From 79977b3cd58013e2960c9aebf46ff4e98e7af9a1 Mon Sep 17 00:00:00 2001 From: Joseph Gao Date: Wed, 29 Mar 2017 02:49:18 -0400 Subject: [PATCH 01/12] kinda works --- .gitignore | 1 + deploy.js | 38 +++++++++++++ index.html | 19 +++++++ package.json | 32 +++++++++++ src/agent.js | 14 +++++ src/crowd.js | 128 ++++++++++++++++++++++++++++++++++++++++++++ src/framework.js | 72 +++++++++++++++++++++++++ src/grid.js | 43 +++++++++++++++ src/main.js | 51 ++++++++++++++++++ src/marker.js | 9 ++++ src/renderengine.js | 53 ++++++++++++++++++ webpack.config.js | 28 ++++++++++ 12 files changed, 488 insertions(+) create mode 100644 .gitignore create mode 100755 deploy.js create mode 100755 index.html create mode 100755 package.json create mode 100644 src/agent.js create mode 100644 src/crowd.js create mode 100755 src/framework.js create mode 100644 src/grid.js create mode 100755 src/main.js create mode 100644 src/marker.js create mode 100644 src/renderengine.js create mode 100755 webpack.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c2658d7d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/deploy.js b/deploy.js new file mode 100755 index 00000000..9defe7c3 --- /dev/null +++ b/deploy.js @@ -0,0 +1,38 @@ +var colors = require('colors'); +var path = require('path'); +var git = require('simple-git')(__dirname); +var deploy = require('gh-pages-deploy'); +var packageJSON = require('require-module')('./package.json'); + +var success = 1; +git.fetch('origin', 'master', function(err) { + if (err) throw err; + git.status(function(err, status) { + if (err) throw err; + if (!status.isClean()) { + success = 0; + console.error('Error: You have uncommitted changes! Please commit them first'.red); + } + + if (status.current !== 'master') { + success = 0; + console.warn('Warning: Please deploy from the master branch!'.yellow) + } + + git.diffSummary(['origin/master'], function(err, diff) { + if (err) throw err; + + if (diff.files.length || diff.insertions || diff.deletions) { + success = 0; + console.error('Error: Current branch is different from origin/master! Please push all changes first'.red) + } + + if (success) { + var cfg = packageJSON['gh-pages-deploy'] || {}; + var buildCmd = deploy.getFullCmd(cfg); + deploy.displayCmds(deploy.getFullCmd(cfg)); + deploy.execBuild(buildCmd, cfg); + } + }) + }) +}) \ No newline at end of file diff --git a/index.html b/index.html new file mode 100755 index 00000000..81e6c193 --- /dev/null +++ b/index.html @@ -0,0 +1,19 @@ + + + + HW7: BioCrowds + + + + + + diff --git a/package.json b/package.json new file mode 100755 index 00000000..35312c66 --- /dev/null +++ b/package.json @@ -0,0 +1,32 @@ +{ + "scripts": { + "start": "webpack-dev-server --hot --inline", + "build": "webpack", + "deploy": "node deploy.js" + }, + "gh-pages-deploy": { + "prep": [ + "build" + ], + "noprompt": true + }, + "dependencies": { + "dat-gui": "^0.5.0", + "gl-matrix": "^2.3.2", + "stats-js": "^1.0.0-alpha1", + "three": "^0.82.1", + "three-orbit-controls": "^82.1.0", + "three-obj-loader": "^1.0.2" + }, + "devDependencies": { + "babel-core": "^6.18.2", + "babel-loader": "^6.2.8", + "babel-preset-es2015": "^6.18.0", + "colors": "^1.1.2", + "gh-pages-deploy": "^0.4.2", + "simple-git": "^1.65.0", + "webpack": "^1.13.3", + "webpack-dev-server": "^1.16.2", + "webpack-glsl-loader": "^1.0.1" + } +} diff --git a/src/agent.js b/src/agent.js new file mode 100644 index 00000000..47fa6862 --- /dev/null +++ b/src/agent.js @@ -0,0 +1,14 @@ +const THREE = require('three'); + +export default class Agent { + constructor(id, pos, vel, goal, size, col) { + this.id = id; + this.position = pos; + this.velocity = vel; + this.goal = goal + this.size = size; + this.markers = []; + this.color = col; + this.mesh = null; + } +} \ No newline at end of file diff --git a/src/crowd.js b/src/crowd.js new file mode 100644 index 00000000..2b66ce07 --- /dev/null +++ b/src/crowd.js @@ -0,0 +1,128 @@ +const THREE = require('three'); +import Grid from './grid.js' +import Agent from './agent.js' +import Marker from './marker.js' + +export default class Crowd { + constructor(renderengine) { + this.renderengine = renderengine; + this.markers = []; + this.agents = []; + this.board = new Grid(2.0, 100.0); + + this.create_agents(); + this.create_markers(); + this.renderengine.render_plane(100.0); + this.renderengine.render_agents(this.agents); + this.renderengine.render_markers(this.markers); + } + + create_agents() { + var agent_1_pos = new THREE.Vector3(-49, 1, 49); + var agent_2_pos = new THREE.Vector3(49, 1, 49); + var agent_1_goal = new THREE.Vector3(49, 0, -49); + var agent_2_goal = new THREE.Vector3(-49, 0, -49); + var zero = new THREE.Vector3(0, 0, 0); + + var agent_1 = new Agent(0, agent_1_pos, zero, agent_1_goal, 2.0, 0x00ff00); + var agent_2 = new Agent(1, agent_2_pos, zero, agent_2_goal, 2.0, 0x0000ff); + this.agents.push(agent_1); + this.agents.push(agent_2); + var agent_1_gs = this.board.find_absolute_grid(agent_1_pos.x, agent_1_pos.z); + var agent_2_gs = this.board.find_absolute_grid(agent_2_pos.x, agent_2_pos.z); + this.board.grid[agent_1_gs.z][agent_1_gs.x].push(agent_1); + this.board.grid[agent_2_gs.z][agent_2_gs.x].push(agent_2); + } + + create_markers() { + for (var i = 0; i < 2000; i++) { + var x = Math.random() * 98 - 49; + var z = Math.random() * 98 - 49; + var marker = new Marker(new THREE.Vector3(x, 0.5, z)); + this.markers.push(marker); + } + } + + /* + update() - for each agent in the crowd, the velocity is calculated based off of the markers that belongs to each agent. + */ + update() { + this.update_marker_ownership(); + this.update_agent_velocities(); + this.renderengine.update_agents(this.agents); + this.renderengine.update_markers(this.markers); + } + + update_marker_ownership() { + for (var i = 0; i < this.markers.length; i++) { + var marker = this.markers[i]; + var ngs = this.board.find_nearest_grid(marker.position.x, marker.position.z); + var top_left = {x: ngs.x -1, z: ngs.z - 1}; + var top = {x: ngs.x, z: ngs.z - 1}; + var left = {x: ngs.x - 1, z: ngs.z}; + var grid = this.board.grid; + var eligible_agents = []; + if (grid[top_left.z][top_left.x].length !== 0) { + grid[top_left.z][top_left.x].forEach(function(agent) { + eligible_agents.push(agent); + }); + } + if (grid[top.z][top.x].length !== 0) { + grid[top_left.z][top_left.x].forEach(function(agent) { + eligible_agents.push(agent); + }); + } + if (grid[left.z][left.x].length !== 0) { + grid[top_left.z][top_left.x].forEach(function(agent) { + eligible_agents.push(agent); + }); + } + this.assign_marker_to_agent(eligible_agents, marker); + } + } + + assign_marker_to_agent(agents, marker) { + if (agents.length === 0) { + marker.color = 0xff0000; + marker.owned = false; + marker.agent = null; + return; + } + var closest = {dist: marker.position.distanceTo(agents[0].position), agent: agents[0]}; + agents.forEach(function(agent) { + var test_dist = marker.position.distanceTo(agent.position); + if (test_dist < closest.dist) { + closest.dist = test_dist; + closest.agent = agent; + } + }); + marker.agent = closest.agent; + marker.color = closest.agent.color; + marker.owned = true; + return; + } + + update_agent_velocities() { + for (var i = 0; i < this.agents.length; i++) { + if (this.agents[i].position.distanceTo(this.agents[i].goal) > 2.0) { + // TODO + // below calulcation for position should use the formulaic velocity calculation + var dir_vector = new THREE.Vector3(this.agents[i].goal.x - this.agents[i].position.x, 0, this.agents[i].goal.z - this.agents[i].position.z).normalize(); + // END TODO + + var old_x = this.agents[i].position.x; + var old_z = this.agents[i].position.z; + var old_gs = this.board.find_absolute_grid(old_x, old_z); + this.agents[i].position.add(dir_vector.divideScalar(5.0)); + + // check if the movement of this agent causes it to leave its current grid + var agent_gs = this.board.find_absolute_grid(this.agents[i].position.x, this.agents[i].position.z); + if (old_gs.x != agent_gs.x && old_gs.z != agent_gs.z) { + var idx = this.board.grid[old_gs.z][old_gs.x].indexOf(this.agents[i]); + this.board.grid[old_gs.z][old_gs.x].splice(idx, 1); + this.board.grid[agent_gs.z][agent_gs.x].push(this.agents[i]); + } + } + } + } +} \ No newline at end of file diff --git a/src/framework.js b/src/framework.js new file mode 100755 index 00000000..35ad723f --- /dev/null +++ b/src/framework.js @@ -0,0 +1,72 @@ + +const THREE = require('three'); +const OrbitControls = require('three-orbit-controls')(THREE) +import Stats from 'stats-js' +import DAT from 'dat-gui' + +// when the scene is done initializing, the function passed as `callback` will be executed +// then, every frame, the function passed as `update` will be executed +function init(callback, update) { + var stats = new Stats(); + stats.setMode(1); + stats.domElement.style.position = 'absolute'; + stats.domElement.style.left = '0px'; + stats.domElement.style.top = '0px'; + document.body.appendChild(stats.domElement); + + var gui = new DAT.GUI(); + + var framework = { + gui: gui, + stats: stats + }; + + // run this function after the window loads + window.addEventListener('load', function() { + + var scene = new THREE.Scene(); + var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 ); + var renderer = new THREE.WebGLRenderer( { antialias: true } ); + renderer.setPixelRatio(window.devicePixelRatio); + renderer.setSize(window.innerWidth, window.innerHeight); + renderer.setClearColor(0x020202, 0); + + var controls = new OrbitControls(camera, renderer.domElement); + controls.enableDamping = true; + controls.enableZoom = true; + controls.target.set(0, 0, 0); + controls.rotateSpeed = 0.3; + controls.zoomSpeed = 1.0; + controls.panSpeed = 2.0; + + document.body.appendChild(renderer.domElement); + + // resize the canvas when the window changes + window.addEventListener('resize', function() { + camera.aspect = window.innerWidth / window.innerHeight; + camera.updateProjectionMatrix(); + renderer.setSize(window.innerWidth, window.innerHeight); + }, false); + + // assign THREE.js objects to the object we will return + framework.scene = scene; + framework.camera = camera; + framework.renderer = renderer; + + // begin the animation loop + (function tick() { + stats.begin(); + update(framework); // perform any requested updates + renderer.render(scene, camera); // render the scene + stats.end(); + requestAnimationFrame(tick); // register to call this again when the browser renders a new frame + })(); + + // we will pass the scene, gui, renderer, camera, etc... to the callback function + return callback(framework); + }); +} + +export default { + init: init +} diff --git a/src/grid.js b/src/grid.js new file mode 100644 index 00000000..e5e5a26f --- /dev/null +++ b/src/grid.js @@ -0,0 +1,43 @@ +const THREE = require('three'); + +// GRID IS ASSUMED TO BE A SQUARE +export default class Grid { + constructor(agent_size, plane_size) { + this.plane_size = plane_size; + this.grid_cell_size = agent_size; + this.grid_len = plane_size / agent_size; + this.grid = []; + while(this.grid.push(new Array(this.grid_len)) < this.grid_len); + for (var i = 0; i < this.grid_len; i++) { + for (var j = 0; j < this.grid_len; j++) { + this.grid[i][j] = []; + } + } + } + + // find_nearest_grid will be used by marker to ultimately find nearest 4 grid + find_nearest_grid(ws_x, ws_z) { + var tgs = this.ws_to_tgs(ws_x, ws_z); + var gs_z = Math.round(tgs.z / this.grid_cell_size); + var gs_x = Math.round(tgs.x / this.grid_cell_size); + return {z: gs_z, x: gs_x}; + } + + // find_absolute_grid will be used by agent to demarcate it's exact grid location + find_absolute_grid(ws_x, ws_z) { + var tgs = this.ws_to_tgs(ws_x, ws_z); + // console.log('tgs:', tgs); + var gs_z = Math.floor(tgs.z / this.grid_cell_size); + var gs_x = Math.floor(tgs.x / this.grid_cell_size); + return {z: gs_z, x: gs_x}; + } + + // convert from world space to uniform grid space + ws_to_tgs(ws_x, ws_z) { + var half_plane_size = this.plane_size / 2.0; + // perform translation + var tgs_x = ws_x + 50.0; + var tgs_z = ws_z + 50.0; + return {x: tgs_x, z: tgs_z}; + } +} \ No newline at end of file diff --git a/src/main.js b/src/main.js new file mode 100755 index 00000000..1a0c27f4 --- /dev/null +++ b/src/main.js @@ -0,0 +1,51 @@ + +const THREE = require('three'); // older modules are imported like this. You shouldn't have to worry about this much +const OBJLoader = require('three-obj-loader')(THREE) +import Grid from './grid.js' +import Agent from './agent.js' +import Marker from './marker.js' +import Crowd from './crowd.js' +import RenderEngine from './renderengine.js' +import Framework from './framework' + +var crowd, renderengine; + +// called after the scene loads +function onLoad(framework) { + var scene = framework.scene; + var camera = framework.camera; + var renderer = framework.renderer; + var gui = framework.gui; + var stats = framework.stats; + + // initialize a simple box and material + var directionalLight = new THREE.DirectionalLight( 0xffffff, 1.25 ); + directionalLight.color.setHSL(0.1, 1, 0.95); + directionalLight.position.set(1, 3, 2); + directionalLight.position.multiplyScalar(10); + scene.add(directionalLight); + + var ambientLight = new THREE.AmbientLight(0x404040); + scene.add(ambientLight); + + // set camera position + camera.position.set(50, 50, 100); + camera.lookAt(new THREE.Vector3(0,0,0)); + + gui.add(camera, 'fov', 0, 180).onChange(function(newVal) { + camera.updateProjectionMatrix(); + }); + + renderengine = new RenderEngine(scene); + crowd = new Crowd(renderengine); +} + +// called on frame updates +function onUpdate(framework) { + if (crowd) { + crowd.update(); + } +} + +// when the scene is done initializing, it will call onLoad, then on frame updates, call onUpdate +Framework.init(onLoad, onUpdate); diff --git a/src/marker.js b/src/marker.js new file mode 100644 index 00000000..844fc03d --- /dev/null +++ b/src/marker.js @@ -0,0 +1,9 @@ +export default class Marker { + constructor(position) { + this.position = position; + this.color = 0xff0000; + this.owned = false; + this.mesh = null; + this.agent = null; + } +} \ No newline at end of file diff --git a/src/renderengine.js b/src/renderengine.js new file mode 100644 index 00000000..33cc6074 --- /dev/null +++ b/src/renderengine.js @@ -0,0 +1,53 @@ +const THREE = require('three'); + +export default class RenderEngine { + + constructor(scene) { + this.scene = scene; + } + + render_plane(size) { + var plane_geo = new THREE.PlaneGeometry(size, size); + var plane_mesh = new THREE.Mesh(plane_geo, new THREE.MeshBasicMaterial( {color: 0xcccccc, side: THREE.DoubleSide})); + plane_mesh.rotation.x = Math.PI / 2.0; + plane_mesh.position.set(0.0, 0.0, 0.0); + this.scene.add(plane_mesh); + } + + render_agents(agents) { + var cylinder_geo = new THREE.CylinderGeometry(1, 1, 2, 20); + var agent; + for (var i = 0; i < agents.length; i++) { + agent = new THREE.Mesh(cylinder_geo, new THREE.MeshBasicMaterial( {color: agents[i].color, side: THREE.DoubleSide})); + agent.position.set(agents[i].position.x, agents[i].position.y, agents[i].position.z); + agents[i].mesh = agent; + this.scene.add(agent); + } + } + + render_markers(markers) { + var cube_geo = new THREE.BoxGeometry(0.5, 0.5, 0.5); + var marker; + for (var i = 0; i < markers.length; i++) { + marker = new THREE.Mesh(cube_geo, new THREE.MeshBasicMaterial( {color: markers[i].color, side: THREE.DoubleSide})); + marker.position.set(markers[i].position.x, markers[i].position.y, markers[i].position.z); + markers[i].mesh = marker; + this.scene.add(marker); + } + } + + update_agents(agents) { + for (var i = 0; i < agents.length; i++) { + var pos = agents[i].position; + var mesh = agents[i].mesh; + mesh.position.set(pos.x, pos.y, pos.z); + mesh.geometry.verticesNeedUpdate = true; + } + } + + update_markers(markers) { + markers.forEach(function(marker) { + marker.mesh.material.color.setHex(marker.color); + }); + } +} diff --git a/webpack.config.js b/webpack.config.js new file mode 100755 index 00000000..4516f068 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,28 @@ +const path = require('path'); + +module.exports = { + entry: path.join(__dirname, "src/main"), + output: { + filename: "./bundle.js" + }, + module: { + loaders: [ + { + test: /\.js$/, + exclude: /(node_modules|bower_components)/, + loader: 'babel', + query: { + presets: ['es2015'] + } + }, + { + test: /\.glsl$/, + loader: "webpack-glsl" + }, + ] + }, + devtool: 'source-map', + devServer: { + port: 7000 + } +} From 670cd86056ba47e4bd75b90fd9b2a85969a6832c Mon Sep 17 00:00:00 2001 From: Joseph Gao Date: Wed, 29 Mar 2017 03:08:55 -0400 Subject: [PATCH 02/12] color works for 2 --- src/crowd.js | 24 ++++++++++++++++++------ src/grid.js | 1 - 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/crowd.js b/src/crowd.js index 2b66ce07..85fa7608 100644 --- a/src/crowd.js +++ b/src/crowd.js @@ -8,7 +8,7 @@ export default class Crowd { this.renderengine = renderengine; this.markers = []; this.agents = []; - this.board = new Grid(2.0, 100.0); + this.board = new Grid(10.0, 100.0); this.create_agents(); this.create_markers(); @@ -57,23 +57,35 @@ export default class Crowd { for (var i = 0; i < this.markers.length; i++) { var marker = this.markers[i]; var ngs = this.board.find_nearest_grid(marker.position.x, marker.position.z); + if (ngs.x === this.board.grid.length) { + ngs.x -= 1; + } + if (ngs.z === this.board.grid.length) { + ngs.z -= 1; + } + var top_left = {x: ngs.x -1, z: ngs.z - 1}; var top = {x: ngs.x, z: ngs.z - 1}; var left = {x: ngs.x - 1, z: ngs.z}; var grid = this.board.grid; var eligible_agents = []; - if (grid[top_left.z][top_left.x].length !== 0) { + if (top_left.z > -1 && top_left.x > -1 && grid[top_left.z][top_left.x].length !== 0) { grid[top_left.z][top_left.x].forEach(function(agent) { eligible_agents.push(agent); }); } - if (grid[top.z][top.x].length !== 0) { - grid[top_left.z][top_left.x].forEach(function(agent) { + if (top.z > -1 && top.x > -1 && grid[top.z][top.x].length !== 0) { + grid[top.z][top.x].forEach(function(agent) { eligible_agents.push(agent); }); } - if (grid[left.z][left.x].length !== 0) { - grid[top_left.z][top_left.x].forEach(function(agent) { + if (left.z > -1 && left.x > -1 && grid[left.z][left.x].length !== 0) { + grid[left.z][left.x].forEach(function(agent) { + eligible_agents.push(agent); + }); + } + if (ngs.z > -1 && ngs.x > -1 && grid[ngs.z][ngs.x].length !== 0) { + grid[ngs.z][ngs.x].forEach(function(agent) { eligible_agents.push(agent); }); } diff --git a/src/grid.js b/src/grid.js index e5e5a26f..fb1b81b4 100644 --- a/src/grid.js +++ b/src/grid.js @@ -34,7 +34,6 @@ export default class Grid { // convert from world space to uniform grid space ws_to_tgs(ws_x, ws_z) { - var half_plane_size = this.plane_size / 2.0; // perform translation var tgs_x = ws_x + 50.0; var tgs_z = ws_z + 50.0; From 333f71a6564bcb2c65d436267444a8ebe5121c54 Mon Sep 17 00:00:00 2001 From: Joseph Gao Date: Wed, 29 Mar 2017 06:50:46 -0400 Subject: [PATCH 03/12] kinda works meh --- src/crowd.js | 94 ++++++++++++++++++++++++++++++++++------------------ src/grid.js | 14 +++++--- src/main.js | 5 +-- 3 files changed, 74 insertions(+), 39 deletions(-) diff --git a/src/crowd.js b/src/crowd.js index 85fa7608..6deca3cd 100644 --- a/src/crowd.js +++ b/src/crowd.js @@ -11,6 +11,7 @@ export default class Crowd { this.board = new Grid(10.0, 100.0); this.create_agents(); + this.populate_board(); this.create_markers(); this.renderengine.render_plane(100.0); this.renderengine.render_agents(this.agents); @@ -28,10 +29,14 @@ export default class Crowd { var agent_2 = new Agent(1, agent_2_pos, zero, agent_2_goal, 2.0, 0x0000ff); this.agents.push(agent_1); this.agents.push(agent_2); - var agent_1_gs = this.board.find_absolute_grid(agent_1_pos.x, agent_1_pos.z); - var agent_2_gs = this.board.find_absolute_grid(agent_2_pos.x, agent_2_pos.z); - this.board.grid[agent_1_gs.z][agent_1_gs.x].push(agent_1); - this.board.grid[agent_2_gs.z][agent_2_gs.x].push(agent_2); + } + + populate_board() { + for (var i = 0; i < this.agents.length; i++) { + var agent = this.agents[i]; + var gs = this.board.find_nearest_grid(agent.position.x, agent.position.z); + this.board.grid[gs.z][gs.x].add(agent); + } } create_markers() { @@ -46,45 +51,54 @@ export default class Crowd { /* update() - for each agent in the crowd, the velocity is calculated based off of the markers that belongs to each agent. */ - update() { + update(time) { this.update_marker_ownership(); - this.update_agent_velocities(); + this.update_agent_velocities(time); this.renderengine.update_agents(this.agents); this.renderengine.update_markers(this.markers); + this.reset_ownership(); + } + + reset_ownership() { + for (var i = 0; i < this.agents.length; i++) { + this.agents[i].markers = []; + } + + for (var i = 0; i < this.markers.length; i++) { + this.markers[i].owned = false; + this.markers[i].color = 0xff0000; + this.markers[i].agent = null; + } } update_marker_ownership() { for (var i = 0; i < this.markers.length; i++) { var marker = this.markers[i]; - var ngs = this.board.find_nearest_grid(marker.position.x, marker.position.z); - if (ngs.x === this.board.grid.length) { - ngs.x -= 1; + if (marker.owned) { + continue; } - if (ngs.z === this.board.grid.length) { - ngs.z -= 1; - } - + var ngs = this.board.find_nearest_grid(marker.position.x, marker.position.z); var top_left = {x: ngs.x -1, z: ngs.z - 1}; var top = {x: ngs.x, z: ngs.z - 1}; var left = {x: ngs.x - 1, z: ngs.z}; var grid = this.board.grid; var eligible_agents = []; - if (top_left.z > -1 && top_left.x > -1 && grid[top_left.z][top_left.x].length !== 0) { + if (top_left.z > -1 && top_left.x > -1 && grid[top_left.z][top_left.x].size > 0) { grid[top_left.z][top_left.x].forEach(function(agent) { eligible_agents.push(agent); }); } - if (top.z > -1 && top.x > -1 && grid[top.z][top.x].length !== 0) { + if (top.z > -1 && top.x > -1 && grid[top.z][top.x].size > 0) { grid[top.z][top.x].forEach(function(agent) { eligible_agents.push(agent); }); } - if (left.z > -1 && left.x > -1 && grid[left.z][left.x].length !== 0) { + if (left.z > -1 && left.x > -1 && grid[left.z][left.x].size > 0) { grid[left.z][left.x].forEach(function(agent) { eligible_agents.push(agent); }); } - if (ngs.z > -1 && ngs.x > -1 && grid[ngs.z][ngs.x].length !== 0) { + if (ngs.z > -1 && ngs.x > -1 && grid[ngs.z][ngs.x].size > 0) { grid[ngs.z][ngs.x].forEach(function(agent) { eligible_agents.push(agent); }); @@ -111,28 +125,42 @@ export default class Crowd { marker.agent = closest.agent; marker.color = closest.agent.color; marker.owned = true; + closest.agent.markers.push(marker); return; } - update_agent_velocities() { + update_agent_velocities(time) { for (var i = 0; i < this.agents.length; i++) { - if (this.agents[i].position.distanceTo(this.agents[i].goal) > 2.0) { - // TODO - // below calulcation for position should use the formulaic velocity calculation - var dir_vector = new THREE.Vector3(this.agents[i].goal.x - this.agents[i].position.x, 0, this.agents[i].goal.z - this.agents[i].position.z).normalize(); - // END TODO - - var old_x = this.agents[i].position.x; - var old_z = this.agents[i].position.z; - var old_gs = this.board.find_absolute_grid(old_x, old_z); - this.agents[i].position.add(dir_vector.divideScalar(5.0)); + var agent = this.agents[i]; + if (agent.position.distanceTo(agent.goal) > 2.0) { + var old_gs = this.board.find_nearest_grid(agent.position.x, agent.position.z); + // computing total marker influence + var G = new THREE.Vector3(agent.goal.x - agent.position.x, 0, agent.goal.z - agent.position.z); + var total_weight = 0.0; + var total_velocity = new THREE.Vector3(0, 0, 0); + for (var j = 0; j < agent.markers.length; j++) { + var marker = agent.markers[j]; + var m = new THREE.Vector3(marker.position.x - agent.position.x, 0, marker.position.z - agent.position.z); + var weight = (1.0 + Math.cos(m.angleTo(G))) / (1.0 + m.length()); + total_weight += weight; + } + for (var j = 0; j < agent.markers.length; j++) { + var marker = agent.markers[j]; + var m = new THREE.Vector3(marker.position.x - agent.position.x, 0, marker.position.z - agent.position.z); + var weight = (1.0 + Math.cos(m.angleTo(G))) / (1.0 + m.length()); + total_velocity.add(m.multiplyScalar(weight / total_weight)); + } + if (i === 1) { + } + // agent.velocity = total_velocity.normalize(); + agent.position.add(total_velocity.multiplyScalar(time).normalize()); + // agent.position.add(G.divideScalar(100.0)); // check if the movement of this agent causes it to leave its current grid - var agent_gs = this.board.find_absolute_grid(this.agents[i].position.x, this.agents[i].position.z); - if (old_gs.x != agent_gs.x && old_gs.z != agent_gs.z) { - var idx = this.board.grid[old_gs.z][old_gs.x].indexOf(this.agents[i]); - this.board.grid[old_gs.z][old_gs.x].splice(idx, 1); - this.board.grid[agent_gs.z][agent_gs.x].push(this.agents[i]); + var agent_gs = this.board.find_nearest_grid(agent.position.x, agent.position.z); + if (old_gs.x !== agent_gs.x || old_gs.z !== agent_gs.z) { + this.board.grid[old_gs.z][old_gs.x].delete(agent); + this.board.grid[agent_gs.z][agent_gs.x].add(agent); } } } diff --git a/src/grid.js b/src/grid.js index fb1b81b4..6faff363 100644 --- a/src/grid.js +++ b/src/grid.js @@ -2,15 +2,15 @@ const THREE = require('three'); // GRID IS ASSUMED TO BE A SQUARE export default class Grid { - constructor(agent_size, plane_size) { + constructor(cell_size, plane_size) { this.plane_size = plane_size; - this.grid_cell_size = agent_size; - this.grid_len = plane_size / agent_size; + this.grid_cell_size = cell_size; + this.grid_len = plane_size / cell_size; this.grid = []; while(this.grid.push(new Array(this.grid_len)) < this.grid_len); for (var i = 0; i < this.grid_len; i++) { for (var j = 0; j < this.grid_len; j++) { - this.grid[i][j] = []; + this.grid[i][j] = new Set(); } } } @@ -20,6 +20,12 @@ export default class Grid { var tgs = this.ws_to_tgs(ws_x, ws_z); var gs_z = Math.round(tgs.z / this.grid_cell_size); var gs_x = Math.round(tgs.x / this.grid_cell_size); + if (gs_z === 10.0) { + gs_z = 9.0; + } + if (gs_x === 10.0) { + gs_x = 9.0; + } return {z: gs_z, x: gs_x}; } diff --git a/src/main.js b/src/main.js index 1a0c27f4..480d9e27 100755 --- a/src/main.js +++ b/src/main.js @@ -9,7 +9,7 @@ import RenderEngine from './renderengine.js' import Framework from './framework' var crowd, renderengine; - +var time = 0.0; // called after the scene loads function onLoad(framework) { var scene = framework.scene; @@ -42,8 +42,9 @@ function onLoad(framework) { // called on frame updates function onUpdate(framework) { + time += 1.0; if (crowd) { - crowd.update(); + crowd.update(time); } } From 634bfb791ad5401eb6087e2b91d8838140dc626f Mon Sep 17 00:00:00 2001 From: Joseph Gao Date: Wed, 29 Mar 2017 06:52:24 -0400 Subject: [PATCH 04/12] somewhat works --- bundle.js | 48731 ++++++++++++++++++++++++++++++++++++++++++++++++ bundle.js.map | 1 + 2 files changed, 48732 insertions(+) create mode 100644 bundle.js create mode 100644 bundle.js.map diff --git a/bundle.js b/bundle.js new file mode 100644 index 00000000..ecefda2d --- /dev/null +++ b/bundle.js @@ -0,0 +1,48731 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var _grid = __webpack_require__(1); + + var _grid2 = _interopRequireDefault(_grid); + + var _agent = __webpack_require__(3); + + var _agent2 = _interopRequireDefault(_agent); + + var _marker = __webpack_require__(4); + + var _marker2 = _interopRequireDefault(_marker); + + var _crowd = __webpack_require__(5); + + var _crowd2 = _interopRequireDefault(_crowd); + + var _renderengine = __webpack_require__(6); + + var _renderengine2 = _interopRequireDefault(_renderengine); + + var _framework = __webpack_require__(7); + + var _framework2 = _interopRequireDefault(_framework); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + var THREE = __webpack_require__(2); // older modules are imported like this. You shouldn't have to worry about this much + var OBJLoader = __webpack_require__(13)(THREE); + + + var crowd, renderengine; + var time = 0.0; + // called after the scene loads + function onLoad(framework) { + var scene = framework.scene; + var camera = framework.camera; + var renderer = framework.renderer; + var gui = framework.gui; + var stats = framework.stats; + + // initialize a simple box and material + var directionalLight = new THREE.DirectionalLight(0xffffff, 1.25); + directionalLight.color.setHSL(0.1, 1, 0.95); + directionalLight.position.set(1, 3, 2); + directionalLight.position.multiplyScalar(10); + scene.add(directionalLight); + + var ambientLight = new THREE.AmbientLight(0x404040); + scene.add(ambientLight); + + // set camera position + camera.position.set(50, 50, 100); + camera.lookAt(new THREE.Vector3(0, 0, 0)); + + gui.add(camera, 'fov', 0, 180).onChange(function (newVal) { + camera.updateProjectionMatrix(); + }); + + renderengine = new _renderengine2.default(scene); + crowd = new _crowd2.default(renderengine); + } + + // called on frame updates + function onUpdate(framework) { + time += 1.0; + if (crowd) { + crowd.update(time); + } + } + + // when the scene is done initializing, it will call onLoad, then on frame updates, call onUpdate + _framework2.default.init(onLoad, onUpdate); + +/***/ }, +/* 1 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + var THREE = __webpack_require__(2); + + // GRID IS ASSUMED TO BE A SQUARE + + var Grid = function () { + function Grid(cell_size, plane_size) { + _classCallCheck(this, Grid); + + this.plane_size = plane_size; + this.grid_cell_size = cell_size; + this.grid_len = plane_size / cell_size; + this.grid = []; + while (this.grid.push(new Array(this.grid_len)) < this.grid_len) {} + for (var i = 0; i < this.grid_len; i++) { + for (var j = 0; j < this.grid_len; j++) { + this.grid[i][j] = new Set(); + } + } + } + + // find_nearest_grid will be used by marker to ultimately find nearest 4 grid + + + _createClass(Grid, [{ + key: 'find_nearest_grid', + value: function find_nearest_grid(ws_x, ws_z) { + var tgs = this.ws_to_tgs(ws_x, ws_z); + var gs_z = Math.round(tgs.z / this.grid_cell_size); + var gs_x = Math.round(tgs.x / this.grid_cell_size); + if (gs_z === 10.0) { + gs_z = 9.0; + } + if (gs_x === 10.0) { + gs_x = 9.0; + } + return { z: gs_z, x: gs_x }; + } + + // find_absolute_grid will be used by agent to demarcate it's exact grid location + + }, { + key: 'find_absolute_grid', + value: function find_absolute_grid(ws_x, ws_z) { + var tgs = this.ws_to_tgs(ws_x, ws_z); + // console.log('tgs:', tgs); + var gs_z = Math.floor(tgs.z / this.grid_cell_size); + var gs_x = Math.floor(tgs.x / this.grid_cell_size); + return { z: gs_z, x: gs_x }; + } + + // convert from world space to uniform grid space + + }, { + key: 'ws_to_tgs', + value: function ws_to_tgs(ws_x, ws_z) { + // perform translation + var tgs_x = ws_x + 50.0; + var tgs_z = ws_z + 50.0; + return { x: tgs_x, z: tgs_z }; + } + }]); + + return Grid; + }(); + + exports.default = Grid; + +/***/ }, +/* 2 */ +/***/ function(module, exports, __webpack_require__) { + + (function (global, factory) { + true ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.THREE = global.THREE || {}))); + }(this, (function (exports) { 'use strict'; + + // Polyfills + + if ( Number.EPSILON === undefined ) { + + Number.EPSILON = Math.pow( 2, - 52 ); + + } + + // + + if ( Math.sign === undefined ) { + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign + + Math.sign = function ( x ) { + + return ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x; + + }; + + } + + if ( Function.prototype.name === undefined ) { + + // Missing in IE9-11. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name + + Object.defineProperty( Function.prototype, 'name', { + + get: function () { + + return this.toString().match( /^\s*function\s*(\S*)\s*\(/ )[ 1 ]; + + } + + } ); + + } + + if ( Object.assign === undefined ) { + + // Missing in IE. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign + + ( function () { + + Object.assign = function ( target ) { + + 'use strict'; + + if ( target === undefined || target === null ) { + + throw new TypeError( 'Cannot convert undefined or null to object' ); + + } + + var output = Object( target ); + + for ( var index = 1; index < arguments.length; index ++ ) { + + var source = arguments[ index ]; + + if ( source !== undefined && source !== null ) { + + for ( var nextKey in source ) { + + if ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) { + + output[ nextKey ] = source[ nextKey ]; + + } + + } + + } + + } + + return output; + + }; + + } )(); + + } + + /** + * https://github.com/mrdoob/eventdispatcher.js/ + */ + + function EventDispatcher() {} + + Object.assign( EventDispatcher.prototype, { + + addEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) this._listeners = {}; + + var listeners = this._listeners; + + if ( listeners[ type ] === undefined ) { + + listeners[ type ] = []; + + } + + if ( listeners[ type ].indexOf( listener ) === - 1 ) { + + listeners[ type ].push( listener ); + + } + + }, + + hasEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return false; + + var listeners = this._listeners; + + if ( listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1 ) { + + return true; + + } + + return false; + + }, + + removeEventListener: function ( type, listener ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ type ]; + + if ( listenerArray !== undefined ) { + + var index = listenerArray.indexOf( listener ); + + if ( index !== - 1 ) { + + listenerArray.splice( index, 1 ); + + } + + } + + }, + + dispatchEvent: function ( event ) { + + if ( this._listeners === undefined ) return; + + var listeners = this._listeners; + var listenerArray = listeners[ event.type ]; + + if ( listenerArray !== undefined ) { + + event.target = this; + + var array = [], i = 0; + var length = listenerArray.length; + + for ( i = 0; i < length; i ++ ) { + + array[ i ] = listenerArray[ i ]; + + } + + for ( i = 0; i < length; i ++ ) { + + array[ i ].call( this, event ); + + } + + } + + } + + } ); + + var REVISION = '82'; + var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 }; + var CullFaceNone = 0; + var CullFaceBack = 1; + var CullFaceFront = 2; + var CullFaceFrontBack = 3; + var FrontFaceDirectionCW = 0; + var FrontFaceDirectionCCW = 1; + var BasicShadowMap = 0; + var PCFShadowMap = 1; + var PCFSoftShadowMap = 2; + var FrontSide = 0; + var BackSide = 1; + var DoubleSide = 2; + var FlatShading = 1; + var SmoothShading = 2; + var NoColors = 0; + var FaceColors = 1; + var VertexColors = 2; + var NoBlending = 0; + var NormalBlending = 1; + var AdditiveBlending = 2; + var SubtractiveBlending = 3; + var MultiplyBlending = 4; + var CustomBlending = 5; + var BlendingMode = { + NoBlending: NoBlending, + NormalBlending: NormalBlending, + AdditiveBlending: AdditiveBlending, + SubtractiveBlending: SubtractiveBlending, + MultiplyBlending: MultiplyBlending, + CustomBlending: CustomBlending + }; + var AddEquation = 100; + var SubtractEquation = 101; + var ReverseSubtractEquation = 102; + var MinEquation = 103; + var MaxEquation = 104; + var ZeroFactor = 200; + var OneFactor = 201; + var SrcColorFactor = 202; + var OneMinusSrcColorFactor = 203; + var SrcAlphaFactor = 204; + var OneMinusSrcAlphaFactor = 205; + var DstAlphaFactor = 206; + var OneMinusDstAlphaFactor = 207; + var DstColorFactor = 208; + var OneMinusDstColorFactor = 209; + var SrcAlphaSaturateFactor = 210; + var NeverDepth = 0; + var AlwaysDepth = 1; + var LessDepth = 2; + var LessEqualDepth = 3; + var EqualDepth = 4; + var GreaterEqualDepth = 5; + var GreaterDepth = 6; + var NotEqualDepth = 7; + var MultiplyOperation = 0; + var MixOperation = 1; + var AddOperation = 2; + var NoToneMapping = 0; + var LinearToneMapping = 1; + var ReinhardToneMapping = 2; + var Uncharted2ToneMapping = 3; + var CineonToneMapping = 4; + var UVMapping = 300; + var CubeReflectionMapping = 301; + var CubeRefractionMapping = 302; + var EquirectangularReflectionMapping = 303; + var EquirectangularRefractionMapping = 304; + var SphericalReflectionMapping = 305; + var CubeUVReflectionMapping = 306; + var CubeUVRefractionMapping = 307; + var TextureMapping = { + UVMapping: UVMapping, + CubeReflectionMapping: CubeReflectionMapping, + CubeRefractionMapping: CubeRefractionMapping, + EquirectangularReflectionMapping: EquirectangularReflectionMapping, + EquirectangularRefractionMapping: EquirectangularRefractionMapping, + SphericalReflectionMapping: SphericalReflectionMapping, + CubeUVReflectionMapping: CubeUVReflectionMapping, + CubeUVRefractionMapping: CubeUVRefractionMapping + }; + var RepeatWrapping = 1000; + var ClampToEdgeWrapping = 1001; + var MirroredRepeatWrapping = 1002; + var TextureWrapping = { + RepeatWrapping: RepeatWrapping, + ClampToEdgeWrapping: ClampToEdgeWrapping, + MirroredRepeatWrapping: MirroredRepeatWrapping + }; + var NearestFilter = 1003; + var NearestMipMapNearestFilter = 1004; + var NearestMipMapLinearFilter = 1005; + var LinearFilter = 1006; + var LinearMipMapNearestFilter = 1007; + var LinearMipMapLinearFilter = 1008; + var TextureFilter = { + NearestFilter: NearestFilter, + NearestMipMapNearestFilter: NearestMipMapNearestFilter, + NearestMipMapLinearFilter: NearestMipMapLinearFilter, + LinearFilter: LinearFilter, + LinearMipMapNearestFilter: LinearMipMapNearestFilter, + LinearMipMapLinearFilter: LinearMipMapLinearFilter + }; + var UnsignedByteType = 1009; + var ByteType = 1010; + var ShortType = 1011; + var UnsignedShortType = 1012; + var IntType = 1013; + var UnsignedIntType = 1014; + var FloatType = 1015; + var HalfFloatType = 1016; + var UnsignedShort4444Type = 1017; + var UnsignedShort5551Type = 1018; + var UnsignedShort565Type = 1019; + var UnsignedInt248Type = 1020; + var AlphaFormat = 1021; + var RGBFormat = 1022; + var RGBAFormat = 1023; + var LuminanceFormat = 1024; + var LuminanceAlphaFormat = 1025; + var RGBEFormat = RGBAFormat; + var DepthFormat = 1026; + var DepthStencilFormat = 1027; + var RGB_S3TC_DXT1_Format = 2001; + var RGBA_S3TC_DXT1_Format = 2002; + var RGBA_S3TC_DXT3_Format = 2003; + var RGBA_S3TC_DXT5_Format = 2004; + var RGB_PVRTC_4BPPV1_Format = 2100; + var RGB_PVRTC_2BPPV1_Format = 2101; + var RGBA_PVRTC_4BPPV1_Format = 2102; + var RGBA_PVRTC_2BPPV1_Format = 2103; + var RGB_ETC1_Format = 2151; + var LoopOnce = 2200; + var LoopRepeat = 2201; + var LoopPingPong = 2202; + var InterpolateDiscrete = 2300; + var InterpolateLinear = 2301; + var InterpolateSmooth = 2302; + var ZeroCurvatureEnding = 2400; + var ZeroSlopeEnding = 2401; + var WrapAroundEnding = 2402; + var TrianglesDrawMode = 0; + var TriangleStripDrawMode = 1; + var TriangleFanDrawMode = 2; + var LinearEncoding = 3000; + var sRGBEncoding = 3001; + var GammaEncoding = 3007; + var RGBEEncoding = 3002; + var LogLuvEncoding = 3003; + var RGBM7Encoding = 3004; + var RGBM16Encoding = 3005; + var RGBDEncoding = 3006; + var BasicDepthPacking = 3200; + var RGBADepthPacking = 3201; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + var _Math = { + + DEG2RAD: Math.PI / 180, + RAD2DEG: 180 / Math.PI, + + generateUUID: function () { + + // http://www.broofa.com/Tools/Math.uuid.htm + + var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' ); + var uuid = new Array( 36 ); + var rnd = 0, r; + + return function generateUUID() { + + for ( var i = 0; i < 36; i ++ ) { + + if ( i === 8 || i === 13 || i === 18 || i === 23 ) { + + uuid[ i ] = '-'; + + } else if ( i === 14 ) { + + uuid[ i ] = '4'; + + } else { + + if ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0; + r = rnd & 0xf; + rnd = rnd >> 4; + uuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ]; + + } + + } + + return uuid.join( '' ); + + }; + + }(), + + clamp: function ( value, min, max ) { + + return Math.max( min, Math.min( max, value ) ); + + }, + + // compute euclidian modulo of m % n + // https://en.wikipedia.org/wiki/Modulo_operation + + euclideanModulo: function ( n, m ) { + + return ( ( n % m ) + m ) % m; + + }, + + // Linear mapping from range to range + + mapLinear: function ( x, a1, a2, b1, b2 ) { + + return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); + + }, + + // https://en.wikipedia.org/wiki/Linear_interpolation + + lerp: function ( x, y, t ) { + + return ( 1 - t ) * x + t * y; + + }, + + // http://en.wikipedia.org/wiki/Smoothstep + + smoothstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * ( 3 - 2 * x ); + + }, + + smootherstep: function ( x, min, max ) { + + if ( x <= min ) return 0; + if ( x >= max ) return 1; + + x = ( x - min ) / ( max - min ); + + return x * x * x * ( x * ( x * 6 - 15 ) + 10 ); + + }, + + random16: function () { + + console.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' ); + return Math.random(); + + }, + + // Random integer from interval + + randInt: function ( low, high ) { + + return low + Math.floor( Math.random() * ( high - low + 1 ) ); + + }, + + // Random float from interval + + randFloat: function ( low, high ) { + + return low + Math.random() * ( high - low ); + + }, + + // Random float from <-range/2, range/2> interval + + randFloatSpread: function ( range ) { + + return range * ( 0.5 - Math.random() ); + + }, + + degToRad: function ( degrees ) { + + return degrees * _Math.DEG2RAD; + + }, + + radToDeg: function ( radians ) { + + return radians * _Math.RAD2DEG; + + }, + + isPowerOfTwo: function ( value ) { + + return ( value & ( value - 1 ) ) === 0 && value !== 0; + + }, + + nearestPowerOfTwo: function ( value ) { + + return Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) ); + + }, + + nextPowerOfTwo: function ( value ) { + + value --; + value |= value >> 1; + value |= value >> 2; + value |= value >> 4; + value |= value >> 8; + value |= value >> 16; + value ++; + + return value; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author philogb / http://blog.thejit.org/ + * @author egraether / http://egraether.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + function Vector2( x, y ) { + + this.x = x || 0; + this.y = y || 0; + + } + + Vector2.prototype = { + + constructor: Vector2, + + isVector2: true, + + get width() { + + return this.x; + + }, + + set width( value ) { + + this.x = value; + + }, + + get height() { + + return this.y; + + }, + + set height( value ) { + + this.y = value; + + }, + + // + + set: function ( x, y ) { + + this.x = x; + this.y = y; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + + return this; + + }, + + multiply: function ( v ) { + + this.x *= v.x; + this.y *= v.y; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + if ( isFinite( scalar ) ) { + + this.x *= scalar; + this.y *= scalar; + + } else { + + this.x = 0; + this.y = 0; + + } + + return this; + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new Vector2(); + max = new Vector2(); + + } + + min.set( minVal, minVal ); + max.set( maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y ); + + }, + + lengthManhattan: function() { + + return Math.abs( this.x ) + Math.abs( this.y ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + angle: function () { + + // computes the angle in radians with respect to the positive x-axis + + var angle = Math.atan2( this.y, this.x ); + + if ( angle < 0 ) angle += 2 * Math.PI; + + return angle; + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y; + return dx * dx + dy * dy; + + }, + + distanceToManhattan: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ); + + }, + + setLength: function ( length ) { + + return this.multiplyScalar( length / this.length() ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + + return array; + + }, + + fromAttribute: function ( attribute, index, offset ) { + + if ( offset === undefined ) offset = 0; + + index = index * attribute.itemSize + offset; + + this.x = attribute.array[ index ]; + this.y = attribute.array[ index + 1 ]; + + return this; + + }, + + rotateAround: function ( center, angle ) { + + var c = Math.cos( angle ), s = Math.sin( angle ); + + var x = this.x - center.x; + var y = this.y - center.y; + + this.x = x * c - y * s + center.x; + this.y = x * s + y * c + center.y; + + return this; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + */ + + function Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + Object.defineProperty( this, 'id', { value: TextureIdCount() } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.sourceFile = ''; + + this.image = image !== undefined ? image : Texture.DEFAULT_IMAGE; + this.mipmaps = []; + + this.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING; + + this.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping; + this.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping; + + this.magFilter = magFilter !== undefined ? magFilter : LinearFilter; + this.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter; + + this.anisotropy = anisotropy !== undefined ? anisotropy : 1; + + this.format = format !== undefined ? format : RGBAFormat; + this.type = type !== undefined ? type : UnsignedByteType; + + this.offset = new Vector2( 0, 0 ); + this.repeat = new Vector2( 1, 1 ); + + this.generateMipmaps = true; + this.premultiplyAlpha = false; + this.flipY = true; + this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) + + + // Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap. + // + // Also changing the encoding after already used by a Material will not automatically make the Material + // update. You need to explicitly call Material.needsUpdate to trigger it to recompile. + this.encoding = encoding !== undefined ? encoding : LinearEncoding; + + this.version = 0; + this.onUpdate = null; + + } + + Texture.DEFAULT_IMAGE = undefined; + Texture.DEFAULT_MAPPING = UVMapping; + + Texture.prototype = { + + constructor: Texture, + + isTexture: true, + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.image = source.image; + this.mipmaps = source.mipmaps.slice( 0 ); + + this.mapping = source.mapping; + + this.wrapS = source.wrapS; + this.wrapT = source.wrapT; + + this.magFilter = source.magFilter; + this.minFilter = source.minFilter; + + this.anisotropy = source.anisotropy; + + this.format = source.format; + this.type = source.type; + + this.offset.copy( source.offset ); + this.repeat.copy( source.repeat ); + + this.generateMipmaps = source.generateMipmaps; + this.premultiplyAlpha = source.premultiplyAlpha; + this.flipY = source.flipY; + this.unpackAlignment = source.unpackAlignment; + this.encoding = source.encoding; + + return this; + + }, + + toJSON: function ( meta ) { + + if ( meta.textures[ this.uuid ] !== undefined ) { + + return meta.textures[ this.uuid ]; + + } + + function getDataURL( image ) { + + var canvas; + + if ( image.toDataURL !== undefined ) { + + canvas = image; + + } else { + + canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = image.width; + canvas.height = image.height; + + canvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height ); + + } + + if ( canvas.width > 2048 || canvas.height > 2048 ) { + + return canvas.toDataURL( 'image/jpeg', 0.6 ); + + } else { + + return canvas.toDataURL( 'image/png' ); + + } + + } + + var output = { + metadata: { + version: 4.4, + type: 'Texture', + generator: 'Texture.toJSON' + }, + + uuid: this.uuid, + name: this.name, + + mapping: this.mapping, + + repeat: [ this.repeat.x, this.repeat.y ], + offset: [ this.offset.x, this.offset.y ], + wrap: [ this.wrapS, this.wrapT ], + + minFilter: this.minFilter, + magFilter: this.magFilter, + anisotropy: this.anisotropy, + + flipY: this.flipY + }; + + if ( this.image !== undefined ) { + + // TODO: Move to THREE.Image + + var image = this.image; + + if ( image.uuid === undefined ) { + + image.uuid = _Math.generateUUID(); // UGH + + } + + if ( meta.images[ image.uuid ] === undefined ) { + + meta.images[ image.uuid ] = { + uuid: image.uuid, + url: getDataURL( image ) + }; + + } + + output.image = image.uuid; + + } + + meta.textures[ this.uuid ] = output; + + return output; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + }, + + transformUv: function ( uv ) { + + if ( this.mapping !== UVMapping ) return; + + uv.multiply( this.repeat ); + uv.add( this.offset ); + + if ( uv.x < 0 || uv.x > 1 ) { + + switch ( this.wrapS ) { + + case RepeatWrapping: + + uv.x = uv.x - Math.floor( uv.x ); + break; + + case ClampToEdgeWrapping: + + uv.x = uv.x < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) { + + uv.x = Math.ceil( uv.x ) - uv.x; + + } else { + + uv.x = uv.x - Math.floor( uv.x ); + + } + break; + + } + + } + + if ( uv.y < 0 || uv.y > 1 ) { + + switch ( this.wrapT ) { + + case RepeatWrapping: + + uv.y = uv.y - Math.floor( uv.y ); + break; + + case ClampToEdgeWrapping: + + uv.y = uv.y < 0 ? 0 : 1; + break; + + case MirroredRepeatWrapping: + + if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) { + + uv.y = Math.ceil( uv.y ) - uv.y; + + } else { + + uv.y = uv.y - Math.floor( uv.y ); + + } + break; + + } + + } + + if ( this.flipY ) { + + uv.y = 1 - uv.y; + + } + + } + + }; + + Object.assign( Texture.prototype, EventDispatcher.prototype ); + + var count = 0; + function TextureIdCount() { return count++; } + + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector4( x, y, z, w ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + this.w = ( w !== undefined ) ? w : 1; + + } + + Vector4.prototype = { + + constructor: Vector4, + + isVector4: true, + + set: function ( x, y, z, w ) { + + this.x = x; + this.y = y; + this.z = z; + this.w = w; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + this.w = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setW: function ( w ) { + + this.w = w; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + case 3: this.w = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + case 3: return this.w; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z, this.w ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = ( v.w !== undefined ) ? v.w : 1; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + this.w += v.w; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + this.w += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + this.w = a.w + b.w; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + this.w += v.w * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + this.w -= v.w; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + this.w -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + this.w = a.w - b.w; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + if ( isFinite( scalar ) ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + this.w *= scalar; + + } else { + + this.x = 0; + this.y = 0; + this.z = 0; + this.w = 0; + + } + + return this; + + }, + + applyMatrix4: function ( m ) { + + var x = this.x, y = this.y, z = this.z, w = this.w; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w; + this.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + setAxisAngleFromQuaternion: function ( q ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm + + // q is assumed to be normalized + + this.w = 2 * Math.acos( q.w ); + + var s = Math.sqrt( 1 - q.w * q.w ); + + if ( s < 0.0001 ) { + + this.x = 1; + this.y = 0; + this.z = 0; + + } else { + + this.x = q.x / s; + this.y = q.y / s; + this.z = q.z / s; + + } + + return this; + + }, + + setAxisAngleFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var angle, x, y, z, // variables for result + epsilon = 0.01, // margin to allow for rounding errors + epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees + + te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + if ( ( Math.abs( m12 - m21 ) < epsilon ) && + ( Math.abs( m13 - m31 ) < epsilon ) && + ( Math.abs( m23 - m32 ) < epsilon ) ) { + + // singularity found + // first check for identity matrix which must have +1 for all terms + // in leading diagonal and zero in other terms + + if ( ( Math.abs( m12 + m21 ) < epsilon2 ) && + ( Math.abs( m13 + m31 ) < epsilon2 ) && + ( Math.abs( m23 + m32 ) < epsilon2 ) && + ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) { + + // this singularity is identity matrix so angle = 0 + + this.set( 1, 0, 0, 0 ); + + return this; // zero angle, arbitrary axis + + } + + // otherwise this singularity is angle = 180 + + angle = Math.PI; + + var xx = ( m11 + 1 ) / 2; + var yy = ( m22 + 1 ) / 2; + var zz = ( m33 + 1 ) / 2; + var xy = ( m12 + m21 ) / 4; + var xz = ( m13 + m31 ) / 4; + var yz = ( m23 + m32 ) / 4; + + if ( ( xx > yy ) && ( xx > zz ) ) { + + // m11 is the largest diagonal term + + if ( xx < epsilon ) { + + x = 0; + y = 0.707106781; + z = 0.707106781; + + } else { + + x = Math.sqrt( xx ); + y = xy / x; + z = xz / x; + + } + + } else if ( yy > zz ) { + + // m22 is the largest diagonal term + + if ( yy < epsilon ) { + + x = 0.707106781; + y = 0; + z = 0.707106781; + + } else { + + y = Math.sqrt( yy ); + x = xy / y; + z = yz / y; + + } + + } else { + + // m33 is the largest diagonal term so base result on this + + if ( zz < epsilon ) { + + x = 0.707106781; + y = 0.707106781; + z = 0; + + } else { + + z = Math.sqrt( zz ); + x = xz / z; + y = yz / z; + + } + + } + + this.set( x, y, z, angle ); + + return this; // return 180 deg rotation + + } + + // as we have reached here there are no singularities so we can handle normally + + var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) + + ( m13 - m31 ) * ( m13 - m31 ) + + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize + + if ( Math.abs( s ) < 0.001 ) s = 1; + + // prevent divide by zero, should not happen if matrix is orthogonal and should be + // caught by singularity test above, but I've left it in just in case + + this.x = ( m32 - m23 ) / s; + this.y = ( m13 - m31 ) / s; + this.z = ( m21 - m12 ) / s; + this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 ); + + return this; + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + this.w = Math.min( this.w, v.w ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + this.w = Math.max( this.w, v.w ); + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + this.w = Math.max( min.w, Math.min( max.w, this.w ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new Vector4(); + max = new Vector4(); + + } + + min.set( minVal, minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + this.w = Math.floor( this.w ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + this.w = Math.ceil( this.w ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + this.w = Math.round( this.w ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + this.w = - this.w; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); + + }, + + lengthManhattan: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + setLength: function ( length ) { + + return this.multiplyScalar( length / this.length() ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + this.w += ( v.w - this.w ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + this.w = array[ offset + 3 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + array[ offset + 3 ] = this.w; + + return array; + + }, + + fromAttribute: function ( attribute, index, offset ) { + + if ( offset === undefined ) offset = 0; + + index = index * attribute.itemSize + offset; + + this.x = attribute.array[ index ]; + this.y = attribute.array[ index + 1 ]; + this.z = attribute.array[ index + 2 ]; + this.w = attribute.array[ index + 3 ]; + + return this; + + } + + }; + + /** + * @author szimek / https://github.com/szimek/ + * @author alteredq / http://alteredqualia.com/ + * @author Marius Kintel / https://github.com/kintel + */ + + /* + In options, we can specify: + * Texture parameters for an auto-generated target texture + * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers + */ + function WebGLRenderTarget( width, height, options ) { + + this.uuid = _Math.generateUUID(); + + this.width = width; + this.height = height; + + this.scissor = new Vector4( 0, 0, width, height ); + this.scissorTest = false; + + this.viewport = new Vector4( 0, 0, width, height ); + + options = options || {}; + + if ( options.minFilter === undefined ) options.minFilter = LinearFilter; + + this.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding ); + + this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; + this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true; + this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null; + + } + + Object.assign( WebGLRenderTarget.prototype, EventDispatcher.prototype, { + + isWebGLRenderTarget: true, + + setSize: function ( width, height ) { + + if ( this.width !== width || this.height !== height ) { + + this.width = width; + this.height = height; + + this.dispose(); + + } + + this.viewport.set( 0, 0, width, height ); + this.scissor.set( 0, 0, width, height ); + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.width = source.width; + this.height = source.height; + + this.viewport.copy( source.viewport ); + + this.texture = source.texture.clone(); + + this.depthBuffer = source.depthBuffer; + this.stencilBuffer = source.stencilBuffer; + this.depthTexture = source.depthTexture; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com + */ + + function WebGLRenderTargetCube( width, height, options ) { + + WebGLRenderTarget.call( this, width, height, options ); + + this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5 + this.activeMipMapLevel = 0; + + } + + WebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype ); + WebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube; + + WebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Quaternion( x, y, z, w ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._w = ( w !== undefined ) ? w : 1; + + } + + Quaternion.prototype = { + + constructor: Quaternion, + + get x () { + + return this._x; + + }, + + set x ( value ) { + + this._x = value; + this.onChangeCallback(); + + }, + + get y () { + + return this._y; + + }, + + set y ( value ) { + + this._y = value; + this.onChangeCallback(); + + }, + + get z () { + + return this._z; + + }, + + set z ( value ) { + + this._z = value; + this.onChangeCallback(); + + }, + + get w () { + + return this._w; + + }, + + set w ( value ) { + + this._w = value; + this.onChangeCallback(); + + }, + + set: function ( x, y, z, w ) { + + this._x = x; + this._y = y; + this._z = z; + this._w = w; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._w ); + + }, + + copy: function ( quaternion ) { + + this._x = quaternion.x; + this._y = quaternion.y; + this._z = quaternion.z; + this._w = quaternion.w; + + this.onChangeCallback(); + + return this; + + }, + + setFromEuler: function ( euler, update ) { + + if ( (euler && euler.isEuler) === false ) { + + throw new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + // http://www.mathworks.com/matlabcentral/fileexchange/ + // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ + // content/SpinCalc.m + + var c1 = Math.cos( euler._x / 2 ); + var c2 = Math.cos( euler._y / 2 ); + var c3 = Math.cos( euler._z / 2 ); + var s1 = Math.sin( euler._x / 2 ); + var s2 = Math.sin( euler._y / 2 ); + var s3 = Math.sin( euler._z / 2 ); + + var order = euler.order; + + if ( order === 'XYZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'YXZ' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'ZXY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'ZYX' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } else if ( order === 'YZX' ) { + + this._x = s1 * c2 * c3 + c1 * s2 * s3; + this._y = c1 * s2 * c3 + s1 * c2 * s3; + this._z = c1 * c2 * s3 - s1 * s2 * c3; + this._w = c1 * c2 * c3 - s1 * s2 * s3; + + } else if ( order === 'XZY' ) { + + this._x = s1 * c2 * c3 - c1 * s2 * s3; + this._y = c1 * s2 * c3 - s1 * c2 * s3; + this._z = c1 * c2 * s3 + s1 * s2 * c3; + this._w = c1 * c2 * c3 + s1 * s2 * s3; + + } + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromAxisAngle: function ( axis, angle ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm + + // assumes axis is normalized + + var halfAngle = angle / 2, s = Math.sin( halfAngle ); + + this._x = axis.x * s; + this._y = axis.y * s; + this._z = axis.z * s; + this._w = Math.cos( halfAngle ); + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m ) { + + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements, + + m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ], + m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ], + m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ], + + trace = m11 + m22 + m33, + s; + + if ( trace > 0 ) { + + s = 0.5 / Math.sqrt( trace + 1.0 ); + + this._w = 0.25 / s; + this._x = ( m32 - m23 ) * s; + this._y = ( m13 - m31 ) * s; + this._z = ( m21 - m12 ) * s; + + } else if ( m11 > m22 && m11 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 ); + + this._w = ( m32 - m23 ) / s; + this._x = 0.25 * s; + this._y = ( m12 + m21 ) / s; + this._z = ( m13 + m31 ) / s; + + } else if ( m22 > m33 ) { + + s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 ); + + this._w = ( m13 - m31 ) / s; + this._x = ( m12 + m21 ) / s; + this._y = 0.25 * s; + this._z = ( m23 + m32 ) / s; + + } else { + + s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 ); + + this._w = ( m21 - m12 ) / s; + this._x = ( m13 + m31 ) / s; + this._y = ( m23 + m32 ) / s; + this._z = 0.25 * s; + + } + + this.onChangeCallback(); + + return this; + + }, + + setFromUnitVectors: function () { + + // http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final + + // assumes direction vectors vFrom and vTo are normalized + + var v1, r; + + var EPS = 0.000001; + + return function setFromUnitVectors( vFrom, vTo ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + r = vFrom.dot( vTo ) + 1; + + if ( r < EPS ) { + + r = 0; + + if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) { + + v1.set( - vFrom.y, vFrom.x, 0 ); + + } else { + + v1.set( 0, - vFrom.z, vFrom.y ); + + } + + } else { + + v1.crossVectors( vFrom, vTo ); + + } + + this._x = v1.x; + this._y = v1.y; + this._z = v1.z; + this._w = r; + + return this.normalize(); + + }; + + }(), + + inverse: function () { + + return this.conjugate().normalize(); + + }, + + conjugate: function () { + + this._x *= - 1; + this._y *= - 1; + this._z *= - 1; + + this.onChangeCallback(); + + return this; + + }, + + dot: function ( v ) { + + return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w; + + }, + + lengthSq: function () { + + return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; + + }, + + length: function () { + + return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w ); + + }, + + normalize: function () { + + var l = this.length(); + + if ( l === 0 ) { + + this._x = 0; + this._y = 0; + this._z = 0; + this._w = 1; + + } else { + + l = 1 / l; + + this._x = this._x * l; + this._y = this._y * l; + this._z = this._z * l; + this._w = this._w * l; + + } + + this.onChangeCallback(); + + return this; + + }, + + multiply: function ( q, p ) { + + if ( p !== undefined ) { + + console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' ); + return this.multiplyQuaternions( q, p ); + + } + + return this.multiplyQuaternions( this, q ); + + }, + + premultiply: function ( q ) { + + return this.multiplyQuaternions( q, this ); + + }, + + multiplyQuaternions: function ( a, b ) { + + // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm + + var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w; + var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w; + + this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby; + this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz; + this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx; + this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz; + + this.onChangeCallback(); + + return this; + + }, + + slerp: function ( qb, t ) { + + if ( t === 0 ) return this; + if ( t === 1 ) return this.copy( qb ); + + var x = this._x, y = this._y, z = this._z, w = this._w; + + // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ + + var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z; + + if ( cosHalfTheta < 0 ) { + + this._w = - qb._w; + this._x = - qb._x; + this._y = - qb._y; + this._z = - qb._z; + + cosHalfTheta = - cosHalfTheta; + + } else { + + this.copy( qb ); + + } + + if ( cosHalfTheta >= 1.0 ) { + + this._w = w; + this._x = x; + this._y = y; + this._z = z; + + return this; + + } + + var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta ); + + if ( Math.abs( sinHalfTheta ) < 0.001 ) { + + this._w = 0.5 * ( w + this._w ); + this._x = 0.5 * ( x + this._x ); + this._y = 0.5 * ( y + this._y ); + this._z = 0.5 * ( z + this._z ); + + return this; + + } + + var halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta ); + var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, + ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; + + this._w = ( w * ratioA + this._w * ratioB ); + this._x = ( x * ratioA + this._x * ratioB ); + this._y = ( y * ratioA + this._y * ratioB ); + this._z = ( z * ratioA + this._z * ratioB ); + + this.onChangeCallback(); + + return this; + + }, + + equals: function ( quaternion ) { + + return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this._x = array[ offset ]; + this._y = array[ offset + 1 ]; + this._z = array[ offset + 2 ]; + this._w = array[ offset + 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._w; + + return array; + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + + }; + + Object.assign( Quaternion, { + + slerp: function( qa, qb, qm, t ) { + + return qm.copy( qa ).slerp( qb, t ); + + }, + + slerpFlat: function( + dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) { + + // fuzz-free, array-based Quaternion SLERP operation + + var x0 = src0[ srcOffset0 + 0 ], + y0 = src0[ srcOffset0 + 1 ], + z0 = src0[ srcOffset0 + 2 ], + w0 = src0[ srcOffset0 + 3 ], + + x1 = src1[ srcOffset1 + 0 ], + y1 = src1[ srcOffset1 + 1 ], + z1 = src1[ srcOffset1 + 2 ], + w1 = src1[ srcOffset1 + 3 ]; + + if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) { + + var s = 1 - t, + + cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, + + dir = ( cos >= 0 ? 1 : - 1 ), + sqrSin = 1 - cos * cos; + + // Skip the Slerp for tiny steps to avoid numeric problems: + if ( sqrSin > Number.EPSILON ) { + + var sin = Math.sqrt( sqrSin ), + len = Math.atan2( sin, cos * dir ); + + s = Math.sin( s * len ) / sin; + t = Math.sin( t * len ) / sin; + + } + + var tDir = t * dir; + + x0 = x0 * s + x1 * tDir; + y0 = y0 * s + y1 * tDir; + z0 = z0 * s + z1 * tDir; + w0 = w0 * s + w1 * tDir; + + // Normalize in case we just did a lerp: + if ( s === 1 - t ) { + + var f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 ); + + x0 *= f; + y0 *= f; + z0 *= f; + w0 *= f; + + } + + } + + dst[ dstOffset ] = x0; + dst[ dstOffset + 1 ] = y0; + dst[ dstOffset + 2 ] = z0; + dst[ dstOffset + 3 ] = w0; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author *kile / http://kile.stravaganza.org/ + * @author philogb / http://blog.thejit.org/ + * @author mikael emtinger / http://gomo.se/ + * @author egraether / http://egraether.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Vector3( x, y, z ) { + + this.x = x || 0; + this.y = y || 0; + this.z = z || 0; + + } + + Vector3.prototype = { + + constructor: Vector3, + + isVector3: true, + + set: function ( x, y, z ) { + + this.x = x; + this.y = y; + this.z = z; + + return this; + + }, + + setScalar: function ( scalar ) { + + this.x = scalar; + this.y = scalar; + this.z = scalar; + + return this; + + }, + + setX: function ( x ) { + + this.x = x; + + return this; + + }, + + setY: function ( y ) { + + this.y = y; + + return this; + + }, + + setZ: function ( z ) { + + this.z = z; + + return this; + + }, + + setComponent: function ( index, value ) { + + switch ( index ) { + + case 0: this.x = value; break; + case 1: this.y = value; break; + case 2: this.z = value; break; + default: throw new Error( 'index is out of range: ' + index ); + + } + + return this; + + }, + + getComponent: function ( index ) { + + switch ( index ) { + + case 0: return this.x; + case 1: return this.y; + case 2: return this.z; + default: throw new Error( 'index is out of range: ' + index ); + + } + + }, + + clone: function () { + + return new this.constructor( this.x, this.y, this.z ); + + }, + + copy: function ( v ) { + + this.x = v.x; + this.y = v.y; + this.z = v.z; + + return this; + + }, + + add: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' ); + return this.addVectors( v, w ); + + } + + this.x += v.x; + this.y += v.y; + this.z += v.z; + + return this; + + }, + + addScalar: function ( s ) { + + this.x += s; + this.y += s; + this.z += s; + + return this; + + }, + + addVectors: function ( a, b ) { + + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + + return this; + + }, + + addScaledVector: function ( v, s ) { + + this.x += v.x * s; + this.y += v.y * s; + this.z += v.z * s; + + return this; + + }, + + sub: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' ); + return this.subVectors( v, w ); + + } + + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + + return this; + + }, + + subScalar: function ( s ) { + + this.x -= s; + this.y -= s; + this.z -= s; + + return this; + + }, + + subVectors: function ( a, b ) { + + this.x = a.x - b.x; + this.y = a.y - b.y; + this.z = a.z - b.z; + + return this; + + }, + + multiply: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' ); + return this.multiplyVectors( v, w ); + + } + + this.x *= v.x; + this.y *= v.y; + this.z *= v.z; + + return this; + + }, + + multiplyScalar: function ( scalar ) { + + if ( isFinite( scalar ) ) { + + this.x *= scalar; + this.y *= scalar; + this.z *= scalar; + + } else { + + this.x = 0; + this.y = 0; + this.z = 0; + + } + + return this; + + }, + + multiplyVectors: function ( a, b ) { + + this.x = a.x * b.x; + this.y = a.y * b.y; + this.z = a.z * b.z; + + return this; + + }, + + applyEuler: function () { + + var quaternion; + + return function applyEuler( euler ) { + + if ( (euler && euler.isEuler) === false ) { + + console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' ); + + } + + if ( quaternion === undefined ) quaternion = new Quaternion(); + + return this.applyQuaternion( quaternion.setFromEuler( euler ) ); + + }; + + }(), + + applyAxisAngle: function () { + + var quaternion; + + return function applyAxisAngle( axis, angle ) { + + if ( quaternion === undefined ) quaternion = new Quaternion(); + + return this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) ); + + }; + + }(), + + applyMatrix3: function ( m ) { + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z; + this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z; + this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z; + + return this; + + }, + + applyMatrix4: function ( m ) { + + // input: THREE.Matrix4 affine matrix + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ]; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ]; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ]; + + return this; + + }, + + applyProjection: function ( m ) { + + // input: THREE.Matrix4 projection matrix + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + var d = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); // perspective divide + + this.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * d; + this.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * d; + this.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * d; + + return this; + + }, + + applyQuaternion: function ( q ) { + + var x = this.x, y = this.y, z = this.z; + var qx = q.x, qy = q.y, qz = q.z, qw = q.w; + + // calculate quat * vector + + var ix = qw * x + qy * z - qz * y; + var iy = qw * y + qz * x - qx * z; + var iz = qw * z + qx * y - qy * x; + var iw = - qx * x - qy * y - qz * z; + + // calculate result * inverse quat + + this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy; + this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz; + this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx; + + return this; + + }, + + project: function () { + + var matrix; + + return function project( camera ) { + + if ( matrix === undefined ) matrix = new Matrix4(); + + matrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) ); + return this.applyProjection( matrix ); + + }; + + }(), + + unproject: function () { + + var matrix; + + return function unproject( camera ) { + + if ( matrix === undefined ) matrix = new Matrix4(); + + matrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) ); + return this.applyProjection( matrix ); + + }; + + }(), + + transformDirection: function ( m ) { + + // input: THREE.Matrix4 affine matrix + // vector interpreted as a direction + + var x = this.x, y = this.y, z = this.z; + var e = m.elements; + + this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z; + this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z; + this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z; + + return this.normalize(); + + }, + + divide: function ( v ) { + + this.x /= v.x; + this.y /= v.y; + this.z /= v.z; + + return this; + + }, + + divideScalar: function ( scalar ) { + + return this.multiplyScalar( 1 / scalar ); + + }, + + min: function ( v ) { + + this.x = Math.min( this.x, v.x ); + this.y = Math.min( this.y, v.y ); + this.z = Math.min( this.z, v.z ); + + return this; + + }, + + max: function ( v ) { + + this.x = Math.max( this.x, v.x ); + this.y = Math.max( this.y, v.y ); + this.z = Math.max( this.z, v.z ); + + return this; + + }, + + clamp: function ( min, max ) { + + // This function assumes min < max, if this assumption isn't true it will not operate correctly + + this.x = Math.max( min.x, Math.min( max.x, this.x ) ); + this.y = Math.max( min.y, Math.min( max.y, this.y ) ); + this.z = Math.max( min.z, Math.min( max.z, this.z ) ); + + return this; + + }, + + clampScalar: function () { + + var min, max; + + return function clampScalar( minVal, maxVal ) { + + if ( min === undefined ) { + + min = new Vector3(); + max = new Vector3(); + + } + + min.set( minVal, minVal, minVal ); + max.set( maxVal, maxVal, maxVal ); + + return this.clamp( min, max ); + + }; + + }(), + + clampLength: function ( min, max ) { + + var length = this.length(); + + return this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length ); + + }, + + floor: function () { + + this.x = Math.floor( this.x ); + this.y = Math.floor( this.y ); + this.z = Math.floor( this.z ); + + return this; + + }, + + ceil: function () { + + this.x = Math.ceil( this.x ); + this.y = Math.ceil( this.y ); + this.z = Math.ceil( this.z ); + + return this; + + }, + + round: function () { + + this.x = Math.round( this.x ); + this.y = Math.round( this.y ); + this.z = Math.round( this.z ); + + return this; + + }, + + roundToZero: function () { + + this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x ); + this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y ); + this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z ); + + return this; + + }, + + negate: function () { + + this.x = - this.x; + this.y = - this.y; + this.z = - this.z; + + return this; + + }, + + dot: function ( v ) { + + return this.x * v.x + this.y * v.y + this.z * v.z; + + }, + + lengthSq: function () { + + return this.x * this.x + this.y * this.y + this.z * this.z; + + }, + + length: function () { + + return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); + + }, + + lengthManhattan: function () { + + return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); + + }, + + normalize: function () { + + return this.divideScalar( this.length() ); + + }, + + setLength: function ( length ) { + + return this.multiplyScalar( length / this.length() ); + + }, + + lerp: function ( v, alpha ) { + + this.x += ( v.x - this.x ) * alpha; + this.y += ( v.y - this.y ) * alpha; + this.z += ( v.z - this.z ) * alpha; + + return this; + + }, + + lerpVectors: function ( v1, v2, alpha ) { + + return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 ); + + }, + + cross: function ( v, w ) { + + if ( w !== undefined ) { + + console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' ); + return this.crossVectors( v, w ); + + } + + var x = this.x, y = this.y, z = this.z; + + this.x = y * v.z - z * v.y; + this.y = z * v.x - x * v.z; + this.z = x * v.y - y * v.x; + + return this; + + }, + + crossVectors: function ( a, b ) { + + var ax = a.x, ay = a.y, az = a.z; + var bx = b.x, by = b.y, bz = b.z; + + this.x = ay * bz - az * by; + this.y = az * bx - ax * bz; + this.z = ax * by - ay * bx; + + return this; + + }, + + projectOnVector: function ( vector ) { + + var scalar = vector.dot( this ) / vector.lengthSq(); + + return this.copy( vector ).multiplyScalar( scalar ); + + }, + + projectOnPlane: function () { + + var v1; + + return function projectOnPlane( planeNormal ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + v1.copy( this ).projectOnVector( planeNormal ); + + return this.sub( v1 ); + + }; + + }(), + + reflect: function () { + + // reflect incident vector off plane orthogonal to normal + // normal is assumed to have unit length + + var v1; + + return function reflect( normal ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) ); + + }; + + }(), + + angleTo: function ( v ) { + + var theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) ); + + // clamp, to handle numerical problems + + return Math.acos( _Math.clamp( theta, - 1, 1 ) ); + + }, + + distanceTo: function ( v ) { + + return Math.sqrt( this.distanceToSquared( v ) ); + + }, + + distanceToSquared: function ( v ) { + + var dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z; + + return dx * dx + dy * dy + dz * dz; + + }, + + distanceToManhattan: function ( v ) { + + return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z ); + + }, + + setFromSpherical: function( s ) { + + var sinPhiRadius = Math.sin( s.phi ) * s.radius; + + this.x = sinPhiRadius * Math.sin( s.theta ); + this.y = Math.cos( s.phi ) * s.radius; + this.z = sinPhiRadius * Math.cos( s.theta ); + + return this; + + }, + + setFromMatrixPosition: function ( m ) { + + return this.setFromMatrixColumn( m, 3 ); + + }, + + setFromMatrixScale: function ( m ) { + + var sx = this.setFromMatrixColumn( m, 0 ).length(); + var sy = this.setFromMatrixColumn( m, 1 ).length(); + var sz = this.setFromMatrixColumn( m, 2 ).length(); + + this.x = sx; + this.y = sy; + this.z = sz; + + return this; + + }, + + setFromMatrixColumn: function ( m, index ) { + + if ( typeof m === 'number' ) { + + console.warn( 'THREE.Vector3: setFromMatrixColumn now expects ( matrix, index ).' ); + var temp = m; + m = index; + index = temp; + + } + + return this.fromArray( m.elements, index * 4 ); + + }, + + equals: function ( v ) { + + return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.x = array[ offset ]; + this.y = array[ offset + 1 ]; + this.z = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.x; + array[ offset + 1 ] = this.y; + array[ offset + 2 ] = this.z; + + return array; + + }, + + fromAttribute: function ( attribute, index, offset ) { + + if ( offset === undefined ) offset = 0; + + index = index * attribute.itemSize + offset; + + this.x = attribute.array[ index ]; + this.y = attribute.array[ index + 1 ]; + this.z = attribute.array[ index + 2 ]; + + return this; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author philogb / http://blog.thejit.org/ + * @author jordi_ros / http://plattsoft.com + * @author D1plo1d / http://github.com/D1plo1d + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author timknip / http://www.floorplanner.com/ + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Matrix4() { + + this.elements = new Float32Array( [ + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ] ); + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + Matrix4.prototype = { + + constructor: Matrix4, + + isMatrix4: true, + + set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14; + te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24; + te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34; + te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new Matrix4().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + this.elements.set( m.elements ); + + return this; + + }, + + copyPosition: function ( m ) { + + var te = this.elements; + var me = m.elements; + + te[ 12 ] = me[ 12 ]; + te[ 13 ] = me[ 13 ]; + te[ 14 ] = me[ 14 ]; + + return this; + + }, + + extractBasis: function ( xAxis, yAxis, zAxis ) { + + xAxis.setFromMatrixColumn( this, 0 ); + yAxis.setFromMatrixColumn( this, 1 ); + zAxis.setFromMatrixColumn( this, 2 ); + + return this; + + }, + + makeBasis: function ( xAxis, yAxis, zAxis ) { + + this.set( + xAxis.x, yAxis.x, zAxis.x, 0, + xAxis.y, yAxis.y, zAxis.y, 0, + xAxis.z, yAxis.z, zAxis.z, 0, + 0, 0, 0, 1 + ); + + return this; + + }, + + extractRotation: function () { + + var v1; + + return function extractRotation( m ) { + + if ( v1 === undefined ) v1 = new Vector3(); + + var te = this.elements; + var me = m.elements; + + var scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length(); + var scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length(); + var scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length(); + + te[ 0 ] = me[ 0 ] * scaleX; + te[ 1 ] = me[ 1 ] * scaleX; + te[ 2 ] = me[ 2 ] * scaleX; + + te[ 4 ] = me[ 4 ] * scaleY; + te[ 5 ] = me[ 5 ] * scaleY; + te[ 6 ] = me[ 6 ] * scaleY; + + te[ 8 ] = me[ 8 ] * scaleZ; + te[ 9 ] = me[ 9 ] * scaleZ; + te[ 10 ] = me[ 10 ] * scaleZ; + + return this; + + }; + + }(), + + makeRotationFromEuler: function ( euler ) { + + if ( (euler && euler.isEuler) === false ) { + + console.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' ); + + } + + var te = this.elements; + + var x = euler.x, y = euler.y, z = euler.z; + var a = Math.cos( x ), b = Math.sin( x ); + var c = Math.cos( y ), d = Math.sin( y ); + var e = Math.cos( z ), f = Math.sin( z ); + + if ( euler.order === 'XYZ' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = - c * f; + te[ 8 ] = d; + + te[ 1 ] = af + be * d; + te[ 5 ] = ae - bf * d; + te[ 9 ] = - b * c; + + te[ 2 ] = bf - ae * d; + te[ 6 ] = be + af * d; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YXZ' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce + df * b; + te[ 4 ] = de * b - cf; + te[ 8 ] = a * d; + + te[ 1 ] = a * f; + te[ 5 ] = a * e; + te[ 9 ] = - b; + + te[ 2 ] = cf * b - de; + te[ 6 ] = df + ce * b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZXY' ) { + + var ce = c * e, cf = c * f, de = d * e, df = d * f; + + te[ 0 ] = ce - df * b; + te[ 4 ] = - a * f; + te[ 8 ] = de + cf * b; + + te[ 1 ] = cf + de * b; + te[ 5 ] = a * e; + te[ 9 ] = df - ce * b; + + te[ 2 ] = - a * d; + te[ 6 ] = b; + te[ 10 ] = a * c; + + } else if ( euler.order === 'ZYX' ) { + + var ae = a * e, af = a * f, be = b * e, bf = b * f; + + te[ 0 ] = c * e; + te[ 4 ] = be * d - af; + te[ 8 ] = ae * d + bf; + + te[ 1 ] = c * f; + te[ 5 ] = bf * d + ae; + te[ 9 ] = af * d - be; + + te[ 2 ] = - d; + te[ 6 ] = b * c; + te[ 10 ] = a * c; + + } else if ( euler.order === 'YZX' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = bd - ac * f; + te[ 8 ] = bc * f + ad; + + te[ 1 ] = f; + te[ 5 ] = a * e; + te[ 9 ] = - b * e; + + te[ 2 ] = - d * e; + te[ 6 ] = ad * f + bc; + te[ 10 ] = ac - bd * f; + + } else if ( euler.order === 'XZY' ) { + + var ac = a * c, ad = a * d, bc = b * c, bd = b * d; + + te[ 0 ] = c * e; + te[ 4 ] = - f; + te[ 8 ] = d * e; + + te[ 1 ] = ac * f + bd; + te[ 5 ] = a * e; + te[ 9 ] = ad * f - bc; + + te[ 2 ] = bc * f - ad; + te[ 6 ] = b * e; + te[ 10 ] = bd * f + ac; + + } + + // last column + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // bottom row + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + makeRotationFromQuaternion: function ( q ) { + + var te = this.elements; + + var x = q.x, y = q.y, z = q.z, w = q.w; + var x2 = x + x, y2 = y + y, z2 = z + z; + var xx = x * x2, xy = x * y2, xz = x * z2; + var yy = y * y2, yz = y * z2, zz = z * z2; + var wx = w * x2, wy = w * y2, wz = w * z2; + + te[ 0 ] = 1 - ( yy + zz ); + te[ 4 ] = xy - wz; + te[ 8 ] = xz + wy; + + te[ 1 ] = xy + wz; + te[ 5 ] = 1 - ( xx + zz ); + te[ 9 ] = yz - wx; + + te[ 2 ] = xz - wy; + te[ 6 ] = yz + wx; + te[ 10 ] = 1 - ( xx + yy ); + + // last column + te[ 3 ] = 0; + te[ 7 ] = 0; + te[ 11 ] = 0; + + // bottom row + te[ 12 ] = 0; + te[ 13 ] = 0; + te[ 14 ] = 0; + te[ 15 ] = 1; + + return this; + + }, + + lookAt: function () { + + var x, y, z; + + return function lookAt( eye, target, up ) { + + if ( x === undefined ) { + + x = new Vector3(); + y = new Vector3(); + z = new Vector3(); + + } + + var te = this.elements; + + z.subVectors( eye, target ).normalize(); + + if ( z.lengthSq() === 0 ) { + + z.z = 1; + + } + + x.crossVectors( up, z ).normalize(); + + if ( x.lengthSq() === 0 ) { + + z.z += 0.0001; + x.crossVectors( up, z ).normalize(); + + } + + y.crossVectors( z, x ); + + + te[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x; + te[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y; + te[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z; + + return this; + + }; + + }(), + + multiply: function ( m, n ) { + + if ( n !== undefined ) { + + console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' ); + return this.multiplyMatrices( m, n ); + + } + + return this.multiplyMatrices( this, m ); + + }, + + premultiply: function ( m ) { + + return this.multiplyMatrices( m, this ); + + }, + + multiplyMatrices: function ( a, b ) { + + var ae = a.elements; + var be = b.elements; + var te = this.elements; + + var a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ]; + var a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ]; + var a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ]; + var a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ]; + + var b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ]; + var b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ]; + var b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ]; + var b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ]; + + te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; + te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; + te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; + te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; + + te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; + te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; + te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; + te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; + + te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; + te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; + te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; + te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; + + te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; + te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; + te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; + te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; + + return this; + + }, + + multiplyToArray: function ( a, b, r ) { + + var te = this.elements; + + this.multiplyMatrices( a, b ); + + r[ 0 ] = te[ 0 ]; r[ 1 ] = te[ 1 ]; r[ 2 ] = te[ 2 ]; r[ 3 ] = te[ 3 ]; + r[ 4 ] = te[ 4 ]; r[ 5 ] = te[ 5 ]; r[ 6 ] = te[ 6 ]; r[ 7 ] = te[ 7 ]; + r[ 8 ] = te[ 8 ]; r[ 9 ] = te[ 9 ]; r[ 10 ] = te[ 10 ]; r[ 11 ] = te[ 11 ]; + r[ 12 ] = te[ 12 ]; r[ 13 ] = te[ 13 ]; r[ 14 ] = te[ 14 ]; r[ 15 ] = te[ 15 ]; + + return this; + + }, + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s; + te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s; + te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s; + te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s; + + return this; + + }, + + applyToVector3Array: function () { + + var v1; + + return function applyToVector3Array( array, offset, length ) { + + if ( v1 === undefined ) v1 = new Vector3(); + if ( offset === undefined ) offset = 0; + if ( length === undefined ) length = array.length; + + for ( var i = 0, j = offset; i < length; i += 3, j += 3 ) { + + v1.fromArray( array, j ); + v1.applyMatrix4( this ); + v1.toArray( array, j ); + + } + + return array; + + }; + + }(), + + applyToBuffer: function () { + + var v1; + + return function applyToBuffer( buffer, offset, length ) { + + if ( v1 === undefined ) v1 = new Vector3(); + if ( offset === undefined ) offset = 0; + if ( length === undefined ) length = buffer.length / buffer.itemSize; + + for ( var i = 0, j = offset; i < length; i ++, j ++ ) { + + v1.x = buffer.getX( j ); + v1.y = buffer.getY( j ); + v1.z = buffer.getZ( j ); + + v1.applyMatrix4( this ); + + buffer.setXYZ( j, v1.x, v1.y, v1.z ); + + } + + return buffer; + + }; + + }(), + + determinant: function () { + + var te = this.elements; + + var n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ]; + var n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ]; + var n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ]; + var n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ]; + + //TODO: make this more efficient + //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) + + return ( + n41 * ( + + n14 * n23 * n32 + - n13 * n24 * n32 + - n14 * n22 * n33 + + n12 * n24 * n33 + + n13 * n22 * n34 + - n12 * n23 * n34 + ) + + n42 * ( + + n11 * n23 * n34 + - n11 * n24 * n33 + + n14 * n21 * n33 + - n13 * n21 * n34 + + n13 * n24 * n31 + - n14 * n23 * n31 + ) + + n43 * ( + + n11 * n24 * n32 + - n11 * n22 * n34 + - n14 * n21 * n32 + + n12 * n21 * n34 + + n14 * n22 * n31 + - n12 * n24 * n31 + ) + + n44 * ( + - n13 * n22 * n31 + - n11 * n23 * n32 + + n11 * n22 * n33 + + n13 * n21 * n32 + - n12 * n21 * n33 + + n12 * n23 * n31 + ) + + ); + + }, + + transpose: function () { + + var te = this.elements; + var tmp; + + tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp; + tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp; + tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp; + + tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp; + tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp; + tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp; + + return this; + + }, + + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix3: .flattenToArrayOffset is deprecated " + + "- just use .toArray instead." ); + + return this.toArray( array, offset ); + + }, + + getPosition: function () { + + var v1; + + return function getPosition() { + + if ( v1 === undefined ) v1 = new Vector3(); + console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' ); + + return v1.setFromMatrixColumn( this, 3 ); + + }; + + }(), + + setPosition: function ( v ) { + + var te = this.elements; + + te[ 12 ] = v.x; + te[ 13 ] = v.y; + te[ 14 ] = v.z; + + return this; + + }, + + getInverse: function ( m, throwOnDegenerate ) { + + // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm + var te = this.elements, + me = m.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ], + n12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ], + n13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ], + n14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ], + + t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44, + t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44, + t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44, + t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34; + + var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14; + + if ( det === 0 ) { + + var msg = "THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + + } + + var detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv; + te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv; + te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv; + + te[ 4 ] = t12 * detInv; + te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv; + te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv; + te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv; + + te[ 8 ] = t13 * detInv; + te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv; + te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv; + te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv; + + te[ 12 ] = t14 * detInv; + te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv; + te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv; + te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv; + + return this; + + }, + + scale: function ( v ) { + + var te = this.elements; + var x = v.x, y = v.y, z = v.z; + + te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z; + te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z; + te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z; + te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z; + + return this; + + }, + + getMaxScaleOnAxis: function () { + + var te = this.elements; + + var scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ]; + var scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ]; + var scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ]; + + return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) ); + + }, + + makeTranslation: function ( x, y, z ) { + + this.set( + + 1, 0, 0, x, + 0, 1, 0, y, + 0, 0, 1, z, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationX: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + 1, 0, 0, 0, + 0, c, - s, 0, + 0, s, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationY: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, 0, s, 0, + 0, 1, 0, 0, + - s, 0, c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationZ: function ( theta ) { + + var c = Math.cos( theta ), s = Math.sin( theta ); + + this.set( + + c, - s, 0, 0, + s, c, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeRotationAxis: function ( axis, angle ) { + + // Based on http://www.gamedev.net/reference/articles/article1199.asp + + var c = Math.cos( angle ); + var s = Math.sin( angle ); + var t = 1 - c; + var x = axis.x, y = axis.y, z = axis.z; + var tx = t * x, ty = t * y; + + this.set( + + tx * x + c, tx * y - s * z, tx * z + s * y, 0, + tx * y + s * z, ty * y + c, ty * z - s * x, 0, + tx * z - s * y, ty * z + s * x, t * z * z + c, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + makeScale: function ( x, y, z ) { + + this.set( + + x, 0, 0, 0, + 0, y, 0, 0, + 0, 0, z, 0, + 0, 0, 0, 1 + + ); + + return this; + + }, + + compose: function ( position, quaternion, scale ) { + + this.makeRotationFromQuaternion( quaternion ); + this.scale( scale ); + this.setPosition( position ); + + return this; + + }, + + decompose: function () { + + var vector, matrix; + + return function decompose( position, quaternion, scale ) { + + if ( vector === undefined ) { + + vector = new Vector3(); + matrix = new Matrix4(); + + } + + var te = this.elements; + + var sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length(); + var sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length(); + var sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length(); + + // if determine is negative, we need to invert one scale + var det = this.determinant(); + if ( det < 0 ) { + + sx = - sx; + + } + + position.x = te[ 12 ]; + position.y = te[ 13 ]; + position.z = te[ 14 ]; + + // scale the rotation part + + matrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy() + + var invSX = 1 / sx; + var invSY = 1 / sy; + var invSZ = 1 / sz; + + matrix.elements[ 0 ] *= invSX; + matrix.elements[ 1 ] *= invSX; + matrix.elements[ 2 ] *= invSX; + + matrix.elements[ 4 ] *= invSY; + matrix.elements[ 5 ] *= invSY; + matrix.elements[ 6 ] *= invSY; + + matrix.elements[ 8 ] *= invSZ; + matrix.elements[ 9 ] *= invSZ; + matrix.elements[ 10 ] *= invSZ; + + quaternion.setFromRotationMatrix( matrix ); + + scale.x = sx; + scale.y = sy; + scale.z = sz; + + return this; + + }; + + }(), + + makeFrustum: function ( left, right, bottom, top, near, far ) { + + var te = this.elements; + var x = 2 * near / ( right - left ); + var y = 2 * near / ( top - bottom ); + + var a = ( right + left ) / ( right - left ); + var b = ( top + bottom ) / ( top - bottom ); + var c = - ( far + near ) / ( far - near ); + var d = - 2 * far * near / ( far - near ); + + te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0; + te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0; + + return this; + + }, + + makePerspective: function ( fov, aspect, near, far ) { + + var ymax = near * Math.tan( _Math.DEG2RAD * fov * 0.5 ); + var ymin = - ymax; + var xmin = ymin * aspect; + var xmax = ymax * aspect; + + return this.makeFrustum( xmin, xmax, ymin, ymax, near, far ); + + }, + + makeOrthographic: function ( left, right, top, bottom, near, far ) { + + var te = this.elements; + var w = 1.0 / ( right - left ); + var h = 1.0 / ( top - bottom ); + var p = 1.0 / ( far - near ); + + var x = ( right + left ) * w; + var y = ( top + bottom ) * h; + var z = ( far + near ) * p; + + te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x; + te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y; + te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 2 * p; te[ 14 ] = - z; + te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1; + + return this; + + }, + + equals: function ( matrix ) { + + var te = this.elements; + var me = matrix.elements; + + for ( var i = 0; i < 16; i ++ ) { + + if ( te[ i ] !== me[ i ] ) return false; + + } + + return true; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for( var i = 0; i < 16; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + array[ offset + 3 ] = te[ 3 ]; + + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + + array[ offset + 8 ] = te[ 8 ]; + array[ offset + 9 ] = te[ 9 ]; + array[ offset + 10 ] = te[ 10 ]; + array[ offset + 11 ] = te[ 11 ]; + + array[ offset + 12 ] = te[ 12 ]; + array[ offset + 13 ] = te[ 13 ]; + array[ offset + 14 ] = te[ 14 ]; + array[ offset + 15 ] = te[ 15 ]; + + return array; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { + + images = images !== undefined ? images : []; + mapping = mapping !== undefined ? mapping : CubeReflectionMapping; + + Texture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.flipY = false; + + } + + CubeTexture.prototype = Object.create( Texture.prototype ); + CubeTexture.prototype.constructor = CubeTexture; + + CubeTexture.prototype.isCubeTexture = true; + + Object.defineProperty( CubeTexture.prototype, 'images', { + + get: function () { + + return this.image; + + }, + + set: function ( value ) { + + this.image = value; + + } + + } ); + + /** + * @author tschw + * + * Uniforms of a program. + * Those form a tree structure with a special top-level container for the root, + * which you get by calling 'new WebGLUniforms( gl, program, renderer )'. + * + * + * Properties of inner nodes including the top-level container: + * + * .seq - array of nested uniforms + * .map - nested uniforms by name + * + * + * Methods of all nodes except the top-level container: + * + * .setValue( gl, value, [renderer] ) + * + * uploads a uniform value(s) + * the 'renderer' parameter is needed for sampler uniforms + * + * + * Static methods of the top-level container (renderer factorizations): + * + * .upload( gl, seq, values, renderer ) + * + * sets uniforms in 'seq' to 'values[id].value' + * + * .seqWithValue( seq, values ) : filteredSeq + * + * filters 'seq' entries with corresponding entry in values + * + * + * Methods of the top-level container (renderer factorizations): + * + * .setValue( gl, name, value ) + * + * sets uniform with name 'name' to 'value' + * + * .set( gl, obj, prop ) + * + * sets uniform from object and property with same name than uniform + * + * .setOptional( gl, obj, prop ) + * + * like .set for an optional property of the object + * + */ + + var emptyTexture = new Texture(); + var emptyCubeTexture = new CubeTexture(); + + // --- Base for inner nodes (including the root) --- + + function UniformContainer() { + + this.seq = []; + this.map = {}; + + } + + // --- Utilities --- + + // Array Caches (provide typed arrays for temporary by size) + + var arrayCacheF32 = []; + var arrayCacheI32 = []; + + // Flattening for arrays of vectors and matrices + + function flatten( array, nBlocks, blockSize ) { + + var firstElem = array[ 0 ]; + + if ( firstElem <= 0 || firstElem > 0 ) return array; + // unoptimized: ! isNaN( firstElem ) + // see http://jacksondunstan.com/articles/983 + + var n = nBlocks * blockSize, + r = arrayCacheF32[ n ]; + + if ( r === undefined ) { + + r = new Float32Array( n ); + arrayCacheF32[ n ] = r; + + } + + if ( nBlocks !== 0 ) { + + firstElem.toArray( r, 0 ); + + for ( var i = 1, offset = 0; i !== nBlocks; ++ i ) { + + offset += blockSize; + array[ i ].toArray( r, offset ); + + } + + } + + return r; + + } + + // Texture unit allocation + + function allocTexUnits( renderer, n ) { + + var r = arrayCacheI32[ n ]; + + if ( r === undefined ) { + + r = new Int32Array( n ); + arrayCacheI32[ n ] = r; + + } + + for ( var i = 0; i !== n; ++ i ) + r[ i ] = renderer.allocTextureUnit(); + + return r; + + } + + // --- Setters --- + + // Note: Defining these methods externally, because they come in a bunch + // and this way their names minify. + + // Single scalar + + function setValue1f( gl, v ) { gl.uniform1f( this.addr, v ); } + function setValue1i( gl, v ) { gl.uniform1i( this.addr, v ); } + + // Single float vector (from flat array or THREE.VectorN) + + function setValue2fv( gl, v ) { + + if ( v.x === undefined ) gl.uniform2fv( this.addr, v ); + else gl.uniform2f( this.addr, v.x, v.y ); + + } + + function setValue3fv( gl, v ) { + + if ( v.x !== undefined ) + gl.uniform3f( this.addr, v.x, v.y, v.z ); + else if ( v.r !== undefined ) + gl.uniform3f( this.addr, v.r, v.g, v.b ); + else + gl.uniform3fv( this.addr, v ); + + } + + function setValue4fv( gl, v ) { + + if ( v.x === undefined ) gl.uniform4fv( this.addr, v ); + else gl.uniform4f( this.addr, v.x, v.y, v.z, v.w ); + + } + + // Single matrix (from flat array or MatrixN) + + function setValue2fm( gl, v ) { + + gl.uniformMatrix2fv( this.addr, false, v.elements || v ); + + } + + function setValue3fm( gl, v ) { + + gl.uniformMatrix3fv( this.addr, false, v.elements || v ); + + } + + function setValue4fm( gl, v ) { + + gl.uniformMatrix4fv( this.addr, false, v.elements || v ); + + } + + // Single texture (2D / Cube) + + function setValueT1( gl, v, renderer ) { + + var unit = renderer.allocTextureUnit(); + gl.uniform1i( this.addr, unit ); + renderer.setTexture2D( v || emptyTexture, unit ); + + } + + function setValueT6( gl, v, renderer ) { + + var unit = renderer.allocTextureUnit(); + gl.uniform1i( this.addr, unit ); + renderer.setTextureCube( v || emptyCubeTexture, unit ); + + } + + // Integer / Boolean vectors or arrays thereof (always flat arrays) + + function setValue2iv( gl, v ) { gl.uniform2iv( this.addr, v ); } + function setValue3iv( gl, v ) { gl.uniform3iv( this.addr, v ); } + function setValue4iv( gl, v ) { gl.uniform4iv( this.addr, v ); } + + // Helper to pick the right setter for the singular case + + function getSingularSetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1f; // FLOAT + case 0x8b50: return setValue2fv; // _VEC2 + case 0x8b51: return setValue3fv; // _VEC3 + case 0x8b52: return setValue4fv; // _VEC4 + + case 0x8b5a: return setValue2fm; // _MAT2 + case 0x8b5b: return setValue3fm; // _MAT3 + case 0x8b5c: return setValue4fm; // _MAT4 + + case 0x8b5e: return setValueT1; // SAMPLER_2D + case 0x8b60: return setValueT6; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1i; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + + } + + // Array of scalars + + function setValue1fv( gl, v ) { gl.uniform1fv( this.addr, v ); } + function setValue1iv( gl, v ) { gl.uniform1iv( this.addr, v ); } + + // Array of vectors (flat or from THREE classes) + + function setValueV2a( gl, v ) { + + gl.uniform2fv( this.addr, flatten( v, this.size, 2 ) ); + + } + + function setValueV3a( gl, v ) { + + gl.uniform3fv( this.addr, flatten( v, this.size, 3 ) ); + + } + + function setValueV4a( gl, v ) { + + gl.uniform4fv( this.addr, flatten( v, this.size, 4 ) ); + + } + + // Array of matrices (flat or from THREE clases) + + function setValueM2a( gl, v ) { + + gl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) ); + + } + + function setValueM3a( gl, v ) { + + gl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) ); + + } + + function setValueM4a( gl, v ) { + + gl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) ); + + } + + // Array of textures (2D / Cube) + + function setValueT1a( gl, v, renderer ) { + + var n = v.length, + units = allocTexUnits( renderer, n ); + + gl.uniform1iv( this.addr, units ); + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] ); + + } + + } + + function setValueT6a( gl, v, renderer ) { + + var n = v.length, + units = allocTexUnits( renderer, n ); + + gl.uniform1iv( this.addr, units ); + + for ( var i = 0; i !== n; ++ i ) { + + renderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] ); + + } + + } + + // Helper to pick the right setter for a pure (bottom-level) array + + function getPureArraySetter( type ) { + + switch ( type ) { + + case 0x1406: return setValue1fv; // FLOAT + case 0x8b50: return setValueV2a; // _VEC2 + case 0x8b51: return setValueV3a; // _VEC3 + case 0x8b52: return setValueV4a; // _VEC4 + + case 0x8b5a: return setValueM2a; // _MAT2 + case 0x8b5b: return setValueM3a; // _MAT3 + case 0x8b5c: return setValueM4a; // _MAT4 + + case 0x8b5e: return setValueT1a; // SAMPLER_2D + case 0x8b60: return setValueT6a; // SAMPLER_CUBE + + case 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL + case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2 + case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3 + case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4 + + } + + } + + // --- Uniform Classes --- + + function SingleUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.setValue = getSingularSetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + function PureArrayUniform( id, activeInfo, addr ) { + + this.id = id; + this.addr = addr; + this.size = activeInfo.size; + this.setValue = getPureArraySetter( activeInfo.type ); + + // this.path = activeInfo.name; // DEBUG + + } + + function StructuredUniform( id ) { + + this.id = id; + + UniformContainer.call( this ); // mix-in + + } + + StructuredUniform.prototype.setValue = function( gl, value ) { + + // Note: Don't need an extra 'renderer' parameter, since samplers + // are not allowed in structured uniforms. + + var seq = this.seq; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + u.setValue( gl, value[ u.id ] ); + + } + + }; + + // --- Top-level --- + + // Parser - builds up the property tree from the path strings + + var RePathPart = /([\w\d_]+)(\])?(\[|\.)?/g; + + // extracts + // - the identifier (member name or array index) + // - followed by an optional right bracket (found when array index) + // - followed by an optional left bracket or dot (type of subscript) + // + // Note: These portions can be read in a non-overlapping fashion and + // allow straightforward parsing of the hierarchy that WebGL encodes + // in the uniform names. + + function addUniform( container, uniformObject ) { + + container.seq.push( uniformObject ); + container.map[ uniformObject.id ] = uniformObject; + + } + + function parseUniform( activeInfo, addr, container ) { + + var path = activeInfo.name, + pathLength = path.length; + + // reset RegExp object, because of the early exit of a previous run + RePathPart.lastIndex = 0; + + for (; ;) { + + var match = RePathPart.exec( path ), + matchEnd = RePathPart.lastIndex, + + id = match[ 1 ], + idIsIndex = match[ 2 ] === ']', + subscript = match[ 3 ]; + + if ( idIsIndex ) id = id | 0; // convert to integer + + if ( subscript === undefined || + subscript === '[' && matchEnd + 2 === pathLength ) { + // bare name or "pure" bottom-level array "[0]" suffix + + addUniform( container, subscript === undefined ? + new SingleUniform( id, activeInfo, addr ) : + new PureArrayUniform( id, activeInfo, addr ) ); + + break; + + } else { + // step into inner node / create it in case it doesn't exist + + var map = container.map, + next = map[ id ]; + + if ( next === undefined ) { + + next = new StructuredUniform( id ); + addUniform( container, next ); + + } + + container = next; + + } + + } + + } + + // Root Container + + function WebGLUniforms( gl, program, renderer ) { + + UniformContainer.call( this ); + + this.renderer = renderer; + + var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS ); + + for ( var i = 0; i !== n; ++ i ) { + + var info = gl.getActiveUniform( program, i ), + path = info.name, + addr = gl.getUniformLocation( program, path ); + + parseUniform( info, addr, this ); + + } + + } + + WebGLUniforms.prototype.setValue = function( gl, name, value ) { + + var u = this.map[ name ]; + + if ( u !== undefined ) u.setValue( gl, value, this.renderer ); + + }; + + WebGLUniforms.prototype.set = function( gl, object, name ) { + + var u = this.map[ name ]; + + if ( u !== undefined ) u.setValue( gl, object[ name ], this.renderer ); + + }; + + WebGLUniforms.prototype.setOptional = function( gl, object, name ) { + + var v = object[ name ]; + + if ( v !== undefined ) this.setValue( gl, name, v ); + + }; + + + // Static interface + + WebGLUniforms.upload = function( gl, seq, values, renderer ) { + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ], + v = values[ u.id ]; + + if ( v.needsUpdate !== false ) { + // note: always updating when .needsUpdate is undefined + + u.setValue( gl, v.value, renderer ); + + } + + } + + }; + + WebGLUniforms.seqWithValue = function( seq, values ) { + + var r = []; + + for ( var i = 0, n = seq.length; i !== n; ++ i ) { + + var u = seq[ i ]; + if ( u.id in values ) r.push( u ); + + } + + return r; + + }; + + /** + * Uniform Utilities + */ + + var UniformsUtils = { + + merge: function ( uniforms ) { + + var merged = {}; + + for ( var u = 0; u < uniforms.length; u ++ ) { + + var tmp = this.clone( uniforms[ u ] ); + + for ( var p in tmp ) { + + merged[ p ] = tmp[ p ]; + + } + + } + + return merged; + + }, + + clone: function ( uniforms_src ) { + + var uniforms_dst = {}; + + for ( var u in uniforms_src ) { + + uniforms_dst[ u ] = {}; + + for ( var p in uniforms_src[ u ] ) { + + var parameter_src = uniforms_src[ u ][ p ]; + + if ( parameter_src && ( parameter_src.isColor || + parameter_src.isMatrix3 || parameter_src.isMatrix4 || + parameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 || + parameter_src.isTexture ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.clone(); + + } else if ( Array.isArray( parameter_src ) ) { + + uniforms_dst[ u ][ p ] = parameter_src.slice(); + + } else { + + uniforms_dst[ u ][ p ] = parameter_src; + + } + + } + + } + + return uniforms_dst; + + } + + }; + + var alphamap_fragment = "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n"; + + var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n"; + + var alphatest_fragment = "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n"; + + var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n"; + + var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif"; + + var begin_vertex = "\nvec3 transformed = vec3( position );\n"; + + var beginnormal_vertex = "\nvec3 objectNormal = vec3( normal );\n"; + + var bsdfs = "bool testLightInRange( const in float lightDistance, const in float cutoffDistance ) {\n\treturn any( bvec2( cutoffDistance == 0.0, lightDistance < cutoffDistance ) );\n}\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t\t}\n\t\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n"; + + var bumpmap_pars_fragment = "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = dFdx( surf_pos );\n\t\tvec3 vSigmaY = dFdy( surf_pos );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n"; + + var clipping_planes_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\n\t\tvec4 plane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t\t\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\n\t\t\tvec4 plane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t\n\t#endif\n#endif\n"; + + var clipping_planes_pars_fragment = "#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n"; + + var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n"; + + var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n"; + + var color_fragment = "#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif"; + + var color_pars_fragment = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n"; + + var color_pars_vertex = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif"; + + var color_vertex = "#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif"; + + var common = "#define PI 3.14159265359\n#define PI2 6.28318530718\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\n"; + + var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n"; + + var defaultnormal_vertex = "#ifdef FLIP_SIDED\n\tobjectNormal = -objectNormal;\n#endif\nvec3 transformedNormal = normalMatrix * objectNormal;\n"; + + var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n"; + + var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n"; + + var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n"; + + var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n"; + + var encodings_fragment = " gl_FragColor = linearToOutputTexel( gl_FragColor );\n"; + + var encodings_pars_fragment = "\nvec4 LinearToLinear( in vec4 value ) {\n return value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n return vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n return vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n return vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n return vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n float maxComponent = max( max( value.r, value.g ), value.b );\n float fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n return vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n return vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n float maxRGB = max( value.x, max( value.g, value.b ) );\n float M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n M = ceil( M * 255.0 ) / 255.0;\n return vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n return vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n float maxRGB = max( value.x, max( value.g, value.b ) );\n float D = max( maxRange / maxRGB, 1.0 );\n D = min( floor( D ) / 255.0, 1.0 );\n return vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n vec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n Xp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n vec4 vResult;\n vResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n float Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n vResult.w = fract(Le);\n vResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n return vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n float Le = value.z * 255.0 + value.w;\n vec3 Xp_Y_XYZp;\n Xp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n Xp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n Xp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n vec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n return vec4( max(vRGB, 0.0), 1.0 );\n}\n"; + + var envmap_fragment = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n"; + + var envmap_pars_fragment = "#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntenstiy;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n"; + + var envmap_pars_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n"; + + var envmap_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n"; + + var fog_fragment = "#ifdef USE_FOG\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tfloat depth = gl_FragDepthEXT / gl_FragCoord.w;\n\t#else\n\t\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\n\t#endif\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, depth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n"; + + var fog_pars_fragment = "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\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"; + + var lightmap_fragment = "#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n"; + + var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif"; + + var lights_lambert_vertex = "vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n"; + + var lights_pars = "uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tif ( testLightInRange( lightDistance, pointLight.distance ) ) {\n\t\t\tdirectLight.color = pointLight.color;\n\t\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( all( bvec2( angleCos > spotLight.coneCos, testLightInRange( lightDistance, spotLight.distance ) ) ) ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\t#include \n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\t#include \n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n"; + + var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n"; + + var lights_phong_pars_fragment = "varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n"; + + var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n"; + + var lights_physical_pars_fragment = "struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n"; + + var lights_template = "\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t \tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\t\t\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n"; + + var logdepthbuf_fragment = "#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n#endif"; + + var logdepthbuf_pars_fragment = "#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n"; + + var logdepthbuf_pars_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif"; + + var logdepthbuf_vertex = "#ifdef USE_LOGDEPTHBUF\n\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\t#endif\n#endif\n"; + + var map_fragment = "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n"; + + var map_pars_fragment = "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n"; + + var map_particle_fragment = "#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n"; + + var map_particle_pars_fragment = "#ifdef USE_MAP\n\tuniform vec4 offsetRepeat;\n\tuniform sampler2D map;\n#endif\n"; + + var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.r;\n#endif\n"; + + var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif"; + + var morphnormal_vertex = "#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n"; + + var morphtarget_pars_vertex = "#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif"; + + var morphtarget_vertex = "#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n"; + + var normal_flip = "#ifdef DOUBLE_SIDED\n\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n#else\n\tfloat flipNormal = 1.0;\n#endif\n"; + + var normal_fragment = "#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal ) * flipNormal;\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n"; + + var normalmap_pars_fragment = "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n"; + + var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n return 1.0 - 2.0 * rgb.xyz;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n return ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n return linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n return (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n return ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n"; + + var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n"; + + var project_vertex = "#ifdef USE_SKINNING\n\tvec4 mvPosition = modelViewMatrix * skinned;\n#else\n\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n#endif\ngl_Position = projectionMatrix * mvPosition;\n"; + + var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.r;\n#endif\n"; + + var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif"; + + var shadowmap_pars_fragment = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn 1.0;\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 ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n"; + + var shadowmap_pars_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n"; + + var shadowmap_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n"; + + var shadowmask_pars_fragment = "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n"; + + var skinbase_vertex = "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif"; + + var skinning_pars_vertex = "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureWidth;\n\t\tuniform int boneTextureHeight;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureWidth ) );\n\t\t\tfloat y = floor( j / float( boneTextureWidth ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureWidth );\n\t\t\tfloat dy = 1.0 / float( boneTextureHeight );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n"; + + var skinning_vertex = "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\tskinned = bindMatrixInverse * skinned;\n#endif\n"; + + var skinnormal_vertex = "#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n"; + + var specularmap_fragment = "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif"; + + var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif"; + + var tonemapping_fragment = "#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n"; + + var tonemapping_pars_fragment = "#define saturate(a) clamp( a, 0.0, 1.0 )\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n return toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n return saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n return saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n color = max( vec3( 0.0 ), color - 0.004 );\n return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n"; + + var uv_pars_fragment = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif"; + + var uv_pars_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform vec4 offsetRepeat;\n#endif\n"; + + var uv_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n#endif"; + + var uv2_pars_fragment = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif"; + + var uv2_pars_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif"; + + var uv2_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif"; + + var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\t#ifdef USE_SKINNING\n\t\tvec4 worldPosition = modelMatrix * skinned;\n\t#else\n\t\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n\t#endif\n#endif\n"; + + var cube_frag = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n"; + + var cube_vert = "varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n"; + + var depth_frag = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n"; + + var depth_vert = "#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var distanceRGBA_frag = "uniform vec3 lightPos;\nvarying vec4 vWorldPosition;\n#include \n#include \n#include \nvoid main () {\n\t#include \n\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\n}\n"; + + var distanceRGBA_vert = "varying vec4 vWorldPosition;\n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition;\n}\n"; + + var equirect_frag = "uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n"; + + var equirect_vert = "varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n"; + + var linedashed_frag = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var linedashed_vert = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n}\n"; + + var meshbasic_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight;\n\treflectedLight.directDiffuse = vec3( 0.0 );\n\treflectedLight.directSpecular = vec3( 0.0 );\n\treflectedLight.indirectDiffuse = diffuseColor.rgb;\n\treflectedLight.indirectSpecular = vec3( 0.0 );\n\t#include \n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshbasic_vert = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshlambert_frag = "uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshlambert_vert = "#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshphong_frag = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshphong_vert = "#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}\n"; + + var meshphysical_frag = "#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nuniform float envMapIntensity;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var meshphysical_vert = "#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n}\n"; + + var normal_frag = "uniform float opacity;\nvarying vec3 vNormal;\n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( vNormal ), opacity );\n\t#include \n}\n"; + + var normal_vert = "varying vec3 vNormal;\n#include \n#include \n#include \n#include \nvoid main() {\n\tvNormal = normalize( normalMatrix * normal );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var points_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var points_vert = "uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var shadow_frag = "uniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\n}\n"; + + var shadow_vert = "#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; + + var ShaderChunk = { + alphamap_fragment: alphamap_fragment, + alphamap_pars_fragment: alphamap_pars_fragment, + alphatest_fragment: alphatest_fragment, + aomap_fragment: aomap_fragment, + aomap_pars_fragment: aomap_pars_fragment, + begin_vertex: begin_vertex, + beginnormal_vertex: beginnormal_vertex, + bsdfs: bsdfs, + bumpmap_pars_fragment: bumpmap_pars_fragment, + clipping_planes_fragment: clipping_planes_fragment, + clipping_planes_pars_fragment: clipping_planes_pars_fragment, + clipping_planes_pars_vertex: clipping_planes_pars_vertex, + clipping_planes_vertex: clipping_planes_vertex, + color_fragment: color_fragment, + color_pars_fragment: color_pars_fragment, + color_pars_vertex: color_pars_vertex, + color_vertex: color_vertex, + common: common, + cube_uv_reflection_fragment: cube_uv_reflection_fragment, + defaultnormal_vertex: defaultnormal_vertex, + displacementmap_pars_vertex: displacementmap_pars_vertex, + displacementmap_vertex: displacementmap_vertex, + emissivemap_fragment: emissivemap_fragment, + emissivemap_pars_fragment: emissivemap_pars_fragment, + encodings_fragment: encodings_fragment, + encodings_pars_fragment: encodings_pars_fragment, + envmap_fragment: envmap_fragment, + envmap_pars_fragment: envmap_pars_fragment, + envmap_pars_vertex: envmap_pars_vertex, + envmap_vertex: envmap_vertex, + fog_fragment: fog_fragment, + fog_pars_fragment: fog_pars_fragment, + lightmap_fragment: lightmap_fragment, + lightmap_pars_fragment: lightmap_pars_fragment, + lights_lambert_vertex: lights_lambert_vertex, + lights_pars: lights_pars, + lights_phong_fragment: lights_phong_fragment, + lights_phong_pars_fragment: lights_phong_pars_fragment, + lights_physical_fragment: lights_physical_fragment, + lights_physical_pars_fragment: lights_physical_pars_fragment, + lights_template: lights_template, + logdepthbuf_fragment: logdepthbuf_fragment, + logdepthbuf_pars_fragment: logdepthbuf_pars_fragment, + logdepthbuf_pars_vertex: logdepthbuf_pars_vertex, + logdepthbuf_vertex: logdepthbuf_vertex, + map_fragment: map_fragment, + map_pars_fragment: map_pars_fragment, + map_particle_fragment: map_particle_fragment, + map_particle_pars_fragment: map_particle_pars_fragment, + metalnessmap_fragment: metalnessmap_fragment, + metalnessmap_pars_fragment: metalnessmap_pars_fragment, + morphnormal_vertex: morphnormal_vertex, + morphtarget_pars_vertex: morphtarget_pars_vertex, + morphtarget_vertex: morphtarget_vertex, + normal_flip: normal_flip, + normal_fragment: normal_fragment, + normalmap_pars_fragment: normalmap_pars_fragment, + packing: packing, + premultiplied_alpha_fragment: premultiplied_alpha_fragment, + project_vertex: project_vertex, + roughnessmap_fragment: roughnessmap_fragment, + roughnessmap_pars_fragment: roughnessmap_pars_fragment, + shadowmap_pars_fragment: shadowmap_pars_fragment, + shadowmap_pars_vertex: shadowmap_pars_vertex, + shadowmap_vertex: shadowmap_vertex, + shadowmask_pars_fragment: shadowmask_pars_fragment, + skinbase_vertex: skinbase_vertex, + skinning_pars_vertex: skinning_pars_vertex, + skinning_vertex: skinning_vertex, + skinnormal_vertex: skinnormal_vertex, + specularmap_fragment: specularmap_fragment, + specularmap_pars_fragment: specularmap_pars_fragment, + tonemapping_fragment: tonemapping_fragment, + tonemapping_pars_fragment: tonemapping_pars_fragment, + uv_pars_fragment: uv_pars_fragment, + uv_pars_vertex: uv_pars_vertex, + uv_vertex: uv_vertex, + uv2_pars_fragment: uv2_pars_fragment, + uv2_pars_vertex: uv2_pars_vertex, + uv2_vertex: uv2_vertex, + worldpos_vertex: worldpos_vertex, + + cube_frag: cube_frag, + cube_vert: cube_vert, + depth_frag: depth_frag, + depth_vert: depth_vert, + distanceRGBA_frag: distanceRGBA_frag, + distanceRGBA_vert: distanceRGBA_vert, + equirect_frag: equirect_frag, + equirect_vert: equirect_vert, + linedashed_frag: linedashed_frag, + linedashed_vert: linedashed_vert, + meshbasic_frag: meshbasic_frag, + meshbasic_vert: meshbasic_vert, + meshlambert_frag: meshlambert_frag, + meshlambert_vert: meshlambert_vert, + meshphong_frag: meshphong_frag, + meshphong_vert: meshphong_vert, + meshphysical_frag: meshphysical_frag, + meshphysical_vert: meshphysical_vert, + normal_frag: normal_frag, + normal_vert: normal_vert, + points_frag: points_frag, + points_vert: points_vert, + shadow_frag: shadow_frag, + shadow_vert: shadow_vert + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Color( r, g, b ) { + + if ( g === undefined && b === undefined ) { + + // r is THREE.Color, hex or string + return this.set( r ); + + } + + return this.setRGB( r, g, b ); + + } + + Color.prototype = { + + constructor: Color, + + isColor: true, + + r: 1, g: 1, b: 1, + + set: function ( value ) { + + if ( (value && value.isColor) ) { + + this.copy( value ); + + } else if ( typeof value === 'number' ) { + + this.setHex( value ); + + } else if ( typeof value === 'string' ) { + + this.setStyle( value ); + + } + + return this; + + }, + + setScalar: function ( scalar ) { + + this.r = scalar; + this.g = scalar; + this.b = scalar; + + return this; + + }, + + setHex: function ( hex ) { + + hex = Math.floor( hex ); + + this.r = ( hex >> 16 & 255 ) / 255; + this.g = ( hex >> 8 & 255 ) / 255; + this.b = ( hex & 255 ) / 255; + + return this; + + }, + + setRGB: function ( r, g, b ) { + + this.r = r; + this.g = g; + this.b = b; + + return this; + + }, + + setHSL: function () { + + function hue2rgb( p, q, t ) { + + if ( t < 0 ) t += 1; + if ( t > 1 ) t -= 1; + if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t; + if ( t < 1 / 2 ) return q; + if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t ); + return p; + + } + + return function setHSL( h, s, l ) { + + // h,s,l ranges are in 0.0 - 1.0 + h = _Math.euclideanModulo( h, 1 ); + s = _Math.clamp( s, 0, 1 ); + l = _Math.clamp( l, 0, 1 ); + + if ( s === 0 ) { + + this.r = this.g = this.b = l; + + } else { + + var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s ); + var q = ( 2 * l ) - p; + + this.r = hue2rgb( q, p, h + 1 / 3 ); + this.g = hue2rgb( q, p, h ); + this.b = hue2rgb( q, p, h - 1 / 3 ); + + } + + return this; + + }; + + }(), + + setStyle: function ( style ) { + + function handleAlpha( string ) { + + if ( string === undefined ) return; + + if ( parseFloat( string ) < 1 ) { + + console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' ); + + } + + } + + + var m; + + if ( m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec( style ) ) { + + // rgb / hsl + + var color; + var name = m[ 1 ]; + var components = m[ 2 ]; + + switch ( name ) { + + case 'rgb': + case 'rgba': + + if ( color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(255,0,0) rgba(255,0,0,0.5) + this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255; + this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255; + this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + if ( color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) + this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100; + this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100; + this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100; + + handleAlpha( color[ 5 ] ); + + return this; + + } + + break; + + case 'hsl': + case 'hsla': + + if ( color = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) { + + // hsl(120,50%,50%) hsla(120,50%,50%,0.5) + var h = parseFloat( color[ 1 ] ) / 360; + var s = parseInt( color[ 2 ], 10 ) / 100; + var l = parseInt( color[ 3 ], 10 ) / 100; + + handleAlpha( color[ 5 ] ); + + return this.setHSL( h, s, l ); + + } + + break; + + } + + } else if ( m = /^\#([A-Fa-f0-9]+)$/.exec( style ) ) { + + // hex color + + var hex = m[ 1 ]; + var size = hex.length; + + if ( size === 3 ) { + + // #ff0 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255; + + return this; + + } else if ( size === 6 ) { + + // #ff0000 + this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255; + this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255; + this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255; + + return this; + + } + + } + + if ( style && style.length > 0 ) { + + // color keywords + var hex = ColorKeywords[ style ]; + + if ( hex !== undefined ) { + + // red + this.setHex( hex ); + + } else { + + // unknown color + console.warn( 'THREE.Color: Unknown color ' + style ); + + } + + } + + return this; + + }, + + clone: function () { + + return new this.constructor( this.r, this.g, this.b ); + + }, + + copy: function ( color ) { + + this.r = color.r; + this.g = color.g; + this.b = color.b; + + return this; + + }, + + copyGammaToLinear: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + this.r = Math.pow( color.r, gammaFactor ); + this.g = Math.pow( color.g, gammaFactor ); + this.b = Math.pow( color.b, gammaFactor ); + + return this; + + }, + + copyLinearToGamma: function ( color, gammaFactor ) { + + if ( gammaFactor === undefined ) gammaFactor = 2.0; + + var safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0; + + this.r = Math.pow( color.r, safeInverse ); + this.g = Math.pow( color.g, safeInverse ); + this.b = Math.pow( color.b, safeInverse ); + + return this; + + }, + + convertGammaToLinear: function () { + + var r = this.r, g = this.g, b = this.b; + + this.r = r * r; + this.g = g * g; + this.b = b * b; + + return this; + + }, + + convertLinearToGamma: function () { + + this.r = Math.sqrt( this.r ); + this.g = Math.sqrt( this.g ); + this.b = Math.sqrt( this.b ); + + return this; + + }, + + getHex: function () { + + return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0; + + }, + + getHexString: function () { + + return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 ); + + }, + + getHSL: function ( optionalTarget ) { + + // h,s,l ranges are in 0.0 - 1.0 + + var hsl = optionalTarget || { h: 0, s: 0, l: 0 }; + + var r = this.r, g = this.g, b = this.b; + + var max = Math.max( r, g, b ); + var min = Math.min( r, g, b ); + + var hue, saturation; + var lightness = ( min + max ) / 2.0; + + if ( min === max ) { + + hue = 0; + saturation = 0; + + } else { + + var delta = max - min; + + saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min ); + + switch ( max ) { + + case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break; + case g: hue = ( b - r ) / delta + 2; break; + case b: hue = ( r - g ) / delta + 4; break; + + } + + hue /= 6; + + } + + hsl.h = hue; + hsl.s = saturation; + hsl.l = lightness; + + return hsl; + + }, + + getStyle: function () { + + return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')'; + + }, + + offsetHSL: function ( h, s, l ) { + + var hsl = this.getHSL(); + + hsl.h += h; hsl.s += s; hsl.l += l; + + this.setHSL( hsl.h, hsl.s, hsl.l ); + + return this; + + }, + + add: function ( color ) { + + this.r += color.r; + this.g += color.g; + this.b += color.b; + + return this; + + }, + + addColors: function ( color1, color2 ) { + + this.r = color1.r + color2.r; + this.g = color1.g + color2.g; + this.b = color1.b + color2.b; + + return this; + + }, + + addScalar: function ( s ) { + + this.r += s; + this.g += s; + this.b += s; + + return this; + + }, + + sub: function( color ) { + + this.r = Math.max( 0, this.r - color.r ); + this.g = Math.max( 0, this.g - color.g ); + this.b = Math.max( 0, this.b - color.b ); + + return this; + + }, + + multiply: function ( color ) { + + this.r *= color.r; + this.g *= color.g; + this.b *= color.b; + + return this; + + }, + + multiplyScalar: function ( s ) { + + this.r *= s; + this.g *= s; + this.b *= s; + + return this; + + }, + + lerp: function ( color, alpha ) { + + this.r += ( color.r - this.r ) * alpha; + this.g += ( color.g - this.g ) * alpha; + this.b += ( color.b - this.b ) * alpha; + + return this; + + }, + + equals: function ( c ) { + + return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b ); + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + this.r = array[ offset ]; + this.g = array[ offset + 1 ]; + this.b = array[ offset + 2 ]; + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this.r; + array[ offset + 1 ] = this.g; + array[ offset + 2 ] = this.b; + + return array; + + }, + + toJSON: function () { + + return this.getHex(); + + } + + }; + + var ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF, + 'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2, + 'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50, + 'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B, + 'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B, + 'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F, + 'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3, + 'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222, + 'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700, + 'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4, + 'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00, + 'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3, + 'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA, + 'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32, + 'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3, + 'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC, + 'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD, + 'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6, + 'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9, + 'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F, + 'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE, + 'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA, + 'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0, + 'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 }; + + /** + * Uniforms library for shared webgl shaders + */ + + var UniformsLib = { + + common: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + + map: { value: null }, + offsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) }, + + specularMap: { value: null }, + alphaMap: { value: null }, + + envMap: { value: null }, + flipEnvMap: { value: - 1 }, + reflectivity: { value: 1.0 }, + refractionRatio: { value: 0.98 } + + }, + + aomap: { + + aoMap: { value: null }, + aoMapIntensity: { value: 1 } + + }, + + lightmap: { + + lightMap: { value: null }, + lightMapIntensity: { value: 1 } + + }, + + emissivemap: { + + emissiveMap: { value: null } + + }, + + bumpmap: { + + bumpMap: { value: null }, + bumpScale: { value: 1 } + + }, + + normalmap: { + + normalMap: { value: null }, + normalScale: { value: new Vector2( 1, 1 ) } + + }, + + displacementmap: { + + displacementMap: { value: null }, + displacementScale: { value: 1 }, + displacementBias: { value: 0 } + + }, + + roughnessmap: { + + roughnessMap: { value: null } + + }, + + metalnessmap: { + + metalnessMap: { value: null } + + }, + + fog: { + + fogDensity: { value: 0.00025 }, + fogNear: { value: 1 }, + fogFar: { value: 2000 }, + fogColor: { value: new Color( 0xffffff ) } + + }, + + lights: { + + ambientLightColor: { value: [] }, + + directionalLights: { value: [], properties: { + direction: {}, + color: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + directionalShadowMap: { value: [] }, + directionalShadowMatrix: { value: [] }, + + spotLights: { value: [], properties: { + color: {}, + position: {}, + direction: {}, + distance: {}, + coneCos: {}, + penumbraCos: {}, + decay: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + spotShadowMap: { value: [] }, + spotShadowMatrix: { value: [] }, + + pointLights: { value: [], properties: { + color: {}, + position: {}, + decay: {}, + distance: {}, + + shadow: {}, + shadowBias: {}, + shadowRadius: {}, + shadowMapSize: {} + } }, + + pointShadowMap: { value: [] }, + pointShadowMatrix: { value: [] }, + + hemisphereLights: { value: [], properties: { + direction: {}, + skyColor: {}, + groundColor: {} + } } + + }, + + points: { + + diffuse: { value: new Color( 0xeeeeee ) }, + opacity: { value: 1.0 }, + size: { value: 1.0 }, + scale: { value: 1.0 }, + map: { value: null }, + offsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) } + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + */ + + var ShaderLib = { + + basic: { + + uniforms: UniformsUtils.merge( [ + + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.fog + + ] ), + + vertexShader: ShaderChunk.meshbasic_vert, + fragmentShader: ShaderChunk.meshbasic_frag + + }, + + lambert: { + + uniforms: UniformsUtils.merge( [ + + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.fog, + UniformsLib.lights, + + { + emissive : { value: new Color( 0x000000 ) } + } + + ] ), + + vertexShader: ShaderChunk.meshlambert_vert, + fragmentShader: ShaderChunk.meshlambert_frag + + }, + + phong: { + + uniforms: UniformsUtils.merge( [ + + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.fog, + UniformsLib.lights, + + { + emissive : { value: new Color( 0x000000 ) }, + specular : { value: new Color( 0x111111 ) }, + shininess: { value: 30 } + } + + ] ), + + vertexShader: ShaderChunk.meshphong_vert, + fragmentShader: ShaderChunk.meshphong_frag + + }, + + standard: { + + uniforms: UniformsUtils.merge( [ + + UniformsLib.common, + UniformsLib.aomap, + UniformsLib.lightmap, + UniformsLib.emissivemap, + UniformsLib.bumpmap, + UniformsLib.normalmap, + UniformsLib.displacementmap, + UniformsLib.roughnessmap, + UniformsLib.metalnessmap, + UniformsLib.fog, + UniformsLib.lights, + + { + emissive : { value: new Color( 0x000000 ) }, + roughness: { value: 0.5 }, + metalness: { value: 0 }, + envMapIntensity : { value: 1 }, // temporary + } + + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }, + + points: { + + uniforms: UniformsUtils.merge( [ + + UniformsLib.points, + UniformsLib.fog + + ] ), + + vertexShader: ShaderChunk.points_vert, + fragmentShader: ShaderChunk.points_frag + + }, + + dashed: { + + uniforms: UniformsUtils.merge( [ + + UniformsLib.common, + UniformsLib.fog, + + { + scale : { value: 1 }, + dashSize : { value: 1 }, + totalSize: { value: 2 } + } + + ] ), + + vertexShader: ShaderChunk.linedashed_vert, + fragmentShader: ShaderChunk.linedashed_frag + + }, + + depth: { + + uniforms: UniformsUtils.merge( [ + + UniformsLib.common, + UniformsLib.displacementmap + + ] ), + + vertexShader: ShaderChunk.depth_vert, + fragmentShader: ShaderChunk.depth_frag + + }, + + normal: { + + uniforms: { + + opacity : { value: 1.0 } + + }, + + vertexShader: ShaderChunk.normal_vert, + fragmentShader: ShaderChunk.normal_frag + + }, + + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + cube: { + + uniforms: { + tCube: { value: null }, + tFlip: { value: - 1 }, + opacity: { value: 1.0 } + }, + + vertexShader: ShaderChunk.cube_vert, + fragmentShader: ShaderChunk.cube_frag + + }, + + /* ------------------------------------------------------------------------- + // Cube map shader + ------------------------------------------------------------------------- */ + + equirect: { + + uniforms: { + tEquirect: { value: null }, + tFlip: { value: - 1 } + }, + + vertexShader: ShaderChunk.equirect_vert, + fragmentShader: ShaderChunk.equirect_frag + + }, + + distanceRGBA: { + + uniforms: { + + lightPos: { value: new Vector3() } + + }, + + vertexShader: ShaderChunk.distanceRGBA_vert, + fragmentShader: ShaderChunk.distanceRGBA_frag + + } + + }; + + ShaderLib.physical = { + + uniforms: UniformsUtils.merge( [ + + ShaderLib.standard.uniforms, + + { + clearCoat: { value: 0 }, + clearCoatRoughness: { value: 0 } + } + + ] ), + + vertexShader: ShaderChunk.meshphysical_vert, + fragmentShader: ShaderChunk.meshphysical_frag + + }; + + /** + * @author bhouston / http://clara.io + */ + + function Box2( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity ); + + } + + Box2.prototype = { + + constructor: Box2, + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector2(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = + Infinity; + this.max.x = this.max.y = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ); + + }, + + getCenter: function ( optionalTarget ) { + + var result = optionalTarget || new Vector2(); + return this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( optionalTarget ) { + + var result = optionalTarget || new Vector2(); + return this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + containsPoint: function ( point ) { + + if ( point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y ) { + + return false; + + } + + return true; + + }, + + containsBox: function ( box ) { + + if ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) && + ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) ) { + + return true; + + } + + return false; + + }, + + getParameter: function ( point, optionalTarget ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + var result = optionalTarget || new Vector2(); + + return result.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 6 splitting planes to rule out intersections. + + if ( box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y ) { + + return false; + + } + + return true; + + }, + + clampPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new Vector2(); + return result.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector2(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + + }; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function LensFlarePlugin( renderer, flares ) { + + var gl = renderer.context; + var state = renderer.state; + + var vertexBuffer, elementBuffer; + var shader, program, attributes, uniforms; + + var tempTexture, occlusionTexture; + + function init() { + + var vertices = new Float32Array( [ + - 1, - 1, 0, 0, + 1, - 1, 1, 0, + 1, 1, 1, 1, + - 1, 1, 0, 1 + ] ); + + var faces = new Uint16Array( [ + 0, 1, 2, + 0, 2, 3 + ] ); + + // buffers + + vertexBuffer = gl.createBuffer(); + elementBuffer = gl.createBuffer(); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW ); + + // textures + + tempTexture = gl.createTexture(); + occlusionTexture = gl.createTexture(); + + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + + state.bindTexture( gl.TEXTURE_2D, occlusionTexture ); + gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + + shader = { + + vertexShader: [ + + "uniform lowp int renderType;", + + "uniform vec3 screenPosition;", + "uniform vec2 scale;", + "uniform float rotation;", + + "uniform sampler2D occlusionMap;", + + "attribute vec2 position;", + "attribute vec2 uv;", + + "varying vec2 vUV;", + "varying float vVisibility;", + + "void main() {", + + "vUV = uv;", + + "vec2 pos = position;", + + "if ( renderType == 2 ) {", + + "vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );", + "visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );", + + "vVisibility = visibility.r / 9.0;", + "vVisibility *= 1.0 - visibility.g / 9.0;", + "vVisibility *= visibility.b / 9.0;", + "vVisibility *= 1.0 - visibility.a / 9.0;", + + "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", + "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", + + "}", + + "gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );", + + "}" + + ].join( "\n" ), + + fragmentShader: [ + + "uniform lowp int renderType;", + + "uniform sampler2D map;", + "uniform float opacity;", + "uniform vec3 color;", + + "varying vec2 vUV;", + "varying float vVisibility;", + + "void main() {", + + // pink square + + "if ( renderType == 0 ) {", + + "gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );", + + // restore + + "} else if ( renderType == 1 ) {", + + "gl_FragColor = texture2D( map, vUV );", + + // flare + + "} else {", + + "vec4 texture = texture2D( map, vUV );", + "texture.a *= opacity * vVisibility;", + "gl_FragColor = texture;", + "gl_FragColor.rgb *= color;", + + "}", + + "}" + + ].join( "\n" ) + + }; + + program = createProgram( shader ); + + attributes = { + vertex: gl.getAttribLocation ( program, "position" ), + uv: gl.getAttribLocation ( program, "uv" ) + }; + + uniforms = { + renderType: gl.getUniformLocation( program, "renderType" ), + map: gl.getUniformLocation( program, "map" ), + occlusionMap: gl.getUniformLocation( program, "occlusionMap" ), + opacity: gl.getUniformLocation( program, "opacity" ), + color: gl.getUniformLocation( program, "color" ), + scale: gl.getUniformLocation( program, "scale" ), + rotation: gl.getUniformLocation( program, "rotation" ), + screenPosition: gl.getUniformLocation( program, "screenPosition" ) + }; + + } + + /* + * Render lens flares + * Method: renders 16x16 0xff00ff-colored points scattered over the light source area, + * reads these back and calculates occlusion. + */ + + this.render = function ( scene, camera, viewport ) { + + if ( flares.length === 0 ) return; + + var tempPosition = new Vector3(); + + var invAspect = viewport.w / viewport.z, + halfViewportWidth = viewport.z * 0.5, + halfViewportHeight = viewport.w * 0.5; + + var size = 16 / viewport.w, + scale = new Vector2( size * invAspect, size ); + + var screenPosition = new Vector3( 1, 1, 0 ), + screenPositionPixels = new Vector2( 1, 1 ); + + var validArea = new Box2(); + + validArea.min.set( viewport.x, viewport.y ); + validArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) ); + + if ( program === undefined ) { + + init(); + + } + + gl.useProgram( program ); + + state.initAttributes(); + state.enableAttribute( attributes.vertex ); + state.enableAttribute( attributes.uv ); + state.disableUnusedAttributes(); + + // loop through all lens flares to update their occlusion and positions + // setup gl and common used attribs/uniforms + + gl.uniform1i( uniforms.occlusionMap, 0 ); + gl.uniform1i( uniforms.map, 1 ); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 ); + gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + + state.disable( gl.CULL_FACE ); + state.setDepthWrite( false ); + + for ( var i = 0, l = flares.length; i < l; i ++ ) { + + size = 16 / viewport.w; + scale.set( size * invAspect, size ); + + // calc object screen position + + var flare = flares[ i ]; + + tempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] ); + + tempPosition.applyMatrix4( camera.matrixWorldInverse ); + tempPosition.applyProjection( camera.projectionMatrix ); + + // setup arrays for gl programs + + screenPosition.copy( tempPosition ); + + // horizontal and vertical coordinate of the lower left corner of the pixels to copy + + screenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8; + screenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8; + + // screen cull + + if ( validArea.containsPoint( screenPositionPixels ) === true ) { + + // save current RGB to temp texture + + state.activeTexture( gl.TEXTURE0 ); + state.bindTexture( gl.TEXTURE_2D, null ); + state.activeTexture( gl.TEXTURE1 ); + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 ); + + + // render pink quad + + gl.uniform1i( uniforms.renderType, 0 ); + gl.uniform2f( uniforms.scale, scale.x, scale.y ); + gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); + + state.disable( gl.BLEND ); + state.enable( gl.DEPTH_TEST ); + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + + // copy result to occlusionMap + + state.activeTexture( gl.TEXTURE0 ); + state.bindTexture( gl.TEXTURE_2D, occlusionTexture ); + gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 ); + + + // restore graphics + + gl.uniform1i( uniforms.renderType, 1 ); + state.disable( gl.DEPTH_TEST ); + + state.activeTexture( gl.TEXTURE1 ); + state.bindTexture( gl.TEXTURE_2D, tempTexture ); + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + + // update object positions + + flare.positionScreen.copy( screenPosition ); + + if ( flare.customUpdateCallback ) { + + flare.customUpdateCallback( flare ); + + } else { + + flare.updateLensFlares(); + + } + + // render flares + + gl.uniform1i( uniforms.renderType, 2 ); + state.enable( gl.BLEND ); + + for ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) { + + var sprite = flare.lensFlares[ j ]; + + if ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) { + + screenPosition.x = sprite.x; + screenPosition.y = sprite.y; + screenPosition.z = sprite.z; + + size = sprite.size * sprite.scale / viewport.w; + + scale.x = size * invAspect; + scale.y = size; + + gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); + gl.uniform2f( uniforms.scale, scale.x, scale.y ); + gl.uniform1f( uniforms.rotation, sprite.rotation ); + + gl.uniform1f( uniforms.opacity, sprite.opacity ); + gl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b ); + + state.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst ); + renderer.setTexture2D( sprite.texture, 1 ); + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + } + + } + + } + + } + + // restore gl + + state.enable( gl.CULL_FACE ); + state.enable( gl.DEPTH_TEST ); + state.setDepthWrite( true ); + + renderer.resetGLState(); + + }; + + function createProgram( shader ) { + + var program = gl.createProgram(); + + var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); + var vertexShader = gl.createShader( gl.VERTEX_SHADER ); + + var prefix = "precision " + renderer.getPrecision() + " float;\n"; + + gl.shaderSource( fragmentShader, prefix + shader.fragmentShader ); + gl.shaderSource( vertexShader, prefix + shader.vertexShader ); + + gl.compileShader( fragmentShader ); + gl.compileShader( vertexShader ); + + gl.attachShader( program, fragmentShader ); + gl.attachShader( program, vertexShader ); + + gl.linkProgram( program ); + + return program; + + } + + } + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function SpritePlugin( renderer, sprites ) { + + var gl = renderer.context; + var state = renderer.state; + + var vertexBuffer, elementBuffer; + var program, attributes, uniforms; + + var texture; + + // decompose matrixWorld + + var spritePosition = new Vector3(); + var spriteRotation = new Quaternion(); + var spriteScale = new Vector3(); + + function init() { + + var vertices = new Float32Array( [ + - 0.5, - 0.5, 0, 0, + 0.5, - 0.5, 1, 0, + 0.5, 0.5, 1, 1, + - 0.5, 0.5, 0, 1 + ] ); + + var faces = new Uint16Array( [ + 0, 1, 2, + 0, 2, 3 + ] ); + + vertexBuffer = gl.createBuffer(); + elementBuffer = gl.createBuffer(); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW ); + + program = createProgram(); + + attributes = { + position: gl.getAttribLocation ( program, 'position' ), + uv: gl.getAttribLocation ( program, 'uv' ) + }; + + uniforms = { + uvOffset: gl.getUniformLocation( program, 'uvOffset' ), + uvScale: gl.getUniformLocation( program, 'uvScale' ), + + rotation: gl.getUniformLocation( program, 'rotation' ), + scale: gl.getUniformLocation( program, 'scale' ), + + color: gl.getUniformLocation( program, 'color' ), + map: gl.getUniformLocation( program, 'map' ), + opacity: gl.getUniformLocation( program, 'opacity' ), + + modelViewMatrix: gl.getUniformLocation( program, 'modelViewMatrix' ), + projectionMatrix: gl.getUniformLocation( program, 'projectionMatrix' ), + + fogType: gl.getUniformLocation( program, 'fogType' ), + fogDensity: gl.getUniformLocation( program, 'fogDensity' ), + fogNear: gl.getUniformLocation( program, 'fogNear' ), + fogFar: gl.getUniformLocation( program, 'fogFar' ), + fogColor: gl.getUniformLocation( program, 'fogColor' ), + + alphaTest: gl.getUniformLocation( program, 'alphaTest' ) + }; + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = 8; + canvas.height = 8; + + var context = canvas.getContext( '2d' ); + context.fillStyle = 'white'; + context.fillRect( 0, 0, 8, 8 ); + + texture = new Texture( canvas ); + texture.needsUpdate = true; + + } + + this.render = function ( scene, camera ) { + + if ( sprites.length === 0 ) return; + + // setup gl + + if ( program === undefined ) { + + init(); + + } + + gl.useProgram( program ); + + state.initAttributes(); + state.enableAttribute( attributes.position ); + state.enableAttribute( attributes.uv ); + state.disableUnusedAttributes(); + + state.disable( gl.CULL_FACE ); + state.enable( gl.BLEND ); + + gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); + gl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 ); + gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 ); + + gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer ); + + gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements ); + + state.activeTexture( gl.TEXTURE0 ); + gl.uniform1i( uniforms.map, 0 ); + + var oldFogType = 0; + var sceneFogType = 0; + var fog = scene.fog; + + if ( fog ) { + + gl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b ); + + if ( (fog && fog.isFog) ) { + + gl.uniform1f( uniforms.fogNear, fog.near ); + gl.uniform1f( uniforms.fogFar, fog.far ); + + gl.uniform1i( uniforms.fogType, 1 ); + oldFogType = 1; + sceneFogType = 1; + + } else if ( (fog && fog.isFogExp2) ) { + + gl.uniform1f( uniforms.fogDensity, fog.density ); + + gl.uniform1i( uniforms.fogType, 2 ); + oldFogType = 2; + sceneFogType = 2; + + } + + } else { + + gl.uniform1i( uniforms.fogType, 0 ); + oldFogType = 0; + sceneFogType = 0; + + } + + + // update positions and sort + + for ( var i = 0, l = sprites.length; i < l; i ++ ) { + + var sprite = sprites[ i ]; + + sprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld ); + sprite.z = - sprite.modelViewMatrix.elements[ 14 ]; + + } + + sprites.sort( painterSortStable ); + + // render all sprites + + var scale = []; + + for ( var i = 0, l = sprites.length; i < l; i ++ ) { + + var sprite = sprites[ i ]; + var material = sprite.material; + + if ( material.visible === false ) continue; + + gl.uniform1f( uniforms.alphaTest, material.alphaTest ); + gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements ); + + sprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale ); + + scale[ 0 ] = spriteScale.x; + scale[ 1 ] = spriteScale.y; + + var fogType = 0; + + if ( scene.fog && material.fog ) { + + fogType = sceneFogType; + + } + + if ( oldFogType !== fogType ) { + + gl.uniform1i( uniforms.fogType, fogType ); + oldFogType = fogType; + + } + + if ( material.map !== null ) { + + gl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y ); + gl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y ); + + } else { + + gl.uniform2f( uniforms.uvOffset, 0, 0 ); + gl.uniform2f( uniforms.uvScale, 1, 1 ); + + } + + gl.uniform1f( uniforms.opacity, material.opacity ); + gl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b ); + + gl.uniform1f( uniforms.rotation, material.rotation ); + gl.uniform2fv( uniforms.scale, scale ); + + state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst ); + state.setDepthTest( material.depthTest ); + state.setDepthWrite( material.depthWrite ); + + if ( material.map ) { + + renderer.setTexture2D( material.map, 0 ); + + } else { + + renderer.setTexture2D( texture, 0 ); + + } + + gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); + + } + + // restore gl + + state.enable( gl.CULL_FACE ); + + renderer.resetGLState(); + + }; + + function createProgram() { + + var program = gl.createProgram(); + + var vertexShader = gl.createShader( gl.VERTEX_SHADER ); + var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); + + gl.shaderSource( vertexShader, [ + + 'precision ' + renderer.getPrecision() + ' float;', + + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform float rotation;', + 'uniform vec2 scale;', + 'uniform vec2 uvOffset;', + 'uniform vec2 uvScale;', + + 'attribute vec2 position;', + 'attribute vec2 uv;', + + 'varying vec2 vUV;', + + 'void main() {', + + 'vUV = uvOffset + uv * uvScale;', + + 'vec2 alignedPosition = position * scale;', + + 'vec2 rotatedPosition;', + 'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;', + 'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;', + + 'vec4 finalPosition;', + + 'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );', + 'finalPosition.xy += rotatedPosition;', + 'finalPosition = projectionMatrix * finalPosition;', + + 'gl_Position = finalPosition;', + + '}' + + ].join( '\n' ) ); + + gl.shaderSource( fragmentShader, [ + + 'precision ' + renderer.getPrecision() + ' float;', + + 'uniform vec3 color;', + 'uniform sampler2D map;', + 'uniform float opacity;', + + 'uniform int fogType;', + 'uniform vec3 fogColor;', + 'uniform float fogDensity;', + 'uniform float fogNear;', + 'uniform float fogFar;', + 'uniform float alphaTest;', + + 'varying vec2 vUV;', + + 'void main() {', + + 'vec4 texture = texture2D( map, vUV );', + + 'if ( texture.a < alphaTest ) discard;', + + 'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );', + + 'if ( fogType > 0 ) {', + + 'float depth = gl_FragCoord.z / gl_FragCoord.w;', + 'float fogFactor = 0.0;', + + 'if ( fogType == 1 ) {', + + 'fogFactor = smoothstep( fogNear, fogFar, depth );', + + '} else {', + + 'const float LOG2 = 1.442695;', + 'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );', + 'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );', + + '}', + + 'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );', + + '}', + + '}' + + ].join( '\n' ) ); + + gl.compileShader( vertexShader ); + gl.compileShader( fragmentShader ); + + gl.attachShader( program, vertexShader ); + gl.attachShader( program, fragmentShader ); + + gl.linkProgram( program ); + + return program; + + } + + function painterSortStable( a, b ) { + + if ( a.renderOrder !== b.renderOrder ) { + + return a.renderOrder - b.renderOrder; + + } else if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return b.id - a.id; + + } + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Material() { + + Object.defineProperty( this, 'id', { value: MaterialIdCount() } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Material'; + + this.fog = true; + this.lights = true; + + this.blending = NormalBlending; + this.side = FrontSide; + this.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading + this.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors + + this.opacity = 1; + this.transparent = false; + + this.blendSrc = SrcAlphaFactor; + this.blendDst = OneMinusSrcAlphaFactor; + this.blendEquation = AddEquation; + this.blendSrcAlpha = null; + this.blendDstAlpha = null; + this.blendEquationAlpha = null; + + this.depthFunc = LessEqualDepth; + this.depthTest = true; + this.depthWrite = true; + + this.clippingPlanes = null; + this.clipIntersection = false; + this.clipShadows = false; + + this.colorWrite = true; + + this.precision = null; // override the renderer's default precision for this material + + this.polygonOffset = false; + this.polygonOffsetFactor = 0; + this.polygonOffsetUnits = 0; + + this.alphaTest = 0; + this.premultipliedAlpha = false; + + this.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer + + this.visible = true; + + this._needsUpdate = true; + + } + + Material.prototype = { + + constructor: Material, + + isMaterial: true, + + get needsUpdate() { + + return this._needsUpdate; + + }, + + set needsUpdate( value ) { + + if ( value === true ) this.update(); + this._needsUpdate = value; + + }, + + setValues: function ( values ) { + + if ( values === undefined ) return; + + for ( var key in values ) { + + var newValue = values[ key ]; + + if ( newValue === undefined ) { + + console.warn( "THREE.Material: '" + key + "' parameter is undefined." ); + continue; + + } + + var currentValue = this[ key ]; + + if ( currentValue === undefined ) { + + console.warn( "THREE." + this.type + ": '" + key + "' is not a property of this material." ); + continue; + + } + + if ( (currentValue && currentValue.isColor) ) { + + currentValue.set( newValue ); + + } else if ( (currentValue && currentValue.isVector3) && (newValue && newValue.isVector3) ) { + + currentValue.copy( newValue ); + + } else if ( key === 'overdraw' ) { + + // ensure overdraw is backwards-compatible with legacy boolean type + this[ key ] = Number( newValue ); + + } else { + + this[ key ] = newValue; + + } + + } + + }, + + toJSON: function ( meta ) { + + var isRoot = meta === undefined; + + if ( isRoot ) { + + meta = { + textures: {}, + images: {} + }; + + } + + var data = { + metadata: { + version: 4.4, + type: 'Material', + generator: 'Material.toJSON' + } + }; + + // standard Material serialization + data.uuid = this.uuid; + data.type = this.type; + + if ( this.name !== '' ) data.name = this.name; + + if ( (this.color && this.color.isColor) ) data.color = this.color.getHex(); + + if ( this.roughness !== undefined ) data.roughness = this.roughness; + if ( this.metalness !== undefined ) data.metalness = this.metalness; + + if ( (this.emissive && this.emissive.isColor) ) data.emissive = this.emissive.getHex(); + if ( (this.specular && this.specular.isColor) ) data.specular = this.specular.getHex(); + if ( this.shininess !== undefined ) data.shininess = this.shininess; + + if ( (this.map && this.map.isTexture) ) data.map = this.map.toJSON( meta ).uuid; + if ( (this.alphaMap && this.alphaMap.isTexture) ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid; + if ( (this.lightMap && this.lightMap.isTexture) ) data.lightMap = this.lightMap.toJSON( meta ).uuid; + if ( (this.bumpMap && this.bumpMap.isTexture) ) { + + data.bumpMap = this.bumpMap.toJSON( meta ).uuid; + data.bumpScale = this.bumpScale; + + } + if ( (this.normalMap && this.normalMap.isTexture) ) { + + data.normalMap = this.normalMap.toJSON( meta ).uuid; + data.normalScale = this.normalScale.toArray(); + + } + if ( (this.displacementMap && this.displacementMap.isTexture) ) { + + data.displacementMap = this.displacementMap.toJSON( meta ).uuid; + data.displacementScale = this.displacementScale; + data.displacementBias = this.displacementBias; + + } + if ( (this.roughnessMap && this.roughnessMap.isTexture) ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid; + if ( (this.metalnessMap && this.metalnessMap.isTexture) ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid; + + if ( (this.emissiveMap && this.emissiveMap.isTexture) ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid; + if ( (this.specularMap && this.specularMap.isTexture) ) data.specularMap = this.specularMap.toJSON( meta ).uuid; + + if ( (this.envMap && this.envMap.isTexture) ) { + + data.envMap = this.envMap.toJSON( meta ).uuid; + data.reflectivity = this.reflectivity; // Scale behind envMap + + } + + if ( this.size !== undefined ) data.size = this.size; + if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation; + + if ( this.blending !== NormalBlending ) data.blending = this.blending; + if ( this.shading !== SmoothShading ) data.shading = this.shading; + if ( this.side !== FrontSide ) data.side = this.side; + if ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors; + + if ( this.opacity < 1 ) data.opacity = this.opacity; + if ( this.transparent === true ) data.transparent = this.transparent; + + data.depthFunc = this.depthFunc; + data.depthTest = this.depthTest; + data.depthWrite = this.depthWrite; + + if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest; + if ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha; + if ( this.wireframe === true ) data.wireframe = this.wireframe; + if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth; + if ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap; + if ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin; + + data.skinning = this.skinning; + data.morphTargets = this.morphTargets; + + // TODO: Copied from Object3D.toJSON + + function extractFromCache( cache ) { + + var values = []; + + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + + return values; + + } + + if ( isRoot ) { + + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + + if ( textures.length > 0 ) data.textures = textures; + if ( images.length > 0 ) data.images = images; + + } + + return data; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.name = source.name; + + this.fog = source.fog; + this.lights = source.lights; + + this.blending = source.blending; + this.side = source.side; + this.shading = source.shading; + this.vertexColors = source.vertexColors; + + this.opacity = source.opacity; + this.transparent = source.transparent; + + this.blendSrc = source.blendSrc; + this.blendDst = source.blendDst; + this.blendEquation = source.blendEquation; + this.blendSrcAlpha = source.blendSrcAlpha; + this.blendDstAlpha = source.blendDstAlpha; + this.blendEquationAlpha = source.blendEquationAlpha; + + this.depthFunc = source.depthFunc; + this.depthTest = source.depthTest; + this.depthWrite = source.depthWrite; + + this.colorWrite = source.colorWrite; + + this.precision = source.precision; + + this.polygonOffset = source.polygonOffset; + this.polygonOffsetFactor = source.polygonOffsetFactor; + this.polygonOffsetUnits = source.polygonOffsetUnits; + + this.alphaTest = source.alphaTest; + + this.premultipliedAlpha = source.premultipliedAlpha; + + this.overdraw = source.overdraw; + + this.visible = source.visible; + this.clipShadows = source.clipShadows; + this.clipIntersection = source.clipIntersection; + + var srcPlanes = source.clippingPlanes, + dstPlanes = null; + + if ( srcPlanes !== null ) { + + var n = srcPlanes.length; + dstPlanes = new Array( n ); + + for ( var i = 0; i !== n; ++ i ) + dstPlanes[ i ] = srcPlanes[ i ].clone(); + + } + + this.clippingPlanes = dstPlanes; + + return this; + + }, + + update: function () { + + this.dispatchEvent( { type: 'update' } ); + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + }; + + Object.assign( Material.prototype, EventDispatcher.prototype ); + + var count$1 = 0; + function MaterialIdCount() { return count$1++; } + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * defines: { "label" : "value" }, + * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } }, + * + * fragmentShader: , + * vertexShader: , + * + * wireframe: , + * wireframeLinewidth: , + * + * lights: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function ShaderMaterial( parameters ) { + + Material.call( this ); + + this.type = 'ShaderMaterial'; + + this.defines = {}; + this.uniforms = {}; + + this.vertexShader = 'void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}'; + this.fragmentShader = 'void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}'; + + this.linewidth = 1; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; // set to use scene fog + this.lights = false; // set to use scene lights + this.clipping = false; // set to use user-defined clipping planes + + this.skinning = false; // set to use skinning attribute streams + this.morphTargets = false; // set to use morph targets + this.morphNormals = false; // set to use morph normals + + this.extensions = { + derivatives: false, // set to use derivatives + fragDepth: false, // set to use fragment depth values + drawBuffers: false, // set to use draw buffers + shaderTextureLOD: false // set to use shader texture LOD + }; + + // When rendered geometry doesn't include these attributes but the material does, + // use these default values in WebGL. This avoids errors when buffer data is missing. + this.defaultAttributeValues = { + 'color': [ 1, 1, 1 ], + 'uv': [ 0, 0 ], + 'uv2': [ 0, 0 ] + }; + + this.index0AttributeName = undefined; + + if ( parameters !== undefined ) { + + if ( parameters.attributes !== undefined ) { + + console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' ); + + } + + this.setValues( parameters ); + + } + + } + + ShaderMaterial.prototype = Object.create( Material.prototype ); + ShaderMaterial.prototype.constructor = ShaderMaterial; + + ShaderMaterial.prototype.isShaderMaterial = true; + + ShaderMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.fragmentShader = source.fragmentShader; + this.vertexShader = source.vertexShader; + + this.uniforms = UniformsUtils.clone( source.uniforms ); + + this.defines = source.defines; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + this.lights = source.lights; + this.clipping = source.clipping; + + this.skinning = source.skinning; + + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + this.extensions = source.extensions; + + return this; + + }; + + ShaderMaterial.prototype.toJSON = function ( meta ) { + + var data = Material.prototype.toJSON.call( this, meta ); + + data.uniforms = this.uniforms; + data.vertexShader = this.vertexShader; + data.fragmentShader = this.fragmentShader; + + return data; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / https://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * + * opacity: , + * + * map: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * wireframe: , + * wireframeLinewidth: + * } + */ + + function MeshDepthMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshDepthMaterial'; + + this.depthPacking = BasicDepthPacking; + + this.skinning = false; + this.morphTargets = false; + + this.map = null; + + this.alphaMap = null; + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + MeshDepthMaterial.prototype = Object.create( Material.prototype ); + MeshDepthMaterial.prototype.constructor = MeshDepthMaterial; + + MeshDepthMaterial.prototype.isMeshDepthMaterial = true; + + MeshDepthMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.depthPacking = source.depthPacking; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + this.map = source.map; + + this.alphaMap = source.alphaMap; + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + + }; + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + */ + + function Box3( min, max ) { + + this.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity ); + this.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity ); + + } + + Box3.prototype = { + + constructor: Box3, + + isBox3: true, + + set: function ( min, max ) { + + this.min.copy( min ); + this.max.copy( max ); + + return this; + + }, + + setFromArray: function ( array ) { + + var minX = + Infinity; + var minY = + Infinity; + var minZ = + Infinity; + + var maxX = - Infinity; + var maxY = - Infinity; + var maxZ = - Infinity; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var x = array[ i ]; + var y = array[ i + 1 ]; + var z = array[ i + 2 ]; + + if ( x < minX ) minX = x; + if ( y < minY ) minY = y; + if ( z < minZ ) minZ = z; + + if ( x > maxX ) maxX = x; + if ( y > maxY ) maxY = y; + if ( z > maxZ ) maxZ = z; + + } + + this.min.set( minX, minY, minZ ); + this.max.set( maxX, maxY, maxZ ); + + }, + + setFromPoints: function ( points ) { + + this.makeEmpty(); + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + this.expandByPoint( points[ i ] ); + + } + + return this; + + }, + + setFromCenterAndSize: function () { + + var v1 = new Vector3(); + + return function setFromCenterAndSize( center, size ) { + + var halfSize = v1.copy( size ).multiplyScalar( 0.5 ); + + this.min.copy( center ).sub( halfSize ); + this.max.copy( center ).add( halfSize ); + + return this; + + }; + + }(), + + setFromObject: function () { + + // Computes the world-axis-aligned bounding box of an object (including its children), + // accounting for both the object's, and children's, world transforms + + var v1 = new Vector3(); + + return function setFromObject( object ) { + + var scope = this; + + object.updateMatrixWorld( true ); + + this.makeEmpty(); + + object.traverse( function ( node ) { + + var geometry = node.geometry; + + if ( geometry !== undefined ) { + + if ( (geometry && geometry.isGeometry) ) { + + var vertices = geometry.vertices; + + for ( var i = 0, il = vertices.length; i < il; i ++ ) { + + v1.copy( vertices[ i ] ); + v1.applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } else if ( (geometry && geometry.isBufferGeometry) ) { + + var attribute = geometry.attributes.position; + + if ( attribute !== undefined ) { + + var array, offset, stride; + + if ( (attribute && attribute.isInterleavedBufferAttribute) ) { + + array = attribute.data.array; + offset = attribute.offset; + stride = attribute.data.stride; + + } else { + + array = attribute.array; + offset = 0; + stride = 3; + + } + + for ( var i = offset, il = array.length; i < il; i += stride ) { + + v1.fromArray( array, i ); + v1.applyMatrix4( node.matrixWorld ); + + scope.expandByPoint( v1 ); + + } + + } + + } + + } + + } ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( box ) { + + this.min.copy( box.min ); + this.max.copy( box.max ); + + return this; + + }, + + makeEmpty: function () { + + this.min.x = this.min.y = this.min.z = + Infinity; + this.max.x = this.max.y = this.max.z = - Infinity; + + return this; + + }, + + isEmpty: function () { + + // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes + + return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z ); + + }, + + getCenter: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); + + }, + + getSize: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min ); + + }, + + expandByPoint: function ( point ) { + + this.min.min( point ); + this.max.max( point ); + + return this; + + }, + + expandByVector: function ( vector ) { + + this.min.sub( vector ); + this.max.add( vector ); + + return this; + + }, + + expandByScalar: function ( scalar ) { + + this.min.addScalar( - scalar ); + this.max.addScalar( scalar ); + + return this; + + }, + + containsPoint: function ( point ) { + + if ( point.x < this.min.x || point.x > this.max.x || + point.y < this.min.y || point.y > this.max.y || + point.z < this.min.z || point.z > this.max.z ) { + + return false; + + } + + return true; + + }, + + containsBox: function ( box ) { + + if ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) && + ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) && + ( this.min.z <= box.min.z ) && ( box.max.z <= this.max.z ) ) { + + return true; + + } + + return false; + + }, + + getParameter: function ( point, optionalTarget ) { + + // This can potentially have a divide by zero if the box + // has a size dimension of 0. + + var result = optionalTarget || new Vector3(); + + return result.set( + ( point.x - this.min.x ) / ( this.max.x - this.min.x ), + ( point.y - this.min.y ) / ( this.max.y - this.min.y ), + ( point.z - this.min.z ) / ( this.max.z - this.min.z ) + ); + + }, + + intersectsBox: function ( box ) { + + // using 6 splitting planes to rule out intersections. + + if ( box.max.x < this.min.x || box.min.x > this.max.x || + box.max.y < this.min.y || box.min.y > this.max.y || + box.max.z < this.min.z || box.min.z > this.max.z ) { + + return false; + + } + + return true; + + }, + + intersectsSphere: ( function () { + + var closestPoint; + + return function intersectsSphere( sphere ) { + + if ( closestPoint === undefined ) closestPoint = new Vector3(); + + // Find the point on the AABB closest to the sphere center. + this.clampPoint( sphere.center, closestPoint ); + + // If that point is inside the sphere, the AABB and sphere intersect. + return closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius ); + + }; + + } )(), + + intersectsPlane: function ( plane ) { + + // We compute the minimum and maximum dot product values. If those values + // are on the same side (back or front) of the plane, then there is no intersection. + + var min, max; + + if ( plane.normal.x > 0 ) { + + min = plane.normal.x * this.min.x; + max = plane.normal.x * this.max.x; + + } else { + + min = plane.normal.x * this.max.x; + max = plane.normal.x * this.min.x; + + } + + if ( plane.normal.y > 0 ) { + + min += plane.normal.y * this.min.y; + max += plane.normal.y * this.max.y; + + } else { + + min += plane.normal.y * this.max.y; + max += plane.normal.y * this.min.y; + + } + + if ( plane.normal.z > 0 ) { + + min += plane.normal.z * this.min.z; + max += plane.normal.z * this.max.z; + + } else { + + min += plane.normal.z * this.max.z; + max += plane.normal.z * this.min.z; + + } + + return ( min <= plane.constant && max >= plane.constant ); + + }, + + clampPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.copy( point ).clamp( this.min, this.max ); + + }, + + distanceToPoint: function () { + + var v1 = new Vector3(); + + return function distanceToPoint( point ) { + + var clampedPoint = v1.copy( point ).clamp( this.min, this.max ); + return clampedPoint.sub( point ).length(); + + }; + + }(), + + getBoundingSphere: function () { + + var v1 = new Vector3(); + + return function getBoundingSphere( optionalTarget ) { + + var result = optionalTarget || new Sphere(); + + this.getCenter( result.center ); + + result.radius = this.getSize( v1 ).length() * 0.5; + + return result; + + }; + + }(), + + intersect: function ( box ) { + + this.min.max( box.min ); + this.max.min( box.max ); + + // ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values. + if( this.isEmpty() ) this.makeEmpty(); + + return this; + + }, + + union: function ( box ) { + + this.min.min( box.min ); + this.max.max( box.max ); + + return this; + + }, + + applyMatrix4: function () { + + var points = [ + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3(), + new Vector3() + ]; + + return function applyMatrix4( matrix ) { + + // transform of empty box is an empty box. + if( this.isEmpty() ) return this; + + // NOTE: I am using a binary pattern to specify all 2^3 combinations below + points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000 + points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001 + points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010 + points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011 + points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100 + points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101 + points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110 + points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111 + + this.setFromPoints( points ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.min.add( offset ); + this.max.add( offset ); + + return this; + + }, + + equals: function ( box ) { + + return box.min.equals( this.min ) && box.max.equals( this.max ); + + } + + }; + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Sphere( center, radius ) { + + this.center = ( center !== undefined ) ? center : new Vector3(); + this.radius = ( radius !== undefined ) ? radius : 0; + + } + + Sphere.prototype = { + + constructor: Sphere, + + set: function ( center, radius ) { + + this.center.copy( center ); + this.radius = radius; + + return this; + + }, + + setFromPoints: function () { + + var box = new Box3(); + + return function setFromPoints( points, optionalCenter ) { + + var center = this.center; + + if ( optionalCenter !== undefined ) { + + center.copy( optionalCenter ); + + } else { + + box.setFromPoints( points ).getCenter( center ); + + } + + var maxRadiusSq = 0; + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) ); + + } + + this.radius = Math.sqrt( maxRadiusSq ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( sphere ) { + + this.center.copy( sphere.center ); + this.radius = sphere.radius; + + return this; + + }, + + empty: function () { + + return ( this.radius <= 0 ); + + }, + + containsPoint: function ( point ) { + + return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) ); + + }, + + distanceToPoint: function ( point ) { + + return ( point.distanceTo( this.center ) - this.radius ); + + }, + + intersectsSphere: function ( sphere ) { + + var radiusSum = this.radius + sphere.radius; + + return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsSphere( this ); + + }, + + intersectsPlane: function ( plane ) { + + // We use the following equation to compute the signed distance from + // the center of the sphere to the plane. + // + // distance = q * n - d + // + // If this distance is greater than the radius of the sphere, + // then there is no intersection. + + return Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius; + + }, + + clampPoint: function ( point, optionalTarget ) { + + var deltaLengthSq = this.center.distanceToSquared( point ); + + var result = optionalTarget || new Vector3(); + + result.copy( point ); + + if ( deltaLengthSq > ( this.radius * this.radius ) ) { + + result.sub( this.center ).normalize(); + result.multiplyScalar( this.radius ).add( this.center ); + + } + + return result; + + }, + + getBoundingBox: function ( optionalTarget ) { + + var box = optionalTarget || new Box3(); + + box.set( this.center, this.center ); + box.expandByScalar( this.radius ); + + return box; + + }, + + applyMatrix4: function ( matrix ) { + + this.center.applyMatrix4( matrix ); + this.radius = this.radius * matrix.getMaxScaleOnAxis(); + + return this; + + }, + + translate: function ( offset ) { + + this.center.add( offset ); + + return this; + + }, + + equals: function ( sphere ) { + + return sphere.center.equals( this.center ) && ( sphere.radius === this.radius ); + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + * @author tschw + */ + + function Matrix3() { + + this.elements = new Float32Array( [ + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ] ); + + if ( arguments.length > 0 ) { + + console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' ); + + } + + } + + Matrix3.prototype = { + + constructor: Matrix3, + + isMatrix3: true, + + set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) { + + var te = this.elements; + + te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31; + te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32; + te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33; + + return this; + + }, + + identity: function () { + + this.set( + + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + + ); + + return this; + + }, + + clone: function () { + + return new this.constructor().fromArray( this.elements ); + + }, + + copy: function ( m ) { + + var me = m.elements; + + this.set( + + me[ 0 ], me[ 3 ], me[ 6 ], + me[ 1 ], me[ 4 ], me[ 7 ], + me[ 2 ], me[ 5 ], me[ 8 ] + + ); + + return this; + + }, + + setFromMatrix4: function( m ) { + + var me = m.elements; + + this.set( + + me[ 0 ], me[ 4 ], me[ 8 ], + me[ 1 ], me[ 5 ], me[ 9 ], + me[ 2 ], me[ 6 ], me[ 10 ] + + ); + + return this; + + }, + + applyToVector3Array: function () { + + var v1; + + return function applyToVector3Array( array, offset, length ) { + + if ( v1 === undefined ) v1 = new Vector3(); + if ( offset === undefined ) offset = 0; + if ( length === undefined ) length = array.length; + + for ( var i = 0, j = offset; i < length; i += 3, j += 3 ) { + + v1.fromArray( array, j ); + v1.applyMatrix3( this ); + v1.toArray( array, j ); + + } + + return array; + + }; + + }(), + + applyToBuffer: function () { + + var v1; + + return function applyToBuffer( buffer, offset, length ) { + + if ( v1 === undefined ) v1 = new Vector3(); + if ( offset === undefined ) offset = 0; + if ( length === undefined ) length = buffer.length / buffer.itemSize; + + for ( var i = 0, j = offset; i < length; i ++, j ++ ) { + + v1.x = buffer.getX( j ); + v1.y = buffer.getY( j ); + v1.z = buffer.getZ( j ); + + v1.applyMatrix3( this ); + + buffer.setXYZ( j, v1.x, v1.y, v1.z ); + + } + + return buffer; + + }; + + }(), + + multiplyScalar: function ( s ) { + + var te = this.elements; + + te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s; + te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s; + te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s; + + return this; + + }, + + determinant: function () { + + var te = this.elements; + + var a = te[ 0 ], b = te[ 1 ], c = te[ 2 ], + d = te[ 3 ], e = te[ 4 ], f = te[ 5 ], + g = te[ 6 ], h = te[ 7 ], i = te[ 8 ]; + + return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g; + + }, + + getInverse: function ( matrix, throwOnDegenerate ) { + + if ( (matrix && matrix.isMatrix4) ) { + + console.error( "THREE.Matrix3.getInverse no longer takes a Matrix4 argument." ); + + } + + var me = matrix.elements, + te = this.elements, + + n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], + n12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ], + n13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ], + + t11 = n33 * n22 - n32 * n23, + t12 = n32 * n13 - n33 * n12, + t13 = n23 * n12 - n22 * n13, + + det = n11 * t11 + n21 * t12 + n31 * t13; + + if ( det === 0 ) { + + var msg = "THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0"; + + if ( throwOnDegenerate === true ) { + + throw new Error( msg ); + + } else { + + console.warn( msg ); + + } + + return this.identity(); + } + + var detInv = 1 / det; + + te[ 0 ] = t11 * detInv; + te[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv; + te[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv; + + te[ 3 ] = t12 * detInv; + te[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv; + te[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv; + + te[ 6 ] = t13 * detInv; + te[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv; + te[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv; + + return this; + + }, + + transpose: function () { + + var tmp, m = this.elements; + + tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp; + tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp; + tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp; + + return this; + + }, + + flattenToArrayOffset: function ( array, offset ) { + + console.warn( "THREE.Matrix3: .flattenToArrayOffset is deprecated " + + "- just use .toArray instead." ); + + return this.toArray( array, offset ); + + }, + + getNormalMatrix: function ( matrix4 ) { + + return this.setFromMatrix4( matrix4 ).getInverse( this ).transpose(); + + }, + + transposeIntoArray: function ( r ) { + + var m = this.elements; + + r[ 0 ] = m[ 0 ]; + r[ 1 ] = m[ 3 ]; + r[ 2 ] = m[ 6 ]; + r[ 3 ] = m[ 1 ]; + r[ 4 ] = m[ 4 ]; + r[ 5 ] = m[ 7 ]; + r[ 6 ] = m[ 2 ]; + r[ 7 ] = m[ 5 ]; + r[ 8 ] = m[ 8 ]; + + return this; + + }, + + fromArray: function ( array, offset ) { + + if ( offset === undefined ) offset = 0; + + for( var i = 0; i < 9; i ++ ) { + + this.elements[ i ] = array[ i + offset ]; + + } + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + var te = this.elements; + + array[ offset ] = te[ 0 ]; + array[ offset + 1 ] = te[ 1 ]; + array[ offset + 2 ] = te[ 2 ]; + + array[ offset + 3 ] = te[ 3 ]; + array[ offset + 4 ] = te[ 4 ]; + array[ offset + 5 ] = te[ 5 ]; + + array[ offset + 6 ] = te[ 6 ]; + array[ offset + 7 ] = te[ 7 ]; + array[ offset + 8 ] = te[ 8 ]; + + return array; + + } + + }; + + /** + * @author bhouston / http://clara.io + */ + + function Plane( normal, constant ) { + + this.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 ); + this.constant = ( constant !== undefined ) ? constant : 0; + + } + + Plane.prototype = { + + constructor: Plane, + + set: function ( normal, constant ) { + + this.normal.copy( normal ); + this.constant = constant; + + return this; + + }, + + setComponents: function ( x, y, z, w ) { + + this.normal.set( x, y, z ); + this.constant = w; + + return this; + + }, + + setFromNormalAndCoplanarPoint: function ( normal, point ) { + + this.normal.copy( normal ); + this.constant = - point.dot( this.normal ); // must be this.normal, not normal, as this.normal is normalized + + return this; + + }, + + setFromCoplanarPoints: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function setFromCoplanarPoints( a, b, c ) { + + var normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize(); + + // Q: should an error be thrown if normal is zero (e.g. degenerate plane)? + + this.setFromNormalAndCoplanarPoint( normal, a ); + + return this; + + }; + + }(), + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( plane ) { + + this.normal.copy( plane.normal ); + this.constant = plane.constant; + + return this; + + }, + + normalize: function () { + + // Note: will lead to a divide by zero if the plane is invalid. + + var inverseNormalLength = 1.0 / this.normal.length(); + this.normal.multiplyScalar( inverseNormalLength ); + this.constant *= inverseNormalLength; + + return this; + + }, + + negate: function () { + + this.constant *= - 1; + this.normal.negate(); + + return this; + + }, + + distanceToPoint: function ( point ) { + + return this.normal.dot( point ) + this.constant; + + }, + + distanceToSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) - sphere.radius; + + }, + + projectPoint: function ( point, optionalTarget ) { + + return this.orthoPoint( point, optionalTarget ).sub( point ).negate(); + + }, + + orthoPoint: function ( point, optionalTarget ) { + + var perpendicularMagnitude = this.distanceToPoint( point ); + + var result = optionalTarget || new Vector3(); + return result.copy( this.normal ).multiplyScalar( perpendicularMagnitude ); + + }, + + intersectLine: function () { + + var v1 = new Vector3(); + + return function intersectLine( line, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + var direction = line.delta( v1 ); + + var denominator = this.normal.dot( direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( this.distanceToPoint( line.start ) === 0 ) { + + return result.copy( line.start ); + + } + + // Unsure if this is the correct method to handle this case. + return undefined; + + } + + var t = - ( line.start.dot( this.normal ) + this.constant ) / denominator; + + if ( t < 0 || t > 1 ) { + + return undefined; + + } + + return result.copy( direction ).multiplyScalar( t ).add( line.start ); + + }; + + }(), + + intersectsLine: function ( line ) { + + // Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. + + var startSign = this.distanceToPoint( line.start ); + var endSign = this.distanceToPoint( line.end ); + + return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 ); + + }, + + intersectsBox: function ( box ) { + + return box.intersectsPlane( this ); + + }, + + intersectsSphere: function ( sphere ) { + + return sphere.intersectsPlane( this ); + + }, + + coplanarPoint: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.copy( this.normal ).multiplyScalar( - this.constant ); + + }, + + applyMatrix4: function () { + + var v1 = new Vector3(); + var m1 = new Matrix3(); + + return function applyMatrix4( matrix, optionalNormalMatrix ) { + + var referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix ); + + // transform normal based on theory here: + // http://www.songho.ca/opengl/gl_normaltransform.html + var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix ); + var normal = this.normal.applyMatrix3( normalMatrix ).normalize(); + + // recalculate constant (like in setFromNormalAndCoplanarPoint) + this.constant = - referencePoint.dot( normal ); + + return this; + + }; + + }(), + + translate: function ( offset ) { + + this.constant = this.constant - offset.dot( this.normal ); + + return this; + + }, + + equals: function ( plane ) { + + return plane.normal.equals( this.normal ) && ( plane.constant === this.constant ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author bhouston / http://clara.io + */ + + function Frustum( p0, p1, p2, p3, p4, p5 ) { + + this.planes = [ + + ( p0 !== undefined ) ? p0 : new Plane(), + ( p1 !== undefined ) ? p1 : new Plane(), + ( p2 !== undefined ) ? p2 : new Plane(), + ( p3 !== undefined ) ? p3 : new Plane(), + ( p4 !== undefined ) ? p4 : new Plane(), + ( p5 !== undefined ) ? p5 : new Plane() + + ]; + + } + + Frustum.prototype = { + + constructor: Frustum, + + set: function ( p0, p1, p2, p3, p4, p5 ) { + + var planes = this.planes; + + planes[ 0 ].copy( p0 ); + planes[ 1 ].copy( p1 ); + planes[ 2 ].copy( p2 ); + planes[ 3 ].copy( p3 ); + planes[ 4 ].copy( p4 ); + planes[ 5 ].copy( p5 ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( frustum ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + planes[ i ].copy( frustum.planes[ i ] ); + + } + + return this; + + }, + + setFromMatrix: function ( m ) { + + var planes = this.planes; + var me = m.elements; + var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ]; + var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ]; + var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ]; + var me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ]; + + planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize(); + planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize(); + planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize(); + planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize(); + planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); + planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); + + return this; + + }, + + intersectsObject: function () { + + var sphere = new Sphere(); + + return function intersectsObject( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) + geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ) + .applyMatrix4( object.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSprite: function () { + + var sphere = new Sphere(); + + return function intersectsSprite( sprite ) { + + sphere.center.set( 0, 0, 0 ); + sphere.radius = 0.7071067811865476; + sphere.applyMatrix4( sprite.matrixWorld ); + + return this.intersectsSphere( sphere ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + var planes = this.planes; + var center = sphere.center; + var negRadius = - sphere.radius; + + for ( var i = 0; i < 6; i ++ ) { + + var distance = planes[ i ].distanceToPoint( center ); + + if ( distance < negRadius ) { + + return false; + + } + + } + + return true; + + }, + + intersectsBox: function () { + + var p1 = new Vector3(), + p2 = new Vector3(); + + return function intersectsBox( box ) { + + var planes = this.planes; + + for ( var i = 0; i < 6 ; i ++ ) { + + var plane = planes[ i ]; + + p1.x = plane.normal.x > 0 ? box.min.x : box.max.x; + p2.x = plane.normal.x > 0 ? box.max.x : box.min.x; + p1.y = plane.normal.y > 0 ? box.min.y : box.max.y; + p2.y = plane.normal.y > 0 ? box.max.y : box.min.y; + p1.z = plane.normal.z > 0 ? box.min.z : box.max.z; + p2.z = plane.normal.z > 0 ? box.max.z : box.min.z; + + var d1 = plane.distanceToPoint( p1 ); + var d2 = plane.distanceToPoint( p2 ); + + // if both outside plane, no intersection + + if ( d1 < 0 && d2 < 0 ) { + + return false; + + } + + } + + return true; + + }; + + }(), + + + containsPoint: function ( point ) { + + var planes = this.planes; + + for ( var i = 0; i < 6; i ++ ) { + + if ( planes[ i ].distanceToPoint( point ) < 0 ) { + + return false; + + } + + } + + return true; + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLShadowMap( _renderer, _lights, _objects, capabilities ) { + + var _gl = _renderer.context, + _state = _renderer.state, + _frustum = new Frustum(), + _projScreenMatrix = new Matrix4(), + + _lightShadows = _lights.shadows, + + _shadowMapSize = new Vector2(), + _maxShadowMapSize = new Vector2( capabilities.maxTextureSize, capabilities.maxTextureSize ), + + _lookTarget = new Vector3(), + _lightPositionWorld = new Vector3(), + + _renderList = [], + + _MorphingFlag = 1, + _SkinningFlag = 2, + + _NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1, + + _depthMaterials = new Array( _NumberOfMaterialVariants ), + _distanceMaterials = new Array( _NumberOfMaterialVariants ), + + _materialCache = {}; + + var cubeDirections = [ + new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ), + new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 ) + ]; + + var cubeUps = [ + new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), + new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 ) + ]; + + var cube2DViewPorts = [ + new Vector4(), new Vector4(), new Vector4(), + new Vector4(), new Vector4(), new Vector4() + ]; + + // init + + var depthMaterialTemplate = new MeshDepthMaterial(); + depthMaterialTemplate.depthPacking = RGBADepthPacking; + depthMaterialTemplate.clipping = true; + + var distanceShader = ShaderLib[ "distanceRGBA" ]; + var distanceUniforms = UniformsUtils.clone( distanceShader.uniforms ); + + for ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) { + + var useMorphing = ( i & _MorphingFlag ) !== 0; + var useSkinning = ( i & _SkinningFlag ) !== 0; + + var depthMaterial = depthMaterialTemplate.clone(); + depthMaterial.morphTargets = useMorphing; + depthMaterial.skinning = useSkinning; + + _depthMaterials[ i ] = depthMaterial; + + var distanceMaterial = new ShaderMaterial( { + defines: { + 'USE_SHADOWMAP': '' + }, + uniforms: distanceUniforms, + vertexShader: distanceShader.vertexShader, + fragmentShader: distanceShader.fragmentShader, + morphTargets: useMorphing, + skinning: useSkinning, + clipping: true + } ); + + _distanceMaterials[ i ] = distanceMaterial; + + } + + // + + var scope = this; + + this.enabled = false; + + this.autoUpdate = true; + this.needsUpdate = false; + + this.type = PCFShadowMap; + + this.renderReverseSided = true; + this.renderSingleSided = true; + + this.render = function ( scene, camera ) { + + if ( scope.enabled === false ) return; + if ( scope.autoUpdate === false && scope.needsUpdate === false ) return; + + if ( _lightShadows.length === 0 ) return; + + // Set GL state for depth map. + _state.clearColor( 1, 1, 1, 1 ); + _state.disable( _gl.BLEND ); + _state.setDepthTest( true ); + _state.setScissorTest( false ); + + // render depth map + + var faceCount, isPointLight; + + for ( var i = 0, il = _lightShadows.length; i < il; i ++ ) { + + var light = _lightShadows[ i ]; + var shadow = light.shadow; + + if ( shadow === undefined ) { + + console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' ); + continue; + + } + + var shadowCamera = shadow.camera; + + _shadowMapSize.copy( shadow.mapSize ); + _shadowMapSize.min( _maxShadowMapSize ); + + if ( (light && light.isPointLight) ) { + + faceCount = 6; + isPointLight = true; + + var vpWidth = _shadowMapSize.x; + var vpHeight = _shadowMapSize.y; + + // These viewports map a cube-map onto a 2D texture with the + // following orientation: + // + // xzXZ + // y Y + // + // X - Positive x direction + // x - Negative x direction + // Y - Positive y direction + // y - Negative y direction + // Z - Positive z direction + // z - Negative z direction + + // positive X + cube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight ); + // negative X + cube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight ); + // positive Z + cube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight ); + // negative Z + cube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight ); + // positive Y + cube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight ); + // negative Y + cube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight ); + + _shadowMapSize.x *= 4.0; + _shadowMapSize.y *= 2.0; + + } else { + + faceCount = 1; + isPointLight = false; + + } + + if ( shadow.map === null ) { + + var pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat }; + + shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars ); + + shadowCamera.updateProjectionMatrix(); + + } + + if ( (shadow && shadow.isSpotLightShadow) ) { + + shadow.update( light ); + + } + + var shadowMap = shadow.map; + var shadowMatrix = shadow.matrix; + + _lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); + shadowCamera.position.copy( _lightPositionWorld ); + + _renderer.setRenderTarget( shadowMap ); + _renderer.clear(); + + // render shadow map for each cube face (if omni-directional) or + // run a single pass if not + + for ( var face = 0; face < faceCount; face ++ ) { + + if ( isPointLight ) { + + _lookTarget.copy( shadowCamera.position ); + _lookTarget.add( cubeDirections[ face ] ); + shadowCamera.up.copy( cubeUps[ face ] ); + shadowCamera.lookAt( _lookTarget ); + + var vpDimensions = cube2DViewPorts[ face ]; + _state.viewport( vpDimensions ); + + } else { + + _lookTarget.setFromMatrixPosition( light.target.matrixWorld ); + shadowCamera.lookAt( _lookTarget ); + + } + + shadowCamera.updateMatrixWorld(); + shadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld ); + + // compute shadow matrix + + shadowMatrix.set( + 0.5, 0.0, 0.0, 0.5, + 0.0, 0.5, 0.0, 0.5, + 0.0, 0.0, 0.5, 0.5, + 0.0, 0.0, 0.0, 1.0 + ); + + shadowMatrix.multiply( shadowCamera.projectionMatrix ); + shadowMatrix.multiply( shadowCamera.matrixWorldInverse ); + + // update camera matrices and frustum + + _projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + // set object matrices & frustum culling + + _renderList.length = 0; + + projectObject( scene, camera, shadowCamera ); + + // render shadow map + // render regular objects + + for ( var j = 0, jl = _renderList.length; j < jl; j ++ ) { + + var object = _renderList[ j ]; + var geometry = _objects.update( object ); + var material = object.material; + + if ( (material && material.isMultiMaterial) ) { + + var groups = geometry.groups; + var materials = material.materials; + + for ( var k = 0, kl = groups.length; k < kl; k ++ ) { + + var group = groups[ k ]; + var groupMaterial = materials[ group.materialIndex ]; + + if ( groupMaterial.visible === true ) { + + var depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group ); + + } + + } + + } else { + + var depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld ); + _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null ); + + } + + } + + } + + } + + // Restore GL state. + var clearColor = _renderer.getClearColor(), + clearAlpha = _renderer.getClearAlpha(); + _renderer.setClearColor( clearColor, clearAlpha ); + + scope.needsUpdate = false; + + }; + + function getDepthMaterial( object, material, isPointLight, lightPositionWorld ) { + + var geometry = object.geometry; + + var result = null; + + var materialVariants = _depthMaterials; + var customMaterial = object.customDepthMaterial; + + if ( isPointLight ) { + + materialVariants = _distanceMaterials; + customMaterial = object.customDistanceMaterial; + + } + + if ( ! customMaterial ) { + + var useMorphing = false; + + if ( material.morphTargets ) { + + if ( (geometry && geometry.isBufferGeometry) ) { + + useMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0; + + } else if ( (geometry && geometry.isGeometry) ) { + + useMorphing = geometry.morphTargets && geometry.morphTargets.length > 0; + + } + + } + + var useSkinning = object.isSkinnedMesh && material.skinning; + + var variantIndex = 0; + + if ( useMorphing ) variantIndex |= _MorphingFlag; + if ( useSkinning ) variantIndex |= _SkinningFlag; + + result = materialVariants[ variantIndex ]; + + } else { + + result = customMaterial; + + } + + if ( _renderer.localClippingEnabled && + material.clipShadows === true && + material.clippingPlanes.length !== 0 ) { + + // in this case we need a unique material instance reflecting the + // appropriate state + + var keyA = result.uuid, keyB = material.uuid; + + var materialsForVariant = _materialCache[ keyA ]; + + if ( materialsForVariant === undefined ) { + + materialsForVariant = {}; + _materialCache[ keyA ] = materialsForVariant; + + } + + var cachedMaterial = materialsForVariant[ keyB ]; + + if ( cachedMaterial === undefined ) { + + cachedMaterial = result.clone(); + materialsForVariant[ keyB ] = cachedMaterial; + + } + + result = cachedMaterial; + + } + + result.visible = material.visible; + result.wireframe = material.wireframe; + + var side = material.side; + + if ( scope.renderSingleSided && side == DoubleSide ) { + + side = FrontSide; + + } + + if ( scope.renderReverseSided ) { + + if ( side === FrontSide ) side = BackSide; + else if ( side === BackSide ) side = FrontSide; + + } + + result.side = side; + + result.clipShadows = material.clipShadows; + result.clippingPlanes = material.clippingPlanes; + + result.wireframeLinewidth = material.wireframeLinewidth; + result.linewidth = material.linewidth; + + if ( isPointLight && result.uniforms.lightPos !== undefined ) { + + result.uniforms.lightPos.value.copy( lightPositionWorld ); + + } + + return result; + + } + + function projectObject( object, camera, shadowCamera ) { + + if ( object.visible === false ) return; + + var visible = ( object.layers.mask & camera.layers.mask ) !== 0; + + if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) { + + if ( object.castShadow && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) { + + var material = object.material; + + if ( material.visible === true ) { + + object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld ); + _renderList.push( object ); + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera, shadowCamera ); + + } + + } + + } + + /** + * @author bhouston / http://clara.io + */ + + function Ray( origin, direction ) { + + this.origin = ( origin !== undefined ) ? origin : new Vector3(); + this.direction = ( direction !== undefined ) ? direction : new Vector3(); + + } + + Ray.prototype = { + + constructor: Ray, + + set: function ( origin, direction ) { + + this.origin.copy( origin ); + this.direction.copy( direction ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( ray ) { + + this.origin.copy( ray.origin ); + this.direction.copy( ray.direction ); + + return this; + + }, + + at: function ( t, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + return result.copy( this.direction ).multiplyScalar( t ).add( this.origin ); + + }, + + lookAt: function ( v ) { + + this.direction.copy( v ).sub( this.origin ).normalize(); + + return this; + + }, + + recast: function () { + + var v1 = new Vector3(); + + return function recast( t ) { + + this.origin.copy( this.at( t, v1 ) ); + + return this; + + }; + + }(), + + closestPointToPoint: function ( point, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + result.subVectors( point, this.origin ); + var directionDistance = result.dot( this.direction ); + + if ( directionDistance < 0 ) { + + return result.copy( this.origin ); + + } + + return result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + }, + + distanceToPoint: function ( point ) { + + return Math.sqrt( this.distanceSqToPoint( point ) ); + + }, + + distanceSqToPoint: function () { + + var v1 = new Vector3(); + + return function distanceSqToPoint( point ) { + + var directionDistance = v1.subVectors( point, this.origin ).dot( this.direction ); + + // point behind the ray + + if ( directionDistance < 0 ) { + + return this.origin.distanceToSquared( point ); + + } + + v1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); + + return v1.distanceToSquared( point ); + + }; + + }(), + + distanceSqToSegment: function () { + + var segCenter = new Vector3(); + var segDir = new Vector3(); + var diff = new Vector3(); + + return function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h + // It returns the min distance between the ray and the segment + // defined by v0 and v1 + // It can also set two optional targets : + // - The closest point on the ray + // - The closest point on the segment + + segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 ); + segDir.copy( v1 ).sub( v0 ).normalize(); + diff.copy( this.origin ).sub( segCenter ); + + var segExtent = v0.distanceTo( v1 ) * 0.5; + var a01 = - this.direction.dot( segDir ); + var b0 = diff.dot( this.direction ); + var b1 = - diff.dot( segDir ); + var c = diff.lengthSq(); + var det = Math.abs( 1 - a01 * a01 ); + var s0, s1, sqrDist, extDet; + + if ( det > 0 ) { + + // The ray and segment are not parallel. + + s0 = a01 * b1 - b0; + s1 = a01 * b0 - b1; + extDet = segExtent * det; + + if ( s0 >= 0 ) { + + if ( s1 >= - extDet ) { + + if ( s1 <= extDet ) { + + // region 0 + // Minimum at interior points of ray and segment. + + var invDet = 1 / det; + s0 *= invDet; + s1 *= invDet; + sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c; + + } else { + + // region 1 + + s1 = segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + // region 5 + + s1 = - segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } else { + + if ( s1 <= - extDet ) { + + // region 4 + + s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } else if ( s1 <= extDet ) { + + // region 3 + + s0 = 0; + s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = s1 * ( s1 + 2 * b1 ) + c; + + } else { + + // region 2 + + s0 = Math.max( 0, - ( a01 * segExtent + b0 ) ); + s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + } + + } else { + + // Ray and segment are parallel. + + s1 = ( a01 > 0 ) ? - segExtent : segExtent; + s0 = Math.max( 0, - ( a01 * s1 + b0 ) ); + sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c; + + } + + if ( optionalPointOnRay ) { + + optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin ); + + } + + if ( optionalPointOnSegment ) { + + optionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter ); + + } + + return sqrDist; + + }; + + }(), + + intersectSphere: function () { + + var v1 = new Vector3(); + + return function intersectSphere( sphere, optionalTarget ) { + + v1.subVectors( sphere.center, this.origin ); + var tca = v1.dot( this.direction ); + var d2 = v1.dot( v1 ) - tca * tca; + var radius2 = sphere.radius * sphere.radius; + + if ( d2 > radius2 ) return null; + + var thc = Math.sqrt( radius2 - d2 ); + + // t0 = first intersect point - entrance on front of sphere + var t0 = tca - thc; + + // t1 = second intersect point - exit point on back of sphere + var t1 = tca + thc; + + // test to see if both t0 and t1 are behind the ray - if so, return null + if ( t0 < 0 && t1 < 0 ) return null; + + // test to see if t0 is behind the ray: + // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, + // in order to always return an intersect point that is in front of the ray. + if ( t0 < 0 ) return this.at( t1, optionalTarget ); + + // else t0 is in front of the ray, so return the first collision point scaled by t0 + return this.at( t0, optionalTarget ); + + }; + + }(), + + intersectsSphere: function ( sphere ) { + + return this.distanceToPoint( sphere.center ) <= sphere.radius; + + }, + + distanceToPlane: function ( plane ) { + + var denominator = plane.normal.dot( this.direction ); + + if ( denominator === 0 ) { + + // line is coplanar, return origin + if ( plane.distanceToPoint( this.origin ) === 0 ) { + + return 0; + + } + + // Null is preferable to undefined since undefined means.... it is undefined + + return null; + + } + + var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator; + + // Return if the ray never intersects the plane + + return t >= 0 ? t : null; + + }, + + intersectPlane: function ( plane, optionalTarget ) { + + var t = this.distanceToPlane( plane ); + + if ( t === null ) { + + return null; + + } + + return this.at( t, optionalTarget ); + + }, + + + + intersectsPlane: function ( plane ) { + + // check if the ray lies on the plane first + + var distToPoint = plane.distanceToPoint( this.origin ); + + if ( distToPoint === 0 ) { + + return true; + + } + + var denominator = plane.normal.dot( this.direction ); + + if ( denominator * distToPoint < 0 ) { + + return true; + + } + + // ray origin is behind the plane (and is pointing behind it) + + return false; + + }, + + intersectBox: function ( box, optionalTarget ) { + + var tmin, tmax, tymin, tymax, tzmin, tzmax; + + var invdirx = 1 / this.direction.x, + invdiry = 1 / this.direction.y, + invdirz = 1 / this.direction.z; + + var origin = this.origin; + + if ( invdirx >= 0 ) { + + tmin = ( box.min.x - origin.x ) * invdirx; + tmax = ( box.max.x - origin.x ) * invdirx; + + } else { + + tmin = ( box.max.x - origin.x ) * invdirx; + tmax = ( box.min.x - origin.x ) * invdirx; + + } + + if ( invdiry >= 0 ) { + + tymin = ( box.min.y - origin.y ) * invdiry; + tymax = ( box.max.y - origin.y ) * invdiry; + + } else { + + tymin = ( box.max.y - origin.y ) * invdiry; + tymax = ( box.min.y - origin.y ) * invdiry; + + } + + if ( ( tmin > tymax ) || ( tymin > tmax ) ) return null; + + // These lines also handle the case where tmin or tmax is NaN + // (result of 0 * Infinity). x !== x returns true if x is NaN + + if ( tymin > tmin || tmin !== tmin ) tmin = tymin; + + if ( tymax < tmax || tmax !== tmax ) tmax = tymax; + + if ( invdirz >= 0 ) { + + tzmin = ( box.min.z - origin.z ) * invdirz; + tzmax = ( box.max.z - origin.z ) * invdirz; + + } else { + + tzmin = ( box.max.z - origin.z ) * invdirz; + tzmax = ( box.min.z - origin.z ) * invdirz; + + } + + if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null; + + if ( tzmin > tmin || tmin !== tmin ) tmin = tzmin; + + if ( tzmax < tmax || tmax !== tmax ) tmax = tzmax; + + //return point closest to the ray (positive side) + + if ( tmax < 0 ) return null; + + return this.at( tmin >= 0 ? tmin : tmax, optionalTarget ); + + }, + + intersectsBox: ( function () { + + var v = new Vector3(); + + return function intersectsBox( box ) { + + return this.intersectBox( box, v ) !== null; + + }; + + } )(), + + intersectTriangle: function () { + + // Compute the offset origin, edges, and normal. + var diff = new Vector3(); + var edge1 = new Vector3(); + var edge2 = new Vector3(); + var normal = new Vector3(); + + return function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) { + + // from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h + + edge1.subVectors( b, a ); + edge2.subVectors( c, a ); + normal.crossVectors( edge1, edge2 ); + + // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, + // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by + // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) + // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) + // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) + var DdN = this.direction.dot( normal ); + var sign; + + if ( DdN > 0 ) { + + if ( backfaceCulling ) return null; + sign = 1; + + } else if ( DdN < 0 ) { + + sign = - 1; + DdN = - DdN; + + } else { + + return null; + + } + + diff.subVectors( this.origin, a ); + var DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) ); + + // b1 < 0, no intersection + if ( DdQxE2 < 0 ) { + + return null; + + } + + var DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) ); + + // b2 < 0, no intersection + if ( DdE1xQ < 0 ) { + + return null; + + } + + // b1+b2 > 1, no intersection + if ( DdQxE2 + DdE1xQ > DdN ) { + + return null; + + } + + // Line intersects triangle, check if ray does. + var QdN = - sign * diff.dot( normal ); + + // t < 0, no intersection + if ( QdN < 0 ) { + + return null; + + } + + // Ray intersects triangle. + return this.at( QdN / DdN, optionalTarget ); + + }; + + }(), + + applyMatrix4: function ( matrix4 ) { + + this.direction.add( this.origin ).applyMatrix4( matrix4 ); + this.origin.applyMatrix4( matrix4 ); + this.direction.sub( this.origin ); + this.direction.normalize(); + + return this; + + }, + + equals: function ( ray ) { + + return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + * @author bhouston / http://clara.io + */ + + function Euler( x, y, z, order ) { + + this._x = x || 0; + this._y = y || 0; + this._z = z || 0; + this._order = order || Euler.DefaultOrder; + + } + + Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]; + + Euler.DefaultOrder = 'XYZ'; + + Euler.prototype = { + + constructor: Euler, + + isEuler: true, + + get x () { + + return this._x; + + }, + + set x ( value ) { + + this._x = value; + this.onChangeCallback(); + + }, + + get y () { + + return this._y; + + }, + + set y ( value ) { + + this._y = value; + this.onChangeCallback(); + + }, + + get z () { + + return this._z; + + }, + + set z ( value ) { + + this._z = value; + this.onChangeCallback(); + + }, + + get order () { + + return this._order; + + }, + + set order ( value ) { + + this._order = value; + this.onChangeCallback(); + + }, + + set: function ( x, y, z, order ) { + + this._x = x; + this._y = y; + this._z = z; + this._order = order || this._order; + + this.onChangeCallback(); + + return this; + + }, + + clone: function () { + + return new this.constructor( this._x, this._y, this._z, this._order ); + + }, + + copy: function ( euler ) { + + this._x = euler._x; + this._y = euler._y; + this._z = euler._z; + this._order = euler._order; + + this.onChangeCallback(); + + return this; + + }, + + setFromRotationMatrix: function ( m, order, update ) { + + var clamp = _Math.clamp; + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + var te = m.elements; + var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ]; + var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ]; + var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ]; + + order = order || this._order; + + if ( order === 'XYZ' ) { + + this._y = Math.asin( clamp( m13, - 1, 1 ) ); + + if ( Math.abs( m13 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m33 ); + this._z = Math.atan2( - m12, m11 ); + + } else { + + this._x = Math.atan2( m32, m22 ); + this._z = 0; + + } + + } else if ( order === 'YXZ' ) { + + this._x = Math.asin( - clamp( m23, - 1, 1 ) ); + + if ( Math.abs( m23 ) < 0.99999 ) { + + this._y = Math.atan2( m13, m33 ); + this._z = Math.atan2( m21, m22 ); + + } else { + + this._y = Math.atan2( - m31, m11 ); + this._z = 0; + + } + + } else if ( order === 'ZXY' ) { + + this._x = Math.asin( clamp( m32, - 1, 1 ) ); + + if ( Math.abs( m32 ) < 0.99999 ) { + + this._y = Math.atan2( - m31, m33 ); + this._z = Math.atan2( - m12, m22 ); + + } else { + + this._y = 0; + this._z = Math.atan2( m21, m11 ); + + } + + } else if ( order === 'ZYX' ) { + + this._y = Math.asin( - clamp( m31, - 1, 1 ) ); + + if ( Math.abs( m31 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m33 ); + this._z = Math.atan2( m21, m11 ); + + } else { + + this._x = 0; + this._z = Math.atan2( - m12, m22 ); + + } + + } else if ( order === 'YZX' ) { + + this._z = Math.asin( clamp( m21, - 1, 1 ) ); + + if ( Math.abs( m21 ) < 0.99999 ) { + + this._x = Math.atan2( - m23, m22 ); + this._y = Math.atan2( - m31, m11 ); + + } else { + + this._x = 0; + this._y = Math.atan2( m13, m33 ); + + } + + } else if ( order === 'XZY' ) { + + this._z = Math.asin( - clamp( m12, - 1, 1 ) ); + + if ( Math.abs( m12 ) < 0.99999 ) { + + this._x = Math.atan2( m32, m22 ); + this._y = Math.atan2( m13, m11 ); + + } else { + + this._x = Math.atan2( - m23, m33 ); + this._y = 0; + + } + + } else { + + console.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order ); + + } + + this._order = order; + + if ( update !== false ) this.onChangeCallback(); + + return this; + + }, + + setFromQuaternion: function () { + + var matrix; + + return function setFromQuaternion( q, order, update ) { + + if ( matrix === undefined ) matrix = new Matrix4(); + + matrix.makeRotationFromQuaternion( q ); + + return this.setFromRotationMatrix( matrix, order, update ); + + }; + + }(), + + setFromVector3: function ( v, order ) { + + return this.set( v.x, v.y, v.z, order || this._order ); + + }, + + reorder: function () { + + // WARNING: this discards revolution information -bhouston + + var q = new Quaternion(); + + return function reorder( newOrder ) { + + q.setFromEuler( this ); + + return this.setFromQuaternion( q, newOrder ); + + }; + + }(), + + equals: function ( euler ) { + + return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order ); + + }, + + fromArray: function ( array ) { + + this._x = array[ 0 ]; + this._y = array[ 1 ]; + this._z = array[ 2 ]; + if ( array[ 3 ] !== undefined ) this._order = array[ 3 ]; + + this.onChangeCallback(); + + return this; + + }, + + toArray: function ( array, offset ) { + + if ( array === undefined ) array = []; + if ( offset === undefined ) offset = 0; + + array[ offset ] = this._x; + array[ offset + 1 ] = this._y; + array[ offset + 2 ] = this._z; + array[ offset + 3 ] = this._order; + + return array; + + }, + + toVector3: function ( optionalResult ) { + + if ( optionalResult ) { + + return optionalResult.set( this._x, this._y, this._z ); + + } else { + + return new Vector3( this._x, this._y, this._z ); + + } + + }, + + onChange: function ( callback ) { + + this.onChangeCallback = callback; + + return this; + + }, + + onChangeCallback: function () {} + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Layers() { + + this.mask = 1; + + } + + Layers.prototype = { + + constructor: Layers, + + set: function ( channel ) { + + this.mask = 1 << channel; + + }, + + enable: function ( channel ) { + + this.mask |= 1 << channel; + + }, + + toggle: function ( channel ) { + + this.mask ^= 1 << channel; + + }, + + disable: function ( channel ) { + + this.mask &= ~ ( 1 << channel ); + + }, + + test: function ( layers ) { + + return ( this.mask & layers.mask ) !== 0; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author elephantatwork / www.elephantatwork.ch + */ + + function Object3D() { + + Object.defineProperty( this, 'id', { value: Object3DIdCount() } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Object3D'; + + this.parent = null; + this.children = []; + + this.up = Object3D.DefaultUp.clone(); + + var position = new Vector3(); + var rotation = new Euler(); + var quaternion = new Quaternion(); + var scale = new Vector3( 1, 1, 1 ); + + function onRotationChange() { + + quaternion.setFromEuler( rotation, false ); + + } + + function onQuaternionChange() { + + rotation.setFromQuaternion( quaternion, undefined, false ); + + } + + rotation.onChange( onRotationChange ); + quaternion.onChange( onQuaternionChange ); + + Object.defineProperties( this, { + position: { + enumerable: true, + value: position + }, + rotation: { + enumerable: true, + value: rotation + }, + quaternion: { + enumerable: true, + value: quaternion + }, + scale: { + enumerable: true, + value: scale + }, + modelViewMatrix: { + value: new Matrix4() + }, + normalMatrix: { + value: new Matrix3() + } + } ); + + this.matrix = new Matrix4(); + this.matrixWorld = new Matrix4(); + + this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate; + this.matrixWorldNeedsUpdate = false; + + this.layers = new Layers(); + this.visible = true; + + this.castShadow = false; + this.receiveShadow = false; + + this.frustumCulled = true; + this.renderOrder = 0; + + this.userData = {}; + + this.onBeforeRender = function(){}; + this.onAfterRender = function(){}; + + } + + Object3D.DefaultUp = new Vector3( 0, 1, 0 ); + Object3D.DefaultMatrixAutoUpdate = true; + + Object.assign( Object3D.prototype, EventDispatcher.prototype, { + + isObject3D: true, + + applyMatrix: function ( matrix ) { + + this.matrix.multiplyMatrices( matrix, this.matrix ); + + this.matrix.decompose( this.position, this.quaternion, this.scale ); + + }, + + setRotationFromAxisAngle: function ( axis, angle ) { + + // assumes axis is normalized + + this.quaternion.setFromAxisAngle( axis, angle ); + + }, + + setRotationFromEuler: function ( euler ) { + + this.quaternion.setFromEuler( euler, true ); + + }, + + setRotationFromMatrix: function ( m ) { + + // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) + + this.quaternion.setFromRotationMatrix( m ); + + }, + + setRotationFromQuaternion: function ( q ) { + + // assumes q is normalized + + this.quaternion.copy( q ); + + }, + + rotateOnAxis: function () { + + // rotate object on axis in object space + // axis is assumed to be normalized + + var q1 = new Quaternion(); + + return function rotateOnAxis( axis, angle ) { + + q1.setFromAxisAngle( axis, angle ); + + this.quaternion.multiply( q1 ); + + return this; + + }; + + }(), + + rotateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function rotateX( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function rotateY( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + rotateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function rotateZ( angle ) { + + return this.rotateOnAxis( v1, angle ); + + }; + + }(), + + translateOnAxis: function () { + + // translate object by distance along axis in object space + // axis is assumed to be normalized + + var v1 = new Vector3(); + + return function translateOnAxis( axis, distance ) { + + v1.copy( axis ).applyQuaternion( this.quaternion ); + + this.position.add( v1.multiplyScalar( distance ) ); + + return this; + + }; + + }(), + + translateX: function () { + + var v1 = new Vector3( 1, 0, 0 ); + + return function translateX( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateY: function () { + + var v1 = new Vector3( 0, 1, 0 ); + + return function translateY( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + translateZ: function () { + + var v1 = new Vector3( 0, 0, 1 ); + + return function translateZ( distance ) { + + return this.translateOnAxis( v1, distance ); + + }; + + }(), + + localToWorld: function ( vector ) { + + return vector.applyMatrix4( this.matrixWorld ); + + }, + + worldToLocal: function () { + + var m1 = new Matrix4(); + + return function worldToLocal( vector ) { + + return vector.applyMatrix4( m1.getInverse( this.matrixWorld ) ); + + }; + + }(), + + lookAt: function () { + + // This routine does not support objects with rotated and/or translated parent(s) + + var m1 = new Matrix4(); + + return function lookAt( vector ) { + + m1.lookAt( vector, this.position, this.up ); + + this.quaternion.setFromRotationMatrix( m1 ); + + }; + + }(), + + add: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.add( arguments[ i ] ); + + } + + return this; + + } + + if ( object === this ) { + + console.error( "THREE.Object3D.add: object can't be added as a child of itself.", object ); + return this; + + } + + if ( (object && object.isObject3D) ) { + + if ( object.parent !== null ) { + + object.parent.remove( object ); + + } + + object.parent = this; + object.dispatchEvent( { type: 'added' } ); + + this.children.push( object ); + + } else { + + console.error( "THREE.Object3D.add: object not an instance of THREE.Object3D.", object ); + + } + + return this; + + }, + + remove: function ( object ) { + + if ( arguments.length > 1 ) { + + for ( var i = 0; i < arguments.length; i ++ ) { + + this.remove( arguments[ i ] ); + + } + + } + + var index = this.children.indexOf( object ); + + if ( index !== - 1 ) { + + object.parent = null; + + object.dispatchEvent( { type: 'removed' } ); + + this.children.splice( index, 1 ); + + } + + }, + + getObjectById: function ( id ) { + + return this.getObjectByProperty( 'id', id ); + + }, + + getObjectByName: function ( name ) { + + return this.getObjectByProperty( 'name', name ); + + }, + + getObjectByProperty: function ( name, value ) { + + if ( this[ name ] === value ) return this; + + for ( var i = 0, l = this.children.length; i < l; i ++ ) { + + var child = this.children[ i ]; + var object = child.getObjectByProperty( name, value ); + + if ( object !== undefined ) { + + return object; + + } + + } + + return undefined; + + }, + + getWorldPosition: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.updateMatrixWorld( true ); + + return result.setFromMatrixPosition( this.matrixWorld ); + + }, + + getWorldQuaternion: function () { + + var position = new Vector3(); + var scale = new Vector3(); + + return function getWorldQuaternion( optionalTarget ) { + + var result = optionalTarget || new Quaternion(); + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, result, scale ); + + return result; + + }; + + }(), + + getWorldRotation: function () { + + var quaternion = new Quaternion(); + + return function getWorldRotation( optionalTarget ) { + + var result = optionalTarget || new Euler(); + + this.getWorldQuaternion( quaternion ); + + return result.setFromQuaternion( quaternion, this.rotation.order, false ); + + }; + + }(), + + getWorldScale: function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + + return function getWorldScale( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.updateMatrixWorld( true ); + + this.matrixWorld.decompose( position, quaternion, result ); + + return result; + + }; + + }(), + + getWorldDirection: function () { + + var quaternion = new Quaternion(); + + return function getWorldDirection( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.getWorldQuaternion( quaternion ); + + return result.set( 0, 0, 1 ).applyQuaternion( quaternion ); + + }; + + }(), + + raycast: function () {}, + + traverse: function ( callback ) { + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverse( callback ); + + } + + }, + + traverseVisible: function ( callback ) { + + if ( this.visible === false ) return; + + callback( this ); + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].traverseVisible( callback ); + + } + + }, + + traverseAncestors: function ( callback ) { + + var parent = this.parent; + + if ( parent !== null ) { + + callback( parent ); + + parent.traverseAncestors( callback ); + + } + + }, + + updateMatrix: function () { + + this.matrix.compose( this.position, this.quaternion, this.scale ); + + this.matrixWorldNeedsUpdate = true; + + }, + + updateMatrixWorld: function ( force ) { + + if ( this.matrixAutoUpdate === true ) this.updateMatrix(); + + if ( this.matrixWorldNeedsUpdate === true || force === true ) { + + if ( this.parent === null ) { + + this.matrixWorld.copy( this.matrix ); + + } else { + + this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix ); + + } + + this.matrixWorldNeedsUpdate = false; + + force = true; + + } + + // update children + + var children = this.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + children[ i ].updateMatrixWorld( force ); + + } + + }, + + toJSON: function ( meta ) { + + // meta is '' when called from JSON.stringify + var isRootObject = ( meta === undefined || meta === '' ); + + var output = {}; + + // meta is a hash used to collect geometries, materials. + // not providing it implies that this is the root object + // being serialized. + if ( isRootObject ) { + + // initialize meta obj + meta = { + geometries: {}, + materials: {}, + textures: {}, + images: {} + }; + + output.metadata = { + version: 4.4, + type: 'Object', + generator: 'Object3D.toJSON' + }; + + } + + // standard Object3D serialization + + var object = {}; + + object.uuid = this.uuid; + object.type = this.type; + + if ( this.name !== '' ) object.name = this.name; + if ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData; + if ( this.castShadow === true ) object.castShadow = true; + if ( this.receiveShadow === true ) object.receiveShadow = true; + if ( this.visible === false ) object.visible = false; + + object.matrix = this.matrix.toArray(); + + // + + if ( this.geometry !== undefined ) { + + if ( meta.geometries[ this.geometry.uuid ] === undefined ) { + + meta.geometries[ this.geometry.uuid ] = this.geometry.toJSON( meta ); + + } + + object.geometry = this.geometry.uuid; + + } + + if ( this.material !== undefined ) { + + if ( meta.materials[ this.material.uuid ] === undefined ) { + + meta.materials[ this.material.uuid ] = this.material.toJSON( meta ); + + } + + object.material = this.material.uuid; + + } + + // + + if ( this.children.length > 0 ) { + + object.children = []; + + for ( var i = 0; i < this.children.length; i ++ ) { + + object.children.push( this.children[ i ].toJSON( meta ).object ); + + } + + } + + if ( isRootObject ) { + + var geometries = extractFromCache( meta.geometries ); + var materials = extractFromCache( meta.materials ); + var textures = extractFromCache( meta.textures ); + var images = extractFromCache( meta.images ); + + if ( geometries.length > 0 ) output.geometries = geometries; + if ( materials.length > 0 ) output.materials = materials; + if ( textures.length > 0 ) output.textures = textures; + if ( images.length > 0 ) output.images = images; + + } + + output.object = object; + + return output; + + // extract data from the cache hash + // remove metadata on each item + // and return as array + function extractFromCache( cache ) { + + var values = []; + for ( var key in cache ) { + + var data = cache[ key ]; + delete data.metadata; + values.push( data ); + + } + return values; + + } + + }, + + clone: function ( recursive ) { + + return new this.constructor().copy( this, recursive ); + + }, + + copy: function ( source, recursive ) { + + if ( recursive === undefined ) recursive = true; + + this.name = source.name; + + this.up.copy( source.up ); + + this.position.copy( source.position ); + this.quaternion.copy( source.quaternion ); + this.scale.copy( source.scale ); + + this.matrix.copy( source.matrix ); + this.matrixWorld.copy( source.matrixWorld ); + + this.matrixAutoUpdate = source.matrixAutoUpdate; + this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; + + this.visible = source.visible; + + this.castShadow = source.castShadow; + this.receiveShadow = source.receiveShadow; + + this.frustumCulled = source.frustumCulled; + this.renderOrder = source.renderOrder; + + this.userData = JSON.parse( JSON.stringify( source.userData ) ); + + if ( recursive === true ) { + + for ( var i = 0; i < source.children.length; i ++ ) { + + var child = source.children[ i ]; + this.add( child.clone() ); + + } + + } + + return this; + + } + + } ); + + var count$2 = 0; + function Object3DIdCount() { return count$2++; } + + /** + * @author bhouston / http://clara.io + */ + + function Line3( start, end ) { + + this.start = ( start !== undefined ) ? start : new Vector3(); + this.end = ( end !== undefined ) ? end : new Vector3(); + + } + + Line3.prototype = { + + constructor: Line3, + + set: function ( start, end ) { + + this.start.copy( start ); + this.end.copy( end ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( line ) { + + this.start.copy( line.start ); + this.end.copy( line.end ); + + return this; + + }, + + getCenter: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.addVectors( this.start, this.end ).multiplyScalar( 0.5 ); + + }, + + delta: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.subVectors( this.end, this.start ); + + }, + + distanceSq: function () { + + return this.start.distanceToSquared( this.end ); + + }, + + distance: function () { + + return this.start.distanceTo( this.end ); + + }, + + at: function ( t, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + return this.delta( result ).multiplyScalar( t ).add( this.start ); + + }, + + closestPointToPointParameter: function () { + + var startP = new Vector3(); + var startEnd = new Vector3(); + + return function closestPointToPointParameter( point, clampToLine ) { + + startP.subVectors( point, this.start ); + startEnd.subVectors( this.end, this.start ); + + var startEnd2 = startEnd.dot( startEnd ); + var startEnd_startP = startEnd.dot( startP ); + + var t = startEnd_startP / startEnd2; + + if ( clampToLine ) { + + t = _Math.clamp( t, 0, 1 ); + + } + + return t; + + }; + + }(), + + closestPointToPoint: function ( point, clampToLine, optionalTarget ) { + + var t = this.closestPointToPointParameter( point, clampToLine ); + + var result = optionalTarget || new Vector3(); + + return this.delta( result ).multiplyScalar( t ).add( this.start ); + + }, + + applyMatrix4: function ( matrix ) { + + this.start.applyMatrix4( matrix ); + this.end.applyMatrix4( matrix ); + + return this; + + }, + + equals: function ( line ) { + + return line.start.equals( this.start ) && line.end.equals( this.end ); + + } + + }; + + /** + * @author bhouston / http://clara.io + * @author mrdoob / http://mrdoob.com/ + */ + + function Triangle( a, b, c ) { + + this.a = ( a !== undefined ) ? a : new Vector3(); + this.b = ( b !== undefined ) ? b : new Vector3(); + this.c = ( c !== undefined ) ? c : new Vector3(); + + } + + Triangle.normal = function () { + + var v0 = new Vector3(); + + return function normal( a, b, c, optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + result.subVectors( c, b ); + v0.subVectors( a, b ); + result.cross( v0 ); + + var resultLengthSq = result.lengthSq(); + if ( resultLengthSq > 0 ) { + + return result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) ); + + } + + return result.set( 0, 0, 0 ); + + }; + + }(); + + // static/instance method to calculate barycentric coordinates + // based on: http://www.blackpawn.com/texts/pointinpoly/default.html + Triangle.barycoordFromPoint = function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function barycoordFromPoint( point, a, b, c, optionalTarget ) { + + v0.subVectors( c, a ); + v1.subVectors( b, a ); + v2.subVectors( point, a ); + + var dot00 = v0.dot( v0 ); + var dot01 = v0.dot( v1 ); + var dot02 = v0.dot( v2 ); + var dot11 = v1.dot( v1 ); + var dot12 = v1.dot( v2 ); + + var denom = ( dot00 * dot11 - dot01 * dot01 ); + + var result = optionalTarget || new Vector3(); + + // collinear or singular triangle + if ( denom === 0 ) { + + // arbitrary location outside of triangle? + // not sure if this is the best idea, maybe should be returning undefined + return result.set( - 2, - 1, - 1 ); + + } + + var invDenom = 1 / denom; + var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom; + var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom; + + // barycentric coordinates must always sum to 1 + return result.set( 1 - u - v, v, u ); + + }; + + }(); + + Triangle.containsPoint = function () { + + var v1 = new Vector3(); + + return function containsPoint( point, a, b, c ) { + + var result = Triangle.barycoordFromPoint( point, a, b, c, v1 ); + + return ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 ); + + }; + + }(); + + Triangle.prototype = { + + constructor: Triangle, + + set: function ( a, b, c ) { + + this.a.copy( a ); + this.b.copy( b ); + this.c.copy( c ); + + return this; + + }, + + setFromPointsAndIndices: function ( points, i0, i1, i2 ) { + + this.a.copy( points[ i0 ] ); + this.b.copy( points[ i1 ] ); + this.c.copy( points[ i2 ] ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( triangle ) { + + this.a.copy( triangle.a ); + this.b.copy( triangle.b ); + this.c.copy( triangle.c ); + + return this; + + }, + + area: function () { + + var v0 = new Vector3(); + var v1 = new Vector3(); + + return function area() { + + v0.subVectors( this.c, this.b ); + v1.subVectors( this.a, this.b ); + + return v0.cross( v1 ).length() * 0.5; + + }; + + }(), + + midpoint: function ( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + return result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 ); + + }, + + normal: function ( optionalTarget ) { + + return Triangle.normal( this.a, this.b, this.c, optionalTarget ); + + }, + + plane: function ( optionalTarget ) { + + var result = optionalTarget || new Plane(); + + return result.setFromCoplanarPoints( this.a, this.b, this.c ); + + }, + + barycoordFromPoint: function ( point, optionalTarget ) { + + return Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget ); + + }, + + containsPoint: function ( point ) { + + return Triangle.containsPoint( point, this.a, this.b, this.c ); + + }, + + closestPointToPoint: function () { + + var plane, edgeList, projectedPoint, closestPoint; + + return function closestPointToPoint( point, optionalTarget ) { + + if ( plane === undefined ) { + + plane = new Plane(); + edgeList = [ new Line3(), new Line3(), new Line3() ]; + projectedPoint = new Vector3(); + closestPoint = new Vector3(); + + } + + var result = optionalTarget || new Vector3(); + var minDistance = Infinity; + + // project the point onto the plane of the triangle + + plane.setFromCoplanarPoints( this.a, this.b, this.c ); + plane.projectPoint( point, projectedPoint ); + + // check if the projection lies within the triangle + + if( this.containsPoint( projectedPoint ) === true ) { + + // if so, this is the closest point + + result.copy( projectedPoint ); + + } else { + + // if not, the point falls outside the triangle. the result is the closest point to the triangle's edges or vertices + + edgeList[ 0 ].set( this.a, this.b ); + edgeList[ 1 ].set( this.b, this.c ); + edgeList[ 2 ].set( this.c, this.a ); + + for( var i = 0; i < edgeList.length; i ++ ) { + + edgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint ); + + var distance = projectedPoint.distanceToSquared( closestPoint ); + + if( distance < minDistance ) { + + minDistance = distance; + + result.copy( closestPoint ); + + } + + } + + } + + return result; + + }; + + }(), + + equals: function ( triangle ) { + + return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Face3( a, b, c, normal, color, materialIndex ) { + + this.a = a; + this.b = b; + this.c = c; + + this.normal = (normal && normal.isVector3) ? normal : new Vector3(); + this.vertexNormals = Array.isArray( normal ) ? normal : []; + + this.color = (color && color.isColor) ? color : new Color(); + this.vertexColors = Array.isArray( color ) ? color : []; + + this.materialIndex = materialIndex !== undefined ? materialIndex : 0; + + } + + Face3.prototype = { + + constructor: Face3, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( source ) { + + this.a = source.a; + this.b = source.b; + this.c = source.c; + + this.normal.copy( source.normal ); + this.color.copy( source.color ); + + this.materialIndex = source.materialIndex; + + for ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) { + + this.vertexNormals[ i ] = source.vertexNormals[ i ].clone(); + + } + + for ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) { + + this.vertexColors[ i ] = source.vertexColors[ i ].clone(); + + } + + return this; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * shading: THREE.SmoothShading, + * depthTest: , + * depthWrite: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: + * } + */ + + function MeshBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshBasicMaterial'; + + this.color = new Color( 0xffffff ); // emissive + + this.map = null; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + + this.lights = false; + + this.setValues( parameters ); + + } + + MeshBasicMaterial.prototype = Object.create( Material.prototype ); + MeshBasicMaterial.prototype.constructor = MeshBasicMaterial; + + MeshBasicMaterial.prototype.isMeshBasicMaterial = true; + + MeshBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferAttribute( array, itemSize, normalized ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.uuid = _Math.generateUUID(); + + this.array = array; + this.itemSize = itemSize; + this.count = array !== undefined ? array.length / itemSize : 0; + this.normalized = normalized === true; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + + } + + BufferAttribute.prototype = { + + constructor: BufferAttribute, + + isBufferAttribute: true, + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + }, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.itemSize : 0; + this.array = array; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.itemSize = source.itemSize; + this.count = source.count; + this.normalized = source.normalized; + + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.itemSize; + index2 *= attribute.itemSize; + + for ( var i = 0, l = this.itemSize; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + copyArray: function ( array ) { + + this.array.set( array ); + + return this; + + }, + + copyColorsArray: function ( colors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = colors.length; i < l; i ++ ) { + + var color = colors[ i ]; + + if ( color === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i ); + color = new Color(); + + } + + array[ offset ++ ] = color.r; + array[ offset ++ ] = color.g; + array[ offset ++ ] = color.b; + + } + + return this; + + }, + + copyIndicesArray: function ( indices ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = indices.length; i < l; i ++ ) { + + var index = indices[ i ]; + + array[ offset ++ ] = index.a; + array[ offset ++ ] = index.b; + array[ offset ++ ] = index.c; + + } + + return this; + + }, + + copyVector2sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i ); + vector = new Vector2(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + + } + + return this; + + }, + + copyVector3sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i ); + vector = new Vector3(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + + } + + return this; + + }, + + copyVector4sArray: function ( vectors ) { + + var array = this.array, offset = 0; + + for ( var i = 0, l = vectors.length; i < l; i ++ ) { + + var vector = vectors[ i ]; + + if ( vector === undefined ) { + + console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i ); + vector = new Vector4(); + + } + + array[ offset ++ ] = vector.x; + array[ offset ++ ] = vector.y; + array[ offset ++ ] = vector.z; + array[ offset ++ ] = vector.w; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + getX: function ( index ) { + + return this.array[ index * this.itemSize ]; + + }, + + setX: function ( index, x ) { + + this.array[ index * this.itemSize ] = x; + + return this; + + }, + + getY: function ( index ) { + + return this.array[ index * this.itemSize + 1 ]; + + }, + + setY: function ( index, y ) { + + this.array[ index * this.itemSize + 1 ] = y; + + return this; + + }, + + getZ: function ( index ) { + + return this.array[ index * this.itemSize + 2 ]; + + }, + + setZ: function ( index, z ) { + + this.array[ index * this.itemSize + 2 ] = z; + + return this; + + }, + + getW: function ( index ) { + + return this.array[ index * this.itemSize + 3 ]; + + }, + + setW: function ( index, w ) { + + this.array[ index * this.itemSize + 3 ] = w; + + return this; + + }, + + setXY: function ( index, x, y ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index *= this.itemSize; + + this.array[ index + 0 ] = x; + this.array[ index + 1 ] = y; + this.array[ index + 2 ] = z; + this.array[ index + 3 ] = w; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + + }; + + // + + function Int8Attribute( array, itemSize ) { + + return new BufferAttribute( new Int8Array( array ), itemSize ); + + } + + function Uint8Attribute( array, itemSize ) { + + return new BufferAttribute( new Uint8Array( array ), itemSize ); + + } + + function Uint8ClampedAttribute( array, itemSize ) { + + return new BufferAttribute( new Uint8ClampedArray( array ), itemSize ); + + } + + function Int16Attribute( array, itemSize ) { + + return new BufferAttribute( new Int16Array( array ), itemSize ); + + } + + function Uint16Attribute( array, itemSize ) { + + return new BufferAttribute( new Uint16Array( array ), itemSize ); + + } + + function Int32Attribute( array, itemSize ) { + + return new BufferAttribute( new Int32Array( array ), itemSize ); + + } + + function Uint32Attribute( array, itemSize ) { + + return new BufferAttribute( new Uint32Array( array ), itemSize ); + + } + + function Float32Attribute( array, itemSize ) { + + return new BufferAttribute( new Float32Array( array ), itemSize ); + + } + + function Float64Attribute( array, itemSize ) { + + return new BufferAttribute( new Float64Array( array ), itemSize ); + + } + + // Deprecated + + function DynamicBufferAttribute( array, itemSize ) { + + console.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' ); + return new BufferAttribute( array, itemSize ).setDynamic( true ); + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author kile / http://kile.stravaganza.org/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author bhouston / http://clara.io + */ + + function Geometry() { + + Object.defineProperty( this, 'id', { value: GeometryIdCount() } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'Geometry'; + + this.vertices = []; + this.colors = []; + this.faces = []; + this.faceVertexUvs = [ [] ]; + + this.morphTargets = []; + this.morphNormals = []; + + this.skinWeights = []; + this.skinIndices = []; + + this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.elementsNeedUpdate = false; + this.verticesNeedUpdate = false; + this.uvsNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.lineDistancesNeedUpdate = false; + this.groupsNeedUpdate = false; + + } + + Object.assign( Geometry.prototype, EventDispatcher.prototype, { + + isGeometry: true, + + applyMatrix: function ( matrix ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + for ( var i = 0, il = this.vertices.length; i < il; i ++ ) { + + var vertex = this.vertices[ i ]; + vertex.applyMatrix4( matrix ); + + } + + for ( var i = 0, il = this.faces.length; i < il; i ++ ) { + + var face = this.faces[ i ]; + face.normal.applyMatrix3( normalMatrix ).normalize(); + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + face.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize(); + + } + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + this.verticesNeedUpdate = true; + this.normalsNeedUpdate = true; + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1; + + return function rotateX( angle ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1; + + return function rotateY( angle ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1; + + return function rotateZ( angle ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1; + + return function translate( x, y, z ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1; + + return function scale( x, y, z ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj; + + return function lookAt( vector ) { + + if ( obj === undefined ) obj = new Object3D(); + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + fromBufferGeometry: function ( geometry ) { + + var scope = this; + + var indices = geometry.index !== null ? geometry.index.array : undefined; + var attributes = geometry.attributes; + + var positions = attributes.position.array; + var normals = attributes.normal !== undefined ? attributes.normal.array : undefined; + var colors = attributes.color !== undefined ? attributes.color.array : undefined; + var uvs = attributes.uv !== undefined ? attributes.uv.array : undefined; + var uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined; + + if ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = []; + + var tempNormals = []; + var tempUVs = []; + var tempUVs2 = []; + + for ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) { + + scope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) ); + + if ( normals !== undefined ) { + + tempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) ); + + } + + if ( colors !== undefined ) { + + scope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) ); + + } + + if ( uvs !== undefined ) { + + tempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) ); + + } + + if ( uvs2 !== undefined ) { + + tempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) ); + + } + + } + + function addFace( a, b, c, materialIndex ) { + + var vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : []; + var vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : []; + + var face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex ); + + scope.faces.push( face ); + + if ( uvs !== undefined ) { + + scope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] ); + + } + + if ( uvs2 !== undefined ) { + + scope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] ); + + } + + } + + if ( indices !== undefined ) { + + var groups = geometry.groups; + + if ( groups.length > 0 ) { + + for ( var i = 0; i < groups.length; i ++ ) { + + var group = groups[ i ]; + + var start = group.start; + var count = group.count; + + for ( var j = start, jl = start + count; j < jl; j += 3 ) { + + addFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex ); + + } + + } + + } else { + + for ( var i = 0; i < indices.length; i += 3 ) { + + addFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] ); + + } + + } + + } else { + + for ( var i = 0; i < positions.length / 3; i += 3 ) { + + addFace( i, i + 1, i + 2 ); + + } + + } + + this.computeFaceNormals(); + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + return this; + + }, + + center: function () { + + this.computeBoundingBox(); + + var offset = this.boundingBox.getCenter().negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return offset; + + }, + + normalize: function () { + + this.computeBoundingSphere(); + + var center = this.boundingSphere.center; + var radius = this.boundingSphere.radius; + + var s = radius === 0 ? 1 : 1.0 / radius; + + var matrix = new Matrix4(); + matrix.set( + s, 0, 0, - s * center.x, + 0, s, 0, - s * center.y, + 0, 0, s, - s * center.z, + 0, 0, 0, 1 + ); + + this.applyMatrix( matrix ); + + return this; + + }, + + computeFaceNormals: function () { + + var cb = new Vector3(), ab = new Vector3(); + + for ( var f = 0, fl = this.faces.length; f < fl; f ++ ) { + + var face = this.faces[ f ]; + + var vA = this.vertices[ face.a ]; + var vB = this.vertices[ face.b ]; + var vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + cb.normalize(); + + face.normal.copy( cb ); + + } + + }, + + computeVertexNormals: function ( areaWeighted ) { + + if ( areaWeighted === undefined ) areaWeighted = true; + + var v, vl, f, fl, face, vertices; + + vertices = new Array( this.vertices.length ); + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ] = new Vector3(); + + } + + if ( areaWeighted ) { + + // vertex normals weighted by triangle areas + // http://www.iquilezles.org/www/articles/normals/normals.htm + + var vA, vB, vC; + var cb = new Vector3(), ab = new Vector3(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vA = this.vertices[ face.a ]; + vB = this.vertices[ face.b ]; + vC = this.vertices[ face.c ]; + + cb.subVectors( vC, vB ); + ab.subVectors( vA, vB ); + cb.cross( ab ); + + vertices[ face.a ].add( cb ); + vertices[ face.b ].add( cb ); + vertices[ face.c ].add( cb ); + + } + + } else { + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + vertices[ face.a ].add( face.normal ); + vertices[ face.b ].add( face.normal ); + vertices[ face.c ].add( face.normal ); + + } + + } + + for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { + + vertices[ v ].normalize(); + + } + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( vertices[ face.a ] ); + vertexNormals[ 1 ].copy( vertices[ face.b ] ); + vertexNormals[ 2 ].copy( vertices[ face.c ] ); + + } else { + + vertexNormals[ 0 ] = vertices[ face.a ].clone(); + vertexNormals[ 1 ] = vertices[ face.b ].clone(); + vertexNormals[ 2 ] = vertices[ face.c ].clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeFlatVertexNormals: function () { + + var f, fl, face; + + this.computeFaceNormals(); + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + vertexNormals[ 0 ].copy( face.normal ); + vertexNormals[ 1 ].copy( face.normal ); + vertexNormals[ 2 ].copy( face.normal ); + + } else { + + vertexNormals[ 0 ] = face.normal.clone(); + vertexNormals[ 1 ] = face.normal.clone(); + vertexNormals[ 2 ] = face.normal.clone(); + + } + + } + + if ( this.faces.length > 0 ) { + + this.normalsNeedUpdate = true; + + } + + }, + + computeMorphNormals: function () { + + var i, il, f, fl, face; + + // save original normals + // - create temp variables on first access + // otherwise just copy (for faster repeated calls) + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + if ( ! face.__originalFaceNormal ) { + + face.__originalFaceNormal = face.normal.clone(); + + } else { + + face.__originalFaceNormal.copy( face.normal ); + + } + + if ( ! face.__originalVertexNormals ) face.__originalVertexNormals = []; + + for ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) { + + if ( ! face.__originalVertexNormals[ i ] ) { + + face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone(); + + } else { + + face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] ); + + } + + } + + } + + // use temp geometry to compute face and vertex normals for each morph + + var tmpGeo = new Geometry(); + tmpGeo.faces = this.faces; + + for ( i = 0, il = this.morphTargets.length; i < il; i ++ ) { + + // create on first access + + if ( ! this.morphNormals[ i ] ) { + + this.morphNormals[ i ] = {}; + this.morphNormals[ i ].faceNormals = []; + this.morphNormals[ i ].vertexNormals = []; + + var dstNormalsFace = this.morphNormals[ i ].faceNormals; + var dstNormalsVertex = this.morphNormals[ i ].vertexNormals; + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + faceNormal = new Vector3(); + vertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() }; + + dstNormalsFace.push( faceNormal ); + dstNormalsVertex.push( vertexNormals ); + + } + + } + + var morphNormals = this.morphNormals[ i ]; + + // set vertices to morph target + + tmpGeo.vertices = this.morphTargets[ i ].vertices; + + // compute morph normals + + tmpGeo.computeFaceNormals(); + tmpGeo.computeVertexNormals(); + + // store morph normals + + var faceNormal, vertexNormals; + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + faceNormal = morphNormals.faceNormals[ f ]; + vertexNormals = morphNormals.vertexNormals[ f ]; + + faceNormal.copy( face.normal ); + + vertexNormals.a.copy( face.vertexNormals[ 0 ] ); + vertexNormals.b.copy( face.vertexNormals[ 1 ] ); + vertexNormals.c.copy( face.vertexNormals[ 2 ] ); + + } + + } + + // restore original normals + + for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { + + face = this.faces[ f ]; + + face.normal = face.__originalFaceNormal; + face.vertexNormals = face.__originalVertexNormals; + + } + + }, + + computeTangents: function () { + + console.warn( 'THREE.Geometry: .computeTangents() has been removed.' ); + + }, + + computeLineDistances: function () { + + var d = 0; + var vertices = this.vertices; + + for ( var i = 0, il = vertices.length; i < il; i ++ ) { + + if ( i > 0 ) { + + d += vertices[ i ].distanceTo( vertices[ i - 1 ] ); + + } + + this.lineDistances[ i ] = d; + + } + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + this.boundingBox.setFromPoints( this.vertices ); + + }, + + computeBoundingSphere: function () { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + this.boundingSphere.setFromPoints( this.vertices ); + + }, + + merge: function ( geometry, matrix, materialIndexOffset ) { + + if ( (geometry && geometry.isGeometry) === false ) { + + console.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry ); + return; + + } + + var normalMatrix, + vertexOffset = this.vertices.length, + vertices1 = this.vertices, + vertices2 = geometry.vertices, + faces1 = this.faces, + faces2 = geometry.faces, + uvs1 = this.faceVertexUvs[ 0 ], + uvs2 = geometry.faceVertexUvs[ 0 ], + colors1 = this.colors, + colors2 = geometry.colors; + + if ( materialIndexOffset === undefined ) materialIndexOffset = 0; + + if ( matrix !== undefined ) { + + normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + } + + // vertices + + for ( var i = 0, il = vertices2.length; i < il; i ++ ) { + + var vertex = vertices2[ i ]; + + var vertexCopy = vertex.clone(); + + if ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix ); + + vertices1.push( vertexCopy ); + + } + + // colors + + for ( var i = 0, il = colors2.length; i < il; i ++ ) { + + colors1.push( colors2[ i ].clone() ); + + } + + // faces + + for ( i = 0, il = faces2.length; i < il; i ++ ) { + + var face = faces2[ i ], faceCopy, normal, color, + faceVertexNormals = face.vertexNormals, + faceVertexColors = face.vertexColors; + + faceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset ); + faceCopy.normal.copy( face.normal ); + + if ( normalMatrix !== undefined ) { + + faceCopy.normal.applyMatrix3( normalMatrix ).normalize(); + + } + + for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) { + + normal = faceVertexNormals[ j ].clone(); + + if ( normalMatrix !== undefined ) { + + normal.applyMatrix3( normalMatrix ).normalize(); + + } + + faceCopy.vertexNormals.push( normal ); + + } + + faceCopy.color.copy( face.color ); + + for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) { + + color = faceVertexColors[ j ]; + faceCopy.vertexColors.push( color.clone() ); + + } + + faceCopy.materialIndex = face.materialIndex + materialIndexOffset; + + faces1.push( faceCopy ); + + } + + // uvs + + for ( i = 0, il = uvs2.length; i < il; i ++ ) { + + var uv = uvs2[ i ], uvCopy = []; + + if ( uv === undefined ) { + + continue; + + } + + for ( var j = 0, jl = uv.length; j < jl; j ++ ) { + + uvCopy.push( uv[ j ].clone() ); + + } + + uvs1.push( uvCopy ); + + } + + }, + + mergeMesh: function ( mesh ) { + + if ( (mesh && mesh.isMesh) === false ) { + + console.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh ); + return; + + } + + mesh.matrixAutoUpdate && mesh.updateMatrix(); + + this.merge( mesh.geometry, mesh.matrix ); + + }, + + /* + * Checks for duplicate vertices with hashmap. + * Duplicated vertices are removed + * and faces' vertices are updated. + */ + + mergeVertices: function () { + + var verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique) + var unique = [], changes = []; + + var v, key; + var precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001 + var precision = Math.pow( 10, precisionPoints ); + var i, il, face; + var indices, j, jl; + + for ( i = 0, il = this.vertices.length; i < il; i ++ ) { + + v = this.vertices[ i ]; + key = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision ); + + if ( verticesMap[ key ] === undefined ) { + + verticesMap[ key ] = i; + unique.push( this.vertices[ i ] ); + changes[ i ] = unique.length - 1; + + } else { + + //console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]); + changes[ i ] = changes[ verticesMap[ key ] ]; + + } + + } + + + // if faces are completely degenerate after merging vertices, we + // have to remove them from the geometry. + var faceIndicesToRemove = []; + + for ( i = 0, il = this.faces.length; i < il; i ++ ) { + + face = this.faces[ i ]; + + face.a = changes[ face.a ]; + face.b = changes[ face.b ]; + face.c = changes[ face.c ]; + + indices = [ face.a, face.b, face.c ]; + + var dupIndex = - 1; + + // if any duplicate vertices are found in a Face3 + // we have to remove the face as nothing can be saved + for ( var n = 0; n < 3; n ++ ) { + + if ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) { + + dupIndex = n; + faceIndicesToRemove.push( i ); + break; + + } + + } + + } + + for ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) { + + var idx = faceIndicesToRemove[ i ]; + + this.faces.splice( idx, 1 ); + + for ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) { + + this.faceVertexUvs[ j ].splice( idx, 1 ); + + } + + } + + // Use unique set of vertices + + var diff = this.vertices.length - unique.length; + this.vertices = unique; + return diff; + + }, + + sortFacesByMaterialIndex: function () { + + var faces = this.faces; + var length = faces.length; + + // tag faces + + for ( var i = 0; i < length; i ++ ) { + + faces[ i ]._id = i; + + } + + // sort faces + + function materialIndexSort( a, b ) { + + return a.materialIndex - b.materialIndex; + + } + + faces.sort( materialIndexSort ); + + // sort uvs + + var uvs1 = this.faceVertexUvs[ 0 ]; + var uvs2 = this.faceVertexUvs[ 1 ]; + + var newUvs1, newUvs2; + + if ( uvs1 && uvs1.length === length ) newUvs1 = []; + if ( uvs2 && uvs2.length === length ) newUvs2 = []; + + for ( var i = 0; i < length; i ++ ) { + + var id = faces[ i ]._id; + + if ( newUvs1 ) newUvs1.push( uvs1[ id ] ); + if ( newUvs2 ) newUvs2.push( uvs2[ id ] ); + + } + + if ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1; + if ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.4, + type: 'Geometry', + generator: 'Geometry.toJSON' + } + }; + + // standard Geometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + var vertices = []; + + for ( var i = 0; i < this.vertices.length; i ++ ) { + + var vertex = this.vertices[ i ]; + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + var faces = []; + var normals = []; + var normalsHash = {}; + var colors = []; + var colorsHash = {}; + var uvs = []; + var uvsHash = {}; + + for ( var i = 0; i < this.faces.length; i ++ ) { + + var face = this.faces[ i ]; + + var hasMaterial = true; + var hasFaceUv = false; // deprecated + var hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined; + var hasFaceNormal = face.normal.length() > 0; + var hasFaceVertexNormal = face.vertexNormals.length > 0; + var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1; + var hasFaceVertexColor = face.vertexColors.length > 0; + + var faceType = 0; + + faceType = setBit( faceType, 0, 0 ); // isQuad + faceType = setBit( faceType, 1, hasMaterial ); + faceType = setBit( faceType, 2, hasFaceUv ); + faceType = setBit( faceType, 3, hasFaceVertexUv ); + faceType = setBit( faceType, 4, hasFaceNormal ); + faceType = setBit( faceType, 5, hasFaceVertexNormal ); + faceType = setBit( faceType, 6, hasFaceColor ); + faceType = setBit( faceType, 7, hasFaceVertexColor ); + + faces.push( faceType ); + faces.push( face.a, face.b, face.c ); + faces.push( face.materialIndex ); + + if ( hasFaceVertexUv ) { + + var faceVertexUvs = this.faceVertexUvs[ 0 ][ i ]; + + faces.push( + getUvIndex( faceVertexUvs[ 0 ] ), + getUvIndex( faceVertexUvs[ 1 ] ), + getUvIndex( faceVertexUvs[ 2 ] ) + ); + + } + + if ( hasFaceNormal ) { + + faces.push( getNormalIndex( face.normal ) ); + + } + + if ( hasFaceVertexNormal ) { + + var vertexNormals = face.vertexNormals; + + faces.push( + getNormalIndex( vertexNormals[ 0 ] ), + getNormalIndex( vertexNormals[ 1 ] ), + getNormalIndex( vertexNormals[ 2 ] ) + ); + + } + + if ( hasFaceColor ) { + + faces.push( getColorIndex( face.color ) ); + + } + + if ( hasFaceVertexColor ) { + + var vertexColors = face.vertexColors; + + faces.push( + getColorIndex( vertexColors[ 0 ] ), + getColorIndex( vertexColors[ 1 ] ), + getColorIndex( vertexColors[ 2 ] ) + ); + + } + + } + + function setBit( value, position, enabled ) { + + return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) ); + + } + + function getNormalIndex( normal ) { + + var hash = normal.x.toString() + normal.y.toString() + normal.z.toString(); + + if ( normalsHash[ hash ] !== undefined ) { + + return normalsHash[ hash ]; + + } + + normalsHash[ hash ] = normals.length / 3; + normals.push( normal.x, normal.y, normal.z ); + + return normalsHash[ hash ]; + + } + + function getColorIndex( color ) { + + var hash = color.r.toString() + color.g.toString() + color.b.toString(); + + if ( colorsHash[ hash ] !== undefined ) { + + return colorsHash[ hash ]; + + } + + colorsHash[ hash ] = colors.length; + colors.push( color.getHex() ); + + return colorsHash[ hash ]; + + } + + function getUvIndex( uv ) { + + var hash = uv.x.toString() + uv.y.toString(); + + if ( uvsHash[ hash ] !== undefined ) { + + return uvsHash[ hash ]; + + } + + uvsHash[ hash ] = uvs.length / 2; + uvs.push( uv.x, uv.y ); + + return uvsHash[ hash ]; + + } + + data.data = {}; + + data.data.vertices = vertices; + data.data.normals = normals; + if ( colors.length > 0 ) data.data.colors = colors; + if ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility + data.data.faces = faces; + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new Geometry().copy( this ); + + }, + + copy: function ( source ) { + + this.vertices = []; + this.faces = []; + this.faceVertexUvs = [ [] ]; + this.colors = []; + + var vertices = source.vertices; + + for ( var i = 0, il = vertices.length; i < il; i ++ ) { + + this.vertices.push( vertices[ i ].clone() ); + + } + + var colors = source.colors; + + for ( var i = 0, il = colors.length; i < il; i ++ ) { + + this.colors.push( colors[ i ].clone() ); + + } + + var faces = source.faces; + + for ( var i = 0, il = faces.length; i < il; i ++ ) { + + this.faces.push( faces[ i ].clone() ); + + } + + for ( var i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) { + + var faceVertexUvs = source.faceVertexUvs[ i ]; + + if ( this.faceVertexUvs[ i ] === undefined ) { + + this.faceVertexUvs[ i ] = []; + + } + + for ( var j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) { + + var uvs = faceVertexUvs[ j ], uvsCopy = []; + + for ( var k = 0, kl = uvs.length; k < kl; k ++ ) { + + var uv = uvs[ k ]; + + uvsCopy.push( uv.clone() ); + + } + + this.faceVertexUvs[ i ].push( uvsCopy ); + + } + + } + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + var count$3 = 0; + function GeometryIdCount() { return count$3++; } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectGeometry() { + + Object.defineProperty( this, 'id', { value: GeometryIdCount() } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'DirectGeometry'; + + this.indices = []; + this.vertices = []; + this.normals = []; + this.colors = []; + this.uvs = []; + this.uvs2 = []; + + this.groups = []; + + this.morphTargets = {}; + + this.skinWeights = []; + this.skinIndices = []; + + // this.lineDistances = []; + + this.boundingBox = null; + this.boundingSphere = null; + + // update flags + + this.verticesNeedUpdate = false; + this.normalsNeedUpdate = false; + this.colorsNeedUpdate = false; + this.uvsNeedUpdate = false; + this.groupsNeedUpdate = false; + + } + + Object.assign( DirectGeometry.prototype, EventDispatcher.prototype, { + + computeBoundingBox: Geometry.prototype.computeBoundingBox, + computeBoundingSphere: Geometry.prototype.computeBoundingSphere, + + computeFaceNormals: function () { + + console.warn( 'THREE.DirectGeometry: computeFaceNormals() is not a method of this type of geometry.' ); + + }, + + computeVertexNormals: function () { + + console.warn( 'THREE.DirectGeometry: computeVertexNormals() is not a method of this type of geometry.' ); + + }, + + computeGroups: function ( geometry ) { + + var group; + var groups = []; + var materialIndex; + + var faces = geometry.faces; + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + // materials + + if ( face.materialIndex !== materialIndex ) { + + materialIndex = face.materialIndex; + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + group = { + start: i * 3, + materialIndex: materialIndex + }; + + } + + } + + if ( group !== undefined ) { + + group.count = ( i * 3 ) - group.start; + groups.push( group ); + + } + + this.groups = groups; + + }, + + fromGeometry: function ( geometry ) { + + var faces = geometry.faces; + var vertices = geometry.vertices; + var faceVertexUvs = geometry.faceVertexUvs; + + var hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0; + var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0; + + // morphs + + var morphTargets = geometry.morphTargets; + var morphTargetsLength = morphTargets.length; + + var morphTargetsPosition; + + if ( morphTargetsLength > 0 ) { + + morphTargetsPosition = []; + + for ( var i = 0; i < morphTargetsLength; i ++ ) { + + morphTargetsPosition[ i ] = []; + + } + + this.morphTargets.position = morphTargetsPosition; + + } + + var morphNormals = geometry.morphNormals; + var morphNormalsLength = morphNormals.length; + + var morphTargetsNormal; + + if ( morphNormalsLength > 0 ) { + + morphTargetsNormal = []; + + for ( var i = 0; i < morphNormalsLength; i ++ ) { + + morphTargetsNormal[ i ] = []; + + } + + this.morphTargets.normal = morphTargetsNormal; + + } + + // skins + + var skinIndices = geometry.skinIndices; + var skinWeights = geometry.skinWeights; + + var hasSkinIndices = skinIndices.length === vertices.length; + var hasSkinWeights = skinWeights.length === vertices.length; + + // + + for ( var i = 0; i < faces.length; i ++ ) { + + var face = faces[ i ]; + + this.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] ); + + var vertexNormals = face.vertexNormals; + + if ( vertexNormals.length === 3 ) { + + this.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] ); + + } else { + + var normal = face.normal; + + this.normals.push( normal, normal, normal ); + + } + + var vertexColors = face.vertexColors; + + if ( vertexColors.length === 3 ) { + + this.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] ); + + } else { + + var color = face.color; + + this.colors.push( color, color, color ); + + } + + if ( hasFaceVertexUv === true ) { + + var vertexUvs = faceVertexUvs[ 0 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i ); + + this.uvs.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + if ( hasFaceVertexUv2 === true ) { + + var vertexUvs = faceVertexUvs[ 1 ][ i ]; + + if ( vertexUvs !== undefined ) { + + this.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] ); + + } else { + + console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i ); + + this.uvs2.push( new Vector2(), new Vector2(), new Vector2() ); + + } + + } + + // morphs + + for ( var j = 0; j < morphTargetsLength; j ++ ) { + + var morphTarget = morphTargets[ j ].vertices; + + morphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] ); + + } + + for ( var j = 0; j < morphNormalsLength; j ++ ) { + + var morphNormal = morphNormals[ j ].vertexNormals[ i ]; + + morphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c ); + + } + + // skins + + if ( hasSkinIndices ) { + + this.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] ); + + } + + if ( hasSkinWeights ) { + + this.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] ); + + } + + } + + this.computeGroups( geometry ); + + this.verticesNeedUpdate = geometry.verticesNeedUpdate; + this.normalsNeedUpdate = geometry.normalsNeedUpdate; + this.colorsNeedUpdate = geometry.colorsNeedUpdate; + this.uvsNeedUpdate = geometry.uvsNeedUpdate; + this.groupsNeedUpdate = geometry.groupsNeedUpdate; + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferGeometry() { + + Object.defineProperty( this, 'id', { value: GeometryIdCount() } ); + + this.uuid = _Math.generateUUID(); + + this.name = ''; + this.type = 'BufferGeometry'; + + this.index = null; + this.attributes = {}; + + this.morphAttributes = {}; + + this.groups = []; + + this.boundingBox = null; + this.boundingSphere = null; + + this.drawRange = { start: 0, count: Infinity }; + + } + + Object.assign( BufferGeometry.prototype, EventDispatcher.prototype, { + + isBufferGeometry: true, + + getIndex: function () { + + return this.index; + + }, + + setIndex: function ( index ) { + + this.index = index; + + }, + + addAttribute: function ( name, attribute ) { + + if ( (attribute && attribute.isBufferAttribute) === false && (attribute && attribute.isInterleavedBufferAttribute) === false ) { + + console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' ); + + this.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) ); + + return; + + } + + if ( name === 'index' ) { + + console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' ); + this.setIndex( attribute ); + + return; + + } + + this.attributes[ name ] = attribute; + + return this; + + }, + + getAttribute: function ( name ) { + + return this.attributes[ name ]; + + }, + + removeAttribute: function ( name ) { + + delete this.attributes[ name ]; + + return this; + + }, + + addGroup: function ( start, count, materialIndex ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex !== undefined ? materialIndex : 0 + + } ); + + }, + + clearGroups: function () { + + this.groups = []; + + }, + + setDrawRange: function ( start, count ) { + + this.drawRange.start = start; + this.drawRange.count = count; + + }, + + applyMatrix: function ( matrix ) { + + var position = this.attributes.position; + + if ( position !== undefined ) { + + matrix.applyToVector3Array( position.array ); + position.needsUpdate = true; + + } + + var normal = this.attributes.normal; + + if ( normal !== undefined ) { + + var normalMatrix = new Matrix3().getNormalMatrix( matrix ); + + normalMatrix.applyToVector3Array( normal.array ); + normal.needsUpdate = true; + + } + + if ( this.boundingBox !== null ) { + + this.computeBoundingBox(); + + } + + if ( this.boundingSphere !== null ) { + + this.computeBoundingSphere(); + + } + + return this; + + }, + + rotateX: function () { + + // rotate geometry around world x-axis + + var m1; + + return function rotateX( angle ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeRotationX( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateY: function () { + + // rotate geometry around world y-axis + + var m1; + + return function rotateY( angle ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeRotationY( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + rotateZ: function () { + + // rotate geometry around world z-axis + + var m1; + + return function rotateZ( angle ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeRotationZ( angle ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + translate: function () { + + // translate geometry + + var m1; + + return function translate( x, y, z ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeTranslation( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + scale: function () { + + // scale geometry + + var m1; + + return function scale( x, y, z ) { + + if ( m1 === undefined ) m1 = new Matrix4(); + + m1.makeScale( x, y, z ); + + this.applyMatrix( m1 ); + + return this; + + }; + + }(), + + lookAt: function () { + + var obj; + + return function lookAt( vector ) { + + if ( obj === undefined ) obj = new Object3D(); + + obj.lookAt( vector ); + + obj.updateMatrix(); + + this.applyMatrix( obj.matrix ); + + }; + + }(), + + center: function () { + + this.computeBoundingBox(); + + var offset = this.boundingBox.getCenter().negate(); + + this.translate( offset.x, offset.y, offset.z ); + + return offset; + + }, + + setFromObject: function ( object ) { + + // console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this ); + + var geometry = object.geometry; + + if ( (object && object.isPoints) || (object && object.isLine) ) { + + var positions = new Float32Attribute( geometry.vertices.length * 3, 3 ); + var colors = new Float32Attribute( geometry.colors.length * 3, 3 ); + + this.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) ); + this.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) ); + + if ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) { + + var lineDistances = new Float32Attribute( geometry.lineDistances.length, 1 ); + + this.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) ); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + } else if ( (object && object.isMesh) ) { + + if ( (geometry && geometry.isGeometry) ) { + + this.fromGeometry( geometry ); + + } + + } + + return this; + + }, + + updateFromObject: function ( object ) { + + var geometry = object.geometry; + + if ( (object && object.isMesh) ) { + + var direct = geometry.__directGeometry; + + if ( geometry.elementsNeedUpdate === true ) { + + direct = undefined; + geometry.elementsNeedUpdate = false; + + } + + if ( direct === undefined ) { + + return this.fromGeometry( geometry ); + + } + + direct.verticesNeedUpdate = geometry.verticesNeedUpdate; + direct.normalsNeedUpdate = geometry.normalsNeedUpdate; + direct.colorsNeedUpdate = geometry.colorsNeedUpdate; + direct.uvsNeedUpdate = geometry.uvsNeedUpdate; + direct.groupsNeedUpdate = geometry.groupsNeedUpdate; + + geometry.verticesNeedUpdate = false; + geometry.normalsNeedUpdate = false; + geometry.colorsNeedUpdate = false; + geometry.uvsNeedUpdate = false; + geometry.groupsNeedUpdate = false; + + geometry = direct; + + } + + var attribute; + + if ( geometry.verticesNeedUpdate === true ) { + + attribute = this.attributes.position; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.vertices ); + attribute.needsUpdate = true; + + } + + geometry.verticesNeedUpdate = false; + + } + + if ( geometry.normalsNeedUpdate === true ) { + + attribute = this.attributes.normal; + + if ( attribute !== undefined ) { + + attribute.copyVector3sArray( geometry.normals ); + attribute.needsUpdate = true; + + } + + geometry.normalsNeedUpdate = false; + + } + + if ( geometry.colorsNeedUpdate === true ) { + + attribute = this.attributes.color; + + if ( attribute !== undefined ) { + + attribute.copyColorsArray( geometry.colors ); + attribute.needsUpdate = true; + + } + + geometry.colorsNeedUpdate = false; + + } + + if ( geometry.uvsNeedUpdate ) { + + attribute = this.attributes.uv; + + if ( attribute !== undefined ) { + + attribute.copyVector2sArray( geometry.uvs ); + attribute.needsUpdate = true; + + } + + geometry.uvsNeedUpdate = false; + + } + + if ( geometry.lineDistancesNeedUpdate ) { + + attribute = this.attributes.lineDistance; + + if ( attribute !== undefined ) { + + attribute.copyArray( geometry.lineDistances ); + attribute.needsUpdate = true; + + } + + geometry.lineDistancesNeedUpdate = false; + + } + + if ( geometry.groupsNeedUpdate ) { + + geometry.computeGroups( object.geometry ); + this.groups = geometry.groups; + + geometry.groupsNeedUpdate = false; + + } + + return this; + + }, + + fromGeometry: function ( geometry ) { + + geometry.__directGeometry = new DirectGeometry().fromGeometry( geometry ); + + return this.fromDirectGeometry( geometry.__directGeometry ); + + }, + + fromDirectGeometry: function ( geometry ) { + + var positions = new Float32Array( geometry.vertices.length * 3 ); + this.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) ); + + if ( geometry.normals.length > 0 ) { + + var normals = new Float32Array( geometry.normals.length * 3 ); + this.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) ); + + } + + if ( geometry.colors.length > 0 ) { + + var colors = new Float32Array( geometry.colors.length * 3 ); + this.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) ); + + } + + if ( geometry.uvs.length > 0 ) { + + var uvs = new Float32Array( geometry.uvs.length * 2 ); + this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) ); + + } + + if ( geometry.uvs2.length > 0 ) { + + var uvs2 = new Float32Array( geometry.uvs2.length * 2 ); + this.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) ); + + } + + if ( geometry.indices.length > 0 ) { + + var TypeArray = geometry.vertices.length > 65535 ? Uint32Array : Uint16Array; + var indices = new TypeArray( geometry.indices.length * 3 ); + this.setIndex( new BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) ); + + } + + // groups + + this.groups = geometry.groups; + + // morphs + + for ( var name in geometry.morphTargets ) { + + var array = []; + var morphTargets = geometry.morphTargets[ name ]; + + for ( var i = 0, l = morphTargets.length; i < l; i ++ ) { + + var morphTarget = morphTargets[ i ]; + + var attribute = new Float32Attribute( morphTarget.length * 3, 3 ); + + array.push( attribute.copyVector3sArray( morphTarget ) ); + + } + + this.morphAttributes[ name ] = array; + + } + + // skinning + + if ( geometry.skinIndices.length > 0 ) { + + var skinIndices = new Float32Attribute( geometry.skinIndices.length * 4, 4 ); + this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) ); + + } + + if ( geometry.skinWeights.length > 0 ) { + + var skinWeights = new Float32Attribute( geometry.skinWeights.length * 4, 4 ); + this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) ); + + } + + // + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + return this; + + }, + + computeBoundingBox: function () { + + if ( this.boundingBox === null ) { + + this.boundingBox = new Box3(); + + } + + var positions = this.attributes.position.array; + + if ( positions !== undefined ) { + + this.boundingBox.setFromArray( positions ); + + } else { + + this.boundingBox.makeEmpty(); + + } + + if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this ); + + } + + }, + + computeBoundingSphere: function () { + + var box = new Box3(); + var vector = new Vector3(); + + return function computeBoundingSphere() { + + if ( this.boundingSphere === null ) { + + this.boundingSphere = new Sphere(); + + } + + var positions = this.attributes.position; + + if ( positions ) { + + var array = positions.array; + var center = this.boundingSphere.center; + + box.setFromArray( array ); + box.getCenter( center ); + + // hoping to find a boundingSphere with a radius smaller than the + // boundingSphere of the boundingBox: sqrt(3) smaller in the best case + + var maxRadiusSq = 0; + + for ( var i = 0, il = array.length; i < il; i += 3 ) { + + vector.fromArray( array, i ); + maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) ); + + } + + this.boundingSphere.radius = Math.sqrt( maxRadiusSq ); + + if ( isNaN( this.boundingSphere.radius ) ) { + + console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this ); + + } + + } + + }; + + }(), + + computeFaceNormals: function () { + + // backwards compatibility + + }, + + computeVertexNormals: function () { + + var index = this.index; + var attributes = this.attributes; + var groups = this.groups; + + if ( attributes.position ) { + + var positions = attributes.position.array; + + if ( attributes.normal === undefined ) { + + this.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) ); + + } else { + + // reset existing normals to zero + + var array = attributes.normal.array; + + for ( var i = 0, il = array.length; i < il; i ++ ) { + + array[ i ] = 0; + + } + + } + + var normals = attributes.normal.array; + + var vA, vB, vC, + + pA = new Vector3(), + pB = new Vector3(), + pC = new Vector3(), + + cb = new Vector3(), + ab = new Vector3(); + + // indexed elements + + if ( index ) { + + var indices = index.array; + + if ( groups.length === 0 ) { + + this.addGroup( 0, indices.length ); + + } + + for ( var j = 0, jl = groups.length; j < jl; ++ j ) { + + var group = groups[ j ]; + + var start = group.start; + var count = group.count; + + for ( var i = start, il = start + count; i < il; i += 3 ) { + + vA = indices[ i + 0 ] * 3; + vB = indices[ i + 1 ] * 3; + vC = indices[ i + 2 ] * 3; + + pA.fromArray( positions, vA ); + pB.fromArray( positions, vB ); + pC.fromArray( positions, vC ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ vA ] += cb.x; + normals[ vA + 1 ] += cb.y; + normals[ vA + 2 ] += cb.z; + + normals[ vB ] += cb.x; + normals[ vB + 1 ] += cb.y; + normals[ vB + 2 ] += cb.z; + + normals[ vC ] += cb.x; + normals[ vC + 1 ] += cb.y; + normals[ vC + 2 ] += cb.z; + + } + + } + + } else { + + // non-indexed elements (unconnected triangle soup) + + for ( var i = 0, il = positions.length; i < il; i += 9 ) { + + pA.fromArray( positions, i ); + pB.fromArray( positions, i + 3 ); + pC.fromArray( positions, i + 6 ); + + cb.subVectors( pC, pB ); + ab.subVectors( pA, pB ); + cb.cross( ab ); + + normals[ i ] = cb.x; + normals[ i + 1 ] = cb.y; + normals[ i + 2 ] = cb.z; + + normals[ i + 3 ] = cb.x; + normals[ i + 4 ] = cb.y; + normals[ i + 5 ] = cb.z; + + normals[ i + 6 ] = cb.x; + normals[ i + 7 ] = cb.y; + normals[ i + 8 ] = cb.z; + + } + + } + + this.normalizeNormals(); + + attributes.normal.needsUpdate = true; + + } + + }, + + merge: function ( geometry, offset ) { + + if ( (geometry && geometry.isBufferGeometry) === false ) { + + console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry ); + return; + + } + + if ( offset === undefined ) offset = 0; + + var attributes = this.attributes; + + for ( var key in attributes ) { + + if ( geometry.attributes[ key ] === undefined ) continue; + + var attribute1 = attributes[ key ]; + var attributeArray1 = attribute1.array; + + var attribute2 = geometry.attributes[ key ]; + var attributeArray2 = attribute2.array; + + var attributeSize = attribute2.itemSize; + + for ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) { + + attributeArray1[ j ] = attributeArray2[ i ]; + + } + + } + + return this; + + }, + + normalizeNormals: function () { + + var normals = this.attributes.normal.array; + + var x, y, z, n; + + for ( var i = 0, il = normals.length; i < il; i += 3 ) { + + x = normals[ i ]; + y = normals[ i + 1 ]; + z = normals[ i + 2 ]; + + n = 1.0 / Math.sqrt( x * x + y * y + z * z ); + + normals[ i ] *= n; + normals[ i + 1 ] *= n; + normals[ i + 2 ] *= n; + + } + + }, + + toNonIndexed: function () { + + if ( this.index === null ) { + + console.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' ); + return this; + + } + + var geometry2 = new BufferGeometry(); + + var indices = this.index.array; + var attributes = this.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + + var array = attribute.array; + var itemSize = attribute.itemSize; + + var array2 = new array.constructor( indices.length * itemSize ); + + var index = 0, index2 = 0; + + for ( var i = 0, l = indices.length; i < l; i ++ ) { + + index = indices[ i ] * itemSize; + + for ( var j = 0; j < itemSize; j ++ ) { + + array2[ index2 ++ ] = array[ index ++ ]; + + } + + } + + geometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) ); + + } + + return geometry2; + + }, + + toJSON: function () { + + var data = { + metadata: { + version: 4.4, + type: 'BufferGeometry', + generator: 'BufferGeometry.toJSON' + } + }; + + // standard BufferGeometry serialization + + data.uuid = this.uuid; + data.type = this.type; + if ( this.name !== '' ) data.name = this.name; + + if ( this.parameters !== undefined ) { + + var parameters = this.parameters; + + for ( var key in parameters ) { + + if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ]; + + } + + return data; + + } + + data.data = { attributes: {} }; + + var index = this.index; + + if ( index !== null ) { + + var array = Array.prototype.slice.call( index.array ); + + data.data.index = { + type: index.array.constructor.name, + array: array + }; + + } + + var attributes = this.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + + var array = Array.prototype.slice.call( attribute.array ); + + data.data.attributes[ key ] = { + itemSize: attribute.itemSize, + type: attribute.array.constructor.name, + array: array, + normalized: attribute.normalized + }; + + } + + var groups = this.groups; + + if ( groups.length > 0 ) { + + data.data.groups = JSON.parse( JSON.stringify( groups ) ); + + } + + var boundingSphere = this.boundingSphere; + + if ( boundingSphere !== null ) { + + data.data.boundingSphere = { + center: boundingSphere.center.toArray(), + radius: boundingSphere.radius + }; + + } + + return data; + + }, + + clone: function () { + + /* + // Handle primitives + + var parameters = this.parameters; + + if ( parameters !== undefined ) { + + var values = []; + + for ( var key in parameters ) { + + values.push( parameters[ key ] ); + + } + + var geometry = Object.create( this.constructor.prototype ); + this.constructor.apply( geometry, values ); + return geometry; + + } + + return new this.constructor().copy( this ); + */ + + return new BufferGeometry().copy( this ); + + }, + + copy: function ( source ) { + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + var attributes = source.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + var groups = source.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + + } + + return this; + + }, + + dispose: function () { + + this.dispatchEvent( { type: 'dispose' } ); + + } + + } ); + + BufferGeometry.MaxIndex = 65535; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author mikael emtinger / http://gomo.se/ + * @author jonobr1 / http://jonobr1.com/ + */ + + function Mesh( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Mesh'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } ); + + this.drawMode = TrianglesDrawMode; + + this.updateMorphTargets(); + + } + + Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Mesh, + + isMesh: true, + + setDrawMode: function ( value ) { + + this.drawMode = value; + + }, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.drawMode = source.drawMode; + + return this; + + }, + + updateMorphTargets: function () { + + var morphTargets = this.geometry.morphTargets; + + if ( morphTargets !== undefined && morphTargets.length > 0 ) { + + this.morphTargetInfluences = []; + this.morphTargetDictionary = {}; + + for ( var m = 0, ml = morphTargets.length; m < ml; m ++ ) { + + this.morphTargetInfluences.push( 0 ); + this.morphTargetDictionary[ morphTargets[ m ].name ] = m; + + } + + } + + }, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + var vA = new Vector3(); + var vB = new Vector3(); + var vC = new Vector3(); + + var tempA = new Vector3(); + var tempB = new Vector3(); + var tempC = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + var barycoord = new Vector3(); + + var intersectionPoint = new Vector3(); + var intersectionPointWorld = new Vector3(); + + function uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) { + + Triangle.barycoordFromPoint( point, p1, p2, p3, barycoord ); + + uv1.multiplyScalar( barycoord.x ); + uv2.multiplyScalar( barycoord.y ); + uv3.multiplyScalar( barycoord.z ); + + uv1.add( uv2 ).add( uv3 ); + + return uv1.clone(); + + } + + function checkIntersection( object, raycaster, ray, pA, pB, pC, point ) { + + var intersect; + var material = object.material; + + if ( material.side === BackSide ) { + + intersect = ray.intersectTriangle( pC, pB, pA, true, point ); + + } else { + + intersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point ); + + } + + if ( intersect === null ) return null; + + intersectionPointWorld.copy( point ); + intersectionPointWorld.applyMatrix4( object.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectionPointWorld ); + + if ( distance < raycaster.near || distance > raycaster.far ) return null; + + return { + distance: distance, + point: intersectionPointWorld.clone(), + object: object + }; + + } + + function checkBufferGeometryIntersection( object, raycaster, ray, positions, uvs, a, b, c ) { + + vA.fromArray( positions, a * 3 ); + vB.fromArray( positions, b * 3 ); + vC.fromArray( positions, c * 3 ); + + var intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint ); + + if ( intersection ) { + + if ( uvs ) { + + uvA.fromArray( uvs, a * 2 ); + uvB.fromArray( uvs, b * 2 ); + uvC.fromArray( uvs, c * 2 ); + + intersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC ); + + } + + intersection.face = new Face3( a, b, c, Triangle.normal( vA, vB, vC ) ); + intersection.faceIndex = a; + + } + + return intersection; + + } + + return function raycast( raycaster, intersects ) { + + var geometry = this.geometry; + var material = this.material; + var matrixWorld = this.matrixWorld; + + if ( material === undefined ) return; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + // Check boundingBox before continuing + + if ( geometry.boundingBox !== null ) { + + if ( ray.intersectsBox( geometry.boundingBox ) === false ) return; + + } + + var uvs, intersection; + + if ( (geometry && geometry.isBufferGeometry) ) { + + var a, b, c; + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( attributes.uv !== undefined ) { + + uvs = attributes.uv.array; + + } + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, l = indices.length; i < l; i += 3 ) { + + a = indices[ i ]; + b = indices[ i + 1 ]; + c = indices[ i + 2 ]; + + intersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c ); + + if ( intersection ) { + + intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics + intersects.push( intersection ); + + } + + } + + } else { + + + for ( var i = 0, l = positions.length; i < l; i += 9 ) { + + a = i / 3; + b = a + 1; + c = a + 2; + + intersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c ); + + if ( intersection ) { + + intersection.index = a; // triangle number in positions buffer semantics + intersects.push( intersection ); + + } + + } + + } + + } else if ( (geometry && geometry.isGeometry) ) { + + var fvA, fvB, fvC; + var isFaceMaterial = (material && material.isMultiMaterial); + var materials = isFaceMaterial === true ? material.materials : null; + + var vertices = geometry.vertices; + var faces = geometry.faces; + var faceVertexUvs = geometry.faceVertexUvs[ 0 ]; + if ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs; + + for ( var f = 0, fl = faces.length; f < fl; f ++ ) { + + var face = faces[ f ]; + var faceMaterial = isFaceMaterial === true ? materials[ face.materialIndex ] : material; + + if ( faceMaterial === undefined ) continue; + + fvA = vertices[ face.a ]; + fvB = vertices[ face.b ]; + fvC = vertices[ face.c ]; + + if ( faceMaterial.morphTargets === true ) { + + var morphTargets = geometry.morphTargets; + var morphInfluences = this.morphTargetInfluences; + + vA.set( 0, 0, 0 ); + vB.set( 0, 0, 0 ); + vC.set( 0, 0, 0 ); + + for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) { + + var influence = morphInfluences[ t ]; + + if ( influence === 0 ) continue; + + var targets = morphTargets[ t ].vertices; + + vA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence ); + vB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence ); + vC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence ); + + } + + vA.add( fvA ); + vB.add( fvB ); + vC.add( fvC ); + + fvA = vA; + fvB = vB; + fvC = vC; + + } + + intersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint ); + + if ( intersection ) { + + if ( uvs ) { + + var uvs_f = uvs[ f ]; + uvA.copy( uvs_f[ 0 ] ); + uvB.copy( uvs_f[ 1 ] ); + uvC.copy( uvs_f[ 2 ] ); + + intersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC ); + + } + + intersection.face = face; + intersection.faceIndex = f; + intersects.push( intersection ); + + } + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + BufferGeometry.call( this ); + + this.type = 'BoxBufferGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + var scope = this; + + // segments + widthSegments = Math.floor( widthSegments ) || 1; + heightSegments = Math.floor( heightSegments ) || 1; + depthSegments = Math.floor( depthSegments ) || 1; + + // these are used to calculate buffer length + var vertexCount = calculateVertexCount( widthSegments, heightSegments, depthSegments ); + var indexCount = calculateIndexCount( widthSegments, heightSegments, depthSegments ); + + // buffers + var indices = new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ); + var vertices = new Float32Array( vertexCount * 3 ); + var normals = new Float32Array( vertexCount * 3 ); + var uvs = new Float32Array( vertexCount * 2 ); + + // offset variables + var vertexBufferOffset = 0; + var uvBufferOffset = 0; + var indexBufferOffset = 0; + var numberOfVertices = 0; + + // group variables + var groupStart = 0; + + // build each side of the box geometry + buildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px + buildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx + buildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py + buildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny + buildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz + buildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz + + // build geometry + this.setIndex( new BufferAttribute( indices, 1 ) ); + this.addAttribute( 'position', new BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) ); + + // helper functions + + function calculateVertexCount( w, h, d ) { + + var vertices = 0; + + // calculate the amount of vertices for each side (plane) + vertices += (w + 1) * (h + 1) * 2; // xy + vertices += (w + 1) * (d + 1) * 2; // xz + vertices += (d + 1) * (h + 1) * 2; // zy + + return vertices; + + } + + function calculateIndexCount( w, h, d ) { + + var index = 0; + + // calculate the amount of squares for each side + index += w * h * 2; // xy + index += w * d * 2; // xz + index += d * h * 2; // zy + + return index * 6; // two triangles per square => six vertices per square + + } + + function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) { + + var segmentWidth = width / gridX; + var segmentHeight = height / gridY; + + var widthHalf = width / 2; + var heightHalf = height / 2; + var depthHalf = depth / 2; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var vertexCounter = 0; + var groupCount = 0; + + var vector = new Vector3(); + + // generate vertices, normals and uvs + + for ( var iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segmentHeight - heightHalf; + + for ( var ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segmentWidth - widthHalf; + + // set values to correct vector component + vector[ u ] = x * udir; + vector[ v ] = y * vdir; + vector[ w ] = depthHalf; + + // now apply vector to vertex buffer + vertices[ vertexBufferOffset ] = vector.x; + vertices[ vertexBufferOffset + 1 ] = vector.y; + vertices[ vertexBufferOffset + 2 ] = vector.z; + + // set values to correct vector component + vector[ u ] = 0; + vector[ v ] = 0; + vector[ w ] = depth > 0 ? 1 : - 1; + + // now apply vector to normal buffer + normals[ vertexBufferOffset ] = vector.x; + normals[ vertexBufferOffset + 1 ] = vector.y; + normals[ vertexBufferOffset + 2 ] = vector.z; + + // uvs + uvs[ uvBufferOffset ] = ix / gridX; + uvs[ uvBufferOffset + 1 ] = 1 - ( iy / gridY ); + + // update offsets and counters + vertexBufferOffset += 3; + uvBufferOffset += 2; + vertexCounter += 1; + + } + + } + + // 1. you need three indices to draw a single face + // 2. a single segment consists of two faces + // 3. so we need to generate six (2*3) indices per segment + + for ( iy = 0; iy < gridY; iy ++ ) { + + for ( ix = 0; ix < gridX; ix ++ ) { + + // indices + var a = numberOfVertices + ix + gridX1 * iy; + var b = numberOfVertices + ix + gridX1 * ( iy + 1 ); + var c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = numberOfVertices + ( ix + 1 ) + gridX1 * iy; + + // face one + indices[ indexBufferOffset ] = a; + indices[ indexBufferOffset + 1 ] = b; + indices[ indexBufferOffset + 2 ] = d; + + // face two + indices[ indexBufferOffset + 3 ] = b; + indices[ indexBufferOffset + 4 ] = c; + indices[ indexBufferOffset + 5 ] = d; + + // update offsets and counters + indexBufferOffset += 6; + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + scope.addGroup( groupStart, groupCount, materialIndex ); + + // calculate new start value for groups + groupStart += groupCount; + + // update total number of vertices + numberOfVertices += vertexCounter; + + } + + } + + BoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + BoxBufferGeometry.prototype.constructor = BoxBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as + */ + + function PlaneBufferGeometry( width, height, widthSegments, heightSegments ) { + + BufferGeometry.call( this ); + + this.type = 'PlaneBufferGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + var width_half = width / 2; + var height_half = height / 2; + + var gridX = Math.floor( widthSegments ) || 1; + var gridY = Math.floor( heightSegments ) || 1; + + var gridX1 = gridX + 1; + var gridY1 = gridY + 1; + + var segment_width = width / gridX; + var segment_height = height / gridY; + + var vertices = new Float32Array( gridX1 * gridY1 * 3 ); + var normals = new Float32Array( gridX1 * gridY1 * 3 ); + var uvs = new Float32Array( gridX1 * gridY1 * 2 ); + + var offset = 0; + var offset2 = 0; + + for ( var iy = 0; iy < gridY1; iy ++ ) { + + var y = iy * segment_height - height_half; + + for ( var ix = 0; ix < gridX1; ix ++ ) { + + var x = ix * segment_width - width_half; + + vertices[ offset ] = x; + vertices[ offset + 1 ] = - y; + + normals[ offset + 2 ] = 1; + + uvs[ offset2 ] = ix / gridX; + uvs[ offset2 + 1 ] = 1 - ( iy / gridY ); + + offset += 3; + offset2 += 2; + + } + + } + + offset = 0; + + var indices = new ( ( vertices.length / 3 ) > 65535 ? Uint32Array : Uint16Array )( gridX * gridY * 6 ); + + for ( var iy = 0; iy < gridY; iy ++ ) { + + for ( var ix = 0; ix < gridX; ix ++ ) { + + var a = ix + gridX1 * iy; + var b = ix + gridX1 * ( iy + 1 ); + var c = ( ix + 1 ) + gridX1 * ( iy + 1 ); + var d = ( ix + 1 ) + gridX1 * iy; + + indices[ offset ] = a; + indices[ offset + 1 ] = b; + indices[ offset + 2 ] = d; + + indices[ offset + 3 ] = b; + indices[ offset + 4 ] = c; + indices[ offset + 5 ] = d; + + offset += 6; + + } + + } + + this.setIndex( new BufferAttribute( indices, 1 ) ); + this.addAttribute( 'position', new BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) ); + + } + + PlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + PlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author mikael emtinger / http://gomo.se/ + * @author WestLangley / http://github.com/WestLangley + */ + + function Camera() { + + Object3D.call( this ); + + this.type = 'Camera'; + + this.matrixWorldInverse = new Matrix4(); + this.projectionMatrix = new Matrix4(); + + } + + Camera.prototype = Object.create( Object3D.prototype ); + Camera.prototype.constructor = Camera; + + Camera.prototype.isCamera = true; + + Camera.prototype.getWorldDirection = function () { + + var quaternion = new Quaternion(); + + return function getWorldDirection( optionalTarget ) { + + var result = optionalTarget || new Vector3(); + + this.getWorldQuaternion( quaternion ); + + return result.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + }; + + }(); + + Camera.prototype.lookAt = function () { + + // This routine does not support cameras with rotated and/or translated parent(s) + + var m1 = new Matrix4(); + + return function lookAt( vector ) { + + m1.lookAt( this.position, vector, this.up ); + + this.quaternion.setFromRotationMatrix( m1 ); + + }; + + }(); + + Camera.prototype.clone = function () { + + return new this.constructor().copy( this ); + + }; + + Camera.prototype.copy = function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.matrixWorldInverse.copy( source.matrixWorldInverse ); + this.projectionMatrix.copy( source.projectionMatrix ); + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author greggman / http://games.greggman.com/ + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author tschw + */ + + function PerspectiveCamera( fov, aspect, near, far ) { + + Camera.call( this ); + + this.type = 'PerspectiveCamera'; + + this.fov = fov !== undefined ? fov : 50; + this.zoom = 1; + + this.near = near !== undefined ? near : 0.1; + this.far = far !== undefined ? far : 2000; + this.focus = 10; + + this.aspect = aspect !== undefined ? aspect : 1; + this.view = null; + + this.filmGauge = 35; // width of the film (default in millimeters) + this.filmOffset = 0; // horizontal film offset (same unit as gauge) + + this.updateProjectionMatrix(); + + } + + PerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: PerspectiveCamera, + + isPerspectiveCamera: true, + + copy: function ( source ) { + + Camera.prototype.copy.call( this, source ); + + this.fov = source.fov; + this.zoom = source.zoom; + + this.near = source.near; + this.far = source.far; + this.focus = source.focus; + + this.aspect = source.aspect; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + this.filmGauge = source.filmGauge; + this.filmOffset = source.filmOffset; + + return this; + + }, + + /** + * Sets the FOV by focal length in respect to the current .filmGauge. + * + * The default film gauge is 35, so that the focal length can be specified for + * a 35mm (full frame) camera. + * + * Values for focal length and film gauge must have the same unit. + */ + setFocalLength: function ( focalLength ) { + + // see http://www.bobatkins.com/photography/technical/field_of_view.html + var vExtentSlope = 0.5 * this.getFilmHeight() / focalLength; + + this.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope ); + this.updateProjectionMatrix(); + + }, + + /** + * Calculates the focal length from the current .fov and .filmGauge. + */ + getFocalLength: function () { + + var vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov ); + + return 0.5 * this.getFilmHeight() / vExtentSlope; + + }, + + getEffectiveFOV: function () { + + return _Math.RAD2DEG * 2 * Math.atan( + Math.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom ); + + }, + + getFilmWidth: function () { + + // film not completely covered in portrait format (aspect < 1) + return this.filmGauge * Math.min( this.aspect, 1 ); + + }, + + getFilmHeight: function () { + + // film not completely covered in landscape format (aspect > 1) + return this.filmGauge / Math.max( this.aspect, 1 ); + + }, + + /** + * Sets an offset in a larger frustum. This is useful for multi-window or + * multi-monitor/multi-machine setups. + * + * For example, if you have 3x2 monitors and each monitor is 1920x1080 and + * the monitors are in grid like this + * + * +---+---+---+ + * | A | B | C | + * +---+---+---+ + * | D | E | F | + * +---+---+---+ + * + * then for each monitor you would call it like this + * + * var w = 1920; + * var h = 1080; + * var fullWidth = w * 3; + * var fullHeight = h * 2; + * + * --A-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); + * --B-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); + * --C-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); + * --D-- + * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); + * --E-- + * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); + * --F-- + * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); + * + * Note there is no reason monitors have to be the same size or in a grid. + */ + setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) { + + this.aspect = fullWidth / fullHeight; + + this.view = { + fullWidth: fullWidth, + fullHeight: fullHeight, + offsetX: x, + offsetY: y, + width: width, + height: height + }; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function() { + + this.view = null; + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var near = this.near, + top = near * Math.tan( + _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom, + height = 2 * top, + width = this.aspect * height, + left = - 0.5 * width, + view = this.view; + + if ( view !== null ) { + + var fullWidth = view.fullWidth, + fullHeight = view.fullHeight; + + left += view.offsetX * width / fullWidth; + top -= view.offsetY * height / fullHeight; + width *= view.width / fullWidth; + height *= view.height / fullHeight; + + } + + var skew = this.filmOffset; + if ( skew !== 0 ) left += near * skew / this.getFilmWidth(); + + this.projectionMatrix.makeFrustum( + left, left + width, top - height, top, near, this.far ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.fov = this.fov; + data.object.zoom = this.zoom; + + data.object.near = this.near; + data.object.far = this.far; + data.object.focus = this.focus; + + data.object.aspect = this.aspect; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + data.object.filmGauge = this.filmGauge; + data.object.filmOffset = this.filmOffset; + + return data; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author arose / http://github.com/arose + */ + + function OrthographicCamera( left, right, top, bottom, near, far ) { + + Camera.call( this ); + + this.type = 'OrthographicCamera'; + + this.zoom = 1; + this.view = null; + + this.left = left; + this.right = right; + this.top = top; + this.bottom = bottom; + + this.near = ( near !== undefined ) ? near : 0.1; + this.far = ( far !== undefined ) ? far : 2000; + + this.updateProjectionMatrix(); + + } + + OrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), { + + constructor: OrthographicCamera, + + isOrthographicCamera: true, + + copy: function ( source ) { + + Camera.prototype.copy.call( this, source ); + + this.left = source.left; + this.right = source.right; + this.top = source.top; + this.bottom = source.bottom; + this.near = source.near; + this.far = source.far; + + this.zoom = source.zoom; + this.view = source.view === null ? null : Object.assign( {}, source.view ); + + return this; + + }, + + setViewOffset: function( fullWidth, fullHeight, x, y, width, height ) { + + this.view = { + fullWidth: fullWidth, + fullHeight: fullHeight, + offsetX: x, + offsetY: y, + width: width, + height: height + }; + + this.updateProjectionMatrix(); + + }, + + clearViewOffset: function() { + + this.view = null; + this.updateProjectionMatrix(); + + }, + + updateProjectionMatrix: function () { + + var dx = ( this.right - this.left ) / ( 2 * this.zoom ); + var dy = ( this.top - this.bottom ) / ( 2 * this.zoom ); + var cx = ( this.right + this.left ) / 2; + var cy = ( this.top + this.bottom ) / 2; + + var left = cx - dx; + var right = cx + dx; + var top = cy + dy; + var bottom = cy - dy; + + if ( this.view !== null ) { + + var zoomW = this.zoom / ( this.view.width / this.view.fullWidth ); + var zoomH = this.zoom / ( this.view.height / this.view.fullHeight ); + var scaleW = ( this.right - this.left ) / this.view.width; + var scaleH = ( this.top - this.bottom ) / this.view.height; + + left += scaleW * ( this.view.offsetX / zoomW ); + right = left + scaleW * ( this.view.width / zoomW ); + top -= scaleH * ( this.view.offsetY / zoomH ); + bottom = top - scaleH * ( this.view.height / zoomH ); + + } + + this.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far ); + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.zoom = this.zoom; + data.object.left = this.left; + data.object.right = this.right; + data.object.top = this.top; + data.object.bottom = this.bottom; + data.object.near = this.near; + data.object.far = this.far; + + if ( this.view !== null ) data.object.view = Object.assign( {}, this.view ); + + return data; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLIndexedBufferRenderer( gl, extensions, infoRender ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + var type, size; + + function setIndex( index ) { + + if ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) { + + type = gl.UNSIGNED_INT; + size = 4; + + } else { + + type = gl.UNSIGNED_SHORT; + size = 2; + + } + + } + + function render( start, count ) { + + gl.drawElements( mode, count, type, start * size ); + + infoRender.calls ++; + infoRender.vertices += count; + + if ( mode === gl.TRIANGLES ) infoRender.faces += count / 3; + + } + + function renderInstances( geometry, start, count ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + extension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount ); + + infoRender.calls ++; + infoRender.vertices += count * geometry.maxInstancedCount; + + if ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3; + + } + + return { + + setMode: setMode, + setIndex: setIndex, + render: render, + renderInstances: renderInstances + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLBufferRenderer( gl, extensions, infoRender ) { + + var mode; + + function setMode( value ) { + + mode = value; + + } + + function render( start, count ) { + + gl.drawArrays( mode, start, count ); + + infoRender.calls ++; + infoRender.vertices += count; + + if ( mode === gl.TRIANGLES ) infoRender.faces += count / 3; + + } + + function renderInstances( geometry ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + var position = geometry.attributes.position; + + var count = 0; + + if ( (position && position.isInterleavedBufferAttribute) ) { + + count = position.data.count; + + extension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount ); + + } else { + + count = position.count; + + extension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount ); + + } + + infoRender.calls ++; + infoRender.vertices += count * geometry.maxInstancedCount; + + if ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3; + + } + + return { + setMode: setMode, + render: render, + renderInstances: renderInstances + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLLights() { + + var lights = {}; + + return { + + get: function ( light ) { + + if ( lights[ light.id ] !== undefined ) { + + return lights[ light.id ]; + + } + + var uniforms; + + switch ( light.type ) { + + case 'DirectionalLight': + uniforms = { + direction: new Vector3(), + color: new Color(), + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'SpotLight': + uniforms = { + position: new Vector3(), + direction: new Vector3(), + color: new Color(), + distance: 0, + coneCos: 0, + penumbraCos: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'PointLight': + uniforms = { + position: new Vector3(), + color: new Color(), + distance: 0, + decay: 0, + + shadow: false, + shadowBias: 0, + shadowRadius: 1, + shadowMapSize: new Vector2() + }; + break; + + case 'HemisphereLight': + uniforms = { + direction: new Vector3(), + skyColor: new Color(), + groundColor: new Color() + }; + break; + + } + + lights[ light.id ] = uniforms; + + return uniforms; + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function addLineNumbers( string ) { + + var lines = string.split( '\n' ); + + for ( var i = 0; i < lines.length; i ++ ) { + + lines[ i ] = ( i + 1 ) + ': ' + lines[ i ]; + + } + + return lines.join( '\n' ); + + } + + function WebGLShader( gl, type, string ) { + + var shader = gl.createShader( type ); + + gl.shaderSource( shader, string ); + gl.compileShader( shader ); + + if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) { + + console.error( 'THREE.WebGLShader: Shader couldn\'t compile.' ); + + } + + if ( gl.getShaderInfoLog( shader ) !== '' ) { + + console.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) ); + + } + + // --enable-privileged-webgl-extension + // console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); + + return shader; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var programIdCount = 0; + + function getEncodingComponents( encoding ) { + + switch ( encoding ) { + + case LinearEncoding: + return [ 'Linear','( value )' ]; + case sRGBEncoding: + return [ 'sRGB','( value )' ]; + case RGBEEncoding: + return [ 'RGBE','( value )' ]; + case RGBM7Encoding: + return [ 'RGBM','( value, 7.0 )' ]; + case RGBM16Encoding: + return [ 'RGBM','( value, 16.0 )' ]; + case RGBDEncoding: + return [ 'RGBD','( value, 256.0 )' ]; + case GammaEncoding: + return [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ]; + default: + throw new Error( 'unsupported encoding: ' + encoding ); + + } + + } + + function getTexelDecodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return "vec4 " + functionName + "( vec4 value ) { return " + components[ 0 ] + "ToLinear" + components[ 1 ] + "; }"; + + } + + function getTexelEncodingFunction( functionName, encoding ) { + + var components = getEncodingComponents( encoding ); + return "vec4 " + functionName + "( vec4 value ) { return LinearTo" + components[ 0 ] + components[ 1 ] + "; }"; + + } + + function getToneMappingFunction( functionName, toneMapping ) { + + var toneMappingName; + + switch ( toneMapping ) { + + case LinearToneMapping: + toneMappingName = "Linear"; + break; + + case ReinhardToneMapping: + toneMappingName = "Reinhard"; + break; + + case Uncharted2ToneMapping: + toneMappingName = "Uncharted2"; + break; + + case CineonToneMapping: + toneMappingName = "OptimizedCineon"; + break; + + default: + throw new Error( 'unsupported toneMapping: ' + toneMapping ); + + } + + return "vec3 " + functionName + "( vec3 color ) { return " + toneMappingName + "ToneMapping( color ); }"; + + } + + function generateExtensions( extensions, parameters, rendererExtensions ) { + + extensions = extensions || {}; + + var chunks = [ + ( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '', + ( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '', + ( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '', + ( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '', + ]; + + return chunks.filter( filterEmptyLine ).join( '\n' ); + + } + + function generateDefines( defines ) { + + var chunks = []; + + for ( var name in defines ) { + + var value = defines[ name ]; + + if ( value === false ) continue; + + chunks.push( '#define ' + name + ' ' + value ); + + } + + return chunks.join( '\n' ); + + } + + function fetchAttributeLocations( gl, program, identifiers ) { + + var attributes = {}; + + var n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES ); + + for ( var i = 0; i < n; i ++ ) { + + var info = gl.getActiveAttrib( program, i ); + var name = info.name; + + // console.log("THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:", name, i ); + + attributes[ name ] = gl.getAttribLocation( program, name ); + + } + + return attributes; + + } + + function filterEmptyLine( string ) { + + return string !== ''; + + } + + function replaceLightNums( string, parameters ) { + + return string + .replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights ) + .replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights ) + .replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights ) + .replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights ); + + } + + function parseIncludes( string ) { + + var pattern = /#include +<([\w\d.]+)>/g; + + function replace( match, include ) { + + var replace = ShaderChunk[ include ]; + + if ( replace === undefined ) { + + throw new Error( 'Can not resolve #include <' + include + '>' ); + + } + + return parseIncludes( replace ); + + } + + return string.replace( pattern, replace ); + + } + + function unrollLoops( string ) { + + var pattern = /for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g; + + function replace( match, start, end, snippet ) { + + var unroll = ''; + + for ( var i = parseInt( start ); i < parseInt( end ); i ++ ) { + + unroll += snippet.replace( /\[ i \]/g, '[ ' + i + ' ]' ); + + } + + return unroll; + + } + + return string.replace( pattern, replace ); + + } + + function WebGLProgram( renderer, code, material, parameters ) { + + var gl = renderer.context; + + var extensions = material.extensions; + var defines = material.defines; + + var vertexShader = material.__webglShader.vertexShader; + var fragmentShader = material.__webglShader.fragmentShader; + + var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC'; + + if ( parameters.shadowMapType === PCFShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF'; + + } else if ( parameters.shadowMapType === PCFSoftShadowMap ) { + + shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT'; + + } + + var envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + var envMapModeDefine = 'ENVMAP_MODE_REFLECTION'; + var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + + if ( parameters.envMap ) { + + switch ( material.envMap.mapping ) { + + case CubeReflectionMapping: + case CubeRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; + break; + + case CubeUVReflectionMapping: + case CubeUVRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV'; + break; + + case EquirectangularReflectionMapping: + case EquirectangularRefractionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC'; + break; + + case SphericalReflectionMapping: + envMapTypeDefine = 'ENVMAP_TYPE_SPHERE'; + break; + + } + + switch ( material.envMap.mapping ) { + + case CubeRefractionMapping: + case EquirectangularRefractionMapping: + envMapModeDefine = 'ENVMAP_MODE_REFRACTION'; + break; + + } + + switch ( material.combine ) { + + case MultiplyOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; + break; + + case MixOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_MIX'; + break; + + case AddOperation: + envMapBlendingDefine = 'ENVMAP_BLENDING_ADD'; + break; + + } + + } + + var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0; + + // console.log( 'building new program ' ); + + // + + var customExtensions = generateExtensions( extensions, parameters, renderer.extensions ); + + var customDefines = generateDefines( defines ); + + // + + var program = gl.createProgram(); + + var prefixVertex, prefixFragment; + + if ( material.isRawShaderMaterial ) { + + prefixVertex = [ + + customDefines, + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + customExtensions, + customDefines, + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } else { + + prefixVertex = [ + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + material.__webglShader.name, + + customDefines, + + parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + '#define MAX_BONES ' + parameters.maxBones, + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.skinning ? '#define USE_SKINNING' : '', + parameters.useVertexTexture ? '#define BONE_TEXTURE' : '', + + parameters.morphTargets ? '#define USE_MORPHTARGETS' : '', + parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '', + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + '#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes, + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + 'uniform mat4 modelMatrix;', + 'uniform mat4 modelViewMatrix;', + 'uniform mat4 projectionMatrix;', + 'uniform mat4 viewMatrix;', + 'uniform mat3 normalMatrix;', + 'uniform vec3 cameraPosition;', + + 'attribute vec3 position;', + 'attribute vec3 normal;', + 'attribute vec2 uv;', + + '#ifdef USE_COLOR', + + ' attribute vec3 color;', + + '#endif', + + '#ifdef USE_MORPHTARGETS', + + ' attribute vec3 morphTarget0;', + ' attribute vec3 morphTarget1;', + ' attribute vec3 morphTarget2;', + ' attribute vec3 morphTarget3;', + + ' #ifdef USE_MORPHNORMALS', + + ' attribute vec3 morphNormal0;', + ' attribute vec3 morphNormal1;', + ' attribute vec3 morphNormal2;', + ' attribute vec3 morphNormal3;', + + ' #else', + + ' attribute vec3 morphTarget4;', + ' attribute vec3 morphTarget5;', + ' attribute vec3 morphTarget6;', + ' attribute vec3 morphTarget7;', + + ' #endif', + + '#endif', + + '#ifdef USE_SKINNING', + + ' attribute vec4 skinIndex;', + ' attribute vec4 skinWeight;', + + '#endif', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + prefixFragment = [ + + customExtensions, + + 'precision ' + parameters.precision + ' float;', + 'precision ' + parameters.precision + ' int;', + + '#define SHADER_NAME ' + material.__webglShader.name, + + customDefines, + + parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '', + + '#define GAMMA_FACTOR ' + gammaFactorDefine, + + ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '', + ( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '', + + parameters.map ? '#define USE_MAP' : '', + parameters.envMap ? '#define USE_ENVMAP' : '', + parameters.envMap ? '#define ' + envMapTypeDefine : '', + parameters.envMap ? '#define ' + envMapModeDefine : '', + parameters.envMap ? '#define ' + envMapBlendingDefine : '', + parameters.lightMap ? '#define USE_LIGHTMAP' : '', + parameters.aoMap ? '#define USE_AOMAP' : '', + parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '', + parameters.bumpMap ? '#define USE_BUMPMAP' : '', + parameters.normalMap ? '#define USE_NORMALMAP' : '', + parameters.specularMap ? '#define USE_SPECULARMAP' : '', + parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '', + parameters.metalnessMap ? '#define USE_METALNESSMAP' : '', + parameters.alphaMap ? '#define USE_ALPHAMAP' : '', + parameters.vertexColors ? '#define USE_COLOR' : '', + + parameters.flatShading ? '#define FLAT_SHADED' : '', + + parameters.doubleSided ? '#define DOUBLE_SIDED' : '', + parameters.flipSided ? '#define FLIP_SIDED' : '', + + '#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes, + '#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection), + + parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', + parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', + + parameters.premultipliedAlpha ? "#define PREMULTIPLIED_ALPHA" : '', + + parameters.physicallyCorrectLights ? "#define PHYSICALLY_CORRECT_LIGHTS" : '', + + parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', + parameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', + + parameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '', + + 'uniform mat4 viewMatrix;', + 'uniform vec3 cameraPosition;', + + ( parameters.toneMapping !== NoToneMapping ) ? "#define TONE_MAPPING" : '', + ( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below + ( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( "toneMapping", parameters.toneMapping ) : '', + + ( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below + parameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '', + parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '', + parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '', + parameters.outputEncoding ? getTexelEncodingFunction( "linearToOutputTexel", parameters.outputEncoding ) : '', + + parameters.depthPacking ? "#define DEPTH_PACKING " + material.depthPacking : '', + + '\n' + + ].filter( filterEmptyLine ).join( '\n' ); + + } + + vertexShader = parseIncludes( vertexShader, parameters ); + vertexShader = replaceLightNums( vertexShader, parameters ); + + fragmentShader = parseIncludes( fragmentShader, parameters ); + fragmentShader = replaceLightNums( fragmentShader, parameters ); + + if ( ! material.isShaderMaterial ) { + + vertexShader = unrollLoops( vertexShader ); + fragmentShader = unrollLoops( fragmentShader ); + + } + + var vertexGlsl = prefixVertex + vertexShader; + var fragmentGlsl = prefixFragment + fragmentShader; + + // console.log( '*VERTEX*', vertexGlsl ); + // console.log( '*FRAGMENT*', fragmentGlsl ); + + var glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl ); + var glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl ); + + gl.attachShader( program, glVertexShader ); + gl.attachShader( program, glFragmentShader ); + + // Force a particular attribute to index 0. + + if ( material.index0AttributeName !== undefined ) { + + gl.bindAttribLocation( program, 0, material.index0AttributeName ); + + } else if ( parameters.morphTargets === true ) { + + // programs with morphTargets displace position out of attribute 0 + gl.bindAttribLocation( program, 0, 'position' ); + + } + + gl.linkProgram( program ); + + var programLog = gl.getProgramInfoLog( program ); + var vertexLog = gl.getShaderInfoLog( glVertexShader ); + var fragmentLog = gl.getShaderInfoLog( glFragmentShader ); + + var runnable = true; + var haveDiagnostics = true; + + // console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) ); + // console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) ); + + if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) { + + runnable = false; + + console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog ); + + } else if ( programLog !== '' ) { + + console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog ); + + } else if ( vertexLog === '' || fragmentLog === '' ) { + + haveDiagnostics = false; + + } + + if ( haveDiagnostics ) { + + this.diagnostics = { + + runnable: runnable, + material: material, + + programLog: programLog, + + vertexShader: { + + log: vertexLog, + prefix: prefixVertex + + }, + + fragmentShader: { + + log: fragmentLog, + prefix: prefixFragment + + } + + }; + + } + + // clean up + + gl.deleteShader( glVertexShader ); + gl.deleteShader( glFragmentShader ); + + // set up caching for uniform locations + + var cachedUniforms; + + this.getUniforms = function() { + + if ( cachedUniforms === undefined ) { + + cachedUniforms = + new WebGLUniforms( gl, program, renderer ); + + } + + return cachedUniforms; + + }; + + // set up caching for attribute locations + + var cachedAttributes; + + this.getAttributes = function() { + + if ( cachedAttributes === undefined ) { + + cachedAttributes = fetchAttributeLocations( gl, program ); + + } + + return cachedAttributes; + + }; + + // free resource + + this.destroy = function() { + + gl.deleteProgram( program ); + this.program = undefined; + + }; + + // DEPRECATED + + Object.defineProperties( this, { + + uniforms: { + get: function() { + + console.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' ); + return this.getUniforms(); + + } + }, + + attributes: { + get: function() { + + console.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' ); + return this.getAttributes(); + + } + } + + } ); + + + // + + this.id = programIdCount ++; + this.code = code; + this.usedTimes = 1; + this.program = program; + this.vertexShader = glVertexShader; + this.fragmentShader = glFragmentShader; + + return this; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLPrograms( renderer, capabilities ) { + + var programs = []; + + var shaderIDs = { + MeshDepthMaterial: 'depth', + MeshNormalMaterial: 'normal', + MeshBasicMaterial: 'basic', + MeshLambertMaterial: 'lambert', + MeshPhongMaterial: 'phong', + MeshStandardMaterial: 'physical', + MeshPhysicalMaterial: 'physical', + LineBasicMaterial: 'basic', + LineDashedMaterial: 'dashed', + PointsMaterial: 'points' + }; + + var parameterNames = [ + "precision", "supportsVertexTextures", "map", "mapEncoding", "envMap", "envMapMode", "envMapEncoding", + "lightMap", "aoMap", "emissiveMap", "emissiveMapEncoding", "bumpMap", "normalMap", "displacementMap", "specularMap", + "roughnessMap", "metalnessMap", + "alphaMap", "combine", "vertexColors", "fog", "useFog", "fogExp", + "flatShading", "sizeAttenuation", "logarithmicDepthBuffer", "skinning", + "maxBones", "useVertexTexture", "morphTargets", "morphNormals", + "maxMorphTargets", "maxMorphNormals", "premultipliedAlpha", + "numDirLights", "numPointLights", "numSpotLights", "numHemiLights", + "shadowMapEnabled", "shadowMapType", "toneMapping", 'physicallyCorrectLights', + "alphaTest", "doubleSided", "flipSided", "numClippingPlanes", "numClipIntersection", "depthPacking" + ]; + + + function allocateBones( object ) { + + if ( capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture ) { + + return 1024; + + } else { + + // default for when object is not specified + // ( for example when prebuilding shader to be used with multiple objects ) + // + // - leave some extra space for other uniforms + // - limit here is ANGLE's 254 max uniform vectors + // (up to 54 should be safe) + + var nVertexUniforms = capabilities.maxVertexUniforms; + var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 ); + + var maxBones = nVertexMatrices; + + if ( object !== undefined && (object && object.isSkinnedMesh) ) { + + maxBones = Math.min( object.skeleton.bones.length, maxBones ); + + if ( maxBones < object.skeleton.bones.length ) { + + console.warn( 'WebGLRenderer: too many bones - ' + object.skeleton.bones.length + ', this GPU supports just ' + maxBones + ' (try OpenGL instead of ANGLE)' ); + + } + + } + + return maxBones; + + } + + } + + function getTextureEncodingFromMap( map, gammaOverrideLinear ) { + + var encoding; + + if ( ! map ) { + + encoding = LinearEncoding; + + } else if ( (map && map.isTexture) ) { + + encoding = map.encoding; + + } else if ( (map && map.isWebGLRenderTarget) ) { + + console.warn( "THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead." ); + encoding = map.texture.encoding; + + } + + // add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point. + if ( encoding === LinearEncoding && gammaOverrideLinear ) { + + encoding = GammaEncoding; + + } + + return encoding; + + } + + this.getParameters = function ( material, lights, fog, nClipPlanes, nClipIntersection, object ) { + + var shaderID = shaderIDs[ material.type ]; + + // heuristics to create shader parameters according to lights in the scene + // (not to blow over maxLights budget) + + var maxBones = allocateBones( object ); + var precision = renderer.getPrecision(); + + if ( material.precision !== null ) { + + precision = capabilities.getMaxPrecision( material.precision ); + + if ( precision !== material.precision ) { + + console.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' ); + + } + + } + + var currentRenderTarget = renderer.getCurrentRenderTarget(); + + var parameters = { + + shaderID: shaderID, + + precision: precision, + supportsVertexTextures: capabilities.vertexTextures, + outputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ), + map: !! material.map, + mapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ), + envMap: !! material.envMap, + envMapMode: material.envMap && material.envMap.mapping, + envMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ), + envMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ), + lightMap: !! material.lightMap, + aoMap: !! material.aoMap, + emissiveMap: !! material.emissiveMap, + emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ), + bumpMap: !! material.bumpMap, + normalMap: !! material.normalMap, + displacementMap: !! material.displacementMap, + roughnessMap: !! material.roughnessMap, + metalnessMap: !! material.metalnessMap, + specularMap: !! material.specularMap, + alphaMap: !! material.alphaMap, + + combine: material.combine, + + vertexColors: material.vertexColors, + + fog: !! fog, + useFog: material.fog, + fogExp: (fog && fog.isFogExp2), + + flatShading: material.shading === FlatShading, + + sizeAttenuation: material.sizeAttenuation, + logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer, + + skinning: material.skinning, + maxBones: maxBones, + useVertexTexture: capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture, + + morphTargets: material.morphTargets, + morphNormals: material.morphNormals, + maxMorphTargets: renderer.maxMorphTargets, + maxMorphNormals: renderer.maxMorphNormals, + + numDirLights: lights.directional.length, + numPointLights: lights.point.length, + numSpotLights: lights.spot.length, + numHemiLights: lights.hemi.length, + + numClippingPlanes: nClipPlanes, + numClipIntersection: nClipIntersection, + + shadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0, + shadowMapType: renderer.shadowMap.type, + + toneMapping: renderer.toneMapping, + physicallyCorrectLights: renderer.physicallyCorrectLights, + + premultipliedAlpha: material.premultipliedAlpha, + + alphaTest: material.alphaTest, + doubleSided: material.side === DoubleSide, + flipSided: material.side === BackSide, + + depthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false + + }; + + return parameters; + + }; + + this.getProgramCode = function ( material, parameters ) { + + var array = []; + + if ( parameters.shaderID ) { + + array.push( parameters.shaderID ); + + } else { + + array.push( material.fragmentShader ); + array.push( material.vertexShader ); + + } + + if ( material.defines !== undefined ) { + + for ( var name in material.defines ) { + + array.push( name ); + array.push( material.defines[ name ] ); + + } + + } + + for ( var i = 0; i < parameterNames.length; i ++ ) { + + array.push( parameters[ parameterNames[ i ] ] ); + + } + + return array.join(); + + }; + + this.acquireProgram = function ( material, parameters, code ) { + + var program; + + // Check if code has been already compiled + for ( var p = 0, pl = programs.length; p < pl; p ++ ) { + + var programInfo = programs[ p ]; + + if ( programInfo.code === code ) { + + program = programInfo; + ++ program.usedTimes; + + break; + + } + + } + + if ( program === undefined ) { + + program = new WebGLProgram( renderer, code, material, parameters ); + programs.push( program ); + + } + + return program; + + }; + + this.releaseProgram = function( program ) { + + if ( -- program.usedTimes === 0 ) { + + // Remove from unordered set + var i = programs.indexOf( program ); + programs[ i ] = programs[ programs.length - 1 ]; + programs.pop(); + + // Free WebGL resources + program.destroy(); + + } + + }; + + // Exposed for resource monitoring & error feedback via renderer.info: + this.programs = programs; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLGeometries( gl, properties, info ) { + + var geometries = {}; + + function onGeometryDispose( event ) { + + var geometry = event.target; + var buffergeometry = geometries[ geometry.id ]; + + if ( buffergeometry.index !== null ) { + + deleteAttribute( buffergeometry.index ); + + } + + deleteAttributes( buffergeometry.attributes ); + + geometry.removeEventListener( 'dispose', onGeometryDispose ); + + delete geometries[ geometry.id ]; + + // TODO + + var property = properties.get( geometry ); + + if ( property.wireframe ) { + + deleteAttribute( property.wireframe ); + + } + + properties.delete( geometry ); + + var bufferproperty = properties.get( buffergeometry ); + + if ( bufferproperty.wireframe ) { + + deleteAttribute( bufferproperty.wireframe ); + + } + + properties.delete( buffergeometry ); + + // + + info.memory.geometries --; + + } + + function getAttributeBuffer( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) { + + return properties.get( attribute.data ).__webglBuffer; + + } + + return properties.get( attribute ).__webglBuffer; + + } + + function deleteAttribute( attribute ) { + + var buffer = getAttributeBuffer( attribute ); + + if ( buffer !== undefined ) { + + gl.deleteBuffer( buffer ); + removeAttributeBuffer( attribute ); + + } + + } + + function deleteAttributes( attributes ) { + + for ( var name in attributes ) { + + deleteAttribute( attributes[ name ] ); + + } + + } + + function removeAttributeBuffer( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) { + + properties.delete( attribute.data ); + + } else { + + properties.delete( attribute ); + + } + + } + + return { + + get: function ( object ) { + + var geometry = object.geometry; + + if ( geometries[ geometry.id ] !== undefined ) { + + return geometries[ geometry.id ]; + + } + + geometry.addEventListener( 'dispose', onGeometryDispose ); + + var buffergeometry; + + if ( geometry.isBufferGeometry ) { + + buffergeometry = geometry; + + } else if ( geometry.isGeometry ) { + + if ( geometry._bufferGeometry === undefined ) { + + geometry._bufferGeometry = new BufferGeometry().setFromObject( object ); + + } + + buffergeometry = geometry._bufferGeometry; + + } + + geometries[ geometry.id ] = buffergeometry; + + info.memory.geometries ++; + + return buffergeometry; + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLObjects( gl, properties, info ) { + + var geometries = new WebGLGeometries( gl, properties, info ); + + // + + function update( object ) { + + // TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter. + + var geometry = geometries.get( object ); + + if ( object.geometry.isGeometry ) { + + geometry.updateFromObject( object ); + + } + + var index = geometry.index; + var attributes = geometry.attributes; + + if ( index !== null ) { + + updateAttribute( index, gl.ELEMENT_ARRAY_BUFFER ); + + } + + for ( var name in attributes ) { + + updateAttribute( attributes[ name ], gl.ARRAY_BUFFER ); + + } + + // morph targets + + var morphAttributes = geometry.morphAttributes; + + for ( var name in morphAttributes ) { + + var array = morphAttributes[ name ]; + + for ( var i = 0, l = array.length; i < l; i ++ ) { + + updateAttribute( array[ i ], gl.ARRAY_BUFFER ); + + } + + } + + return geometry; + + } + + function updateAttribute( attribute, bufferType ) { + + var data = ( attribute.isInterleavedBufferAttribute ) ? attribute.data : attribute; + + var attributeProperties = properties.get( data ); + + if ( attributeProperties.__webglBuffer === undefined ) { + + createBuffer( attributeProperties, data, bufferType ); + + } else if ( attributeProperties.version !== data.version ) { + + updateBuffer( attributeProperties, data, bufferType ); + + } + + } + + function createBuffer( attributeProperties, data, bufferType ) { + + attributeProperties.__webglBuffer = gl.createBuffer(); + gl.bindBuffer( bufferType, attributeProperties.__webglBuffer ); + + var usage = data.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW; + + gl.bufferData( bufferType, data.array, usage ); + + attributeProperties.version = data.version; + + } + + function updateBuffer( attributeProperties, data, bufferType ) { + + gl.bindBuffer( bufferType, attributeProperties.__webglBuffer ); + + if ( data.dynamic === false ) { + + gl.bufferData( bufferType, data.array, gl.STATIC_DRAW ); + + } else if ( data.updateRange.count === - 1 ) { + + // Not using update ranges + + gl.bufferSubData( bufferType, 0, data.array ); + + } else if ( data.updateRange.count === 0 ) { + + console.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' ); + + } else { + + gl.bufferSubData( bufferType, data.updateRange.offset * data.array.BYTES_PER_ELEMENT, + data.array.subarray( data.updateRange.offset, data.updateRange.offset + data.updateRange.count ) ); + + data.updateRange.count = 0; // reset range + + } + + attributeProperties.version = data.version; + + } + + function getAttributeBuffer( attribute ) { + + if ( attribute.isInterleavedBufferAttribute ) { + + return properties.get( attribute.data ).__webglBuffer; + + } + + return properties.get( attribute ).__webglBuffer; + + } + + function getWireframeAttribute( geometry ) { + + var property = properties.get( geometry ); + + if ( property.wireframe !== undefined ) { + + return property.wireframe; + + } + + var indices = []; + + var index = geometry.index; + var attributes = geometry.attributes; + var position = attributes.position; + + // console.time( 'wireframe' ); + + if ( index !== null ) { + + var edges = {}; + var array = index.array; + + for ( var i = 0, l = array.length; i < l; i += 3 ) { + + var a = array[ i + 0 ]; + var b = array[ i + 1 ]; + var c = array[ i + 2 ]; + + indices.push( a, b, b, c, c, a ); + + } + + } else { + + var array = attributes.position.array; + + for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) { + + var a = i + 0; + var b = i + 1; + var c = i + 2; + + indices.push( a, b, b, c, c, a ); + + } + + } + + // console.timeEnd( 'wireframe' ); + + var TypeArray = position.count > 65535 ? Uint32Array : Uint16Array; + var attribute = new BufferAttribute( new TypeArray( indices ), 1 ); + + updateAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER ); + + property.wireframe = attribute; + + return attribute; + + } + + return { + + getAttributeBuffer: getAttributeBuffer, + getWireframeAttribute: getWireframeAttribute, + + update: update + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, info ) { + + var _infoMemory = info.memory; + var _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext ); + + // + + function clampToMaxSize( image, maxSize ) { + + if ( image.width > maxSize || image.height > maxSize ) { + + // Warning: Scaling through the canvas will only work with images that use + // premultiplied alpha. + + var scale = maxSize / Math.max( image.width, image.height ); + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = Math.floor( image.width * scale ); + canvas.height = Math.floor( image.height * scale ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image ); + + return canvas; + + } + + return image; + + } + + function isPowerOfTwo( image ) { + + return _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height ); + + } + + function makePowerOfTwo( image ) { + + if ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) { + + var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + canvas.width = _Math.nearestPowerOfTwo( image.width ); + canvas.height = _Math.nearestPowerOfTwo( image.height ); + + var context = canvas.getContext( '2d' ); + context.drawImage( image, 0, 0, canvas.width, canvas.height ); + + console.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image ); + + return canvas; + + } + + return image; + + } + + function textureNeedsPowerOfTwo( texture ) { + + if ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) return true; + if ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) return true; + + return false; + + } + + // Fallback filters for non-power-of-2 textures + + function filterFallback( f ) { + + if ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) { + + return _gl.NEAREST; + + } + + return _gl.LINEAR; + + } + + // + + function onTextureDispose( event ) { + + var texture = event.target; + + texture.removeEventListener( 'dispose', onTextureDispose ); + + deallocateTexture( texture ); + + _infoMemory.textures --; + + + } + + function onRenderTargetDispose( event ) { + + var renderTarget = event.target; + + renderTarget.removeEventListener( 'dispose', onRenderTargetDispose ); + + deallocateRenderTarget( renderTarget ); + + _infoMemory.textures --; + + } + + // + + function deallocateTexture( texture ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image && textureProperties.__image__webglTextureCube ) { + + // cube texture + + _gl.deleteTexture( textureProperties.__image__webglTextureCube ); + + } else { + + // 2D texture + + if ( textureProperties.__webglInit === undefined ) return; + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + // remove all webgl properties + properties.delete( texture ); + + } + + function deallocateRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + if ( ! renderTarget ) return; + + if ( textureProperties.__webglTexture !== undefined ) { + + _gl.deleteTexture( textureProperties.__webglTexture ); + + } + + if ( renderTarget.depthTexture ) { + + renderTarget.depthTexture.dispose(); + + } + + if ( (renderTarget && renderTarget.isWebGLRenderTargetCube) ) { + + for ( var i = 0; i < 6; i ++ ) { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] ); + + } + + } else { + + _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer ); + if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer ); + + } + + properties.delete( renderTarget.texture ); + properties.delete( renderTarget ); + + } + + // + + + + function setTexture2D( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + var image = texture.image; + + if ( image === undefined ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture ); + + } else if ( image.complete === false ) { + + console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture ); + + } else { + + uploadTexture( textureProperties, texture, slot ); + return; + + } + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + + } + + function setTextureCube( texture, slot ) { + + var textureProperties = properties.get( texture ); + + if ( texture.image.length === 6 ) { + + if ( texture.version > 0 && textureProperties.__version !== texture.version ) { + + if ( ! textureProperties.__image__webglTextureCube ) { + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__image__webglTextureCube = _gl.createTexture(); + + _infoMemory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + + var isCompressed = (texture && texture.isCompressedTexture); + var isDataTexture = (texture.image[ 0 ] && texture.image[ 0 ].isDataTexture); + + var cubeImage = []; + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed && ! isDataTexture ) { + + cubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize ); + + } else { + + cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ]; + + } + + } + + var image = cubeImage[ 0 ], + isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = paramThreeToGL( texture.format ), + glType = paramThreeToGL( texture.type ); + + setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage ); + + for ( var i = 0; i < 6; i ++ ) { + + if ( ! isCompressed ) { + + if ( isDataTexture ) { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data ); + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] ); + + } + + } else { + + var mipmap, mipmaps = cubeImage[ i ].mipmaps; + + for ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) { + + mipmap = mipmaps[ j ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()" ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } + + } + + if ( texture.generateMipmaps && isPowerOfTwoImage ) { + + _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); + + } + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } else { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube ); + + } + + } + + } + + function setTextureCubeDynamic( texture, slot ) { + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture ); + + } + + function setTextureParameters( textureType, texture, isPowerOfTwoImage ) { + + var extension; + + if ( isPowerOfTwoImage ) { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) ); + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) ); + + } else { + + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE ); + _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE ); + + if ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture ); + + } + + _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) ); + _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) ); + + if ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) { + + console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture ); + + } + + } + + extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension ) { + + if ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return; + if ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return; + + if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) { + + _gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) ); + properties.get( texture ).__currentAnisotropy = texture.anisotropy; + + } + + } + + } + + function uploadTexture( textureProperties, texture, slot ) { + + if ( textureProperties.__webglInit === undefined ) { + + textureProperties.__webglInit = true; + + texture.addEventListener( 'dispose', onTextureDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + _infoMemory.textures ++; + + } + + state.activeTexture( _gl.TEXTURE0 + slot ); + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + + _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY ); + _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha ); + _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment ); + + var image = clampToMaxSize( texture.image, capabilities.maxTextureSize ); + + if ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) { + + image = makePowerOfTwo( image ); + + } + + var isPowerOfTwoImage = isPowerOfTwo( image ), + glFormat = paramThreeToGL( texture.format ), + glType = paramThreeToGL( texture.type ); + + setTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage ); + + var mipmap, mipmaps = texture.mipmaps; + + if ( (texture && texture.isDepthTexture) ) { + + // populate depth texture with dummy data + + var internalFormat = _gl.DEPTH_COMPONENT; + + if ( texture.type === FloatType ) { + + if ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0'); + internalFormat = _gl.DEPTH_COMPONENT32F; + + } else if ( _isWebGL2 ) { + + // WebGL 2.0 requires signed internalformat for glTexImage2D + internalFormat = _gl.DEPTH_COMPONENT16; + + } + + // Depth stencil textures need the DEPTH_STENCIL internal format + // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) + if ( texture.format === DepthStencilFormat ) { + + internalFormat = _gl.DEPTH_STENCIL; + + } + + state.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null ); + + } else if ( (texture && texture.isDataTexture) ) { + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + texture.generateMipmaps = false; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data ); + + } + + } else if ( (texture && texture.isCompressedTexture) ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + + if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) { + + if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) { + + state.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data ); + + } else { + + console.warn( "THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()" ); + + } + + } else { + + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data ); + + } + + } + + } else { + + // regular Texture (image, video, canvas) + + // use manually created mipmaps if available + // if there are no manual mipmaps + // set 0 level mipmap and then use GL to generate other mipmap levels + + if ( mipmaps.length > 0 && isPowerOfTwoImage ) { + + for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { + + mipmap = mipmaps[ i ]; + state.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap ); + + } + + texture.generateMipmaps = false; + + } else { + + state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image ); + + } + + } + + if ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D ); + + textureProperties.__version = texture.version; + + if ( texture.onUpdate ) texture.onUpdate( texture ); + + } + + // Render targets + + // Setup storage for target texture and bind it to correct framebuffer + function setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) { + + var glFormat = paramThreeToGL( renderTarget.texture.format ); + var glType = paramThreeToGL( renderTarget.texture.type ); + state.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 ); + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // Setup storage for internal depth/stencil buffers and bind to correct framebuffer + function setupRenderBufferStorage( renderbuffer, renderTarget ) { + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer ); + + if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { + + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height ); + _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); + + } else { + + // FIXME: We don't support !depth !stencil + _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height ); + + } + + _gl.bindRenderbuffer( _gl.RENDERBUFFER, null ); + + } + + // Setup resources for a Depth Texture for a FBO (needs an extension) + function setupDepthTexture( framebuffer, renderTarget ) { + + var isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) ); + if ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!'); + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + if ( !( (renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture) ) ) { + + throw new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture'); + + } + + // upload an empty depth texture with framebuffer size + if ( !properties.get( renderTarget.depthTexture ).__webglTexture || + renderTarget.depthTexture.image.width !== renderTarget.width || + renderTarget.depthTexture.image.height !== renderTarget.height ) { + renderTarget.depthTexture.image.width = renderTarget.width; + renderTarget.depthTexture.image.height = renderTarget.height; + renderTarget.depthTexture.needsUpdate = true; + } + + setTexture2D( renderTarget.depthTexture, 0 ); + + var webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture; + + if ( renderTarget.depthTexture.format === DepthFormat ) { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } else if ( renderTarget.depthTexture.format === DepthStencilFormat ) { + + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); + + } else { + + throw new Error('Unknown depthTexture format') + + } + + } + + // Setup GL resources for a non-texture depth buffer + function setupDepthRenderbuffer( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + + var isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) ); + + if ( renderTarget.depthTexture ) { + + if ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets'); + + setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget ); + + } else { + + if ( isCube ) { + + renderTargetProperties.__webglDepthbuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] ); + renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget ); + + } + + } else { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer ); + renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer(); + setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget ); + + } + + } + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, null ); + + } + + // Set up GL resources for the render target + function setupRenderTarget( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + var textureProperties = properties.get( renderTarget.texture ); + + renderTarget.addEventListener( 'dispose', onRenderTargetDispose ); + + textureProperties.__webglTexture = _gl.createTexture(); + + _infoMemory.textures ++; + + var isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) ); + var isTargetPowerOfTwo = isPowerOfTwo( renderTarget ); + + // Setup framebuffer + + if ( isCube ) { + + renderTargetProperties.__webglFramebuffer = []; + + for ( var i = 0; i < 6; i ++ ) { + + renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer(); + + } + + } else { + + renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer(); + + } + + // Setup color buffer + + if ( isCube ) { + + state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo ); + + for ( var i = 0; i < 6; i ++ ) { + + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i ); + + } + + if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); + state.bindTexture( _gl.TEXTURE_CUBE_MAP, null ); + + } else { + + state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture ); + setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo ); + setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D ); + + if ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D ); + state.bindTexture( _gl.TEXTURE_2D, null ); + + } + + // Setup depth and stencil buffers + + if ( renderTarget.depthBuffer ) { + + setupDepthRenderbuffer( renderTarget ); + + } + + } + + function updateRenderTargetMipmap( renderTarget ) { + + var texture = renderTarget.texture; + + if ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) && + texture.minFilter !== NearestFilter && + texture.minFilter !== LinearFilter ) { + + var target = (renderTarget && renderTarget.isWebGLRenderTargetCube) ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D; + var webglTexture = properties.get( texture ).__webglTexture; + + state.bindTexture( target, webglTexture ); + _gl.generateMipmap( target ); + state.bindTexture( target, null ); + + } + + } + + this.setTexture2D = setTexture2D; + this.setTextureCube = setTextureCube; + this.setTextureCubeDynamic = setTextureCubeDynamic; + this.setupRenderTarget = setupRenderTarget; + this.updateRenderTargetMipmap = updateRenderTargetMipmap; + + } + + /** + * @author fordacious / fordacious.github.io + */ + + function WebGLProperties() { + + var properties = {}; + + return { + + get: function ( object ) { + + var uuid = object.uuid; + var map = properties[ uuid ]; + + if ( map === undefined ) { + + map = {}; + properties[ uuid ] = map; + + } + + return map; + + }, + + delete: function ( object ) { + + delete properties[ object.uuid ]; + + }, + + clear: function () { + + properties = {}; + + } + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLState( gl, extensions, paramThreeToGL ) { + + function ColorBuffer() { + + var locked = false; + + var color = new Vector4(); + var currentColorMask = null; + var currentColorClear = new Vector4(); + + return { + + setMask: function ( colorMask ) { + + if ( currentColorMask !== colorMask && ! locked ) { + + gl.colorMask( colorMask, colorMask, colorMask, colorMask ); + currentColorMask = colorMask; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( r, g, b, a ) { + + color.set( r, g, b, a ); + + if ( currentColorClear.equals( color ) === false ) { + + gl.clearColor( r, g, b, a ); + currentColorClear.copy( color ); + + } + + }, + + reset: function () { + + locked = false; + + currentColorMask = null; + currentColorClear.set( 0, 0, 0, 1 ); + + } + + }; + + } + + function DepthBuffer() { + + var locked = false; + + var currentDepthMask = null; + var currentDepthFunc = null; + var currentDepthClear = null; + + return { + + setTest: function ( depthTest ) { + + if ( depthTest ) { + + enable( gl.DEPTH_TEST ); + + } else { + + disable( gl.DEPTH_TEST ); + + } + + }, + + setMask: function ( depthMask ) { + + if ( currentDepthMask !== depthMask && ! locked ) { + + gl.depthMask( depthMask ); + currentDepthMask = depthMask; + + } + + }, + + setFunc: function ( depthFunc ) { + + if ( currentDepthFunc !== depthFunc ) { + + if ( depthFunc ) { + + switch ( depthFunc ) { + + case NeverDepth: + + gl.depthFunc( gl.NEVER ); + break; + + case AlwaysDepth: + + gl.depthFunc( gl.ALWAYS ); + break; + + case LessDepth: + + gl.depthFunc( gl.LESS ); + break; + + case LessEqualDepth: + + gl.depthFunc( gl.LEQUAL ); + break; + + case EqualDepth: + + gl.depthFunc( gl.EQUAL ); + break; + + case GreaterEqualDepth: + + gl.depthFunc( gl.GEQUAL ); + break; + + case GreaterDepth: + + gl.depthFunc( gl.GREATER ); + break; + + case NotEqualDepth: + + gl.depthFunc( gl.NOTEQUAL ); + break; + + default: + + gl.depthFunc( gl.LEQUAL ); + + } + + } else { + + gl.depthFunc( gl.LEQUAL ); + + } + + currentDepthFunc = depthFunc; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( depth ) { + + if ( currentDepthClear !== depth ) { + + gl.clearDepth( depth ); + currentDepthClear = depth; + + } + + }, + + reset: function () { + + locked = false; + + currentDepthMask = null; + currentDepthFunc = null; + currentDepthClear = null; + + } + + }; + + } + + function StencilBuffer() { + + var locked = false; + + var currentStencilMask = null; + var currentStencilFunc = null; + var currentStencilRef = null; + var currentStencilFuncMask = null; + var currentStencilFail = null; + var currentStencilZFail = null; + var currentStencilZPass = null; + var currentStencilClear = null; + + return { + + setTest: function ( stencilTest ) { + + if ( stencilTest ) { + + enable( gl.STENCIL_TEST ); + + } else { + + disable( gl.STENCIL_TEST ); + + } + + }, + + setMask: function ( stencilMask ) { + + if ( currentStencilMask !== stencilMask && ! locked ) { + + gl.stencilMask( stencilMask ); + currentStencilMask = stencilMask; + + } + + }, + + setFunc: function ( stencilFunc, stencilRef, stencilMask ) { + + if ( currentStencilFunc !== stencilFunc || + currentStencilRef !== stencilRef || + currentStencilFuncMask !== stencilMask ) { + + gl.stencilFunc( stencilFunc, stencilRef, stencilMask ); + + currentStencilFunc = stencilFunc; + currentStencilRef = stencilRef; + currentStencilFuncMask = stencilMask; + + } + + }, + + setOp: function ( stencilFail, stencilZFail, stencilZPass ) { + + if ( currentStencilFail !== stencilFail || + currentStencilZFail !== stencilZFail || + currentStencilZPass !== stencilZPass ) { + + gl.stencilOp( stencilFail, stencilZFail, stencilZPass ); + + currentStencilFail = stencilFail; + currentStencilZFail = stencilZFail; + currentStencilZPass = stencilZPass; + + } + + }, + + setLocked: function ( lock ) { + + locked = lock; + + }, + + setClear: function ( stencil ) { + + if ( currentStencilClear !== stencil ) { + + gl.clearStencil( stencil ); + currentStencilClear = stencil; + + } + + }, + + reset: function () { + + locked = false; + + currentStencilMask = null; + currentStencilFunc = null; + currentStencilRef = null; + currentStencilFuncMask = null; + currentStencilFail = null; + currentStencilZFail = null; + currentStencilZPass = null; + currentStencilClear = null; + + } + + }; + + } + + // + + var colorBuffer = new ColorBuffer(); + var depthBuffer = new DepthBuffer(); + var stencilBuffer = new StencilBuffer(); + + var maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + var newAttributes = new Uint8Array( maxVertexAttributes ); + var enabledAttributes = new Uint8Array( maxVertexAttributes ); + var attributeDivisors = new Uint8Array( maxVertexAttributes ); + + var capabilities = {}; + + var compressedTextureFormats = null; + + var currentBlending = null; + var currentBlendEquation = null; + var currentBlendSrc = null; + var currentBlendDst = null; + var currentBlendEquationAlpha = null; + var currentBlendSrcAlpha = null; + var currentBlendDstAlpha = null; + var currentPremultipledAlpha = false; + + var currentFlipSided = null; + var currentCullFace = null; + + var currentLineWidth = null; + + var currentPolygonOffsetFactor = null; + var currentPolygonOffsetUnits = null; + + var currentScissorTest = null; + + var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); + + var currentTextureSlot = null; + var currentBoundTextures = {}; + + var currentScissor = new Vector4(); + var currentViewport = new Vector4(); + + function createTexture( type, target, count ) { + + var data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4. + var texture = gl.createTexture(); + + gl.bindTexture( type, texture ); + gl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); + gl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); + + for ( var i = 0; i < count; i ++ ) { + + gl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data ); + + } + + return texture; + + } + + var emptyTextures = {}; + emptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 ); + emptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 ); + + // + + function init() { + + clearColor( 0, 0, 0, 1 ); + clearDepth( 1 ); + clearStencil( 0 ); + + enable( gl.DEPTH_TEST ); + setDepthFunc( LessEqualDepth ); + + setFlipSided( false ); + setCullFace( CullFaceBack ); + enable( gl.CULL_FACE ); + + enable( gl.BLEND ); + setBlending( NormalBlending ); + + } + + function initAttributes() { + + for ( var i = 0, l = newAttributes.length; i < l; i ++ ) { + + newAttributes[ i ] = 0; + + } + + } + + function enableAttribute( attribute ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== 0 ) { + + var extension = extensions.get( 'ANGLE_instanced_arrays' ); + + extension.vertexAttribDivisorANGLE( attribute, 0 ); + attributeDivisors[ attribute ] = 0; + + } + + } + + function enableAttributeAndDivisor( attribute, meshPerAttribute, extension ) { + + newAttributes[ attribute ] = 1; + + if ( enabledAttributes[ attribute ] === 0 ) { + + gl.enableVertexAttribArray( attribute ); + enabledAttributes[ attribute ] = 1; + + } + + if ( attributeDivisors[ attribute ] !== meshPerAttribute ) { + + extension.vertexAttribDivisorANGLE( attribute, meshPerAttribute ); + attributeDivisors[ attribute ] = meshPerAttribute; + + } + + } + + function disableUnusedAttributes() { + + for ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) { + + if ( enabledAttributes[ i ] !== newAttributes[ i ] ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + } + + function enable( id ) { + + if ( capabilities[ id ] !== true ) { + + gl.enable( id ); + capabilities[ id ] = true; + + } + + } + + function disable( id ) { + + if ( capabilities[ id ] !== false ) { + + gl.disable( id ); + capabilities[ id ] = false; + + } + + } + + function getCompressedTextureFormats() { + + if ( compressedTextureFormats === null ) { + + compressedTextureFormats = []; + + if ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) || + extensions.get( 'WEBGL_compressed_texture_s3tc' ) || + extensions.get( 'WEBGL_compressed_texture_etc1' ) ) { + + var formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS ); + + for ( var i = 0; i < formats.length; i ++ ) { + + compressedTextureFormats.push( formats[ i ] ); + + } + + } + + } + + return compressedTextureFormats; + + } + + function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) { + + if ( blending !== NoBlending ) { + + enable( gl.BLEND ); + + } else { + + disable( gl.BLEND ); + + } + + if ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) { + + if ( blending === AdditiveBlending ) { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.SRC_ALPHA, gl.ONE ); + + } + + } else if ( blending === SubtractiveBlending ) { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR ); + + } + + } else if ( blending === MultiplyBlending ) { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA ); + + } else { + + gl.blendEquation( gl.FUNC_ADD ); + gl.blendFunc( gl.ZERO, gl.SRC_COLOR ); + + } + + } else { + + if ( premultipliedAlpha ) { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + + } else { + + gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); + gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); + + } + + } + + currentBlending = blending; + currentPremultipledAlpha = premultipliedAlpha; + + } + + if ( blending === CustomBlending ) { + + blendEquationAlpha = blendEquationAlpha || blendEquation; + blendSrcAlpha = blendSrcAlpha || blendSrc; + blendDstAlpha = blendDstAlpha || blendDst; + + if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) { + + gl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) ); + + currentBlendEquation = blendEquation; + currentBlendEquationAlpha = blendEquationAlpha; + + } + + if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) { + + gl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) ); + + currentBlendSrc = blendSrc; + currentBlendDst = blendDst; + currentBlendSrcAlpha = blendSrcAlpha; + currentBlendDstAlpha = blendDstAlpha; + + } + + } else { + + currentBlendEquation = null; + currentBlendSrc = null; + currentBlendDst = null; + currentBlendEquationAlpha = null; + currentBlendSrcAlpha = null; + currentBlendDstAlpha = null; + + } + + } + + // TODO Deprecate + + function setColorWrite( colorWrite ) { + + colorBuffer.setMask( colorWrite ); + + } + + function setDepthTest( depthTest ) { + + depthBuffer.setTest( depthTest ); + + } + + function setDepthWrite( depthWrite ) { + + depthBuffer.setMask( depthWrite ); + + } + + function setDepthFunc( depthFunc ) { + + depthBuffer.setFunc( depthFunc ); + + } + + function setStencilTest( stencilTest ) { + + stencilBuffer.setTest( stencilTest ); + + } + + function setStencilWrite( stencilWrite ) { + + stencilBuffer.setMask( stencilWrite ); + + } + + function setStencilFunc( stencilFunc, stencilRef, stencilMask ) { + + stencilBuffer.setFunc( stencilFunc, stencilRef, stencilMask ); + + } + + function setStencilOp( stencilFail, stencilZFail, stencilZPass ) { + + stencilBuffer.setOp( stencilFail, stencilZFail, stencilZPass ); + + } + + // + + function setFlipSided( flipSided ) { + + if ( currentFlipSided !== flipSided ) { + + if ( flipSided ) { + + gl.frontFace( gl.CW ); + + } else { + + gl.frontFace( gl.CCW ); + + } + + currentFlipSided = flipSided; + + } + + } + + function setCullFace( cullFace ) { + + if ( cullFace !== CullFaceNone ) { + + enable( gl.CULL_FACE ); + + if ( cullFace !== currentCullFace ) { + + if ( cullFace === CullFaceBack ) { + + gl.cullFace( gl.BACK ); + + } else if ( cullFace === CullFaceFront ) { + + gl.cullFace( gl.FRONT ); + + } else { + + gl.cullFace( gl.FRONT_AND_BACK ); + + } + + } + + } else { + + disable( gl.CULL_FACE ); + + } + + currentCullFace = cullFace; + + } + + function setLineWidth( width ) { + + if ( width !== currentLineWidth ) { + + gl.lineWidth( width ); + + currentLineWidth = width; + + } + + } + + function setPolygonOffset( polygonOffset, factor, units ) { + + if ( polygonOffset ) { + + enable( gl.POLYGON_OFFSET_FILL ); + + if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) { + + gl.polygonOffset( factor, units ); + + currentPolygonOffsetFactor = factor; + currentPolygonOffsetUnits = units; + + } + + } else { + + disable( gl.POLYGON_OFFSET_FILL ); + + } + + } + + function getScissorTest() { + + return currentScissorTest; + + } + + function setScissorTest( scissorTest ) { + + currentScissorTest = scissorTest; + + if ( scissorTest ) { + + enable( gl.SCISSOR_TEST ); + + } else { + + disable( gl.SCISSOR_TEST ); + + } + + } + + // texture + + function activeTexture( webglSlot ) { + + if ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1; + + if ( currentTextureSlot !== webglSlot ) { + + gl.activeTexture( webglSlot ); + currentTextureSlot = webglSlot; + + } + + } + + function bindTexture( webglType, webglTexture ) { + + if ( currentTextureSlot === null ) { + + activeTexture(); + + } + + var boundTexture = currentBoundTextures[ currentTextureSlot ]; + + if ( boundTexture === undefined ) { + + boundTexture = { type: undefined, texture: undefined }; + currentBoundTextures[ currentTextureSlot ] = boundTexture; + + } + + if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) { + + gl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] ); + + boundTexture.type = webglType; + boundTexture.texture = webglTexture; + + } + + } + + function compressedTexImage2D() { + + try { + + gl.compressedTexImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( error ); + + } + + } + + function texImage2D() { + + try { + + gl.texImage2D.apply( gl, arguments ); + + } catch ( error ) { + + console.error( error ); + + } + + } + + // TODO Deprecate + + function clearColor( r, g, b, a ) { + + colorBuffer.setClear( r, g, b, a ); + + } + + function clearDepth( depth ) { + + depthBuffer.setClear( depth ); + + } + + function clearStencil( stencil ) { + + stencilBuffer.setClear( stencil ); + + } + + // + + function scissor( scissor ) { + + if ( currentScissor.equals( scissor ) === false ) { + + gl.scissor( scissor.x, scissor.y, scissor.z, scissor.w ); + currentScissor.copy( scissor ); + + } + + } + + function viewport( viewport ) { + + if ( currentViewport.equals( viewport ) === false ) { + + gl.viewport( viewport.x, viewport.y, viewport.z, viewport.w ); + currentViewport.copy( viewport ); + + } + + } + + // + + function reset() { + + for ( var i = 0; i < enabledAttributes.length; i ++ ) { + + if ( enabledAttributes[ i ] === 1 ) { + + gl.disableVertexAttribArray( i ); + enabledAttributes[ i ] = 0; + + } + + } + + capabilities = {}; + + compressedTextureFormats = null; + + currentTextureSlot = null; + currentBoundTextures = {}; + + currentBlending = null; + + currentFlipSided = null; + currentCullFace = null; + + colorBuffer.reset(); + depthBuffer.reset(); + stencilBuffer.reset(); + + } + + return { + + buffers: { + color: colorBuffer, + depth: depthBuffer, + stencil: stencilBuffer + }, + + init: init, + initAttributes: initAttributes, + enableAttribute: enableAttribute, + enableAttributeAndDivisor: enableAttributeAndDivisor, + disableUnusedAttributes: disableUnusedAttributes, + enable: enable, + disable: disable, + getCompressedTextureFormats: getCompressedTextureFormats, + + setBlending: setBlending, + + setColorWrite: setColorWrite, + setDepthTest: setDepthTest, + setDepthWrite: setDepthWrite, + setDepthFunc: setDepthFunc, + setStencilTest: setStencilTest, + setStencilWrite: setStencilWrite, + setStencilFunc: setStencilFunc, + setStencilOp: setStencilOp, + + setFlipSided: setFlipSided, + setCullFace: setCullFace, + + setLineWidth: setLineWidth, + setPolygonOffset: setPolygonOffset, + + getScissorTest: getScissorTest, + setScissorTest: setScissorTest, + + activeTexture: activeTexture, + bindTexture: bindTexture, + compressedTexImage2D: compressedTexImage2D, + texImage2D: texImage2D, + + clearColor: clearColor, + clearDepth: clearDepth, + clearStencil: clearStencil, + + scissor: scissor, + viewport: viewport, + + reset: reset + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLCapabilities( gl, extensions, parameters ) { + + var maxAnisotropy; + + function getMaxAnisotropy() { + + if ( maxAnisotropy !== undefined ) return maxAnisotropy; + + var extension = extensions.get( 'EXT_texture_filter_anisotropic' ); + + if ( extension !== null ) { + + maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT ); + + } else { + + maxAnisotropy = 0; + + } + + return maxAnisotropy; + + } + + function getMaxPrecision( precision ) { + + if ( precision === 'highp' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) { + + return 'highp'; + + } + + precision = 'mediump'; + + } + + if ( precision === 'mediump' ) { + + if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 && + gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) { + + return 'mediump'; + + } + + } + + return 'lowp'; + + } + + var precision = parameters.precision !== undefined ? parameters.precision : 'highp'; + var maxPrecision = getMaxPrecision( precision ); + + if ( maxPrecision !== precision ) { + + console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' ); + precision = maxPrecision; + + } + + var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' ); + + var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); + var maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ); + var maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE ); + var maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE ); + + var maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS ); + var maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS ); + var maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS ); + var maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS ); + + var vertexTextures = maxVertexTextures > 0; + var floatFragmentTextures = !! extensions.get( 'OES_texture_float' ); + var floatVertexTextures = vertexTextures && floatFragmentTextures; + + return { + + getMaxAnisotropy: getMaxAnisotropy, + getMaxPrecision: getMaxPrecision, + + precision: precision, + logarithmicDepthBuffer: logarithmicDepthBuffer, + + maxTextures: maxTextures, + maxVertexTextures: maxVertexTextures, + maxTextureSize: maxTextureSize, + maxCubemapSize: maxCubemapSize, + + maxAttributes: maxAttributes, + maxVertexUniforms: maxVertexUniforms, + maxVaryings: maxVaryings, + maxFragmentUniforms: maxFragmentUniforms, + + vertexTextures: vertexTextures, + floatFragmentTextures: floatFragmentTextures, + floatVertexTextures: floatVertexTextures + + }; + + } + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WebGLExtensions( gl ) { + + var extensions = {}; + + return { + + get: function ( name ) { + + if ( extensions[ name ] !== undefined ) { + + return extensions[ name ]; + + } + + var extension; + + switch ( name ) { + + case 'WEBGL_depth_texture': + extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' ); + break; + + case 'EXT_texture_filter_anisotropic': + extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' ); + break; + + case 'WEBGL_compressed_texture_s3tc': + extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' ); + break; + + case 'WEBGL_compressed_texture_pvrtc': + extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' ); + break; + + case 'WEBGL_compressed_texture_etc1': + extension = gl.getExtension( 'WEBGL_compressed_texture_etc1' ); + break; + + default: + extension = gl.getExtension( name ); + + } + + if ( extension === null ) { + + console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' ); + + } + + extensions[ name ] = extension; + + return extension; + + } + + }; + + } + + /** + * @author tschw + */ + + function WebGLClipping() { + + var scope = this, + + globalState = null, + numGlobalPlanes = 0, + localClippingEnabled = false, + renderingShadows = false, + + plane = new Plane(), + viewNormalMatrix = new Matrix3(), + + uniform = { value: null, needsUpdate: false }; + + this.uniform = uniform; + this.numPlanes = 0; + this.numIntersection = 0; + + this.init = function( planes, enableLocalClipping, camera ) { + + var enabled = + planes.length !== 0 || + enableLocalClipping || + // enable state of previous frame - the clipping code has to + // run another frame in order to reset the state: + numGlobalPlanes !== 0 || + localClippingEnabled; + + localClippingEnabled = enableLocalClipping; + + globalState = projectPlanes( planes, camera, 0 ); + numGlobalPlanes = planes.length; + + return enabled; + + }; + + this.beginShadows = function() { + + renderingShadows = true; + projectPlanes( null ); + + }; + + this.endShadows = function() { + + renderingShadows = false; + resetGlobalState(); + + }; + + this.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) { + + if ( ! localClippingEnabled || + planes === null || planes.length === 0 || + renderingShadows && ! clipShadows ) { + // there's no local clipping + + if ( renderingShadows ) { + // there's no global clipping + + projectPlanes( null ); + + } else { + + resetGlobalState(); + } + + } else { + + var nGlobal = renderingShadows ? 0 : numGlobalPlanes, + lGlobal = nGlobal * 4, + + dstArray = cache.clippingState || null; + + uniform.value = dstArray; // ensure unique state + + dstArray = projectPlanes( planes, camera, lGlobal, fromCache ); + + for ( var i = 0; i !== lGlobal; ++ i ) { + + dstArray[ i ] = globalState[ i ]; + + } + + cache.clippingState = dstArray; + this.numIntersection = clipIntersection ? this.numPlanes : 0; + this.numPlanes += nGlobal; + + } + + + }; + + function resetGlobalState() { + + if ( uniform.value !== globalState ) { + + uniform.value = globalState; + uniform.needsUpdate = numGlobalPlanes > 0; + + } + + scope.numPlanes = numGlobalPlanes; + scope.numIntersection = 0; + + } + + function projectPlanes( planes, camera, dstOffset, skipTransform ) { + + var nPlanes = planes !== null ? planes.length : 0, + dstArray = null; + + if ( nPlanes !== 0 ) { + + dstArray = uniform.value; + + if ( skipTransform !== true || dstArray === null ) { + + var flatSize = dstOffset + nPlanes * 4, + viewMatrix = camera.matrixWorldInverse; + + viewNormalMatrix.getNormalMatrix( viewMatrix ); + + if ( dstArray === null || dstArray.length < flatSize ) { + + dstArray = new Float32Array( flatSize ); + + } + + for ( var i = 0, i4 = dstOffset; + i !== nPlanes; ++ i, i4 += 4 ) { + + plane.copy( planes[ i ] ). + applyMatrix4( viewMatrix, viewNormalMatrix ); + + plane.normal.toArray( dstArray, i4 ); + dstArray[ i4 + 3 ] = plane.constant; + + } + + } + + uniform.value = dstArray; + uniform.needsUpdate = true; + + } + + scope.numPlanes = nPlanes; + + return dstArray; + + } + + } + + /** + * @author supereggbert / http://www.paulbrunt.co.uk/ + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * @author szimek / https://github.com/szimek/ + * @author tschw + */ + + function WebGLRenderer( parameters ) { + + console.log( 'THREE.WebGLRenderer', REVISION ); + + parameters = parameters || {}; + + var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ), + _context = parameters.context !== undefined ? parameters.context : null, + + _alpha = parameters.alpha !== undefined ? parameters.alpha : false, + _depth = parameters.depth !== undefined ? parameters.depth : true, + _stencil = parameters.stencil !== undefined ? parameters.stencil : true, + _antialias = parameters.antialias !== undefined ? parameters.antialias : false, + _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, + _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false; + + var lights = []; + + var opaqueObjects = []; + var opaqueObjectsLastIndex = - 1; + var transparentObjects = []; + var transparentObjectsLastIndex = - 1; + + var morphInfluences = new Float32Array( 8 ); + + var sprites = []; + var lensFlares = []; + + // public properties + + this.domElement = _canvas; + this.context = null; + + // clearing + + this.autoClear = true; + this.autoClearColor = true; + this.autoClearDepth = true; + this.autoClearStencil = true; + + // scene graph + + this.sortObjects = true; + + // user-defined clipping + + this.clippingPlanes = []; + this.localClippingEnabled = false; + + // physically based shading + + this.gammaFactor = 2.0; // for backwards compatibility + this.gammaInput = false; + this.gammaOutput = false; + + // physical lights + + this.physicallyCorrectLights = false; + + // tone mapping + + this.toneMapping = LinearToneMapping; + this.toneMappingExposure = 1.0; + this.toneMappingWhitePoint = 1.0; + + // morphs + + this.maxMorphTargets = 8; + this.maxMorphNormals = 4; + + // internal properties + + var _this = this, + + // internal state cache + + _currentProgram = null, + _currentRenderTarget = null, + _currentFramebuffer = null, + _currentMaterialId = - 1, + _currentGeometryProgram = '', + _currentCamera = null, + + _currentScissor = new Vector4(), + _currentScissorTest = null, + + _currentViewport = new Vector4(), + + // + + _usedTextureUnits = 0, + + // + + _clearColor = new Color( 0x000000 ), + _clearAlpha = 0, + + _width = _canvas.width, + _height = _canvas.height, + + _pixelRatio = 1, + + _scissor = new Vector4( 0, 0, _width, _height ), + _scissorTest = false, + + _viewport = new Vector4( 0, 0, _width, _height ), + + // frustum + + _frustum = new Frustum(), + + // clipping + + _clipping = new WebGLClipping(), + _clippingEnabled = false, + _localClippingEnabled = false, + + _sphere = new Sphere(), + + // camera matrices cache + + _projScreenMatrix = new Matrix4(), + + _vector3 = new Vector3(), + + // light arrays cache + + _lights = { + + hash: '', + + ambient: [ 0, 0, 0 ], + directional: [], + directionalShadowMap: [], + directionalShadowMatrix: [], + spot: [], + spotShadowMap: [], + spotShadowMatrix: [], + point: [], + pointShadowMap: [], + pointShadowMatrix: [], + hemi: [], + + shadows: [] + + }, + + // info + + _infoRender = { + + calls: 0, + vertices: 0, + faces: 0, + points: 0 + + }; + + this.info = { + + render: _infoRender, + memory: { + + geometries: 0, + textures: 0 + + }, + programs: null + + }; + + + // initialize + + var _gl; + + try { + + var attributes = { + alpha: _alpha, + depth: _depth, + stencil: _stencil, + antialias: _antialias, + premultipliedAlpha: _premultipliedAlpha, + preserveDrawingBuffer: _preserveDrawingBuffer + }; + + _gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes ); + + if ( _gl === null ) { + + if ( _canvas.getContext( 'webgl' ) !== null ) { + + throw 'Error creating WebGL context with your selected attributes.'; + + } else { + + throw 'Error creating WebGL context.'; + + } + + } + + // Some experimental-webgl implementations do not have getShaderPrecisionFormat + + if ( _gl.getShaderPrecisionFormat === undefined ) { + + _gl.getShaderPrecisionFormat = function () { + + return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 }; + + }; + + } + + _canvas.addEventListener( 'webglcontextlost', onContextLost, false ); + + } catch ( error ) { + + console.error( 'THREE.WebGLRenderer: ' + error ); + + } + + var extensions = new WebGLExtensions( _gl ); + + extensions.get( 'WEBGL_depth_texture' ); + extensions.get( 'OES_texture_float' ); + extensions.get( 'OES_texture_float_linear' ); + extensions.get( 'OES_texture_half_float' ); + extensions.get( 'OES_texture_half_float_linear' ); + extensions.get( 'OES_standard_derivatives' ); + extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extensions.get( 'OES_element_index_uint' ) ) { + + BufferGeometry.MaxIndex = 4294967296; + + } + + var capabilities = new WebGLCapabilities( _gl, extensions, parameters ); + + var state = new WebGLState( _gl, extensions, paramThreeToGL ); + var properties = new WebGLProperties(); + var textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, this.info ); + var objects = new WebGLObjects( _gl, properties, this.info ); + var programCache = new WebGLPrograms( this, capabilities ); + var lightCache = new WebGLLights(); + + this.info.programs = programCache.programs; + + var bufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender ); + var indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender ); + + // + + var backgroundCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 ); + var backgroundCamera2 = new PerspectiveCamera(); + var backgroundPlaneMesh = new Mesh( + new PlaneBufferGeometry( 2, 2 ), + new MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } ) + ); + var backgroundBoxShader = ShaderLib[ 'cube' ]; + var backgroundBoxMesh = new Mesh( + new BoxBufferGeometry( 5, 5, 5 ), + new ShaderMaterial( { + uniforms: backgroundBoxShader.uniforms, + vertexShader: backgroundBoxShader.vertexShader, + fragmentShader: backgroundBoxShader.fragmentShader, + side: BackSide, + depthTest: false, + depthWrite: false, + fog: false + } ) + ); + + // + + function getTargetPixelRatio() { + + return _currentRenderTarget === null ? _pixelRatio : 1; + + } + + function glClearColor( r, g, b, a ) { + + if ( _premultipliedAlpha === true ) { + + r *= a; g *= a; b *= a; + + } + + state.clearColor( r, g, b, a ); + + } + + function setDefaultGLState() { + + state.init(); + + state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) ); + state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) ); + + glClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha ); + + } + + function resetGLState() { + + _currentProgram = null; + _currentCamera = null; + + _currentGeometryProgram = ''; + _currentMaterialId = - 1; + + state.reset(); + + } + + setDefaultGLState(); + + this.context = _gl; + this.capabilities = capabilities; + this.extensions = extensions; + this.properties = properties; + this.state = state; + + // shadow map + + var shadowMap = new WebGLShadowMap( this, _lights, objects, capabilities ); + + this.shadowMap = shadowMap; + + + // Plugins + + var spritePlugin = new SpritePlugin( this, sprites ); + var lensFlarePlugin = new LensFlarePlugin( this, lensFlares ); + + // API + + this.getContext = function () { + + return _gl; + + }; + + this.getContextAttributes = function () { + + return _gl.getContextAttributes(); + + }; + + this.forceContextLoss = function () { + + extensions.get( 'WEBGL_lose_context' ).loseContext(); + + }; + + this.getMaxAnisotropy = function () { + + return capabilities.getMaxAnisotropy(); + + }; + + this.getPrecision = function () { + + return capabilities.precision; + + }; + + this.getPixelRatio = function () { + + return _pixelRatio; + + }; + + this.setPixelRatio = function ( value ) { + + if ( value === undefined ) return; + + _pixelRatio = value; + + this.setSize( _viewport.z, _viewport.w, false ); + + }; + + this.getSize = function () { + + return { + width: _width, + height: _height + }; + + }; + + this.setSize = function ( width, height, updateStyle ) { + + _width = width; + _height = height; + + _canvas.width = width * _pixelRatio; + _canvas.height = height * _pixelRatio; + + if ( updateStyle !== false ) { + + _canvas.style.width = width + 'px'; + _canvas.style.height = height + 'px'; + + } + + this.setViewport( 0, 0, width, height ); + + }; + + this.setViewport = function ( x, y, width, height ) { + + state.viewport( _viewport.set( x, y, width, height ) ); + + }; + + this.setScissor = function ( x, y, width, height ) { + + state.scissor( _scissor.set( x, y, width, height ) ); + + }; + + this.setScissorTest = function ( boolean ) { + + state.setScissorTest( _scissorTest = boolean ); + + }; + + // Clearing + + this.getClearColor = function () { + + return _clearColor; + + }; + + this.setClearColor = function ( color, alpha ) { + + _clearColor.set( color ); + + _clearAlpha = alpha !== undefined ? alpha : 1; + + glClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha ); + + }; + + this.getClearAlpha = function () { + + return _clearAlpha; + + }; + + this.setClearAlpha = function ( alpha ) { + + _clearAlpha = alpha; + + glClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha ); + + }; + + this.clear = function ( color, depth, stencil ) { + + var bits = 0; + + if ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT; + if ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT; + if ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT; + + _gl.clear( bits ); + + }; + + this.clearColor = function () { + + this.clear( true, false, false ); + + }; + + this.clearDepth = function () { + + this.clear( false, true, false ); + + }; + + this.clearStencil = function () { + + this.clear( false, false, true ); + + }; + + this.clearTarget = function ( renderTarget, color, depth, stencil ) { + + this.setRenderTarget( renderTarget ); + this.clear( color, depth, stencil ); + + }; + + // Reset + + this.resetGLState = resetGLState; + + this.dispose = function() { + + transparentObjects = []; + transparentObjectsLastIndex = -1; + opaqueObjects = []; + opaqueObjectsLastIndex = -1; + + _canvas.removeEventListener( 'webglcontextlost', onContextLost, false ); + + }; + + // Events + + function onContextLost( event ) { + + event.preventDefault(); + + resetGLState(); + setDefaultGLState(); + + properties.clear(); + + } + + function onMaterialDispose( event ) { + + var material = event.target; + + material.removeEventListener( 'dispose', onMaterialDispose ); + + deallocateMaterial( material ); + + } + + // Buffer deallocation + + function deallocateMaterial( material ) { + + releaseMaterialProgramReference( material ); + + properties.delete( material ); + + } + + + function releaseMaterialProgramReference( material ) { + + var programInfo = properties.get( material ).program; + + material.program = undefined; + + if ( programInfo !== undefined ) { + + programCache.releaseProgram( programInfo ); + + } + + } + + // Buffer rendering + + this.renderBufferImmediate = function ( object, program, material ) { + + state.initAttributes(); + + var buffers = properties.get( object ); + + if ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer(); + if ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer(); + if ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer(); + if ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer(); + + var attributes = program.getAttributes(); + + if ( object.hasPositions ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( attributes.position ); + _gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasNormals ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal ); + + if ( ! material.isMeshPhongMaterial && + ! material.isMeshStandardMaterial && + material.shading === FlatShading ) { + + for ( var i = 0, l = object.count * 3; i < l; i += 9 ) { + + var array = object.normalArray; + + var nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3; + var ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3; + var nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3; + + array[ i + 0 ] = nx; + array[ i + 1 ] = ny; + array[ i + 2 ] = nz; + + array[ i + 3 ] = nx; + array[ i + 4 ] = ny; + array[ i + 5 ] = nz; + + array[ i + 6 ] = nx; + array[ i + 7 ] = ny; + array[ i + 8 ] = nz; + + } + + } + + _gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( attributes.normal ); + + _gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasUvs && material.map ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( attributes.uv ); + + _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 ); + + } + + if ( object.hasColors && material.vertexColors !== NoColors ) { + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color ); + _gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW ); + + state.enableAttribute( attributes.color ); + + _gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 ); + + } + + state.disableUnusedAttributes(); + + _gl.drawArrays( _gl.TRIANGLES, 0, object.count ); + + object.count = 0; + + }; + + this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) { + + setMaterial( material ); + + var program = setProgram( camera, fog, material, object ); + + var updateBuffers = false; + var geometryProgram = geometry.id + '_' + program.id + '_' + material.wireframe; + + if ( geometryProgram !== _currentGeometryProgram ) { + + _currentGeometryProgram = geometryProgram; + updateBuffers = true; + + } + + // morph targets + + var morphTargetInfluences = object.morphTargetInfluences; + + if ( morphTargetInfluences !== undefined ) { + + var activeInfluences = []; + + for ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) { + + var influence = morphTargetInfluences[ i ]; + activeInfluences.push( [ influence, i ] ); + + } + + activeInfluences.sort( absNumericalSort ); + + if ( activeInfluences.length > 8 ) { + + activeInfluences.length = 8; + + } + + var morphAttributes = geometry.morphAttributes; + + for ( var i = 0, l = activeInfluences.length; i < l; i ++ ) { + + var influence = activeInfluences[ i ]; + morphInfluences[ i ] = influence[ 0 ]; + + if ( influence[ 0 ] !== 0 ) { + + var index = influence[ 1 ]; + + if ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] ); + if ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] ); + + } else { + + if ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i ); + if ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i ); + + } + + } + + for ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) { + + morphInfluences[ i ] = 0.0; + + } + + program.getUniforms().setValue( + _gl, 'morphTargetInfluences', morphInfluences ); + + updateBuffers = true; + + } + + // + + var index = geometry.index; + var position = geometry.attributes.position; + var rangeFactor = 1; + + if ( material.wireframe === true ) { + + index = objects.getWireframeAttribute( geometry ); + rangeFactor = 2; + + } + + var renderer; + + if ( index !== null ) { + + renderer = indexedBufferRenderer; + renderer.setIndex( index ); + + } else { + + renderer = bufferRenderer; + + } + + if ( updateBuffers ) { + + setupVertexAttributes( material, program, geometry ); + + if ( index !== null ) { + + _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, objects.getAttributeBuffer( index ) ); + + } + + } + + // + + var dataCount = 0; + + if ( index !== null ) { + + dataCount = index.count; + + } else if ( position !== undefined ) { + + dataCount = position.count; + + } + + var rangeStart = geometry.drawRange.start * rangeFactor; + var rangeCount = geometry.drawRange.count * rangeFactor; + + var groupStart = group !== null ? group.start * rangeFactor : 0; + var groupCount = group !== null ? group.count * rangeFactor : Infinity; + + var drawStart = Math.max( rangeStart, groupStart ); + var drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1; + + var drawCount = Math.max( 0, drawEnd - drawStart + 1 ); + + if ( drawCount === 0 ) return; + + // + + if ( object.isMesh ) { + + if ( material.wireframe === true ) { + + state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() ); + renderer.setMode( _gl.LINES ); + + } else { + + switch ( object.drawMode ) { + + case TrianglesDrawMode: + renderer.setMode( _gl.TRIANGLES ); + break; + + case TriangleStripDrawMode: + renderer.setMode( _gl.TRIANGLE_STRIP ); + break; + + case TriangleFanDrawMode: + renderer.setMode( _gl.TRIANGLE_FAN ); + break; + + } + + } + + + } else if ( object.isLine ) { + + var lineWidth = material.linewidth; + + if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material + + state.setLineWidth( lineWidth * getTargetPixelRatio() ); + + if ( object.isLineSegments ) { + + renderer.setMode( _gl.LINES ); + + } else { + + renderer.setMode( _gl.LINE_STRIP ); + + } + + } else if ( object.isPoints ) { + + renderer.setMode( _gl.POINTS ); + + } + + if ( geometry && geometry.isInstancedBufferGeometry ) { + + if ( geometry.maxInstancedCount > 0 ) { + + renderer.renderInstances( geometry, drawStart, drawCount ); + + } + + } else { + + renderer.render( drawStart, drawCount ); + + } + + }; + + function setupVertexAttributes( material, program, geometry, startIndex ) { + + var extension; + + if ( geometry && geometry.isInstancedBufferGeometry ) { + + extension = extensions.get( 'ANGLE_instanced_arrays' ); + + if ( extension === null ) { + + console.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' ); + return; + + } + + } + + if ( startIndex === undefined ) startIndex = 0; + + state.initAttributes(); + + var geometryAttributes = geometry.attributes; + + var programAttributes = program.getAttributes(); + + var materialDefaultAttributeValues = material.defaultAttributeValues; + + for ( var name in programAttributes ) { + + var programAttribute = programAttributes[ name ]; + + if ( programAttribute >= 0 ) { + + var geometryAttribute = geometryAttributes[ name ]; + + if ( geometryAttribute !== undefined ) { + + var type = _gl.FLOAT; + var array = geometryAttribute.array; + var normalized = geometryAttribute.normalized; + + if ( array instanceof Float32Array ) { + + type = _gl.FLOAT; + + } else if ( array instanceof Float64Array ) { + + console.warn( "Unsupported data buffer format: Float64Array" ); + + } else if ( array instanceof Uint16Array ) { + + type = _gl.UNSIGNED_SHORT; + + } else if ( array instanceof Int16Array ) { + + type = _gl.SHORT; + + } else if ( array instanceof Uint32Array ) { + + type = _gl.UNSIGNED_INT; + + } else if ( array instanceof Int32Array ) { + + type = _gl.INT; + + } else if ( array instanceof Int8Array ) { + + type = _gl.BYTE; + + } else if ( array instanceof Uint8Array ) { + + type = _gl.UNSIGNED_BYTE; + + } + + var size = geometryAttribute.itemSize; + var buffer = objects.getAttributeBuffer( geometryAttribute ); + + if ( geometryAttribute.isInterleavedBufferAttribute ) { + + var data = geometryAttribute.data; + var stride = data.stride; + var offset = geometryAttribute.offset; + + if ( data && data.isInstancedInterleavedBuffer ) { + + state.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute, extension ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = data.meshPerAttribute * data.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * data.array.BYTES_PER_ELEMENT, ( startIndex * stride + offset ) * data.array.BYTES_PER_ELEMENT ); + + } else { + + if ( geometryAttribute.isInstancedBufferAttribute ) { + + state.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute, extension ); + + if ( geometry.maxInstancedCount === undefined ) { + + geometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count; + + } + + } else { + + state.enableAttribute( programAttribute ); + + } + + _gl.bindBuffer( _gl.ARRAY_BUFFER, buffer ); + _gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * geometryAttribute.array.BYTES_PER_ELEMENT ); + + } + + } else if ( materialDefaultAttributeValues !== undefined ) { + + var value = materialDefaultAttributeValues[ name ]; + + if ( value !== undefined ) { + + switch ( value.length ) { + + case 2: + _gl.vertexAttrib2fv( programAttribute, value ); + break; + + case 3: + _gl.vertexAttrib3fv( programAttribute, value ); + break; + + case 4: + _gl.vertexAttrib4fv( programAttribute, value ); + break; + + default: + _gl.vertexAttrib1fv( programAttribute, value ); + + } + + } + + } + + } + + } + + state.disableUnusedAttributes(); + + } + + // Sorting + + function absNumericalSort( a, b ) { + + return Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] ); + + } + + function painterSortStable( a, b ) { + + if ( a.object.renderOrder !== b.object.renderOrder ) { + + return a.object.renderOrder - b.object.renderOrder; + + } else if ( a.material.program && b.material.program && a.material.program !== b.material.program ) { + + return a.material.program.id - b.material.program.id; + + } else if ( a.material.id !== b.material.id ) { + + return a.material.id - b.material.id; + + } else if ( a.z !== b.z ) { + + return a.z - b.z; + + } else { + + return a.id - b.id; + + } + + } + + function reversePainterSortStable( a, b ) { + + if ( a.object.renderOrder !== b.object.renderOrder ) { + + return a.object.renderOrder - b.object.renderOrder; + + } if ( a.z !== b.z ) { + + return b.z - a.z; + + } else { + + return a.id - b.id; + + } + + } + + // Rendering + + this.render = function ( scene, camera, renderTarget, forceClear ) { + + if ( camera !== undefined && camera.isCamera !== true ) { + + console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); + return; + + } + + // reset caching for this frame + + _currentGeometryProgram = ''; + _currentMaterialId = - 1; + _currentCamera = null; + + // update scene graph + + if ( scene.autoUpdate === true ) scene.updateMatrixWorld(); + + // update camera matrices and frustum + + if ( camera.parent === null ) camera.updateMatrixWorld(); + + camera.matrixWorldInverse.getInverse( camera.matrixWorld ); + + _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); + _frustum.setFromMatrix( _projScreenMatrix ); + + lights.length = 0; + + opaqueObjectsLastIndex = - 1; + transparentObjectsLastIndex = - 1; + + sprites.length = 0; + lensFlares.length = 0; + + _localClippingEnabled = this.localClippingEnabled; + _clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera ); + + projectObject( scene, camera ); + + opaqueObjects.length = opaqueObjectsLastIndex + 1; + transparentObjects.length = transparentObjectsLastIndex + 1; + + if ( _this.sortObjects === true ) { + + opaqueObjects.sort( painterSortStable ); + transparentObjects.sort( reversePainterSortStable ); + + } + + // + + if ( _clippingEnabled ) _clipping.beginShadows(); + + setupShadows( lights ); + + shadowMap.render( scene, camera ); + + setupLights( lights, camera ); + + if ( _clippingEnabled ) _clipping.endShadows(); + + // + + _infoRender.calls = 0; + _infoRender.vertices = 0; + _infoRender.faces = 0; + _infoRender.points = 0; + + if ( renderTarget === undefined ) { + + renderTarget = null; + + } + + this.setRenderTarget( renderTarget ); + + // + + var background = scene.background; + + if ( background === null ) { + + glClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha ); + + } else if ( background && background.isColor ) { + + glClearColor( background.r, background.g, background.b, 1 ); + forceClear = true; + + } + + if ( this.autoClear || forceClear ) { + + this.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil ); + + } + + if ( background && background.isCubeTexture ) { + + backgroundCamera2.projectionMatrix.copy( camera.projectionMatrix ); + + backgroundCamera2.matrixWorld.extractRotation( camera.matrixWorld ); + backgroundCamera2.matrixWorldInverse.getInverse( backgroundCamera2.matrixWorld ); + + backgroundBoxMesh.material.uniforms[ "tCube" ].value = background; + backgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundCamera2.matrixWorldInverse, backgroundBoxMesh.matrixWorld ); + + objects.update( backgroundBoxMesh ); + + _this.renderBufferDirect( backgroundCamera2, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null ); + + } else if ( background && background.isTexture ) { + + backgroundPlaneMesh.material.map = background; + + objects.update( backgroundPlaneMesh ); + + _this.renderBufferDirect( backgroundCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null ); + + } + + // + + if ( scene.overrideMaterial ) { + + var overrideMaterial = scene.overrideMaterial; + + renderObjects( opaqueObjects, scene, camera, overrideMaterial ); + renderObjects( transparentObjects, scene, camera, overrideMaterial ); + + } else { + + // opaque pass (front-to-back order) + + state.setBlending( NoBlending ); + renderObjects( opaqueObjects, scene, camera ); + + // transparent pass (back-to-front order) + + renderObjects( transparentObjects, scene, camera ); + + } + + // custom render plugins (post pass) + + spritePlugin.render( scene, camera ); + lensFlarePlugin.render( scene, camera, _currentViewport ); + + // Generate mipmap if we're using any kind of mipmap filtering + + if ( renderTarget ) { + + textures.updateRenderTargetMipmap( renderTarget ); + + } + + // Ensure depth buffer writing is enabled so it can be cleared on next render + + state.setDepthTest( true ); + state.setDepthWrite( true ); + state.setColorWrite( true ); + + // _gl.finish(); + + }; + + function pushRenderItem( object, geometry, material, z, group ) { + + var array, index; + + // allocate the next position in the appropriate array + + if ( material.transparent ) { + + array = transparentObjects; + index = ++ transparentObjectsLastIndex; + + } else { + + array = opaqueObjects; + index = ++ opaqueObjectsLastIndex; + + } + + // recycle existing render item or grow the array + + var renderItem = array[ index ]; + + if ( renderItem !== undefined ) { + + renderItem.id = object.id; + renderItem.object = object; + renderItem.geometry = geometry; + renderItem.material = material; + renderItem.z = _vector3.z; + renderItem.group = group; + + } else { + + renderItem = { + id: object.id, + object: object, + geometry: geometry, + material: material, + z: _vector3.z, + group: group + }; + + // assert( index === array.length ); + array.push( renderItem ); + + } + + } + + // TODO Duplicated code (Frustum) + + function isObjectViewable( object ) { + + var geometry = object.geometry; + + if ( geometry.boundingSphere === null ) + geometry.computeBoundingSphere(); + + _sphere.copy( geometry.boundingSphere ). + applyMatrix4( object.matrixWorld ); + + return isSphereViewable( _sphere ); + + } + + function isSpriteViewable( sprite ) { + + _sphere.center.set( 0, 0, 0 ); + _sphere.radius = 0.7071067811865476; + _sphere.applyMatrix4( sprite.matrixWorld ); + + return isSphereViewable( _sphere ); + + } + + function isSphereViewable( sphere ) { + + if ( ! _frustum.intersectsSphere( sphere ) ) return false; + + var numPlanes = _clipping.numPlanes; + + if ( numPlanes === 0 ) return true; + + var planes = _this.clippingPlanes, + + center = sphere.center, + negRad = - sphere.radius, + i = 0; + + do { + + // out when deeper than radius in the negative halfspace + if ( planes[ i ].distanceToPoint( center ) < negRad ) return false; + + } while ( ++ i !== numPlanes ); + + return true; + + } + + function projectObject( object, camera ) { + + if ( object.visible === false ) return; + + var visible = ( object.layers.mask & camera.layers.mask ) !== 0; + + if ( visible ) { + + if ( object.isLight ) { + + lights.push( object ); + + } else if ( object.isSprite ) { + + if ( object.frustumCulled === false || isSpriteViewable( object ) === true ) { + + sprites.push( object ); + + } + + } else if ( object.isLensFlare ) { + + lensFlares.push( object ); + + } else if ( object.isImmediateRenderObject ) { + + if ( _this.sortObjects === true ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ); + _vector3.applyProjection( _projScreenMatrix ); + + } + + pushRenderItem( object, null, object.material, _vector3.z, null ); + + } else if ( object.isMesh || object.isLine || object.isPoints ) { + + if ( object.isSkinnedMesh ) { + + object.skeleton.update(); + + } + + if ( object.frustumCulled === false || isObjectViewable( object ) === true ) { + + var material = object.material; + + if ( material.visible === true ) { + + if ( _this.sortObjects === true ) { + + _vector3.setFromMatrixPosition( object.matrixWorld ); + _vector3.applyProjection( _projScreenMatrix ); + + } + + var geometry = objects.update( object ); + + if ( material.isMultiMaterial ) { + + var groups = geometry.groups; + var materials = material.materials; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + var groupMaterial = materials[ group.materialIndex ]; + + if ( groupMaterial.visible === true ) { + + pushRenderItem( object, geometry, groupMaterial, _vector3.z, group ); + + } + + } + + } else { + + pushRenderItem( object, geometry, material, _vector3.z, null ); + + } + + } + + } + + } + + } + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + projectObject( children[ i ], camera ); + + } + + } + + function renderObjects( renderList, scene, camera, overrideMaterial ) { + + for ( var i = 0, l = renderList.length; i < l; i ++ ) { + + var renderItem = renderList[ i ]; + + var object = renderItem.object; + var geometry = renderItem.geometry; + var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial; + var group = renderItem.group; + + object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); + object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); + + object.onBeforeRender( _this, scene, camera, geometry, material, group ); + + if ( object.isImmediateRenderObject ) { + + setMaterial( material ); + + var program = setProgram( camera, scene.fog, material, object ); + + _currentGeometryProgram = ''; + + object.render( function ( object ) { + + _this.renderBufferImmediate( object, program, material ); + + } ); + + } else { + + _this.renderBufferDirect( camera, scene.fog, geometry, material, object, group ); + + } + + object.onAfterRender( _this, scene, camera, geometry, material, group ); + + + } + + } + + function initMaterial( material, fog, object ) { + + var materialProperties = properties.get( material ); + + var parameters = programCache.getParameters( + material, _lights, fog, _clipping.numPlanes, _clipping.numIntersection, object ); + + var code = programCache.getProgramCode( material, parameters ); + + var program = materialProperties.program; + var programChange = true; + + if ( program === undefined ) { + + // new material + material.addEventListener( 'dispose', onMaterialDispose ); + + } else if ( program.code !== code ) { + + // changed glsl or parameters + releaseMaterialProgramReference( material ); + + } else if ( parameters.shaderID !== undefined ) { + + // same glsl and uniform list + return; + + } else { + + // only rebuild uniform list + programChange = false; + + } + + if ( programChange ) { + + if ( parameters.shaderID ) { + + var shader = ShaderLib[ parameters.shaderID ]; + + materialProperties.__webglShader = { + name: material.type, + uniforms: UniformsUtils.clone( shader.uniforms ), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader + }; + + } else { + + materialProperties.__webglShader = { + name: material.type, + uniforms: material.uniforms, + vertexShader: material.vertexShader, + fragmentShader: material.fragmentShader + }; + + } + + material.__webglShader = materialProperties.__webglShader; + + program = programCache.acquireProgram( material, parameters, code ); + + materialProperties.program = program; + material.program = program; + + } + + var attributes = program.getAttributes(); + + if ( material.morphTargets ) { + + material.numSupportedMorphTargets = 0; + + for ( var i = 0; i < _this.maxMorphTargets; i ++ ) { + + if ( attributes[ 'morphTarget' + i ] >= 0 ) { + + material.numSupportedMorphTargets ++; + + } + + } + + } + + if ( material.morphNormals ) { + + material.numSupportedMorphNormals = 0; + + for ( var i = 0; i < _this.maxMorphNormals; i ++ ) { + + if ( attributes[ 'morphNormal' + i ] >= 0 ) { + + material.numSupportedMorphNormals ++; + + } + + } + + } + + var uniforms = materialProperties.__webglShader.uniforms; + + if ( ! material.isShaderMaterial && + ! material.isRawShaderMaterial || + material.clipping === true ) { + + materialProperties.numClippingPlanes = _clipping.numPlanes; + materialProperties.numIntersection = _clipping.numIntersection; + uniforms.clippingPlanes = _clipping.uniform; + + } + + materialProperties.fog = fog; + + // store the light setup it was created for + + materialProperties.lightsHash = _lights.hash; + + if ( material.lights ) { + + // wire up the material to this renderer's lighting state + + uniforms.ambientLightColor.value = _lights.ambient; + uniforms.directionalLights.value = _lights.directional; + uniforms.spotLights.value = _lights.spot; + uniforms.pointLights.value = _lights.point; + uniforms.hemisphereLights.value = _lights.hemi; + + uniforms.directionalShadowMap.value = _lights.directionalShadowMap; + uniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix; + uniforms.spotShadowMap.value = _lights.spotShadowMap; + uniforms.spotShadowMatrix.value = _lights.spotShadowMatrix; + uniforms.pointShadowMap.value = _lights.pointShadowMap; + uniforms.pointShadowMatrix.value = _lights.pointShadowMatrix; + + } + + var progUniforms = materialProperties.program.getUniforms(), + uniformsList = + WebGLUniforms.seqWithValue( progUniforms.seq, uniforms ); + + materialProperties.uniformsList = uniformsList; + + } + + function setMaterial( material ) { + + material.side === DoubleSide + ? state.disable( _gl.CULL_FACE ) + : state.enable( _gl.CULL_FACE ); + + state.setFlipSided( material.side === BackSide ); + + material.transparent === true + ? state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha ) + : state.setBlending( NoBlending ); + + state.setDepthFunc( material.depthFunc ); + state.setDepthTest( material.depthTest ); + state.setDepthWrite( material.depthWrite ); + state.setColorWrite( material.colorWrite ); + state.setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); + + } + + function setProgram( camera, fog, material, object ) { + + _usedTextureUnits = 0; + + var materialProperties = properties.get( material ); + + if ( _clippingEnabled ) { + + if ( _localClippingEnabled || camera !== _currentCamera ) { + + var useCache = + camera === _currentCamera && + material.id === _currentMaterialId; + + // we might want to call this function with some ClippingGroup + // object instead of the material, once it becomes feasible + // (#8465, #8379) + _clipping.setState( + material.clippingPlanes, material.clipIntersection, material.clipShadows, + camera, materialProperties, useCache ); + + } + + } + + if ( material.needsUpdate === false ) { + + if ( materialProperties.program === undefined ) { + + material.needsUpdate = true; + + } else if ( material.fog && materialProperties.fog !== fog ) { + + material.needsUpdate = true; + + } else if ( material.lights && materialProperties.lightsHash !== _lights.hash ) { + + material.needsUpdate = true; + + } else if ( materialProperties.numClippingPlanes !== undefined && + ( materialProperties.numClippingPlanes !== _clipping.numPlanes || + materialProperties.numIntersection !== _clipping.numIntersection ) ) { + + material.needsUpdate = true; + + } + + } + + if ( material.needsUpdate ) { + + initMaterial( material, fog, object ); + material.needsUpdate = false; + + } + + var refreshProgram = false; + var refreshMaterial = false; + var refreshLights = false; + + var program = materialProperties.program, + p_uniforms = program.getUniforms(), + m_uniforms = materialProperties.__webglShader.uniforms; + + if ( program.id !== _currentProgram ) { + + _gl.useProgram( program.program ); + _currentProgram = program.id; + + refreshProgram = true; + refreshMaterial = true; + refreshLights = true; + + } + + if ( material.id !== _currentMaterialId ) { + + _currentMaterialId = material.id; + + refreshMaterial = true; + + } + + if ( refreshProgram || camera !== _currentCamera ) { + + p_uniforms.set( _gl, camera, 'projectionMatrix' ); + + if ( capabilities.logarithmicDepthBuffer ) { + + p_uniforms.setValue( _gl, 'logDepthBufFC', + 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) ); + + } + + + if ( camera !== _currentCamera ) { + + _currentCamera = camera; + + // lighting uniforms depend on the camera so enforce an update + // now, in case this material supports lights - or later, when + // the next material that does gets activated: + + refreshMaterial = true; // set to true on material change + refreshLights = true; // remains set until update done + + } + + // load material specific uniforms + // (shader material also gets them for the sake of genericity) + + if ( material.isShaderMaterial || + material.isMeshPhongMaterial || + material.isMeshStandardMaterial || + material.envMap ) { + + var uCamPos = p_uniforms.map.cameraPosition; + + if ( uCamPos !== undefined ) { + + uCamPos.setValue( _gl, + _vector3.setFromMatrixPosition( camera.matrixWorld ) ); + + } + + } + + if ( material.isMeshPhongMaterial || + material.isMeshLambertMaterial || + material.isMeshBasicMaterial || + material.isMeshStandardMaterial || + material.isShaderMaterial || + material.skinning ) { + + p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse ); + + } + + p_uniforms.set( _gl, _this, 'toneMappingExposure' ); + p_uniforms.set( _gl, _this, 'toneMappingWhitePoint' ); + + } + + // skinning uniforms must be set even if material didn't change + // auto-setting of texture unit for bone texture must go before other textures + // not sure why, but otherwise weird things happen + + if ( material.skinning ) { + + p_uniforms.setOptional( _gl, object, 'bindMatrix' ); + p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' ); + + var skeleton = object.skeleton; + + if ( skeleton ) { + + if ( capabilities.floatVertexTextures && skeleton.useVertexTexture ) { + + p_uniforms.set( _gl, skeleton, 'boneTexture' ); + p_uniforms.set( _gl, skeleton, 'boneTextureWidth' ); + p_uniforms.set( _gl, skeleton, 'boneTextureHeight' ); + + } else { + + p_uniforms.setOptional( _gl, skeleton, 'boneMatrices' ); + + } + + } + + } + + if ( refreshMaterial ) { + + if ( material.lights ) { + + // the current material requires lighting info + + // note: all lighting uniforms are always set correctly + // they simply reference the renderer's state for their + // values + // + // use the current material's .needsUpdate flags to set + // the GL state when required + + markUniformsLightsNeedsUpdate( m_uniforms, refreshLights ); + + } + + // refresh uniforms common to several materials + + if ( fog && material.fog ) { + + refreshUniformsFog( m_uniforms, fog ); + + } + + if ( material.isMeshBasicMaterial || + material.isMeshLambertMaterial || + material.isMeshPhongMaterial || + material.isMeshStandardMaterial || + material.isMeshDepthMaterial ) { + + refreshUniformsCommon( m_uniforms, material ); + + } + + // refresh single material specific uniforms + + if ( material.isLineBasicMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + + } else if ( material.isLineDashedMaterial ) { + + refreshUniformsLine( m_uniforms, material ); + refreshUniformsDash( m_uniforms, material ); + + } else if ( material.isPointsMaterial ) { + + refreshUniformsPoints( m_uniforms, material ); + + } else if ( material.isMeshLambertMaterial ) { + + refreshUniformsLambert( m_uniforms, material ); + + } else if ( material.isMeshPhongMaterial ) { + + refreshUniformsPhong( m_uniforms, material ); + + } else if ( material.isMeshPhysicalMaterial ) { + + refreshUniformsPhysical( m_uniforms, material ); + + } else if ( material.isMeshStandardMaterial ) { + + refreshUniformsStandard( m_uniforms, material ); + + } else if ( material.isMeshDepthMaterial ) { + + if ( material.displacementMap ) { + + m_uniforms.displacementMap.value = material.displacementMap; + m_uniforms.displacementScale.value = material.displacementScale; + m_uniforms.displacementBias.value = material.displacementBias; + + } + + } else if ( material.isMeshNormalMaterial ) { + + m_uniforms.opacity.value = material.opacity; + + } + + WebGLUniforms.upload( + _gl, materialProperties.uniformsList, m_uniforms, _this ); + + } + + + // common matrices + + p_uniforms.set( _gl, object, 'modelViewMatrix' ); + p_uniforms.set( _gl, object, 'normalMatrix' ); + p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld ); + + return program; + + } + + // Uniforms (refresh uniforms objects) + + function refreshUniformsCommon( uniforms, material ) { + + uniforms.opacity.value = material.opacity; + + uniforms.diffuse.value = material.color; + + if ( material.emissive ) { + + uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity ); + + } + + uniforms.map.value = material.map; + uniforms.specularMap.value = material.specularMap; + uniforms.alphaMap.value = material.alphaMap; + + if ( material.aoMap ) { + + uniforms.aoMap.value = material.aoMap; + uniforms.aoMapIntensity.value = material.aoMapIntensity; + + } + + // uv repeat and offset setting priorities + // 1. color map + // 2. specular map + // 3. normal map + // 4. bump map + // 5. alpha map + // 6. emissive map + + var uvScaleMap; + + if ( material.map ) { + + uvScaleMap = material.map; + + } else if ( material.specularMap ) { + + uvScaleMap = material.specularMap; + + } else if ( material.displacementMap ) { + + uvScaleMap = material.displacementMap; + + } else if ( material.normalMap ) { + + uvScaleMap = material.normalMap; + + } else if ( material.bumpMap ) { + + uvScaleMap = material.bumpMap; + + } else if ( material.roughnessMap ) { + + uvScaleMap = material.roughnessMap; + + } else if ( material.metalnessMap ) { + + uvScaleMap = material.metalnessMap; + + } else if ( material.alphaMap ) { + + uvScaleMap = material.alphaMap; + + } else if ( material.emissiveMap ) { + + uvScaleMap = material.emissiveMap; + + } + + if ( uvScaleMap !== undefined ) { + + // backwards compatibility + if ( uvScaleMap.isWebGLRenderTarget ) { + + uvScaleMap = uvScaleMap.texture; + + } + + var offset = uvScaleMap.offset; + var repeat = uvScaleMap.repeat; + + uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y ); + + } + + uniforms.envMap.value = material.envMap; + + // don't flip CubeTexture envMaps, flip everything else: + // WebGLRenderTargetCube will be flipped for backwards compatibility + // WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture + // this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future + uniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1; + + uniforms.reflectivity.value = material.reflectivity; + uniforms.refractionRatio.value = material.refractionRatio; + + } + + function refreshUniformsLine( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + + } + + function refreshUniformsDash( uniforms, material ) { + + uniforms.dashSize.value = material.dashSize; + uniforms.totalSize.value = material.dashSize + material.gapSize; + uniforms.scale.value = material.scale; + + } + + function refreshUniformsPoints( uniforms, material ) { + + uniforms.diffuse.value = material.color; + uniforms.opacity.value = material.opacity; + uniforms.size.value = material.size * _pixelRatio; + uniforms.scale.value = _height * 0.5; + + uniforms.map.value = material.map; + + if ( material.map !== null ) { + + var offset = material.map.offset; + var repeat = material.map.repeat; + + uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y ); + + } + + } + + function refreshUniformsFog( uniforms, fog ) { + + uniforms.fogColor.value = fog.color; + + if ( fog.isFog ) { + + uniforms.fogNear.value = fog.near; + uniforms.fogFar.value = fog.far; + + } else if ( fog.isFogExp2 ) { + + uniforms.fogDensity.value = fog.density; + + } + + } + + function refreshUniformsLambert( uniforms, material ) { + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + } + + function refreshUniformsPhong( uniforms, material ) { + + uniforms.specular.value = material.specular; + uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 ) + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + } + + function refreshUniformsStandard( uniforms, material ) { + + uniforms.roughness.value = material.roughness; + uniforms.metalness.value = material.metalness; + + if ( material.roughnessMap ) { + + uniforms.roughnessMap.value = material.roughnessMap; + + } + + if ( material.metalnessMap ) { + + uniforms.metalnessMap.value = material.metalnessMap; + + } + + if ( material.lightMap ) { + + uniforms.lightMap.value = material.lightMap; + uniforms.lightMapIntensity.value = material.lightMapIntensity; + + } + + if ( material.emissiveMap ) { + + uniforms.emissiveMap.value = material.emissiveMap; + + } + + if ( material.bumpMap ) { + + uniforms.bumpMap.value = material.bumpMap; + uniforms.bumpScale.value = material.bumpScale; + + } + + if ( material.normalMap ) { + + uniforms.normalMap.value = material.normalMap; + uniforms.normalScale.value.copy( material.normalScale ); + + } + + if ( material.displacementMap ) { + + uniforms.displacementMap.value = material.displacementMap; + uniforms.displacementScale.value = material.displacementScale; + uniforms.displacementBias.value = material.displacementBias; + + } + + if ( material.envMap ) { + + //uniforms.envMap.value = material.envMap; // part of uniforms common + uniforms.envMapIntensity.value = material.envMapIntensity; + + } + + } + + function refreshUniformsPhysical( uniforms, material ) { + + uniforms.clearCoat.value = material.clearCoat; + uniforms.clearCoatRoughness.value = material.clearCoatRoughness; + + refreshUniformsStandard( uniforms, material ); + + } + + // If uniforms are marked as clean, they don't need to be loaded to the GPU. + + function markUniformsLightsNeedsUpdate( uniforms, value ) { + + uniforms.ambientLightColor.needsUpdate = value; + + uniforms.directionalLights.needsUpdate = value; + uniforms.pointLights.needsUpdate = value; + uniforms.spotLights.needsUpdate = value; + uniforms.hemisphereLights.needsUpdate = value; + + } + + // Lighting + + function setupShadows( lights ) { + + var lightShadowsLength = 0; + + for ( var i = 0, l = lights.length; i < l; i ++ ) { + + var light = lights[ i ]; + + if ( light.castShadow ) { + + _lights.shadows[ lightShadowsLength ++ ] = light; + + } + + } + + _lights.shadows.length = lightShadowsLength; + + } + + function setupLights( lights, camera ) { + + var l, ll, light, + r = 0, g = 0, b = 0, + color, + intensity, + distance, + shadowMap, + + viewMatrix = camera.matrixWorldInverse, + + directionalLength = 0, + pointLength = 0, + spotLength = 0, + hemiLength = 0; + + for ( l = 0, ll = lights.length; l < ll; l ++ ) { + + light = lights[ l ]; + + color = light.color; + intensity = light.intensity; + distance = light.distance; + + shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null; + + if ( light.isAmbientLight ) { + + r += color.r * intensity; + g += color.g * intensity; + b += color.b * intensity; + + } else if ( light.isDirectionalLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + _vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( _vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + uniforms.shadowBias = light.shadow.bias; + uniforms.shadowRadius = light.shadow.radius; + uniforms.shadowMapSize = light.shadow.mapSize; + + } + + _lights.directionalShadowMap[ directionalLength ] = shadowMap; + _lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix; + _lights.directional[ directionalLength ++ ] = uniforms; + + } else if ( light.isSpotLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( color ).multiplyScalar( intensity ); + uniforms.distance = distance; + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + _vector3.setFromMatrixPosition( light.target.matrixWorld ); + uniforms.direction.sub( _vector3 ); + uniforms.direction.transformDirection( viewMatrix ); + + uniforms.coneCos = Math.cos( light.angle ); + uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) ); + uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + uniforms.shadowBias = light.shadow.bias; + uniforms.shadowRadius = light.shadow.radius; + uniforms.shadowMapSize = light.shadow.mapSize; + + } + + _lights.spotShadowMap[ spotLength ] = shadowMap; + _lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix; + _lights.spot[ spotLength ++ ] = uniforms; + + } else if ( light.isPointLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.position.setFromMatrixPosition( light.matrixWorld ); + uniforms.position.applyMatrix4( viewMatrix ); + + uniforms.color.copy( light.color ).multiplyScalar( light.intensity ); + uniforms.distance = light.distance; + uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay; + + uniforms.shadow = light.castShadow; + + if ( light.castShadow ) { + + uniforms.shadowBias = light.shadow.bias; + uniforms.shadowRadius = light.shadow.radius; + uniforms.shadowMapSize = light.shadow.mapSize; + + } + + _lights.pointShadowMap[ pointLength ] = shadowMap; + + if ( _lights.pointShadowMatrix[ pointLength ] === undefined ) { + + _lights.pointShadowMatrix[ pointLength ] = new Matrix4(); + + } + + // for point lights we set the shadow matrix to be a translation-only matrix + // equal to inverse of the light's position + _vector3.setFromMatrixPosition( light.matrixWorld ).negate(); + _lights.pointShadowMatrix[ pointLength ].identity().setPosition( _vector3 ); + + _lights.point[ pointLength ++ ] = uniforms; + + } else if ( light.isHemisphereLight ) { + + var uniforms = lightCache.get( light ); + + uniforms.direction.setFromMatrixPosition( light.matrixWorld ); + uniforms.direction.transformDirection( viewMatrix ); + uniforms.direction.normalize(); + + uniforms.skyColor.copy( light.color ).multiplyScalar( intensity ); + uniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity ); + + _lights.hemi[ hemiLength ++ ] = uniforms; + + } + + } + + _lights.ambient[ 0 ] = r; + _lights.ambient[ 1 ] = g; + _lights.ambient[ 2 ] = b; + + _lights.directional.length = directionalLength; + _lights.spot.length = spotLength; + _lights.point.length = pointLength; + _lights.hemi.length = hemiLength; + + _lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + hemiLength + ',' + _lights.shadows.length; + + } + + // GL state setting + + this.setFaceCulling = function ( cullFace, frontFaceDirection ) { + + state.setCullFace( cullFace ); + state.setFlipSided( frontFaceDirection === FrontFaceDirectionCW ); + + }; + + // Textures + + function allocTextureUnit() { + + var textureUnit = _usedTextureUnits; + + if ( textureUnit >= capabilities.maxTextures ) { + + console.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures ); + + } + + _usedTextureUnits += 1; + + return textureUnit; + + } + + this.allocTextureUnit = allocTextureUnit; + + // this.setTexture2D = setTexture2D; + this.setTexture2D = ( function() { + + var warned = false; + + // backwards compatibility: peel texture.texture + return function setTexture2D( texture, slot ) { + + if ( texture && texture.isWebGLRenderTarget ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTexture = ( function() { + + var warned = false; + + return function setTexture( texture, slot ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead." ); + warned = true; + + } + + textures.setTexture2D( texture, slot ); + + }; + + }() ); + + this.setTextureCube = ( function() { + + var warned = false; + + return function setTextureCube( texture, slot ) { + + // backwards compatibility: peel texture.texture + if ( texture && texture.isWebGLRenderTargetCube ) { + + if ( ! warned ) { + + console.warn( "THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead." ); + warned = true; + + } + + texture = texture.texture; + + } + + // currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture + // TODO: unify these code paths + if ( ( texture && texture.isCubeTexture ) || + ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) { + + // CompressedTexture can have Array in image :/ + + // this function alone should take care of cube textures + textures.setTextureCube( texture, slot ); + + } else { + + // assumed: texture property of THREE.WebGLRenderTargetCube + + textures.setTextureCubeDynamic( texture, slot ); + + } + + }; + + }() ); + + this.getCurrentRenderTarget = function() { + + return _currentRenderTarget; + + }; + + this.setRenderTarget = function ( renderTarget ) { + + _currentRenderTarget = renderTarget; + + if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) { + + textures.setupRenderTarget( renderTarget ); + + } + + var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube ); + var framebuffer; + + if ( renderTarget ) { + + var renderTargetProperties = properties.get( renderTarget ); + + if ( isCube ) { + + framebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ]; + + } else { + + framebuffer = renderTargetProperties.__webglFramebuffer; + + } + + _currentScissor.copy( renderTarget.scissor ); + _currentScissorTest = renderTarget.scissorTest; + + _currentViewport.copy( renderTarget.viewport ); + + } else { + + framebuffer = null; + + _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ); + _currentScissorTest = _scissorTest; + + _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ); + + } + + if ( _currentFramebuffer !== framebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + _currentFramebuffer = framebuffer; + + } + + state.scissor( _currentScissor ); + state.setScissorTest( _currentScissorTest ); + + state.viewport( _currentViewport ); + + if ( isCube ) { + + var textureProperties = properties.get( renderTarget.texture ); + _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel ); + + } + + }; + + this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) { + + if ( ( renderTarget && renderTarget.isWebGLRenderTarget ) === false ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' ); + return; + + } + + var framebuffer = properties.get( renderTarget ).__webglFramebuffer; + + if ( framebuffer ) { + + var restore = false; + + if ( framebuffer !== _currentFramebuffer ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); + + restore = true; + + } + + try { + + var texture = renderTarget.texture; + var textureFormat = texture.format; + var textureType = texture.type; + + if ( textureFormat !== RGBAFormat && paramThreeToGL( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' ); + return; + + } + + if ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513) + ! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox + ! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' ); + return; + + } + + if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) { + + // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604) + + if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) { + + _gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer ); + + } + + } else { + + console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' ); + + } + + } finally { + + if ( restore ) { + + _gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer ); + + } + + } + + } + + }; + + // Map three.js constants to WebGL constants + + function paramThreeToGL( p ) { + + var extension; + + if ( p === RepeatWrapping ) return _gl.REPEAT; + if ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE; + if ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT; + + if ( p === NearestFilter ) return _gl.NEAREST; + if ( p === NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST; + if ( p === NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR; + + if ( p === LinearFilter ) return _gl.LINEAR; + if ( p === LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST; + if ( p === LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR; + + if ( p === UnsignedByteType ) return _gl.UNSIGNED_BYTE; + if ( p === UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4; + if ( p === UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1; + if ( p === UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5; + + if ( p === ByteType ) return _gl.BYTE; + if ( p === ShortType ) return _gl.SHORT; + if ( p === UnsignedShortType ) return _gl.UNSIGNED_SHORT; + if ( p === IntType ) return _gl.INT; + if ( p === UnsignedIntType ) return _gl.UNSIGNED_INT; + if ( p === FloatType ) return _gl.FLOAT; + + if ( p === HalfFloatType ) { + + extension = extensions.get( 'OES_texture_half_float' ); + + if ( extension !== null ) return extension.HALF_FLOAT_OES; + + } + + if ( p === AlphaFormat ) return _gl.ALPHA; + if ( p === RGBFormat ) return _gl.RGB; + if ( p === RGBAFormat ) return _gl.RGBA; + if ( p === LuminanceFormat ) return _gl.LUMINANCE; + if ( p === LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA; + if ( p === DepthFormat ) return _gl.DEPTH_COMPONENT; + if ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL; + + if ( p === AddEquation ) return _gl.FUNC_ADD; + if ( p === SubtractEquation ) return _gl.FUNC_SUBTRACT; + if ( p === ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT; + + if ( p === ZeroFactor ) return _gl.ZERO; + if ( p === OneFactor ) return _gl.ONE; + if ( p === SrcColorFactor ) return _gl.SRC_COLOR; + if ( p === OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR; + if ( p === SrcAlphaFactor ) return _gl.SRC_ALPHA; + if ( p === OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA; + if ( p === DstAlphaFactor ) return _gl.DST_ALPHA; + if ( p === OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA; + + if ( p === DstColorFactor ) return _gl.DST_COLOR; + if ( p === OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR; + if ( p === SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE; + + if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || + p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_s3tc' ); + + if ( extension !== null ) { + + if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; + if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; + if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; + + } + + } + + if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || + p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + + if ( extension !== null ) { + + if ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + + } + + } + + if ( p === RGB_ETC1_Format ) { + + extension = extensions.get( 'WEBGL_compressed_texture_etc1' ); + + if ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL; + + } + + if ( p === MinEquation || p === MaxEquation ) { + + extension = extensions.get( 'EXT_blend_minmax' ); + + if ( extension !== null ) { + + if ( p === MinEquation ) return extension.MIN_EXT; + if ( p === MaxEquation ) return extension.MAX_EXT; + + } + + } + + if ( p === UnsignedInt248Type ) { + + extension = extensions.get( 'WEBGL_depth_texture' ); + + if ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL; + + } + + return 0; + + } + + } + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function FogExp2 ( color, density ) { + + this.name = ''; + + this.color = new Color( color ); + this.density = ( density !== undefined ) ? density : 0.00025; + + } + + FogExp2.prototype.isFogExp2 = true; + + FogExp2.prototype.clone = function () { + + return new FogExp2( this.color.getHex(), this.density ); + + }; + + FogExp2.prototype.toJSON = function ( meta ) { + + return { + type: 'FogExp2', + color: this.color.getHex(), + density: this.density + }; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Fog ( color, near, far ) { + + this.name = ''; + + this.color = new Color( color ); + + this.near = ( near !== undefined ) ? near : 1; + this.far = ( far !== undefined ) ? far : 1000; + + } + + Fog.prototype.isFog = true; + + Fog.prototype.clone = function () { + + return new Fog( this.color.getHex(), this.near, this.far ); + + }; + + Fog.prototype.toJSON = function ( meta ) { + + return { + type: 'Fog', + color: this.color.getHex(), + near: this.near, + far: this.far + }; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Scene () { + + Object3D.call( this ); + + this.type = 'Scene'; + + this.background = null; + this.fog = null; + this.overrideMaterial = null; + + this.autoUpdate = true; // checked by the renderer + + } + + Scene.prototype = Object.create( Object3D.prototype ); + + Scene.prototype.constructor = Scene; + + Scene.prototype.copy = function ( source, recursive ) { + + Object3D.prototype.copy.call( this, source, recursive ); + + if ( source.background !== null ) this.background = source.background.clone(); + if ( source.fog !== null ) this.fog = source.fog.clone(); + if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone(); + + this.autoUpdate = source.autoUpdate; + this.matrixAutoUpdate = source.matrixAutoUpdate; + + return this; + + }; + + Scene.prototype.toJSON = function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + if ( this.background !== null ) data.object.background = this.background.toJSON( meta ); + if ( this.fog !== null ) data.object.fog = this.fog.toJSON(); + + return data; + + }; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function LensFlare( texture, size, distance, blending, color ) { + + Object3D.call( this ); + + this.lensFlares = []; + + this.positionScreen = new Vector3(); + this.customUpdateCallback = undefined; + + if ( texture !== undefined ) { + + this.add( texture, size, distance, blending, color ); + + } + + } + + LensFlare.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: LensFlare, + + isLensFlare: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.positionScreen.copy( source.positionScreen ); + this.customUpdateCallback = source.customUpdateCallback; + + for ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) { + + this.lensFlares.push( source.lensFlares[ i ] ); + + } + + return this; + + }, + + add: function ( texture, size, distance, blending, color, opacity ) { + + if ( size === undefined ) size = - 1; + if ( distance === undefined ) distance = 0; + if ( opacity === undefined ) opacity = 1; + if ( color === undefined ) color = new Color( 0xffffff ); + if ( blending === undefined ) blending = NormalBlending; + + distance = Math.min( distance, Math.max( 0, distance ) ); + + this.lensFlares.push( { + texture: texture, // THREE.Texture + size: size, // size in pixels (-1 = use texture.width) + distance: distance, // distance (0-1) from light source (0=at light source) + x: 0, y: 0, z: 0, // screen position (-1 => 1) z = 0 is in front z = 1 is back + scale: 1, // scale + rotation: 0, // rotation + opacity: opacity, // opacity + color: color, // color + blending: blending // blending + } ); + + }, + + /* + * Update lens flares update positions on all flares based on the screen position + * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way. + */ + + updateLensFlares: function () { + + var f, fl = this.lensFlares.length; + var flare; + var vecX = - this.positionScreen.x * 2; + var vecY = - this.positionScreen.y * 2; + + for ( f = 0; f < fl; f ++ ) { + + flare = this.lensFlares[ f ]; + + flare.x = this.positionScreen.x + vecX * flare.distance; + flare.y = this.positionScreen.y + vecY * flare.distance; + + flare.wantedRotation = flare.x * Math.PI * 0.25; + flare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25; + + } + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * uvOffset: new THREE.Vector2(), + * uvScale: new THREE.Vector2() + * } + */ + + function SpriteMaterial( parameters ) { + + Material.call( this ); + + this.type = 'SpriteMaterial'; + + this.color = new Color( 0xffffff ); + this.map = null; + + this.rotation = 0; + + this.fog = false; + this.lights = false; + + this.setValues( parameters ); + + } + + SpriteMaterial.prototype = Object.create( Material.prototype ); + SpriteMaterial.prototype.constructor = SpriteMaterial; + + SpriteMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.map = source.map; + + this.rotation = source.rotation; + + return this; + + }; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Sprite( material ) { + + Object3D.call( this ); + + this.type = 'Sprite'; + + this.material = ( material !== undefined ) ? material : new SpriteMaterial(); + + } + + Sprite.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Sprite, + + isSprite: true, + + raycast: ( function () { + + var matrixPosition = new Vector3(); + + return function raycast( raycaster, intersects ) { + + matrixPosition.setFromMatrixPosition( this.matrixWorld ); + + var distanceSq = raycaster.ray.distanceSqToPoint( matrixPosition ); + var guessSizeSq = this.scale.x * this.scale.y / 4; + + if ( distanceSq > guessSizeSq ) { + + return; + + } + + intersects.push( { + + distance: Math.sqrt( distanceSq ), + point: this.position, + face: null, + object: this + + } ); + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.material ).copy( this ); + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function LOD() { + + Object3D.call( this ); + + this.type = 'LOD'; + + Object.defineProperties( this, { + levels: { + enumerable: true, + value: [] + } + } ); + + } + + + LOD.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: LOD, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source, false ); + + var levels = source.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + this.addLevel( level.object.clone(), level.distance ); + + } + + return this; + + }, + + addLevel: function ( object, distance ) { + + if ( distance === undefined ) distance = 0; + + distance = Math.abs( distance ); + + var levels = this.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + if ( distance < levels[ l ].distance ) { + + break; + + } + + } + + levels.splice( l, 0, { distance: distance, object: object } ); + + this.add( object ); + + }, + + getObjectForDistance: function ( distance ) { + + var levels = this.levels; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance < levels[ i ].distance ) { + + break; + + } + + } + + return levels[ i - 1 ].object; + + }, + + raycast: ( function () { + + var matrixPosition = new Vector3(); + + return function raycast( raycaster, intersects ) { + + matrixPosition.setFromMatrixPosition( this.matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( matrixPosition ); + + this.getObjectForDistance( distance ).raycast( raycaster, intersects ); + + }; + + }() ), + + update: function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + + return function update( camera ) { + + var levels = this.levels; + + if ( levels.length > 1 ) { + + v1.setFromMatrixPosition( camera.matrixWorld ); + v2.setFromMatrixPosition( this.matrixWorld ); + + var distance = v1.distanceTo( v2 ); + + levels[ 0 ].object.visible = true; + + for ( var i = 1, l = levels.length; i < l; i ++ ) { + + if ( distance >= levels[ i ].distance ) { + + levels[ i - 1 ].object.visible = false; + levels[ i ].object.visible = true; + + } else { + + break; + + } + + } + + for ( ; i < l; i ++ ) { + + levels[ i ].object.visible = false; + + } + + } + + }; + + }(), + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.levels = []; + + var levels = this.levels; + + for ( var i = 0, l = levels.length; i < l; i ++ ) { + + var level = levels[ i ]; + + data.object.levels.push( { + object: level.object.uuid, + distance: level.distance + } ); + + } + + return data; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { data: data, width: width, height: height }; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.generateMipmaps = false; + this.flipY = false; + this.unpackAlignment = 1; + + } + + DataTexture.prototype = Object.create( Texture.prototype ); + DataTexture.prototype.constructor = DataTexture; + + DataTexture.prototype.isDataTexture = true; + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author michael guerrero / http://realitymeltdown.com + * @author ikerr / http://verold.com + */ + + function Skeleton( bones, boneInverses, useVertexTexture ) { + + this.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true; + + this.identityMatrix = new Matrix4(); + + // copy the bone array + + bones = bones || []; + + this.bones = bones.slice( 0 ); + + // create a bone texture or an array of floats + + if ( this.useVertexTexture ) { + + // layout (1 matrix = 4 pixels) + // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) + // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) + // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) + // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) + // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) + + + var size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix + size = _Math.nextPowerOfTwo( Math.ceil( size ) ); + size = Math.max( size, 4 ); + + this.boneTextureWidth = size; + this.boneTextureHeight = size; + + this.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel + this.boneTexture = new DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, RGBAFormat, FloatType ); + + } else { + + this.boneMatrices = new Float32Array( 16 * this.bones.length ); + + } + + // use the supplied bone inverses or calculate the inverses + + if ( boneInverses === undefined ) { + + this.calculateInverses(); + + } else { + + if ( this.bones.length === boneInverses.length ) { + + this.boneInverses = boneInverses.slice( 0 ); + + } else { + + console.warn( 'THREE.Skeleton bonInverses is the wrong length.' ); + + this.boneInverses = []; + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + this.boneInverses.push( new Matrix4() ); + + } + + } + + } + + } + + Object.assign( Skeleton.prototype, { + + calculateInverses: function () { + + this.boneInverses = []; + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + var inverse = new Matrix4(); + + if ( this.bones[ b ] ) { + + inverse.getInverse( this.bones[ b ].matrixWorld ); + + } + + this.boneInverses.push( inverse ); + + } + + }, + + pose: function () { + + var bone; + + // recover the bind-time world matrices + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + bone = this.bones[ b ]; + + if ( bone ) { + + bone.matrixWorld.getInverse( this.boneInverses[ b ] ); + + } + + } + + // compute the local matrices, positions, rotations and scales + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + bone = this.bones[ b ]; + + if ( bone ) { + + if ( (bone.parent && bone.parent.isBone) ) { + + bone.matrix.getInverse( bone.parent.matrixWorld ); + bone.matrix.multiply( bone.matrixWorld ); + + } else { + + bone.matrix.copy( bone.matrixWorld ); + + } + + bone.matrix.decompose( bone.position, bone.quaternion, bone.scale ); + + } + + } + + }, + + update: ( function () { + + var offsetMatrix = new Matrix4(); + + return function update() { + + // flatten bone matrices to array + + for ( var b = 0, bl = this.bones.length; b < bl; b ++ ) { + + // compute the offset between the current and the original transform + + var matrix = this.bones[ b ] ? this.bones[ b ].matrixWorld : this.identityMatrix; + + offsetMatrix.multiplyMatrices( matrix, this.boneInverses[ b ] ); + offsetMatrix.toArray( this.boneMatrices, b * 16 ); + + } + + if ( this.useVertexTexture ) { + + this.boneTexture.needsUpdate = true; + + } + + }; + + } )(), + + clone: function () { + + return new Skeleton( this.bones, this.boneInverses, this.useVertexTexture ); + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function Bone( skin ) { + + Object3D.call( this ); + + this.type = 'Bone'; + + this.skin = skin; + + } + + Bone.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Bone, + + isBone: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.skin = source.skin; + + return this; + + } + + } ); + + /** + * @author mikael emtinger / http://gomo.se/ + * @author alteredq / http://alteredqualia.com/ + * @author ikerr / http://verold.com + */ + + function SkinnedMesh( geometry, material, useVertexTexture ) { + + Mesh.call( this, geometry, material ); + + this.type = 'SkinnedMesh'; + + this.bindMode = "attached"; + this.bindMatrix = new Matrix4(); + this.bindMatrixInverse = new Matrix4(); + + // init bones + + // TODO: remove bone creation as there is no reason (other than + // convenience) for THREE.SkinnedMesh to do this. + + var bones = []; + + if ( this.geometry && this.geometry.bones !== undefined ) { + + var bone, gbone; + + for ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) { + + gbone = this.geometry.bones[ b ]; + + bone = new Bone( this ); + bones.push( bone ); + + bone.name = gbone.name; + bone.position.fromArray( gbone.pos ); + bone.quaternion.fromArray( gbone.rotq ); + if ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl ); + + } + + for ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) { + + gbone = this.geometry.bones[ b ]; + + if ( gbone.parent !== - 1 && gbone.parent !== null && + bones[ gbone.parent ] !== undefined ) { + + bones[ gbone.parent ].add( bones[ b ] ); + + } else { + + this.add( bones[ b ] ); + + } + + } + + } + + this.normalizeSkinWeights(); + + this.updateMatrixWorld( true ); + this.bind( new Skeleton( bones, undefined, useVertexTexture ), this.matrixWorld ); + + } + + + SkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), { + + constructor: SkinnedMesh, + + isSkinnedMesh: true, + + bind: function( skeleton, bindMatrix ) { + + this.skeleton = skeleton; + + if ( bindMatrix === undefined ) { + + this.updateMatrixWorld( true ); + + this.skeleton.calculateInverses(); + + bindMatrix = this.matrixWorld; + + } + + this.bindMatrix.copy( bindMatrix ); + this.bindMatrixInverse.getInverse( bindMatrix ); + + }, + + pose: function () { + + this.skeleton.pose(); + + }, + + normalizeSkinWeights: function () { + + if ( (this.geometry && this.geometry.isGeometry) ) { + + for ( var i = 0; i < this.geometry.skinWeights.length; i ++ ) { + + var sw = this.geometry.skinWeights[ i ]; + + var scale = 1.0 / sw.lengthManhattan(); + + if ( scale !== Infinity ) { + + sw.multiplyScalar( scale ); + + } else { + + sw.set( 1, 0, 0, 0 ); // do something reasonable + + } + + } + + } else if ( (this.geometry && this.geometry.isBufferGeometry) ) { + + var vec = new Vector4(); + + var skinWeight = this.geometry.attributes.skinWeight; + + for ( var i = 0; i < skinWeight.count; i ++ ) { + + vec.x = skinWeight.getX( i ); + vec.y = skinWeight.getY( i ); + vec.z = skinWeight.getZ( i ); + vec.w = skinWeight.getW( i ); + + var scale = 1.0 / vec.lengthManhattan(); + + if ( scale !== Infinity ) { + + vec.multiplyScalar( scale ); + + } else { + + vec.set( 1, 0, 0, 0 ); // do something reasonable + + } + + skinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w ); + + } + + } + + }, + + updateMatrixWorld: function( force ) { + + Mesh.prototype.updateMatrixWorld.call( this, true ); + + if ( this.bindMode === "attached" ) { + + this.bindMatrixInverse.getInverse( this.matrixWorld ); + + } else if ( this.bindMode === "detached" ) { + + this.bindMatrixInverse.getInverse( this.bindMatrix ); + + } else { + + console.warn( 'THREE.SkinnedMesh unrecognized bindMode: ' + this.bindMode ); + + } + + }, + + clone: function() { + + return new this.constructor( this.geometry, this.material, this.skeleton.useVertexTexture ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * linecap: "round", + * linejoin: "round" + * } + */ + + function LineBasicMaterial( parameters ) { + + Material.call( this ); + + this.type = 'LineBasicMaterial'; + + this.color = new Color( 0xffffff ); + + this.linewidth = 1; + this.linecap = 'round'; + this.linejoin = 'round'; + + this.lights = false; + + this.setValues( parameters ); + + } + + LineBasicMaterial.prototype = Object.create( Material.prototype ); + LineBasicMaterial.prototype.constructor = LineBasicMaterial; + + LineBasicMaterial.prototype.isLineBasicMaterial = true; + + LineBasicMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + this.linecap = source.linecap; + this.linejoin = source.linejoin; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Line( geometry, material, mode ) { + + if ( mode === 1 ) { + + console.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' ); + return new LineSegments( geometry, material ); + + } + + Object3D.call( this ); + + this.type = 'Line'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } ); + + } + + Line.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Line, + + isLine: true, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var precision = raycaster.linePrecision; + var precisionSq = precision * precision; + + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var vStart = new Vector3(); + var vEnd = new Vector3(); + var interSegment = new Vector3(); + var interRay = new Vector3(); + var step = (this && this.isLineSegments) ? 2 : 1; + + if ( (geometry && geometry.isBufferGeometry) ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, l = indices.length - 1; i < l; i += step ) { + + var a = indices[ i ]; + var b = indices[ i + 1 ]; + + vStart.fromArray( positions, a * 3 ); + vEnd.fromArray( positions, b * 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) { + + vStart.fromArray( positions, 3 * i ); + vEnd.fromArray( positions, 3 * i + 3 ); + + var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + } else if ( (geometry && geometry.isGeometry) ) { + + var vertices = geometry.vertices; + var nbVertices = vertices.length; + + for ( var i = 0; i < nbVertices - 1; i += step ) { + + var distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment ); + + if ( distSq > precisionSq ) continue; + + interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation + + var distance = raycaster.ray.origin.distanceTo( interRay ); + + if ( distance < raycaster.near || distance > raycaster.far ) continue; + + intersects.push( { + + distance: distance, + // What do we want? intersection point on the ray or on the segment?? + // point: raycaster.ray.at( distance ), + point: interSegment.clone().applyMatrix4( this.matrixWorld ), + index: i, + face: null, + faceIndex: null, + object: this + + } ); + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LineSegments( geometry, material ) { + + Line.call( this, geometry, material ); + + this.type = 'LineSegments'; + + } + + LineSegments.prototype = Object.assign( Object.create( Line.prototype ), { + + constructor: LineSegments, + + isLineSegments: true + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * map: new THREE.Texture( ), + * + * size: , + * sizeAttenuation: + * } + */ + + function PointsMaterial( parameters ) { + + Material.call( this ); + + this.type = 'PointsMaterial'; + + this.color = new Color( 0xffffff ); + + this.map = null; + + this.size = 1; + this.sizeAttenuation = true; + + this.lights = false; + + this.setValues( parameters ); + + } + + PointsMaterial.prototype = Object.create( Material.prototype ); + PointsMaterial.prototype.constructor = PointsMaterial; + + PointsMaterial.prototype.isPointsMaterial = true; + + PointsMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.size = source.size; + this.sizeAttenuation = source.sizeAttenuation; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Points( geometry, material ) { + + Object3D.call( this ); + + this.type = 'Points'; + + this.geometry = geometry !== undefined ? geometry : new BufferGeometry(); + this.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } ); + + } + + Points.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Points, + + isPoints: true, + + raycast: ( function () { + + var inverseMatrix = new Matrix4(); + var ray = new Ray(); + var sphere = new Sphere(); + + return function raycast( raycaster, intersects ) { + + var object = this; + var geometry = this.geometry; + var matrixWorld = this.matrixWorld; + var threshold = raycaster.params.Points.threshold; + + // Checking boundingSphere distance to ray + + if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere(); + + sphere.copy( geometry.boundingSphere ); + sphere.applyMatrix4( matrixWorld ); + + if ( raycaster.ray.intersectsSphere( sphere ) === false ) return; + + // + + inverseMatrix.getInverse( matrixWorld ); + ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix ); + + var localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 ); + var localThresholdSq = localThreshold * localThreshold; + var position = new Vector3(); + + function testPoint( point, index ) { + + var rayPointDistanceSq = ray.distanceSqToPoint( point ); + + if ( rayPointDistanceSq < localThresholdSq ) { + + var intersectPoint = ray.closestPointToPoint( point ); + intersectPoint.applyMatrix4( matrixWorld ); + + var distance = raycaster.ray.origin.distanceTo( intersectPoint ); + + if ( distance < raycaster.near || distance > raycaster.far ) return; + + intersects.push( { + + distance: distance, + distanceToRay: Math.sqrt( rayPointDistanceSq ), + point: intersectPoint.clone(), + index: index, + face: null, + object: object + + } ); + + } + + } + + if ( (geometry && geometry.isBufferGeometry) ) { + + var index = geometry.index; + var attributes = geometry.attributes; + var positions = attributes.position.array; + + if ( index !== null ) { + + var indices = index.array; + + for ( var i = 0, il = indices.length; i < il; i ++ ) { + + var a = indices[ i ]; + + position.fromArray( positions, a * 3 ); + + testPoint( position, a ); + + } + + } else { + + for ( var i = 0, l = positions.length / 3; i < l; i ++ ) { + + position.fromArray( positions, i * 3 ); + + testPoint( position, i ); + + } + + } + + } else { + + var vertices = geometry.vertices; + + for ( var i = 0, l = vertices.length; i < l; i ++ ) { + + testPoint( vertices[ i ], i ); + + } + + } + + }; + + }() ), + + clone: function () { + + return new this.constructor( this.geometry, this.material ).copy( this ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Group() { + + Object3D.call( this ); + + this.type = 'Group'; + + } + + Group.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Group + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.generateMipmaps = false; + + var scope = this; + + function update() { + + requestAnimationFrame( update ); + + if ( video.readyState >= video.HAVE_CURRENT_DATA ) { + + scope.needsUpdate = true; + + } + + } + + update(); + + } + + VideoTexture.prototype = Object.create( Texture.prototype ); + VideoTexture.prototype.constructor = VideoTexture; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); + + this.image = { width: width, height: height }; + this.mipmaps = mipmaps; + + // no flipping for cube textures + // (also flipping doesn't work for compressed textures ) + + this.flipY = false; + + // can't generate mipmaps for compressed textures + // mips must be embedded in DDS files + + this.generateMipmaps = false; + + } + + CompressedTexture.prototype = Object.create( Texture.prototype ); + CompressedTexture.prototype.constructor = CompressedTexture; + + CompressedTexture.prototype.isCompressedTexture = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { + + Texture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.needsUpdate = true; + + } + + CanvasTexture.prototype = Object.create( Texture.prototype ); + CanvasTexture.prototype.constructor = CanvasTexture; + + /** + * @author Matt DesLauriers / @mattdesl + * @author atix / arthursilber.de + */ + + function DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) { + + format = format !== undefined ? format : DepthFormat; + + if ( format !== DepthFormat && format !== DepthStencilFormat ) { + + throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' ) + + } + + Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); + + this.image = { width: width, height: height }; + + this.type = type !== undefined ? type : UnsignedShortType; + + this.magFilter = magFilter !== undefined ? magFilter : NearestFilter; + this.minFilter = minFilter !== undefined ? minFilter : NearestFilter; + + this.flipY = false; + this.generateMipmaps = false; + + } + + DepthTexture.prototype = Object.create( Texture.prototype ); + DepthTexture.prototype.constructor = DepthTexture; + DepthTexture.prototype.isDepthTexture = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function WireframeGeometry( geometry ) { + + BufferGeometry.call( this ); + + var edge = [ 0, 0 ], hash = {}; + + function sortFunction( a, b ) { + + return a - b; + + } + + var keys = [ 'a', 'b', 'c' ]; + + if ( (geometry && geometry.isGeometry) ) { + + var vertices = geometry.vertices; + var faces = geometry.faces; + var numEdges = 0; + + // allocate maximal size + var edges = new Uint32Array( 6 * faces.length ); + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0; j < 3; j ++ ) { + + edge[ 0 ] = face[ keys[ j ] ]; + edge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ]; + edge.sort( sortFunction ); + + var key = edge.toString(); + + if ( hash[ key ] === undefined ) { + + edges[ 2 * numEdges ] = edge[ 0 ]; + edges[ 2 * numEdges + 1 ] = edge[ 1 ]; + hash[ key ] = true; + numEdges ++; + + } + + } + + } + + var coords = new Float32Array( numEdges * 2 * 3 ); + + for ( var i = 0, l = numEdges; i < l; i ++ ) { + + for ( var j = 0; j < 2; j ++ ) { + + var vertex = vertices[ edges [ 2 * i + j ] ]; + + var index = 6 * i + 3 * j; + coords[ index + 0 ] = vertex.x; + coords[ index + 1 ] = vertex.y; + coords[ index + 2 ] = vertex.z; + + } + + } + + this.addAttribute( 'position', new BufferAttribute( coords, 3 ) ); + + } else if ( (geometry && geometry.isBufferGeometry) ) { + + if ( geometry.index !== null ) { + + // Indexed BufferGeometry + + var indices = geometry.index.array; + var vertices = geometry.attributes.position; + var groups = geometry.groups; + var numEdges = 0; + + if ( groups.length === 0 ) { + + geometry.addGroup( 0, indices.length ); + + } + + // allocate maximal size + var edges = new Uint32Array( 2 * indices.length ); + + for ( var o = 0, ol = groups.length; o < ol; ++ o ) { + + var group = groups[ o ]; + + var start = group.start; + var count = group.count; + + for ( var i = start, il = start + count; i < il; i += 3 ) { + + for ( var j = 0; j < 3; j ++ ) { + + edge[ 0 ] = indices[ i + j ]; + edge[ 1 ] = indices[ i + ( j + 1 ) % 3 ]; + edge.sort( sortFunction ); + + var key = edge.toString(); + + if ( hash[ key ] === undefined ) { + + edges[ 2 * numEdges ] = edge[ 0 ]; + edges[ 2 * numEdges + 1 ] = edge[ 1 ]; + hash[ key ] = true; + numEdges ++; + + } + + } + + } + + } + + var coords = new Float32Array( numEdges * 2 * 3 ); + + for ( var i = 0, l = numEdges; i < l; i ++ ) { + + for ( var j = 0; j < 2; j ++ ) { + + var index = 6 * i + 3 * j; + var index2 = edges[ 2 * i + j ]; + + coords[ index + 0 ] = vertices.getX( index2 ); + coords[ index + 1 ] = vertices.getY( index2 ); + coords[ index + 2 ] = vertices.getZ( index2 ); + + } + + } + + this.addAttribute( 'position', new BufferAttribute( coords, 3 ) ); + + } else { + + // non-indexed BufferGeometry + + var vertices = geometry.attributes.position.array; + var numEdges = vertices.length / 3; + var numTris = numEdges / 3; + + var coords = new Float32Array( numEdges * 2 * 3 ); + + for ( var i = 0, l = numTris; i < l; i ++ ) { + + for ( var j = 0; j < 3; j ++ ) { + + var index = 18 * i + 6 * j; + + var index1 = 9 * i + 3 * j; + coords[ index + 0 ] = vertices[ index1 ]; + coords[ index + 1 ] = vertices[ index1 + 1 ]; + coords[ index + 2 ] = vertices[ index1 + 2 ]; + + var index2 = 9 * i + 3 * ( ( j + 1 ) % 3 ); + coords[ index + 3 ] = vertices[ index2 ]; + coords[ index + 4 ] = vertices[ index2 + 1 ]; + coords[ index + 5 ] = vertices[ index2 + 2 ]; + + } + + } + + this.addAttribute( 'position', new BufferAttribute( coords, 3 ) ); + + } + + } + + } + + WireframeGeometry.prototype = Object.create( BufferGeometry.prototype ); + WireframeGeometry.prototype.constructor = WireframeGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + * + * Parametric Surfaces Geometry + * based on the brilliant article by @prideout http://prideout.net/blog/?p=44 + */ + + function ParametricBufferGeometry( func, slices, stacks ) { + + BufferGeometry.call( this ); + + this.type = 'ParametricBufferGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + // generate vertices and uvs + + var vertices = []; + var uvs = []; + + var i, j, p; + var u, v; + + var sliceCount = slices + 1; + + for ( i = 0; i <= stacks; i ++ ) { + + v = i / stacks; + + for ( j = 0; j <= slices; j ++ ) { + + u = j / slices; + + p = func( u, v ); + vertices.push( p.x, p.y, p.z ); + + uvs.push( u, v ); + + } + + } + + // generate indices + + var indices = []; + var a, b, c, d; + + for ( i = 0; i < stacks; i ++ ) { + + for ( j = 0; j < slices; j ++ ) { + + a = i * sliceCount + j; + b = i * sliceCount + j + 1; + c = ( i + 1 ) * sliceCount + j + 1; + d = ( i + 1 ) * sliceCount + j; + + // faces one and two + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + // build geometry + + this.setIndex( ( indices.length > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) ); + this.addAttribute( 'position', Float32Attribute( vertices, 3 ) ); + this.addAttribute( 'uv', Float32Attribute( uvs, 2 ) ); + + // generate normals + + this.computeVertexNormals(); + + } + + ParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + ParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry; + + /** + * @author zz85 / https://github.com/zz85 + * + * Parametric Surfaces Geometry + * based on the brilliant article by @prideout http://prideout.net/blog/?p=44 + */ + + function ParametricGeometry( func, slices, stacks ) { + + Geometry.call( this ); + + this.type = 'ParametricGeometry'; + + this.parameters = { + func: func, + slices: slices, + stacks: stacks + }; + + this.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) ); + this.mergeVertices(); + + } + + ParametricGeometry.prototype = Object.create( Geometry.prototype ); + ParametricGeometry.prototype.constructor = ParametricGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function PolyhedronBufferGeometry( vertices, indices, radius, detail ) { + + BufferGeometry.call( this ); + + this.type = 'PolyhedronBufferGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + radius = radius || 1; + detail = detail || 0; + + // default buffer data + + var vertexBuffer = []; + var uvBuffer = []; + + // the subdivision creates the vertex buffer data + + subdivide( detail ); + + // all vertices should lie on a conceptual sphere with a given radius + + appplyRadius( radius ); + + // finally, create the uv data + + generateUVs(); + + // build non-indexed geometry + + this.addAttribute( 'position', Float32Attribute( vertexBuffer, 3 ) ); + this.addAttribute( 'normal', Float32Attribute( vertexBuffer.slice(), 3 ) ); + this.addAttribute( 'uv', Float32Attribute( uvBuffer, 2 ) ); + this.normalizeNormals(); + + this.boundingSphere = new Sphere( new Vector3(), radius ); + + // helper functions + + function subdivide( detail ) { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + // iterate over all faces and apply a subdivison with the given detail value + + for ( var i = 0; i < indices.length; i += 3 ) { + + // get the vertices of the face + + getVertexByIndex( indices[ i + 0 ], a ); + getVertexByIndex( indices[ i + 1 ], b ); + getVertexByIndex( indices[ i + 2 ], c ); + + // perform subdivision + + subdivideFace( a, b, c, detail ); + + } + + } + + function subdivideFace( a, b, c, detail ) { + + var cols = Math.pow( 2, detail ); + + // we use this multidimensional array as a data structure for creating the subdivision + + var v = []; + + var i, j; + + // construct all of the vertices for this subdivision + + for ( i = 0 ; i <= cols; i ++ ) { + + v[ i ] = []; + + var aj = a.clone().lerp( c, i / cols ); + var bj = b.clone().lerp( c, i / cols ); + + var rows = cols - i; + + for ( j = 0; j <= rows; j ++ ) { + + if ( j === 0 && i === cols ) { + + v[ i ][ j ] = aj; + + } else { + + v[ i ][ j ] = aj.clone().lerp( bj, j / rows ); + + } + + } + + } + + // construct all of the faces + + for ( i = 0; i < cols ; i ++ ) { + + for ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) { + + var k = Math.floor( j / 2 ); + + if ( j % 2 === 0 ) { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + pushVertex( v[ i ][ k ] ); + + } else { + + pushVertex( v[ i ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k + 1 ] ); + pushVertex( v[ i + 1 ][ k ] ); + + } + + } + + } + + } + + function appplyRadius( radius ) { + + var vertex = new Vector3(); + + // iterate over the entire buffer and apply the radius to each vertex + + for ( var i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + vertex.normalize().multiplyScalar( radius ); + + vertexBuffer[ i + 0 ] = vertex.x; + vertexBuffer[ i + 1 ] = vertex.y; + vertexBuffer[ i + 2 ] = vertex.z; + + } + + } + + function generateUVs() { + + var vertex = new Vector3(); + + for ( var i = 0; i < vertexBuffer.length; i += 3 ) { + + vertex.x = vertexBuffer[ i + 0 ]; + vertex.y = vertexBuffer[ i + 1 ]; + vertex.z = vertexBuffer[ i + 2 ]; + + var u = azimuth( vertex ) / 2 / Math.PI + 0.5; + var v = inclination( vertex ) / Math.PI + 0.5; + uvBuffer.push( u, 1 - v ); + + } + + correctUVs(); + + correctSeam(); + + } + + function correctSeam() { + + // handle case when face straddles the seam, see #3269 + + for ( var i = 0; i < uvBuffer.length; i += 6 ) { + + // uv data of a single face + + var x0 = uvBuffer[ i + 0 ]; + var x1 = uvBuffer[ i + 2 ]; + var x2 = uvBuffer[ i + 4 ]; + + var max = Math.max( x0, x1, x2 ); + var min = Math.min( x0, x1, x2 ); + + // 0.9 is somewhat arbitrary + + if ( max > 0.9 && min < 0.1 ) { + + if ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1; + if ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1; + if ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1; + + } + + } + + } + + function pushVertex( vertex ) { + + vertexBuffer.push( vertex.x, vertex.y, vertex.z ); + + } + + function getVertexByIndex( index, vertex ) { + + var stride = index * 3; + + vertex.x = vertices[ stride + 0 ]; + vertex.y = vertices[ stride + 1 ]; + vertex.z = vertices[ stride + 2 ]; + + } + + function correctUVs() { + + var a = new Vector3(); + var b = new Vector3(); + var c = new Vector3(); + + var centroid = new Vector3(); + + var uvA = new Vector2(); + var uvB = new Vector2(); + var uvC = new Vector2(); + + for ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) { + + a.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] ); + b.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] ); + c.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] ); + + uvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] ); + uvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] ); + uvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] ); + + centroid.copy( a ).add( b ).add( c ).divideScalar( 3 ); + + var azi = azimuth( centroid ); + + correctUV( uvA, j + 0, a, azi ); + correctUV( uvB, j + 2, b, azi ); + correctUV( uvC, j + 4, c, azi ); + + } + + } + + function correctUV( uv, stride, vector, azimuth ) { + + if ( ( azimuth < 0 ) && ( uv.x === 1 ) ) { + + uvBuffer[ stride ] = uv.x - 1; + + } + + if ( ( vector.x === 0 ) && ( vector.z === 0 ) ) { + + uvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5; + + } + + } + + // Angle around the Y axis, counter-clockwise when looking from above. + + function azimuth( vector ) { + + return Math.atan2( vector.z, - vector.x ); + + } + + + // Angle above the XZ plane. + + function inclination( vector ) { + + return Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) ); + + } + + } + + PolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + PolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function TetrahedronBufferGeometry( radius, detail ) { + + var vertices = [ + 1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1 + ]; + + var indices = [ + 2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'TetrahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + TetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + TetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + */ + + function TetrahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'TetrahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + TetrahedronGeometry.prototype = Object.create( Geometry.prototype ); + TetrahedronGeometry.prototype.constructor = TetrahedronGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function OctahedronBufferGeometry( radius,detail ) { + + var vertices = [ + 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1 + ]; + + var indices = [ + 0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'OctahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + OctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + OctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + */ + + function OctahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'OctahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + OctahedronGeometry.prototype = Object.create( Geometry.prototype ); + OctahedronGeometry.prototype.constructor = OctahedronGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function IcosahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + + var vertices = [ + - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0, + 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, + t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1 + ]; + + var indices = [ + 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11, + 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8, + 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9, + 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'IcosahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + IcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + IcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry; + + /** + * @author timothypratley / https://github.com/timothypratley + */ + + function IcosahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'IcosahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + IcosahedronGeometry.prototype = Object.create( Geometry.prototype ); + IcosahedronGeometry.prototype.constructor = IcosahedronGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function DodecahedronBufferGeometry( radius, detail ) { + + var t = ( 1 + Math.sqrt( 5 ) ) / 2; + var r = 1 / t; + + var vertices = [ + + // (±1, ±1, ±1) + - 1, - 1, - 1, - 1, - 1, 1, + - 1, 1, - 1, - 1, 1, 1, + 1, - 1, - 1, 1, - 1, 1, + 1, 1, - 1, 1, 1, 1, + + // (0, ±1/φ, ±φ) + 0, - r, - t, 0, - r, t, + 0, r, - t, 0, r, t, + + // (±1/φ, ±φ, 0) + - r, - t, 0, - r, t, 0, + r, - t, 0, r, t, 0, + + // (±φ, 0, ±1/φ) + - t, 0, - r, t, 0, - r, + - t, 0, r, t, 0, r + ]; + + var indices = [ + 3, 11, 7, 3, 7, 15, 3, 15, 13, + 7, 19, 17, 7, 17, 6, 7, 6, 15, + 17, 4, 8, 17, 8, 10, 17, 10, 6, + 8, 0, 16, 8, 16, 2, 8, 2, 10, + 0, 12, 1, 0, 1, 18, 0, 18, 16, + 6, 10, 2, 6, 2, 13, 6, 13, 15, + 2, 16, 18, 2, 18, 3, 2, 3, 13, + 18, 1, 9, 18, 9, 11, 18, 11, 3, + 4, 14, 12, 4, 12, 0, 4, 0, 8, + 11, 9, 5, 11, 5, 19, 11, 19, 7, + 19, 5, 14, 19, 14, 4, 19, 4, 17, + 1, 12, 14, 1, 14, 5, 1, 5, 9 + ]; + + PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail ); + + this.type = 'DodecahedronBufferGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + } + + DodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype ); + DodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry; + + /** + * @author Abe Pazos / https://hamoid.com + */ + + function DodecahedronGeometry( radius, detail ) { + + Geometry.call( this ); + + this.type = 'DodecahedronGeometry'; + + this.parameters = { + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) ); + this.mergeVertices(); + + } + + DodecahedronGeometry.prototype = Object.create( Geometry.prototype ); + DodecahedronGeometry.prototype.constructor = DodecahedronGeometry; + + /** + * @author clockworkgeek / https://github.com/clockworkgeek + * @author timothypratley / https://github.com/timothypratley + * @author WestLangley / http://github.com/WestLangley + */ + + function PolyhedronGeometry( vertices, indices, radius, detail ) { + + Geometry.call( this ); + + this.type = 'PolyhedronGeometry'; + + this.parameters = { + vertices: vertices, + indices: indices, + radius: radius, + detail: detail + }; + + this.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) ); + this.mergeVertices(); + + } + + PolyhedronGeometry.prototype = Object.create( Geometry.prototype ); + PolyhedronGeometry.prototype.constructor = PolyhedronGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + * + * Creates a tube which extrudes along a 3d spline. + * + */ + + function TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) { + + BufferGeometry.call( this ); + + this.type = 'TubeBufferGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + tubularSegments = tubularSegments || 64; + radius = radius || 1; + radialSegments = radialSegments || 8; + closed = closed || false; + + var frames = path.computeFrenetFrames( tubularSegments, closed ); + + // expose internals + + this.tangents = frames.tangents; + this.normals = frames.normals; + this.binormals = frames.binormals; + + // helper variables + + var vertex = new Vector3(); + var normal = new Vector3(); + var uv = new Vector2(); + + var i, j; + + // buffer + + var vertices = []; + var normals = []; + var uvs = []; + var indices = []; + + // create buffer data + + generateBufferData(); + + // build geometry + + this.setIndex( ( indices.length > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) ); + this.addAttribute( 'position', Float32Attribute( vertices, 3 ) ); + this.addAttribute( 'normal', Float32Attribute( normals, 3 ) ); + this.addAttribute( 'uv', Float32Attribute( uvs, 2 ) ); + + // functions + + function generateBufferData() { + + for ( i = 0; i < tubularSegments; i ++ ) { + + generateSegment( i ); + + } + + // if the geometry is not closed, generate the last row of vertices and normals + // at the regular position on the given path + // + // if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ) + + generateSegment( ( closed === false ) ? tubularSegments : 0 ); + + // uvs are generated in a separate function. + // this makes it easy compute correct values for closed geometries + + generateUVs(); + + // finally create faces + + generateIndices(); + + } + + function generateSegment( i ) { + + // we use getPointAt to sample evenly distributed points from the given path + + var P = path.getPointAt( i / tubularSegments ); + + // retrieve corresponding normal and binormal + + var N = frames.normals[ i ]; + var B = frames.binormals[ i ]; + + // generate normals and vertices for the current segment + + for ( j = 0; j <= radialSegments; j ++ ) { + + var v = j / radialSegments * Math.PI * 2; + + var sin = Math.sin( v ); + var cos = - Math.cos( v ); + + // normal + + normal.x = ( cos * N.x + sin * B.x ); + normal.y = ( cos * N.y + sin * B.y ); + normal.z = ( cos * N.z + sin * B.z ); + normal.normalize(); + + normals.push( normal.x, normal.y, normal.z ); + + // vertex + + vertex.x = P.x + radius * normal.x; + vertex.y = P.y + radius * normal.y; + vertex.z = P.z + radius * normal.z; + + vertices.push( vertex.x, vertex.y, vertex.z ); + + } + + } + + function generateIndices() { + + for ( j = 1; j <= tubularSegments; j ++ ) { + + for ( i = 1; i <= radialSegments; i ++ ) { + + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // faces + + indices.push( a, b, d ); + indices.push( b, c, d ); + + } + + } + + } + + function generateUVs() { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + for ( j = 0; j <= radialSegments; j ++ ) { + + uv.x = i / tubularSegments; + uv.y = j / radialSegments; + + uvs.push( uv.x, uv.y ); + + } + + } + + } + + } + + TubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TubeBufferGeometry.prototype.constructor = TubeBufferGeometry; + + /** + * @author oosmoxiecode / https://github.com/oosmoxiecode + * @author WestLangley / https://github.com/WestLangley + * @author zz85 / https://github.com/zz85 + * @author miningold / https://github.com/miningold + * @author jonobr1 / https://github.com/jonobr1 + * + * Creates a tube which extrudes along a 3d spline. + */ + + function TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) { + + Geometry.call( this ); + + this.type = 'TubeGeometry'; + + this.parameters = { + path: path, + tubularSegments: tubularSegments, + radius: radius, + radialSegments: radialSegments, + closed: closed + }; + + if ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' ); + + var bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ); + + // expose internals + + this.tangents = bufferGeometry.tangents; + this.normals = bufferGeometry.normals; + this.binormals = bufferGeometry.binormals; + + // create geometry + + this.fromBufferGeometry( bufferGeometry ); + this.mergeVertices(); + + } + + TubeGeometry.prototype = Object.create( Geometry.prototype ); + TubeGeometry.prototype.constructor = TubeGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + * + * see: http://www.blackpawn.com/texts/pqtorus/ + */ + function TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) { + + BufferGeometry.call( this ); + + this.type = 'TorusKnotBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + radius = radius || 100; + tube = tube || 40; + tubularSegments = Math.floor( tubularSegments ) || 64; + radialSegments = Math.floor( radialSegments ) || 8; + p = p || 2; + q = q || 3; + + // used to calculate buffer length + var vertexCount = ( ( radialSegments + 1 ) * ( tubularSegments + 1 ) ); + var indexCount = radialSegments * tubularSegments * 2 * 3; + + // buffers + var indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 ); + var vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 ); + + // helper variables + var i, j, index = 0, indexOffset = 0; + + var vertex = new Vector3(); + var normal = new Vector3(); + var uv = new Vector2(); + + var P1 = new Vector3(); + var P2 = new Vector3(); + + var B = new Vector3(); + var T = new Vector3(); + var N = new Vector3(); + + // generate vertices, normals and uvs + + for ( i = 0; i <= tubularSegments; ++ i ) { + + // the radian "u" is used to calculate the position on the torus curve of the current tubular segement + + var u = i / tubularSegments * p * Math.PI * 2; + + // now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead. + // these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions + + calculatePositionOnCurve( u, p, q, radius, P1 ); + calculatePositionOnCurve( u + 0.01, p, q, radius, P2 ); + + // calculate orthonormal basis + + T.subVectors( P2, P1 ); + N.addVectors( P2, P1 ); + B.crossVectors( T, N ); + N.crossVectors( B, T ); + + // normalize B, N. T can be ignored, we don't use it + + B.normalize(); + N.normalize(); + + for ( j = 0; j <= radialSegments; ++ j ) { + + // now calculate the vertices. they are nothing more than an extrusion of the torus curve. + // because we extrude a shape in the xy-plane, there is no need to calculate a z-value. + + var v = j / radialSegments * Math.PI * 2; + var cx = - tube * Math.cos( v ); + var cy = tube * Math.sin( v ); + + // now calculate the final vertex position. + // first we orient the extrusion with our basis vectos, then we add it to the current position on the curve + + vertex.x = P1.x + ( cx * N.x + cy * B.x ); + vertex.y = P1.y + ( cx * N.y + cy * B.y ); + vertex.z = P1.z + ( cx * N.z + cy * B.z ); + + // vertex + vertices.setXYZ( index, vertex.x, vertex.y, vertex.z ); + + // normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal) + normal.subVectors( vertex, P1 ).normalize(); + normals.setXYZ( index, normal.x, normal.y, normal.z ); + + // uv + uv.x = i / tubularSegments; + uv.y = j / radialSegments; + uvs.setXY( index, uv.x, uv.y ); + + // increase index + index ++; + + } + + } + + // generate indices + + for ( j = 1; j <= tubularSegments; j ++ ) { + + for ( i = 1; i <= radialSegments; i ++ ) { + + // indices + var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 ); + var b = ( radialSegments + 1 ) * j + ( i - 1 ); + var c = ( radialSegments + 1 ) * j + i; + var d = ( radialSegments + 1 ) * ( j - 1 ) + i; + + // face one + indices.setX( indexOffset, a ); indexOffset++; + indices.setX( indexOffset, b ); indexOffset++; + indices.setX( indexOffset, d ); indexOffset++; + + // face two + indices.setX( indexOffset, b ); indexOffset++; + indices.setX( indexOffset, c ); indexOffset++; + indices.setX( indexOffset, d ); indexOffset++; + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', vertices ); + this.addAttribute( 'normal', normals ); + this.addAttribute( 'uv', uvs ); + + // this function calculates the current position on the torus curve + + function calculatePositionOnCurve( u, p, q, radius, position ) { + + var cu = Math.cos( u ); + var su = Math.sin( u ); + var quOverP = q / p * u; + var cs = Math.cos( quOverP ); + + position.x = radius * ( 2 + cs ) * 0.5 * cu; + position.y = radius * ( 2 + cs ) * su * 0.5; + position.z = radius * Math.sin( quOverP ) * 0.5; + + } + + } + + TorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry; + + /** + * @author oosmoxiecode + */ + + function TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) { + + Geometry.call( this ); + + this.type = 'TorusKnotGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + tubularSegments: tubularSegments, + radialSegments: radialSegments, + p: p, + q: q + }; + + if( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' ); + + this.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) ); + this.mergeVertices(); + + } + + TorusKnotGeometry.prototype = Object.create( Geometry.prototype ); + TorusKnotGeometry.prototype.constructor = TorusKnotGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + BufferGeometry.call( this ); + + this.type = 'TorusBufferGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + radius = radius || 100; + tube = tube || 40; + radialSegments = Math.floor( radialSegments ) || 8; + tubularSegments = Math.floor( tubularSegments ) || 6; + arc = arc || Math.PI * 2; + + // used to calculate buffer length + var vertexCount = ( ( radialSegments + 1 ) * ( tubularSegments + 1 ) ); + var indexCount = radialSegments * tubularSegments * 2 * 3; + + // buffers + var indices = new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ); + var vertices = new Float32Array( vertexCount * 3 ); + var normals = new Float32Array( vertexCount * 3 ); + var uvs = new Float32Array( vertexCount * 2 ); + + // offset variables + var vertexBufferOffset = 0; + var uvBufferOffset = 0; + var indexBufferOffset = 0; + + // helper variables + var center = new Vector3(); + var vertex = new Vector3(); + var normal = new Vector3(); + + var j, i; + + // generate vertices, normals and uvs + + for ( j = 0; j <= radialSegments; j ++ ) { + + for ( i = 0; i <= tubularSegments; i ++ ) { + + var u = i / tubularSegments * arc; + var v = j / radialSegments * Math.PI * 2; + + // vertex + vertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u ); + vertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u ); + vertex.z = tube * Math.sin( v ); + + vertices[ vertexBufferOffset ] = vertex.x; + vertices[ vertexBufferOffset + 1 ] = vertex.y; + vertices[ vertexBufferOffset + 2 ] = vertex.z; + + // this vector is used to calculate the normal + center.x = radius * Math.cos( u ); + center.y = radius * Math.sin( u ); + + // normal + normal.subVectors( vertex, center ).normalize(); + + normals[ vertexBufferOffset ] = normal.x; + normals[ vertexBufferOffset + 1 ] = normal.y; + normals[ vertexBufferOffset + 2 ] = normal.z; + + // uv + uvs[ uvBufferOffset ] = i / tubularSegments; + uvs[ uvBufferOffset + 1 ] = j / radialSegments; + + // update offsets + vertexBufferOffset += 3; + uvBufferOffset += 2; + + } + + } + + // generate indices + + for ( j = 1; j <= radialSegments; j ++ ) { + + for ( i = 1; i <= tubularSegments; i ++ ) { + + // indices + var a = ( tubularSegments + 1 ) * j + i - 1; + var b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1; + var c = ( tubularSegments + 1 ) * ( j - 1 ) + i; + var d = ( tubularSegments + 1 ) * j + i; + + // face one + indices[ indexBufferOffset ] = a; + indices[ indexBufferOffset + 1 ] = b; + indices[ indexBufferOffset + 2 ] = d; + + // face two + indices[ indexBufferOffset + 3 ] = b; + indices[ indexBufferOffset + 4 ] = c; + indices[ indexBufferOffset + 5 ] = d; + + // update offset + indexBufferOffset += 6; + + } + + } + + // build geometry + this.setIndex( new BufferAttribute( indices, 1 ) ); + this.addAttribute( 'position', new BufferAttribute( vertices, 3 ) ); + this.addAttribute( 'normal', new BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) ); + + } + + TorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + TorusBufferGeometry.prototype.constructor = TorusBufferGeometry; + + /** + * @author oosmoxiecode + * @author mrdoob / http://mrdoob.com/ + * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888 + */ + + function TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) { + + Geometry.call( this ); + + this.type = 'TorusGeometry'; + + this.parameters = { + radius: radius, + tube: tube, + radialSegments: radialSegments, + tubularSegments: tubularSegments, + arc: arc + }; + + this.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) ); + + } + + TorusGeometry.prototype = Object.create( Geometry.prototype ); + TorusGeometry.prototype.constructor = TorusGeometry; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + var ShapeUtils = { + + // calculate area of the contour polygon + + area: function ( contour ) { + + var n = contour.length; + var a = 0.0; + + for ( var p = n - 1, q = 0; q < n; p = q ++ ) { + + a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y; + + } + + return a * 0.5; + + }, + + triangulate: ( function () { + + /** + * This code is a quick port of code written in C++ which was submitted to + * flipcode.com by John W. Ratcliff // July 22, 2000 + * See original code and more information here: + * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml + * + * ported to actionscript by Zevan Rosser + * www.actionsnippet.com + * + * ported to javascript by Joshua Koo + * http://www.lab4games.net/zz85/blog + * + */ + + function snip( contour, u, v, w, n, verts ) { + + var p; + var ax, ay, bx, by; + var cx, cy, px, py; + + ax = contour[ verts[ u ] ].x; + ay = contour[ verts[ u ] ].y; + + bx = contour[ verts[ v ] ].x; + by = contour[ verts[ v ] ].y; + + cx = contour[ verts[ w ] ].x; + cy = contour[ verts[ w ] ].y; + + if ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false; + + var aX, aY, bX, bY, cX, cY; + var apx, apy, bpx, bpy, cpx, cpy; + var cCROSSap, bCROSScp, aCROSSbp; + + aX = cx - bx; aY = cy - by; + bX = ax - cx; bY = ay - cy; + cX = bx - ax; cY = by - ay; + + for ( p = 0; p < n; p ++ ) { + + px = contour[ verts[ p ] ].x; + py = contour[ verts[ p ] ].y; + + if ( ( ( px === ax ) && ( py === ay ) ) || + ( ( px === bx ) && ( py === by ) ) || + ( ( px === cx ) && ( py === cy ) ) ) continue; + + apx = px - ax; apy = py - ay; + bpx = px - bx; bpy = py - by; + cpx = px - cx; cpy = py - cy; + + // see if p is inside triangle abc + + aCROSSbp = aX * bpy - aY * bpx; + cCROSSap = cX * apy - cY * apx; + bCROSScp = bX * cpy - bY * cpx; + + if ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false; + + } + + return true; + + } + + // takes in an contour array and returns + + return function triangulate( contour, indices ) { + + var n = contour.length; + + if ( n < 3 ) return null; + + var result = [], + verts = [], + vertIndices = []; + + /* we want a counter-clockwise polygon in verts */ + + var u, v, w; + + if ( ShapeUtils.area( contour ) > 0.0 ) { + + for ( v = 0; v < n; v ++ ) verts[ v ] = v; + + } else { + + for ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v; + + } + + var nv = n; + + /* remove nv - 2 vertices, creating 1 triangle every time */ + + var count = 2 * nv; /* error detection */ + + for ( v = nv - 1; nv > 2; ) { + + /* if we loop, it is probably a non-simple polygon */ + + if ( ( count -- ) <= 0 ) { + + //** Triangulate: ERROR - probable bad polygon! + + //throw ( "Warning, unable to triangulate polygon!" ); + //return null; + // Sometimes warning is fine, especially polygons are triangulated in reverse. + console.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' ); + + if ( indices ) return vertIndices; + return result; + + } + + /* three consecutive vertices in current polygon, */ + + u = v; if ( nv <= u ) u = 0; /* previous */ + v = u + 1; if ( nv <= v ) v = 0; /* new v */ + w = v + 1; if ( nv <= w ) w = 0; /* next */ + + if ( snip( contour, u, v, w, nv, verts ) ) { + + var a, b, c, s, t; + + /* true names of the vertices */ + + a = verts[ u ]; + b = verts[ v ]; + c = verts[ w ]; + + /* output Triangle */ + + result.push( [ contour[ a ], + contour[ b ], + contour[ c ] ] ); + + + vertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] ); + + /* remove v from the remaining polygon */ + + for ( s = v, t = v + 1; t < nv; s ++, t ++ ) { + + verts[ s ] = verts[ t ]; + + } + + nv --; + + /* reset error detection counter */ + + count = 2 * nv; + + } + + } + + if ( indices ) return vertIndices; + return result; + + } + + } )(), + + triangulateShape: function ( contour, holes ) { + + function removeDupEndPts(points) { + + var l = points.length; + + if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) { + + points.pop(); + + } + + } + + removeDupEndPts( contour ); + holes.forEach( removeDupEndPts ); + + function point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) { + + // inOtherPt needs to be collinear to the inSegment + if ( inSegPt1.x !== inSegPt2.x ) { + + if ( inSegPt1.x < inSegPt2.x ) { + + return ( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) ); + + } else { + + return ( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) ); + + } + + } else { + + if ( inSegPt1.y < inSegPt2.y ) { + + return ( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) ); + + } else { + + return ( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) ); + + } + + } + + } + + function intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) { + + var seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y; + var seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y; + + var seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x; + var seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y; + + var limit = seg1dy * seg2dx - seg1dx * seg2dy; + var perpSeg1 = seg1dy * seg1seg2dx - seg1dx * seg1seg2dy; + + if ( Math.abs( limit ) > Number.EPSILON ) { + + // not parallel + + var perpSeg2; + if ( limit > 0 ) { + + if ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) return []; + perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; + if ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) return []; + + } else { + + if ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) return []; + perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; + if ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) return []; + + } + + // i.e. to reduce rounding errors + // intersection at endpoint of segment#1? + if ( perpSeg2 === 0 ) { + + if ( ( inExcludeAdjacentSegs ) && + ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return []; + return [ inSeg1Pt1 ]; + + } + if ( perpSeg2 === limit ) { + + if ( ( inExcludeAdjacentSegs ) && + ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return []; + return [ inSeg1Pt2 ]; + + } + // intersection at endpoint of segment#2? + if ( perpSeg1 === 0 ) return [ inSeg2Pt1 ]; + if ( perpSeg1 === limit ) return [ inSeg2Pt2 ]; + + // return real intersection point + var factorSeg1 = perpSeg2 / limit; + return [ { x: inSeg1Pt1.x + factorSeg1 * seg1dx, + y: inSeg1Pt1.y + factorSeg1 * seg1dy } ]; + + } else { + + // parallel or collinear + if ( ( perpSeg1 !== 0 ) || + ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) return []; + + // they are collinear or degenerate + var seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) ); // segment1 is just a point? + var seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) ); // segment2 is just a point? + // both segments are points + if ( seg1Pt && seg2Pt ) { + + if ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) || + ( inSeg1Pt1.y !== inSeg2Pt1.y ) ) return []; // they are distinct points + return [ inSeg1Pt1 ]; // they are the same point + + } + // segment#1 is a single point + if ( seg1Pt ) { + + if ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) ) return []; // but not in segment#2 + return [ inSeg1Pt1 ]; + + } + // segment#2 is a single point + if ( seg2Pt ) { + + if ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) ) return []; // but not in segment#1 + return [ inSeg2Pt1 ]; + + } + + // they are collinear segments, which might overlap + var seg1min, seg1max, seg1minVal, seg1maxVal; + var seg2min, seg2max, seg2minVal, seg2maxVal; + if ( seg1dx !== 0 ) { + + // the segments are NOT on a vertical line + if ( inSeg1Pt1.x < inSeg1Pt2.x ) { + + seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x; + seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x; + + } else { + + seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x; + seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x; + + } + if ( inSeg2Pt1.x < inSeg2Pt2.x ) { + + seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x; + seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x; + + } else { + + seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x; + seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x; + + } + + } else { + + // the segments are on a vertical line + if ( inSeg1Pt1.y < inSeg1Pt2.y ) { + + seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y; + seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y; + + } else { + + seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y; + seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y; + + } + if ( inSeg2Pt1.y < inSeg2Pt2.y ) { + + seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y; + seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y; + + } else { + + seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y; + seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y; + + } + + } + if ( seg1minVal <= seg2minVal ) { + + if ( seg1maxVal < seg2minVal ) return []; + if ( seg1maxVal === seg2minVal ) { + + if ( inExcludeAdjacentSegs ) return []; + return [ seg2min ]; + + } + if ( seg1maxVal <= seg2maxVal ) return [ seg2min, seg1max ]; + return [ seg2min, seg2max ]; + + } else { + + if ( seg1minVal > seg2maxVal ) return []; + if ( seg1minVal === seg2maxVal ) { + + if ( inExcludeAdjacentSegs ) return []; + return [ seg1min ]; + + } + if ( seg1maxVal <= seg2maxVal ) return [ seg1min, seg1max ]; + return [ seg1min, seg2max ]; + + } + + } + + } + + function isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) { + + // The order of legs is important + + // translation of all points, so that Vertex is at (0,0) + var legFromPtX = inLegFromPt.x - inVertex.x, legFromPtY = inLegFromPt.y - inVertex.y; + var legToPtX = inLegToPt.x - inVertex.x, legToPtY = inLegToPt.y - inVertex.y; + var otherPtX = inOtherPt.x - inVertex.x, otherPtY = inOtherPt.y - inVertex.y; + + // main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg. + var from2toAngle = legFromPtX * legToPtY - legFromPtY * legToPtX; + var from2otherAngle = legFromPtX * otherPtY - legFromPtY * otherPtX; + + if ( Math.abs( from2toAngle ) > Number.EPSILON ) { + + // angle != 180 deg. + + var other2toAngle = otherPtX * legToPtY - otherPtY * legToPtX; + // console.log( "from2to: " + from2toAngle + ", from2other: " + from2otherAngle + ", other2to: " + other2toAngle ); + + if ( from2toAngle > 0 ) { + + // main angle < 180 deg. + return ( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) ); + + } else { + + // main angle > 180 deg. + return ( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) ); + + } + + } else { + + // angle == 180 deg. + // console.log( "from2to: 180 deg., from2other: " + from2otherAngle ); + return ( from2otherAngle > 0 ); + + } + + } + + + function removeHoles( contour, holes ) { + + var shape = contour.concat(); // work on this shape + var hole; + + function isCutLineInsideAngles( inShapeIdx, inHoleIdx ) { + + // Check if hole point lies within angle around shape point + var lastShapeIdx = shape.length - 1; + + var prevShapeIdx = inShapeIdx - 1; + if ( prevShapeIdx < 0 ) prevShapeIdx = lastShapeIdx; + + var nextShapeIdx = inShapeIdx + 1; + if ( nextShapeIdx > lastShapeIdx ) nextShapeIdx = 0; + + var insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] ); + if ( ! insideAngle ) { + + // console.log( "Vertex (Shape): " + inShapeIdx + ", Point: " + hole[inHoleIdx].x + "/" + hole[inHoleIdx].y ); + return false; + + } + + // Check if shape point lies within angle around hole point + var lastHoleIdx = hole.length - 1; + + var prevHoleIdx = inHoleIdx - 1; + if ( prevHoleIdx < 0 ) prevHoleIdx = lastHoleIdx; + + var nextHoleIdx = inHoleIdx + 1; + if ( nextHoleIdx > lastHoleIdx ) nextHoleIdx = 0; + + insideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] ); + if ( ! insideAngle ) { + + // console.log( "Vertex (Hole): " + inHoleIdx + ", Point: " + shape[inShapeIdx].x + "/" + shape[inShapeIdx].y ); + return false; + + } + + return true; + + } + + function intersectsShapeEdge( inShapePt, inHolePt ) { + + // checks for intersections with shape edges + var sIdx, nextIdx, intersection; + for ( sIdx = 0; sIdx < shape.length; sIdx ++ ) { + + nextIdx = sIdx + 1; nextIdx %= shape.length; + intersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true ); + if ( intersection.length > 0 ) return true; + + } + + return false; + + } + + var indepHoles = []; + + function intersectsHoleEdge( inShapePt, inHolePt ) { + + // checks for intersections with hole edges + var ihIdx, chkHole, + hIdx, nextIdx, intersection; + for ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) { + + chkHole = holes[ indepHoles[ ihIdx ]]; + for ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) { + + nextIdx = hIdx + 1; nextIdx %= chkHole.length; + intersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true ); + if ( intersection.length > 0 ) return true; + + } + + } + return false; + + } + + var holeIndex, shapeIndex, + shapePt, holePt, + holeIdx, cutKey, failedCuts = [], + tmpShape1, tmpShape2, + tmpHole1, tmpHole2; + + for ( var h = 0, hl = holes.length; h < hl; h ++ ) { + + indepHoles.push( h ); + + } + + var minShapeIndex = 0; + var counter = indepHoles.length * 2; + while ( indepHoles.length > 0 ) { + + counter --; + if ( counter < 0 ) { + + console.log( "Infinite Loop! Holes left:" + indepHoles.length + ", Probably Hole outside Shape!" ); + break; + + } + + // search for shape-vertex and hole-vertex, + // which can be connected without intersections + for ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) { + + shapePt = shape[ shapeIndex ]; + holeIndex = - 1; + + // search for hole which can be reached without intersections + for ( var h = 0; h < indepHoles.length; h ++ ) { + + holeIdx = indepHoles[ h ]; + + // prevent multiple checks + cutKey = shapePt.x + ":" + shapePt.y + ":" + holeIdx; + if ( failedCuts[ cutKey ] !== undefined ) continue; + + hole = holes[ holeIdx ]; + for ( var h2 = 0; h2 < hole.length; h2 ++ ) { + + holePt = hole[ h2 ]; + if ( ! isCutLineInsideAngles( shapeIndex, h2 ) ) continue; + if ( intersectsShapeEdge( shapePt, holePt ) ) continue; + if ( intersectsHoleEdge( shapePt, holePt ) ) continue; + + holeIndex = h2; + indepHoles.splice( h, 1 ); + + tmpShape1 = shape.slice( 0, shapeIndex + 1 ); + tmpShape2 = shape.slice( shapeIndex ); + tmpHole1 = hole.slice( holeIndex ); + tmpHole2 = hole.slice( 0, holeIndex + 1 ); + + shape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 ); + + minShapeIndex = shapeIndex; + + // Debug only, to show the selected cuts + // glob_CutLines.push( [ shapePt, holePt ] ); + + break; + + } + if ( holeIndex >= 0 ) break; // hole-vertex found + + failedCuts[ cutKey ] = true; // remember failure + + } + if ( holeIndex >= 0 ) break; // hole-vertex found + + } + + } + + return shape; /* shape with no holes */ + + } + + + var i, il, f, face, + key, index, + allPointsMap = {}; + + // To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first. + + var allpoints = contour.concat(); + + for ( var h = 0, hl = holes.length; h < hl; h ++ ) { + + Array.prototype.push.apply( allpoints, holes[ h ] ); + + } + + //console.log( "allpoints",allpoints, allpoints.length ); + + // prepare all points map + + for ( i = 0, il = allpoints.length; i < il; i ++ ) { + + key = allpoints[ i ].x + ":" + allpoints[ i ].y; + + if ( allPointsMap[ key ] !== undefined ) { + + console.warn( "THREE.ShapeUtils: Duplicate point", key, i ); + + } + + allPointsMap[ key ] = i; + + } + + // remove holes by cutting paths to holes and adding them to the shape + var shapeWithoutHoles = removeHoles( contour, holes ); + + var triangles = ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape + //console.log( "triangles",triangles, triangles.length ); + + // check all face vertices against all points map + + for ( i = 0, il = triangles.length; i < il; i ++ ) { + + face = triangles[ i ]; + + for ( f = 0; f < 3; f ++ ) { + + key = face[ f ].x + ":" + face[ f ].y; + + index = allPointsMap[ key ]; + + if ( index !== undefined ) { + + face[ f ] = index; + + } + + } + + } + + return triangles.concat(); + + }, + + isClockWise: function ( pts ) { + + return ShapeUtils.area( pts ) < 0; + + }, + + // Bezier Curves formulas obtained from + // http://en.wikipedia.org/wiki/B%C3%A9zier_curve + + // Quad Bezier Functions + + b2: ( function () { + + function b2p0( t, p ) { + + var k = 1 - t; + return k * k * p; + + } + + function b2p1( t, p ) { + + return 2 * ( 1 - t ) * t * p; + + } + + function b2p2( t, p ) { + + return t * t * p; + + } + + return function b2( t, p0, p1, p2 ) { + + return b2p0( t, p0 ) + b2p1( t, p1 ) + b2p2( t, p2 ); + + }; + + } )(), + + // Cubic Bezier Functions + + b3: ( function () { + + function b3p0( t, p ) { + + var k = 1 - t; + return k * k * k * p; + + } + + function b3p1( t, p ) { + + var k = 1 - t; + return 3 * k * k * t * p; + + } + + function b3p2( t, p ) { + + var k = 1 - t; + return 3 * k * t * t * p; + + } + + function b3p3( t, p ) { + + return t * t * t * p; + + } + + return function b3( t, p0, p1, p2, p3 ) { + + return b3p0( t, p0 ) + b3p1( t, p1 ) + b3p2( t, p2 ) + b3p3( t, p3 ); + + }; + + } )() + + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + * Creates extruded geometry from a path shape. + * + * parameters = { + * + * curveSegments: , // number of points on the curves + * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too + * amount: , // Depth to extrude the shape + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into the original shape bevel goes + * bevelSize: , // how far from shape outline is bevel + * bevelSegments: , // number of bevel layers + * + * extrudePath: // 3d spline path to extrude shape along. (creates Frames if .frames aren't defined) + * frames: // containing arrays of tangents, normals, binormals + * + * uvGenerator: // object that provides UV generator functions + * + * } + **/ + + function ExtrudeGeometry( shapes, options ) { + + if ( typeof( shapes ) === "undefined" ) { + + shapes = []; + return; + + } + + Geometry.call( this ); + + this.type = 'ExtrudeGeometry'; + + shapes = Array.isArray( shapes ) ? shapes : [ shapes ]; + + this.addShapeList( shapes, options ); + + this.computeFaceNormals(); + + // can't really use automatic vertex normals + // as then front and back sides get smoothed too + // should do separate smoothing just for sides + + //this.computeVertexNormals(); + + //console.log( "took", ( Date.now() - startTime ) ); + + } + + ExtrudeGeometry.prototype = Object.create( Geometry.prototype ); + ExtrudeGeometry.prototype.constructor = ExtrudeGeometry; + + ExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) { + + var sl = shapes.length; + + for ( var s = 0; s < sl; s ++ ) { + + var shape = shapes[ s ]; + this.addShape( shape, options ); + + } + + }; + + ExtrudeGeometry.prototype.addShape = function ( shape, options ) { + + var amount = options.amount !== undefined ? options.amount : 100; + + var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10 + var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8 + var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3; + + var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false + + var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; + + var steps = options.steps !== undefined ? options.steps : 1; + + var extrudePath = options.extrudePath; + var extrudePts, extrudeByPath = false; + + // Use default WorldUVGenerator if no UV generators are specified. + var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator; + + var splineTube, binormal, normal, position2; + if ( extrudePath ) { + + extrudePts = extrudePath.getSpacedPoints( steps ); + + extrudeByPath = true; + bevelEnabled = false; // bevels not supported for path extrusion + + // SETUP TNB variables + + // TODO1 - have a .isClosed in spline? + + splineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false ); + + // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length); + + binormal = new Vector3(); + normal = new Vector3(); + position2 = new Vector3(); + + } + + // Safeguards if bevels are not enabled + + if ( ! bevelEnabled ) { + + bevelSegments = 0; + bevelThickness = 0; + bevelSize = 0; + + } + + // Variables initialization + + var ahole, h, hl; // looping of holes + var scope = this; + + var shapesOffset = this.vertices.length; + + var shapePoints = shape.extractPoints( curveSegments ); + + var vertices = shapePoints.shape; + var holes = shapePoints.holes; + + var reverse = ! ShapeUtils.isClockWise( vertices ); + + if ( reverse ) { + + vertices = vertices.reverse(); + + // Maybe we should also check if holes are in the opposite direction, just to be safe ... + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + if ( ShapeUtils.isClockWise( ahole ) ) { + + holes[ h ] = ahole.reverse(); + + } + + } + + reverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)! + + } + + + var faces = ShapeUtils.triangulateShape( vertices, holes ); + + /* Vertices */ + + var contour = vertices; // vertices has all points but contour has only points of circumference + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + vertices = vertices.concat( ahole ); + + } + + + function scalePt2( pt, vec, size ) { + + if ( ! vec ) console.error( "THREE.ExtrudeGeometry: vec does not exist" ); + + return vec.clone().multiplyScalar( size ).add( pt ); + + } + + var b, bs, t, z, + vert, vlen = vertices.length, + face, flen = faces.length; + + + // Find directions for point movement + + + function getBevelVec( inPt, inPrev, inNext ) { + + // computes for inPt the corresponding point inPt' on a new contour + // shifted by 1 unit (length of normalized vector) to the left + // if we walk along contour clockwise, this new contour is outside the old one + // + // inPt' is the intersection of the two lines parallel to the two + // adjacent edges of inPt at a distance of 1 unit on the left side. + + var v_trans_x, v_trans_y, shrink_by = 1; // resulting translation vector for inPt + + // good reading for geometry algorithms (here: line-line intersection) + // http://geomalgorithms.com/a05-_intersect-1.html + + var v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y; + var v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y; + + var v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y ); + + // check for collinear edges + var collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + if ( Math.abs( collinear0 ) > Number.EPSILON ) { + + // not collinear + + // length of vectors for normalizing + + var v_prev_len = Math.sqrt( v_prev_lensq ); + var v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y ); + + // shift adjacent points by unit vectors to the left + + var ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len ); + var ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len ); + + var ptNextShift_x = ( inNext.x - v_next_y / v_next_len ); + var ptNextShift_y = ( inNext.y + v_next_x / v_next_len ); + + // scaling factor for v_prev to intersection point + + var sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y - + ( ptNextShift_y - ptPrevShift_y ) * v_next_x ) / + ( v_prev_x * v_next_y - v_prev_y * v_next_x ); + + // vector from inPt to intersection point + + v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x ); + v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y ); + + // Don't normalize!, otherwise sharp corners become ugly + // but prevent crazy spikes + var v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y ); + if ( v_trans_lensq <= 2 ) { + + return new Vector2( v_trans_x, v_trans_y ); + + } else { + + shrink_by = Math.sqrt( v_trans_lensq / 2 ); + + } + + } else { + + // handle special case of collinear edges + + var direction_eq = false; // assumes: opposite + if ( v_prev_x > Number.EPSILON ) { + + if ( v_next_x > Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( v_prev_x < - Number.EPSILON ) { + + if ( v_next_x < - Number.EPSILON ) { + + direction_eq = true; + + } + + } else { + + if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) { + + direction_eq = true; + + } + + } + + } + + if ( direction_eq ) { + + // console.log("Warning: lines are a straight sequence"); + v_trans_x = - v_prev_y; + v_trans_y = v_prev_x; + shrink_by = Math.sqrt( v_prev_lensq ); + + } else { + + // console.log("Warning: lines are a straight spike"); + v_trans_x = v_prev_x; + v_trans_y = v_prev_y; + shrink_by = Math.sqrt( v_prev_lensq / 2 ); + + } + + } + + return new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by ); + + } + + + var contourMovements = []; + + for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + // console.log('i,j,k', i, j , k) + + contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] ); + + } + + var holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat(); + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + + oneHoleMovements = []; + + for ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { + + if ( j === il ) j = 0; + if ( k === il ) k = 0; + + // (j)---(i)---(k) + oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] ); + + } + + holesMovements.push( oneHoleMovements ); + verticesMovements = verticesMovements.concat( oneHoleMovements ); + + } + + + // Loop bevelSegments, 1 for the front, 1 for the back + + for ( b = 0; b < bevelSegments; b ++ ) { + + //for ( b = bevelSegments; b > 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + v( vert.x, vert.y, - z ); + + } + + } + + } + + bs = bevelSize; + + // Back facing vertices + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, 0 ); + + } else { + + // v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x ); + + normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + // Add stepped vertices... + // Including front facing vertices + + var s; + + for ( s = 1; s <= steps; s ++ ) { + + for ( i = 0; i < vlen; i ++ ) { + + vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, amount / steps * s ); + + } else { + + // v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x ); + + normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x ); + binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y ); + + position2.copy( extrudePts[ s ] ).add( normal ).add( binormal ); + + v( position2.x, position2.y, position2.z ); + + } + + } + + } + + + // Add bevel segments planes + + //for ( b = 1; b <= bevelSegments; b ++ ) { + for ( b = bevelSegments - 1; b >= 0; b -- ) { + + t = b / bevelSegments; + z = bevelThickness * Math.cos ( t * Math.PI / 2 ); + bs = bevelSize * Math.sin( t * Math.PI / 2 ); + + // contract shape + + for ( i = 0, il = contour.length; i < il; i ++ ) { + + vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); + v( vert.x, vert.y, amount + z ); + + } + + // expand holes + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + oneHoleMovements = holesMovements[ h ]; + + for ( i = 0, il = ahole.length; i < il; i ++ ) { + + vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); + + if ( ! extrudeByPath ) { + + v( vert.x, vert.y, amount + z ); + + } else { + + v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z ); + + } + + } + + } + + } + + /* Faces */ + + // Top and bottom faces + + buildLidFaces(); + + // Sides faces + + buildSideFaces(); + + + ///// Internal functions + + function buildLidFaces() { + + if ( bevelEnabled ) { + + var layer = 0; // steps + 1 + var offset = vlen * layer; + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset ); + + } + + layer = steps + bevelSegments * 2; + offset = vlen * layer; + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset ); + + } + + } else { + + // Bottom faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 2 ], face[ 1 ], face[ 0 ] ); + + } + + // Top faces + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps ); + + } + + } + + } + + // Create faces for the z-sides of the shape + + function buildSideFaces() { + + var layeroffset = 0; + sidewalls( contour, layeroffset ); + layeroffset += contour.length; + + for ( h = 0, hl = holes.length; h < hl; h ++ ) { + + ahole = holes[ h ]; + sidewalls( ahole, layeroffset ); + + //, true + layeroffset += ahole.length; + + } + + } + + function sidewalls( contour, layeroffset ) { + + var j, k; + i = contour.length; + + while ( -- i >= 0 ) { + + j = i; + k = i - 1; + if ( k < 0 ) k = contour.length - 1; + + //console.log('b', i,j, i-1, k,vertices.length); + + var s = 0, sl = steps + bevelSegments * 2; + + for ( s = 0; s < sl; s ++ ) { + + var slen1 = vlen * s; + var slen2 = vlen * ( s + 1 ); + + var a = layeroffset + j + slen1, + b = layeroffset + k + slen1, + c = layeroffset + k + slen2, + d = layeroffset + j + slen2; + + f4( a, b, c, d, contour, s, sl, j, k ); + + } + + } + + } + + + function v( x, y, z ) { + + scope.vertices.push( new Vector3( x, y, z ) ); + + } + + function f3( a, b, c ) { + + a += shapesOffset; + b += shapesOffset; + c += shapesOffset; + + scope.faces.push( new Face3( a, b, c, null, null, 0 ) ); + + var uvs = uvgen.generateTopUV( scope, a, b, c ); + + scope.faceVertexUvs[ 0 ].push( uvs ); + + } + + function f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) { + + a += shapesOffset; + b += shapesOffset; + c += shapesOffset; + d += shapesOffset; + + scope.faces.push( new Face3( a, b, d, null, null, 1 ) ); + scope.faces.push( new Face3( b, c, d, null, null, 1 ) ); + + var uvs = uvgen.generateSideWallUV( scope, a, b, c, d ); + + scope.faceVertexUvs[ 0 ].push( [ uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ] ); + scope.faceVertexUvs[ 0 ].push( [ uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ] ); + + } + + }; + + ExtrudeGeometry.WorldUVGenerator = { + + generateTopUV: function ( geometry, indexA, indexB, indexC ) { + + var vertices = geometry.vertices; + + var a = vertices[ indexA ]; + var b = vertices[ indexB ]; + var c = vertices[ indexC ]; + + return [ + new Vector2( a.x, a.y ), + new Vector2( b.x, b.y ), + new Vector2( c.x, c.y ) + ]; + + }, + + generateSideWallUV: function ( geometry, indexA, indexB, indexC, indexD ) { + + var vertices = geometry.vertices; + + var a = vertices[ indexA ]; + var b = vertices[ indexB ]; + var c = vertices[ indexC ]; + var d = vertices[ indexD ]; + + if ( Math.abs( a.y - b.y ) < 0.01 ) { + + return [ + new Vector2( a.x, 1 - a.z ), + new Vector2( b.x, 1 - b.z ), + new Vector2( c.x, 1 - c.z ), + new Vector2( d.x, 1 - d.z ) + ]; + + } else { + + return [ + new Vector2( a.y, 1 - a.z ), + new Vector2( b.y, 1 - b.z ), + new Vector2( c.y, 1 - c.z ), + new Vector2( d.y, 1 - d.z ) + ]; + + } + + } + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author alteredq / http://alteredqualia.com/ + * + * Text = 3D Text + * + * parameters = { + * font: , // font + * + * size: , // size of the text + * height: , // thickness to extrude text + * curveSegments: , // number of points on the curves + * + * bevelEnabled: , // turn on bevel + * bevelThickness: , // how deep into text bevel goes + * bevelSize: // how far from text outline is bevel + * } + */ + + function TextGeometry( text, parameters ) { + + parameters = parameters || {}; + + var font = parameters.font; + + if ( (font && font.isFont) === false ) { + + console.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' ); + return new Geometry(); + + } + + var shapes = font.generateShapes( text, parameters.size, parameters.curveSegments ); + + // translate parameters to ExtrudeGeometry API + + parameters.amount = parameters.height !== undefined ? parameters.height : 50; + + // defaults + + if ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10; + if ( parameters.bevelSize === undefined ) parameters.bevelSize = 8; + if ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false; + + ExtrudeGeometry.call( this, shapes, parameters ); + + this.type = 'TextGeometry'; + + } + + TextGeometry.prototype = Object.create( ExtrudeGeometry.prototype ); + TextGeometry.prototype.constructor = TextGeometry; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + * based on THREE.SphereGeometry + */ + + function SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'SphereBufferGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 50; + + widthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 ); + heightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 ); + + phiStart = phiStart !== undefined ? phiStart : 0; + phiLength = phiLength !== undefined ? phiLength : Math.PI * 2; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI; + + var thetaEnd = thetaStart + thetaLength; + + var vertexCount = ( ( widthSegments + 1 ) * ( heightSegments + 1 ) ); + + var positions = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 ); + + var index = 0, vertices = [], normal = new Vector3(); + + for ( var y = 0; y <= heightSegments; y ++ ) { + + var verticesRow = []; + + var v = y / heightSegments; + + for ( var x = 0; x <= widthSegments; x ++ ) { + + var u = x / widthSegments; + + var px = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + var py = radius * Math.cos( thetaStart + v * thetaLength ); + var pz = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); + + normal.set( px, py, pz ).normalize(); + + positions.setXYZ( index, px, py, pz ); + normals.setXYZ( index, normal.x, normal.y, normal.z ); + uvs.setXY( index, u, 1 - v ); + + verticesRow.push( index ); + + index ++; + + } + + vertices.push( verticesRow ); + + } + + var indices = []; + + for ( var y = 0; y < heightSegments; y ++ ) { + + for ( var x = 0; x < widthSegments; x ++ ) { + + var v1 = vertices[ y ][ x + 1 ]; + var v2 = vertices[ y ][ x ]; + var v3 = vertices[ y + 1 ][ x ]; + var v4 = vertices[ y + 1 ][ x + 1 ]; + + if ( y !== 0 || thetaStart > 0 ) indices.push( v1, v2, v4 ); + if ( y !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( v2, v3, v4 ); + + } + + } + + this.setIndex( new ( positions.count > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) ); + this.addAttribute( 'position', positions ); + this.addAttribute( 'normal', normals ); + this.addAttribute( 'uv', uvs ); + + this.boundingSphere = new Sphere( new Vector3(), radius ); + + } + + SphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + SphereBufferGeometry.prototype.constructor = SphereBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'SphereGeometry'; + + this.parameters = { + radius: radius, + widthSegments: widthSegments, + heightSegments: heightSegments, + phiStart: phiStart, + phiLength: phiLength, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) ); + + } + + SphereGeometry.prototype = Object.create( Geometry.prototype ); + SphereGeometry.prototype.constructor = SphereGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'RingBufferGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + innerRadius = innerRadius || 20; + outerRadius = outerRadius || 50; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + thetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8; + phiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1; + + // these are used to calculate buffer length + var vertexCount = ( thetaSegments + 1 ) * ( phiSegments + 1 ); + var indexCount = thetaSegments * phiSegments * 2 * 3; + + // buffers + var indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 ); + var vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 ); + + // some helper variables + var index = 0, indexOffset = 0, segment; + var radius = innerRadius; + var radiusStep = ( ( outerRadius - innerRadius ) / phiSegments ); + var vertex = new Vector3(); + var uv = new Vector2(); + var j, i; + + // generate vertices, normals and uvs + + // values are generate from the inside of the ring to the outside + + for ( j = 0; j <= phiSegments; j ++ ) { + + for ( i = 0; i <= thetaSegments; i ++ ) { + + segment = thetaStart + i / thetaSegments * thetaLength; + + // vertex + vertex.x = radius * Math.cos( segment ); + vertex.y = radius * Math.sin( segment ); + vertices.setXYZ( index, vertex.x, vertex.y, vertex.z ); + + // normal + normals.setXYZ( index, 0, 0, 1 ); + + // uv + uv.x = ( vertex.x / outerRadius + 1 ) / 2; + uv.y = ( vertex.y / outerRadius + 1 ) / 2; + uvs.setXY( index, uv.x, uv.y ); + + // increase index + index++; + + } + + // increase the radius for next row of vertices + radius += radiusStep; + + } + + // generate indices + + for ( j = 0; j < phiSegments; j ++ ) { + + var thetaSegmentLevel = j * ( thetaSegments + 1 ); + + for ( i = 0; i < thetaSegments; i ++ ) { + + segment = i + thetaSegmentLevel; + + // indices + var a = segment; + var b = segment + thetaSegments + 1; + var c = segment + thetaSegments + 2; + var d = segment + 1; + + // face one + indices.setX( indexOffset, a ); indexOffset++; + indices.setX( indexOffset, b ); indexOffset++; + indices.setX( indexOffset, c ); indexOffset++; + + // face two + indices.setX( indexOffset, a ); indexOffset++; + indices.setX( indexOffset, c ); indexOffset++; + indices.setX( indexOffset, d ); indexOffset++; + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', vertices ); + this.addAttribute( 'normal', normals ); + this.addAttribute( 'uv', uvs ); + + } + + RingBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + RingBufferGeometry.prototype.constructor = RingBufferGeometry; + + /** + * @author Kaleb Murphy + */ + + function RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'RingGeometry'; + + this.parameters = { + innerRadius: innerRadius, + outerRadius: outerRadius, + thetaSegments: thetaSegments, + phiSegments: phiSegments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) ); + + } + + RingGeometry.prototype = Object.create( Geometry.prototype ); + RingGeometry.prototype.constructor = RingGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as + */ + + function PlaneGeometry( width, height, widthSegments, heightSegments ) { + + Geometry.call( this ); + + this.type = 'PlaneGeometry'; + + this.parameters = { + width: width, + height: height, + widthSegments: widthSegments, + heightSegments: heightSegments + }; + + this.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) ); + + } + + PlaneGeometry.prototype = Object.create( Geometry.prototype ); + PlaneGeometry.prototype.constructor = PlaneGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + // points - to create a closed torus, one must use a set of points + // like so: [ a, b, c, d, a ], see first is the same as last. + // segments - the number of circumference segments to create + // phiStart - the starting radian + // phiLength - the radian (0 to 2PI) range of the lathed section + // 2PI is a closed lathe, less than 2PI is a portion. + + function LatheBufferGeometry( points, segments, phiStart, phiLength ) { + + BufferGeometry.call( this ); + + this.type = 'LatheBufferGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + segments = Math.floor( segments ) || 12; + phiStart = phiStart || 0; + phiLength = phiLength || Math.PI * 2; + + // clamp phiLength so it's in range of [ 0, 2PI ] + phiLength = _Math.clamp( phiLength, 0, Math.PI * 2 ); + + // these are used to calculate buffer length + var vertexCount = ( segments + 1 ) * points.length; + var indexCount = segments * points.length * 2 * 3; + + // buffers + var indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 ); + var vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 ); + + // helper variables + var index = 0, indexOffset = 0, base; + var inverseSegments = 1.0 / segments; + var vertex = new Vector3(); + var uv = new Vector2(); + var i, j; + + // generate vertices and uvs + + for ( i = 0; i <= segments; i ++ ) { + + var phi = phiStart + i * inverseSegments * phiLength; + + var sin = Math.sin( phi ); + var cos = Math.cos( phi ); + + for ( j = 0; j <= ( points.length - 1 ); j ++ ) { + + // vertex + vertex.x = points[ j ].x * sin; + vertex.y = points[ j ].y; + vertex.z = points[ j ].x * cos; + vertices.setXYZ( index, vertex.x, vertex.y, vertex.z ); + + // uv + uv.x = i / segments; + uv.y = j / ( points.length - 1 ); + uvs.setXY( index, uv.x, uv.y ); + + // increase index + index ++; + + } + + } + + // generate indices + + for ( i = 0; i < segments; i ++ ) { + + for ( j = 0; j < ( points.length - 1 ); j ++ ) { + + base = j + i * points.length; + + // indices + var a = base; + var b = base + points.length; + var c = base + points.length + 1; + var d = base + 1; + + // face one + indices.setX( indexOffset, a ); indexOffset++; + indices.setX( indexOffset, b ); indexOffset++; + indices.setX( indexOffset, d ); indexOffset++; + + // face two + indices.setX( indexOffset, b ); indexOffset++; + indices.setX( indexOffset, c ); indexOffset++; + indices.setX( indexOffset, d ); indexOffset++; + + } + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', vertices ); + this.addAttribute( 'uv', uvs ); + + // generate normals + + this.computeVertexNormals(); + + // if the geometry is closed, we need to average the normals along the seam. + // because the corresponding vertices are identical (but still have different UVs). + + if( phiLength === Math.PI * 2 ) { + + var normals = this.attributes.normal.array; + var n1 = new Vector3(); + var n2 = new Vector3(); + var n = new Vector3(); + + // this is the buffer offset for the last line of vertices + base = segments * points.length * 3; + + for( i = 0, j = 0; i < points.length; i ++, j += 3 ) { + + // select the normal of the vertex in the first line + n1.x = normals[ j + 0 ]; + n1.y = normals[ j + 1 ]; + n1.z = normals[ j + 2 ]; + + // select the normal of the vertex in the last line + n2.x = normals[ base + j + 0 ]; + n2.y = normals[ base + j + 1 ]; + n2.z = normals[ base + j + 2 ]; + + // average normals + n.addVectors( n1, n2 ).normalize(); + + // assign the new values to both normals + normals[ j + 0 ] = normals[ base + j + 0 ] = n.x; + normals[ j + 1 ] = normals[ base + j + 1 ] = n.y; + normals[ j + 2 ] = normals[ base + j + 2 ] = n.z; + + } // next row + + } + + } + + LatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + LatheBufferGeometry.prototype.constructor = LatheBufferGeometry; + + /** + * @author astrodud / http://astrodud.isgreat.org/ + * @author zz85 / https://github.com/zz85 + * @author bhouston / http://clara.io + */ + + // points - to create a closed torus, one must use a set of points + // like so: [ a, b, c, d, a ], see first is the same as last. + // segments - the number of circumference segments to create + // phiStart - the starting radian + // phiLength - the radian (0 to 2PI) range of the lathed section + // 2PI is a closed lathe, less than 2PI is a portion. + + function LatheGeometry( points, segments, phiStart, phiLength ) { + + Geometry.call( this ); + + this.type = 'LatheGeometry'; + + this.parameters = { + points: points, + segments: segments, + phiStart: phiStart, + phiLength: phiLength + }; + + this.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) ); + this.mergeVertices(); + + } + + LatheGeometry.prototype = Object.create( Geometry.prototype ); + LatheGeometry.prototype.constructor = LatheGeometry; + + /** + * @author jonobr1 / http://jonobr1.com + * + * Creates a one-sided polygonal geometry from a path shape. Similar to + * ExtrudeGeometry. + * + * parameters = { + * + * curveSegments: , // number of points on the curves. NOT USED AT THE MOMENT. + * + * material: // material index for front and back faces + * uvGenerator: // object that provides UV generator functions + * + * } + **/ + + function ShapeGeometry( shapes, options ) { + + Geometry.call( this ); + + this.type = 'ShapeGeometry'; + + if ( Array.isArray( shapes ) === false ) shapes = [ shapes ]; + + this.addShapeList( shapes, options ); + + this.computeFaceNormals(); + + } + + ShapeGeometry.prototype = Object.create( Geometry.prototype ); + ShapeGeometry.prototype.constructor = ShapeGeometry; + + /** + * Add an array of shapes to THREE.ShapeGeometry. + */ + ShapeGeometry.prototype.addShapeList = function ( shapes, options ) { + + for ( var i = 0, l = shapes.length; i < l; i ++ ) { + + this.addShape( shapes[ i ], options ); + + } + + return this; + + }; + + /** + * Adds a shape to THREE.ShapeGeometry, based on THREE.ExtrudeGeometry. + */ + ShapeGeometry.prototype.addShape = function ( shape, options ) { + + if ( options === undefined ) options = {}; + var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; + + var material = options.material; + var uvgen = options.UVGenerator === undefined ? ExtrudeGeometry.WorldUVGenerator : options.UVGenerator; + + // + + var i, l, hole; + + var shapesOffset = this.vertices.length; + var shapePoints = shape.extractPoints( curveSegments ); + + var vertices = shapePoints.shape; + var holes = shapePoints.holes; + + var reverse = ! ShapeUtils.isClockWise( vertices ); + + if ( reverse ) { + + vertices = vertices.reverse(); + + // Maybe we should also check if holes are in the opposite direction, just to be safe... + + for ( i = 0, l = holes.length; i < l; i ++ ) { + + hole = holes[ i ]; + + if ( ShapeUtils.isClockWise( hole ) ) { + + holes[ i ] = hole.reverse(); + + } + + } + + reverse = false; + + } + + var faces = ShapeUtils.triangulateShape( vertices, holes ); + + // Vertices + + for ( i = 0, l = holes.length; i < l; i ++ ) { + + hole = holes[ i ]; + vertices = vertices.concat( hole ); + + } + + // + + var vert, vlen = vertices.length; + var face, flen = faces.length; + + for ( i = 0; i < vlen; i ++ ) { + + vert = vertices[ i ]; + + this.vertices.push( new Vector3( vert.x, vert.y, 0 ) ); + + } + + for ( i = 0; i < flen; i ++ ) { + + face = faces[ i ]; + + var a = face[ 0 ] + shapesOffset; + var b = face[ 1 ] + shapesOffset; + var c = face[ 2 ] + shapesOffset; + + this.faces.push( new Face3( a, b, c, null, null, material ) ); + this.faceVertexUvs[ 0 ].push( uvgen.generateTopUV( this, a, b, c ) ); + + } + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + */ + + function EdgesGeometry( geometry, thresholdAngle ) { + + BufferGeometry.call( this ); + + thresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1; + + var thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle ); + + var edge = [ 0, 0 ], hash = {}; + + function sortFunction( a, b ) { + + return a - b; + + } + + var keys = [ 'a', 'b', 'c' ]; + + var geometry2; + + if ( (geometry && geometry.isBufferGeometry) ) { + + geometry2 = new Geometry(); + geometry2.fromBufferGeometry( geometry ); + + } else { + + geometry2 = geometry.clone(); + + } + + geometry2.mergeVertices(); + geometry2.computeFaceNormals(); + + var vertices = geometry2.vertices; + var faces = geometry2.faces; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0; j < 3; j ++ ) { + + edge[ 0 ] = face[ keys[ j ] ]; + edge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ]; + edge.sort( sortFunction ); + + var key = edge.toString(); + + if ( hash[ key ] === undefined ) { + + hash[ key ] = { vert1: edge[ 0 ], vert2: edge[ 1 ], face1: i, face2: undefined }; + + } else { + + hash[ key ].face2 = i; + + } + + } + + } + + var coords = []; + + for ( var key in hash ) { + + var h = hash[ key ]; + + if ( h.face2 === undefined || faces[ h.face1 ].normal.dot( faces[ h.face2 ].normal ) <= thresholdDot ) { + + var vertex = vertices[ h.vert1 ]; + coords.push( vertex.x ); + coords.push( vertex.y ); + coords.push( vertex.z ); + + vertex = vertices[ h.vert2 ]; + coords.push( vertex.x ); + coords.push( vertex.y ); + coords.push( vertex.z ); + + } + + } + + this.addAttribute( 'position', new BufferAttribute( new Float32Array( coords ), 3 ) ); + + } + + EdgesGeometry.prototype = Object.create( BufferGeometry.prototype ); + EdgesGeometry.prototype.constructor = EdgesGeometry; + + /** + * @author Mugen87 / https://github.com/Mugen87 + */ + + function CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CylinderBufferGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + var scope = this; + + radiusTop = radiusTop !== undefined ? radiusTop : 20; + radiusBottom = radiusBottom !== undefined ? radiusBottom : 20; + height = height !== undefined ? height : 100; + + radialSegments = Math.floor( radialSegments ) || 8; + heightSegments = Math.floor( heightSegments ) || 1; + + openEnded = openEnded !== undefined ? openEnded : false; + thetaStart = thetaStart !== undefined ? thetaStart : 0.0; + thetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI; + + // used to calculate buffer length + + var nbCap = 0; + + if ( openEnded === false ) { + + if ( radiusTop > 0 ) nbCap ++; + if ( radiusBottom > 0 ) nbCap ++; + + } + + var vertexCount = calculateVertexCount(); + var indexCount = calculateIndexCount(); + + // buffers + + var indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ), 1 ); + var vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 ); + var uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 ); + + // helper variables + + var index = 0, + indexOffset = 0, + indexArray = [], + halfHeight = height / 2; + + // group variables + var groupStart = 0; + + // generate geometry + + generateTorso(); + + if ( openEnded === false ) { + + if ( radiusTop > 0 ) generateCap( true ); + if ( radiusBottom > 0 ) generateCap( false ); + + } + + // build geometry + + this.setIndex( indices ); + this.addAttribute( 'position', vertices ); + this.addAttribute( 'normal', normals ); + this.addAttribute( 'uv', uvs ); + + // helper functions + + function calculateVertexCount() { + + var count = ( radialSegments + 1 ) * ( heightSegments + 1 ); + + if ( openEnded === false ) { + + count += ( ( radialSegments + 1 ) * nbCap ) + ( radialSegments * nbCap ); + + } + + return count; + + } + + function calculateIndexCount() { + + var count = radialSegments * heightSegments * 2 * 3; + + if ( openEnded === false ) { + + count += radialSegments * nbCap * 3; + + } + + return count; + + } + + function generateTorso() { + + var x, y; + var normal = new Vector3(); + var vertex = new Vector3(); + + var groupCount = 0; + + // this will be used to calculate the normal + var slope = ( radiusBottom - radiusTop ) / height; + + // generate vertices, normals and uvs + + for ( y = 0; y <= heightSegments; y ++ ) { + + var indexRow = []; + + var v = y / heightSegments; + + // calculate the radius of the current row + var radius = v * ( radiusBottom - radiusTop ) + radiusTop; + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + + var theta = u * thetaLength + thetaStart; + + var sinTheta = Math.sin( theta ); + var cosTheta = Math.cos( theta ); + + // vertex + vertex.x = radius * sinTheta; + vertex.y = - v * height + halfHeight; + vertex.z = radius * cosTheta; + vertices.setXYZ( index, vertex.x, vertex.y, vertex.z ); + + // normal + normal.set( sinTheta, slope, cosTheta ).normalize(); + normals.setXYZ( index, normal.x, normal.y, normal.z ); + + // uv + uvs.setXY( index, u, 1 - v ); + + // save index of vertex in respective row + indexRow.push( index ); + + // increase index + index ++; + + } + + // now save vertices of the row in our index array + indexArray.push( indexRow ); + + } + + // generate indices + + for ( x = 0; x < radialSegments; x ++ ) { + + for ( y = 0; y < heightSegments; y ++ ) { + + // we use the index array to access the correct indices + var i1 = indexArray[ y ][ x ]; + var i2 = indexArray[ y + 1 ][ x ]; + var i3 = indexArray[ y + 1 ][ x + 1 ]; + var i4 = indexArray[ y ][ x + 1 ]; + + // face one + indices.setX( indexOffset, i1 ); indexOffset ++; + indices.setX( indexOffset, i2 ); indexOffset ++; + indices.setX( indexOffset, i4 ); indexOffset ++; + + // face two + indices.setX( indexOffset, i2 ); indexOffset ++; + indices.setX( indexOffset, i3 ); indexOffset ++; + indices.setX( indexOffset, i4 ); indexOffset ++; + + // update counters + groupCount += 6; + + } + + } + + // add a group to the geometry. this will ensure multi material support + scope.addGroup( groupStart, groupCount, 0 ); + + // calculate new start value for groups + groupStart += groupCount; + + } + + function generateCap( top ) { + + var x, centerIndexStart, centerIndexEnd; + + var uv = new Vector2(); + var vertex = new Vector3(); + + var groupCount = 0; + + var radius = ( top === true ) ? radiusTop : radiusBottom; + var sign = ( top === true ) ? 1 : - 1; + + // save the index of the first center vertex + centerIndexStart = index; + + // first we generate the center vertex data of the cap. + // because the geometry needs one set of uvs per face, + // we must generate a center vertex per face/segment + + for ( x = 1; x <= radialSegments; x ++ ) { + + // vertex + vertices.setXYZ( index, 0, halfHeight * sign, 0 ); + + // normal + normals.setXYZ( index, 0, sign, 0 ); + + // uv + uv.x = 0.5; + uv.y = 0.5; + + uvs.setXY( index, uv.x, uv.y ); + + // increase index + index ++; + + } + + // save the index of the last center vertex + centerIndexEnd = index; + + // now we generate the surrounding vertices, normals and uvs + + for ( x = 0; x <= radialSegments; x ++ ) { + + var u = x / radialSegments; + var theta = u * thetaLength + thetaStart; + + var cosTheta = Math.cos( theta ); + var sinTheta = Math.sin( theta ); + + // vertex + vertex.x = radius * sinTheta; + vertex.y = halfHeight * sign; + vertex.z = radius * cosTheta; + vertices.setXYZ( index, vertex.x, vertex.y, vertex.z ); + + // normal + normals.setXYZ( index, 0, sign, 0 ); + + // uv + uv.x = ( cosTheta * 0.5 ) + 0.5; + uv.y = ( sinTheta * 0.5 * sign ) + 0.5; + uvs.setXY( index, uv.x, uv.y ); + + // increase index + index ++; + + } + + // generate indices + + for ( x = 0; x < radialSegments; x ++ ) { + + var c = centerIndexStart + x; + var i = centerIndexEnd + x; + + if ( top === true ) { + + // face top + indices.setX( indexOffset, i ); indexOffset ++; + indices.setX( indexOffset, i + 1 ); indexOffset ++; + indices.setX( indexOffset, c ); indexOffset ++; + + } else { + + // face bottom + indices.setX( indexOffset, i + 1 ); indexOffset ++; + indices.setX( indexOffset, i ); indexOffset ++; + indices.setX( indexOffset, c ); indexOffset ++; + + } + + // update counters + groupCount += 3; + + } + + // add a group to the geometry. this will ensure multi material support + scope.addGroup( groupStart, groupCount, top === true ? 1 : 2 ); + + // calculate new start value for groups + groupStart += groupCount; + + } + + } + + CylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + CylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CylinderGeometry'; + + this.parameters = { + radiusTop: radiusTop, + radiusBottom: radiusBottom, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) ); + this.mergeVertices(); + + } + + CylinderGeometry.prototype = Object.create( Geometry.prototype ); + CylinderGeometry.prototype.constructor = CylinderGeometry; + + /** + * @author abelnation / http://github.com/abelnation + */ + + function ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + ConeGeometry.prototype = Object.create( CylinderGeometry.prototype ); + ConeGeometry.prototype.constructor = ConeGeometry; + + /** + * @author: abelnation / http://github.com/abelnation + */ + + function ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { + + CylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ); + + this.type = 'ConeBufferGeometry'; + + this.parameters = { + radius: radius, + height: height, + radialSegments: radialSegments, + heightSegments: heightSegments, + openEnded: openEnded, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + } + + ConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype ); + ConeBufferGeometry.prototype.constructor = ConeBufferGeometry; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) { + + BufferGeometry.call( this ); + + this.type = 'CircleBufferGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + radius = radius || 50; + segments = segments !== undefined ? Math.max( 3, segments ) : 8; + + thetaStart = thetaStart !== undefined ? thetaStart : 0; + thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2; + + var vertices = segments + 2; + + var positions = new Float32Array( vertices * 3 ); + var normals = new Float32Array( vertices * 3 ); + var uvs = new Float32Array( vertices * 2 ); + + // center data is already zero, but need to set a few extras + normals[ 2 ] = 1.0; + uvs[ 0 ] = 0.5; + uvs[ 1 ] = 0.5; + + for ( var s = 0, i = 3, ii = 2 ; s <= segments; s ++, i += 3, ii += 2 ) { + + var segment = thetaStart + s / segments * thetaLength; + + positions[ i ] = radius * Math.cos( segment ); + positions[ i + 1 ] = radius * Math.sin( segment ); + + normals[ i + 2 ] = 1; // normal z + + uvs[ ii ] = ( positions[ i ] / radius + 1 ) / 2; + uvs[ ii + 1 ] = ( positions[ i + 1 ] / radius + 1 ) / 2; + + } + + var indices = []; + + for ( var i = 1; i <= segments; i ++ ) { + + indices.push( i, i + 1, 0 ); + + } + + this.setIndex( new BufferAttribute( new Uint16Array( indices ), 1 ) ); + this.addAttribute( 'position', new BufferAttribute( positions, 3 ) ); + this.addAttribute( 'normal', new BufferAttribute( normals, 3 ) ); + this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) ); + + this.boundingSphere = new Sphere( new Vector3(), radius ); + + } + + CircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + CircleBufferGeometry.prototype.constructor = CircleBufferGeometry; + + /** + * @author hughes + */ + + function CircleGeometry( radius, segments, thetaStart, thetaLength ) { + + Geometry.call( this ); + + this.type = 'CircleGeometry'; + + this.parameters = { + radius: radius, + segments: segments, + thetaStart: thetaStart, + thetaLength: thetaLength + }; + + this.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) ); + + } + + CircleGeometry.prototype = Object.create( Geometry.prototype ); + CircleGeometry.prototype.constructor = CircleGeometry; + + /** + * @author mrdoob / http://mrdoob.com/ + * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as + */ + + function BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) { + + Geometry.call( this ); + + this.type = 'BoxGeometry'; + + this.parameters = { + width: width, + height: height, + depth: depth, + widthSegments: widthSegments, + heightSegments: heightSegments, + depthSegments: depthSegments + }; + + this.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) ); + this.mergeVertices(); + + } + + BoxGeometry.prototype = Object.create( Geometry.prototype ); + BoxGeometry.prototype.constructor = BoxGeometry; + + + + var Geometries = Object.freeze({ + WireframeGeometry: WireframeGeometry, + ParametricGeometry: ParametricGeometry, + ParametricBufferGeometry: ParametricBufferGeometry, + TetrahedronGeometry: TetrahedronGeometry, + TetrahedronBufferGeometry: TetrahedronBufferGeometry, + OctahedronGeometry: OctahedronGeometry, + OctahedronBufferGeometry: OctahedronBufferGeometry, + IcosahedronGeometry: IcosahedronGeometry, + IcosahedronBufferGeometry: IcosahedronBufferGeometry, + DodecahedronGeometry: DodecahedronGeometry, + DodecahedronBufferGeometry: DodecahedronBufferGeometry, + PolyhedronGeometry: PolyhedronGeometry, + PolyhedronBufferGeometry: PolyhedronBufferGeometry, + TubeGeometry: TubeGeometry, + TubeBufferGeometry: TubeBufferGeometry, + TorusKnotGeometry: TorusKnotGeometry, + TorusKnotBufferGeometry: TorusKnotBufferGeometry, + TorusGeometry: TorusGeometry, + TorusBufferGeometry: TorusBufferGeometry, + TextGeometry: TextGeometry, + SphereBufferGeometry: SphereBufferGeometry, + SphereGeometry: SphereGeometry, + RingGeometry: RingGeometry, + RingBufferGeometry: RingBufferGeometry, + PlaneBufferGeometry: PlaneBufferGeometry, + PlaneGeometry: PlaneGeometry, + LatheGeometry: LatheGeometry, + LatheBufferGeometry: LatheBufferGeometry, + ShapeGeometry: ShapeGeometry, + ExtrudeGeometry: ExtrudeGeometry, + EdgesGeometry: EdgesGeometry, + ConeGeometry: ConeGeometry, + ConeBufferGeometry: ConeBufferGeometry, + CylinderGeometry: CylinderGeometry, + CylinderBufferGeometry: CylinderBufferGeometry, + CircleBufferGeometry: CircleBufferGeometry, + CircleGeometry: CircleGeometry, + BoxBufferGeometry: BoxBufferGeometry, + BoxGeometry: BoxGeometry + }); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ShadowMaterial() { + + ShaderMaterial.call( this, { + uniforms: UniformsUtils.merge( [ + UniformsLib[ "lights" ], + { + opacity: { value: 1.0 } + } + ] ), + vertexShader: ShaderChunk[ 'shadow_vert' ], + fragmentShader: ShaderChunk[ 'shadow_frag' ] + } ); + + this.lights = true; + this.transparent = true; + + Object.defineProperties( this, { + opacity: { + enumerable: true, + get: function () { + return this.uniforms.opacity.value; + }, + set: function ( value ) { + this.uniforms.opacity.value = value; + } + } + } ); + + } + + ShadowMaterial.prototype = Object.create( ShaderMaterial.prototype ); + ShadowMaterial.prototype.constructor = ShadowMaterial; + + ShadowMaterial.prototype.isShadowMaterial = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function RawShaderMaterial( parameters ) { + + ShaderMaterial.call( this, parameters ); + + this.type = 'RawShaderMaterial'; + + } + + RawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype ); + RawShaderMaterial.prototype.constructor = RawShaderMaterial; + + RawShaderMaterial.prototype.isRawShaderMaterial = true; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function MultiMaterial( materials ) { + + this.uuid = _Math.generateUUID(); + + this.type = 'MultiMaterial'; + + this.materials = materials instanceof Array ? materials : []; + + this.visible = true; + + } + + MultiMaterial.prototype = { + + constructor: MultiMaterial, + + isMultiMaterial: true, + + toJSON: function ( meta ) { + + var output = { + metadata: { + version: 4.2, + type: 'material', + generator: 'MaterialExporter' + }, + uuid: this.uuid, + type: this.type, + materials: [] + }; + + var materials = this.materials; + + for ( var i = 0, l = materials.length; i < l; i ++ ) { + + var material = materials[ i ].toJSON( meta ); + delete material.metadata; + + output.materials.push( material ); + + } + + output.visible = this.visible; + + return output; + + }, + + clone: function () { + + var material = new this.constructor(); + + for ( var i = 0; i < this.materials.length; i ++ ) { + + material.materials.push( this.materials[ i ].clone() ); + + } + + material.visible = this.visible; + + return material; + + } + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * color: , + * roughness: , + * metalness: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * roughnessMap: new THREE.Texture( ), + * + * metalnessMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), + * envMapIntensity: + * + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshStandardMaterial( parameters ) { + + Material.call( this ); + + this.defines = { 'STANDARD': '' }; + + this.type = 'MeshStandardMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.roughness = 0.5; + this.metalness = 0.5; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.roughnessMap = null; + + this.metalnessMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.envMapIntensity = 1.0; + + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshStandardMaterial.prototype = Object.create( Material.prototype ); + MeshStandardMaterial.prototype.constructor = MeshStandardMaterial; + + MeshStandardMaterial.prototype.isMeshStandardMaterial = true; + + MeshStandardMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.defines = { 'STANDARD': '' }; + + this.color.copy( source.color ); + this.roughness = source.roughness; + this.metalness = source.metalness; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.roughnessMap = source.roughnessMap; + + this.metalnessMap = source.metalnessMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.envMapIntensity = source.envMapIntensity; + + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author WestLangley / http://github.com/WestLangley + * + * parameters = { + * reflectivity: + * } + */ + + function MeshPhysicalMaterial( parameters ) { + + MeshStandardMaterial.call( this ); + + this.defines = { 'PHYSICAL': '' }; + + this.type = 'MeshPhysicalMaterial'; + + this.reflectivity = 0.5; // maps to F0 = 0.04 + + this.clearCoat = 0.0; + this.clearCoatRoughness = 0.0; + + this.setValues( parameters ); + + } + + MeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype ); + MeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial; + + MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true; + + MeshPhysicalMaterial.prototype.copy = function ( source ) { + + MeshStandardMaterial.prototype.copy.call( this, source ); + + this.defines = { 'PHYSICAL': '' }; + + this.reflectivity = source.reflectivity; + + this.clearCoat = source.clearCoat; + this.clearCoatRoughness = source.clearCoatRoughness; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * specular: , + * shininess: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * bumpMap: new THREE.Texture( ), + * bumpScale: , + * + * normalMap: new THREE.Texture( ), + * normalScale: , + * + * displacementMap: new THREE.Texture( ), + * displacementScale: , + * displacementBias: , + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshPhongMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshPhongMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + this.specular = new Color( 0x111111 ); + this.shininess = 30; + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.bumpMap = null; + this.bumpScale = 1; + + this.normalMap = null; + this.normalScale = new Vector2( 1, 1 ); + + this.displacementMap = null; + this.displacementScale = 1; + this.displacementBias = 0; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshPhongMaterial.prototype = Object.create( Material.prototype ); + MeshPhongMaterial.prototype.constructor = MeshPhongMaterial; + + MeshPhongMaterial.prototype.isMeshPhongMaterial = true; + + MeshPhongMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.specular.copy( source.specular ); + this.shininess = source.shininess; + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.bumpMap = source.bumpMap; + this.bumpScale = source.bumpScale; + + this.normalMap = source.normalMap; + this.normalScale.copy( source.normalScale ); + + this.displacementMap = source.displacementMap; + this.displacementScale = source.displacementScale; + this.displacementBias = source.displacementBias; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * + * parameters = { + * opacity: , + * + * wireframe: , + * wireframeLinewidth: + * } + */ + + function MeshNormalMaterial( parameters ) { + + Material.call( this, parameters ); + + this.type = 'MeshNormalMaterial'; + + this.wireframe = false; + this.wireframeLinewidth = 1; + + this.fog = false; + this.lights = false; + this.morphTargets = false; + + this.setValues( parameters ); + + } + + MeshNormalMaterial.prototype = Object.create( Material.prototype ); + MeshNormalMaterial.prototype.constructor = MeshNormalMaterial; + + MeshNormalMaterial.prototype.isMeshNormalMaterial = true; + + MeshNormalMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * map: new THREE.Texture( ), + * + * lightMap: new THREE.Texture( ), + * lightMapIntensity: + * + * aoMap: new THREE.Texture( ), + * aoMapIntensity: + * + * emissive: , + * emissiveIntensity: + * emissiveMap: new THREE.Texture( ), + * + * specularMap: new THREE.Texture( ), + * + * alphaMap: new THREE.Texture( ), + * + * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), + * combine: THREE.Multiply, + * reflectivity: , + * refractionRatio: , + * + * wireframe: , + * wireframeLinewidth: , + * + * skinning: , + * morphTargets: , + * morphNormals: + * } + */ + + function MeshLambertMaterial( parameters ) { + + Material.call( this ); + + this.type = 'MeshLambertMaterial'; + + this.color = new Color( 0xffffff ); // diffuse + + this.map = null; + + this.lightMap = null; + this.lightMapIntensity = 1.0; + + this.aoMap = null; + this.aoMapIntensity = 1.0; + + this.emissive = new Color( 0x000000 ); + this.emissiveIntensity = 1.0; + this.emissiveMap = null; + + this.specularMap = null; + + this.alphaMap = null; + + this.envMap = null; + this.combine = MultiplyOperation; + this.reflectivity = 1; + this.refractionRatio = 0.98; + + this.wireframe = false; + this.wireframeLinewidth = 1; + this.wireframeLinecap = 'round'; + this.wireframeLinejoin = 'round'; + + this.skinning = false; + this.morphTargets = false; + this.morphNormals = false; + + this.setValues( parameters ); + + } + + MeshLambertMaterial.prototype = Object.create( Material.prototype ); + MeshLambertMaterial.prototype.constructor = MeshLambertMaterial; + + MeshLambertMaterial.prototype.isMeshLambertMaterial = true; + + MeshLambertMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.map = source.map; + + this.lightMap = source.lightMap; + this.lightMapIntensity = source.lightMapIntensity; + + this.aoMap = source.aoMap; + this.aoMapIntensity = source.aoMapIntensity; + + this.emissive.copy( source.emissive ); + this.emissiveMap = source.emissiveMap; + this.emissiveIntensity = source.emissiveIntensity; + + this.specularMap = source.specularMap; + + this.alphaMap = source.alphaMap; + + this.envMap = source.envMap; + this.combine = source.combine; + this.reflectivity = source.reflectivity; + this.refractionRatio = source.refractionRatio; + + this.wireframe = source.wireframe; + this.wireframeLinewidth = source.wireframeLinewidth; + this.wireframeLinecap = source.wireframeLinecap; + this.wireframeLinejoin = source.wireframeLinejoin; + + this.skinning = source.skinning; + this.morphTargets = source.morphTargets; + this.morphNormals = source.morphNormals; + + return this; + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * + * parameters = { + * color: , + * opacity: , + * + * linewidth: , + * + * scale: , + * dashSize: , + * gapSize: + * } + */ + + function LineDashedMaterial( parameters ) { + + Material.call( this ); + + this.type = 'LineDashedMaterial'; + + this.color = new Color( 0xffffff ); + + this.linewidth = 1; + + this.scale = 1; + this.dashSize = 3; + this.gapSize = 1; + + this.lights = false; + + this.setValues( parameters ); + + } + + LineDashedMaterial.prototype = Object.create( Material.prototype ); + LineDashedMaterial.prototype.constructor = LineDashedMaterial; + + LineDashedMaterial.prototype.isLineDashedMaterial = true; + + LineDashedMaterial.prototype.copy = function ( source ) { + + Material.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + + this.linewidth = source.linewidth; + + this.scale = source.scale; + this.dashSize = source.dashSize; + this.gapSize = source.gapSize; + + return this; + + }; + + + + var Materials = Object.freeze({ + ShadowMaterial: ShadowMaterial, + SpriteMaterial: SpriteMaterial, + RawShaderMaterial: RawShaderMaterial, + ShaderMaterial: ShaderMaterial, + PointsMaterial: PointsMaterial, + MultiMaterial: MultiMaterial, + MeshPhysicalMaterial: MeshPhysicalMaterial, + MeshStandardMaterial: MeshStandardMaterial, + MeshPhongMaterial: MeshPhongMaterial, + MeshNormalMaterial: MeshNormalMaterial, + MeshLambertMaterial: MeshLambertMaterial, + MeshDepthMaterial: MeshDepthMaterial, + MeshBasicMaterial: MeshBasicMaterial, + LineDashedMaterial: LineDashedMaterial, + LineBasicMaterial: LineBasicMaterial, + Material: Material + }); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + var Cache = { + + enabled: false, + + files: {}, + + add: function ( key, file ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Adding key:', key ); + + this.files[ key ] = file; + + }, + + get: function ( key ) { + + if ( this.enabled === false ) return; + + // console.log( 'THREE.Cache', 'Checking key:', key ); + + return this.files[ key ]; + + }, + + remove: function ( key ) { + + delete this.files[ key ]; + + }, + + clear: function () { + + this.files = {}; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LoadingManager( onLoad, onProgress, onError ) { + + var scope = this; + + var isLoading = false, itemsLoaded = 0, itemsTotal = 0; + + this.onStart = undefined; + this.onLoad = onLoad; + this.onProgress = onProgress; + this.onError = onError; + + this.itemStart = function ( url ) { + + itemsTotal ++; + + if ( isLoading === false ) { + + if ( scope.onStart !== undefined ) { + + scope.onStart( url, itemsLoaded, itemsTotal ); + + } + + } + + isLoading = true; + + }; + + this.itemEnd = function ( url ) { + + itemsLoaded ++; + + if ( scope.onProgress !== undefined ) { + + scope.onProgress( url, itemsLoaded, itemsTotal ); + + } + + if ( itemsLoaded === itemsTotal ) { + + isLoading = false; + + if ( scope.onLoad !== undefined ) { + + scope.onLoad(); + + } + + } + + }; + + this.itemError = function ( url ) { + + if ( scope.onError !== undefined ) { + + scope.onError( url ); + + } + + }; + + } + + var DefaultLoadingManager = new LoadingManager(); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function XHRLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( XHRLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( url === undefined ) url = ''; + + if ( this.path !== undefined ) url = this.path + url; + + var scope = this; + + var cached = Cache.get( url ); + + if ( cached !== undefined ) { + + scope.manager.itemStart( url ); + + setTimeout( function () { + + if ( onLoad ) onLoad( cached ); + + scope.manager.itemEnd( url ); + + }, 0 ); + + return cached; + + } + + // Check for data: URI + var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/; + var dataUriRegexResult = url.match( dataUriRegex ); + + // Safari can not handle Data URIs through XMLHttpRequest so process manually + if ( dataUriRegexResult ) { + + var mimeType = dataUriRegexResult[1]; + var isBase64 = !!dataUriRegexResult[2]; + var data = dataUriRegexResult[3]; + + data = window.decodeURIComponent(data); + + if( isBase64 ) { + data = window.atob(data); + } + + try { + + var response; + var responseType = ( this.responseType || '' ).toLowerCase(); + + switch ( responseType ) { + + case 'arraybuffer': + case 'blob': + + response = new ArrayBuffer( data.length ); + var view = new Uint8Array( response ); + for ( var i = 0; i < data.length; i ++ ) { + + view[ i ] = data.charCodeAt( i ); + + } + + if ( responseType === 'blob' ) { + + response = new Blob( [ response ], { "type" : mimeType } ); + + } + + break; + + case 'document': + + var parser = new DOMParser(); + response = parser.parseFromString( data, mimeType ); + + break; + + case 'json': + + response = JSON.parse( data ); + + break; + + default: // 'text' or other + + response = data; + + break; + + } + + // Wait for next browser tick + window.setTimeout( function() { + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + }, 0); + + } catch ( error ) { + + // Wait for next browser tick + window.setTimeout( function() { + + if ( onError ) onError( error ); + + scope.manager.itemError( url ); + + }, 0); + + } + + } else { + + var request = new XMLHttpRequest(); + request.open( 'GET', url, true ); + + request.addEventListener( 'load', function ( event ) { + + var response = event.target.response; + + Cache.add( url, response ); + + if ( this.status === 200 ) { + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + } else if ( this.status === 0 ) { + + // Some browsers return HTTP Status 0 when using non-http protocol + // e.g. 'file://' or 'data://'. Handle as success. + + console.warn( 'THREE.XHRLoader: HTTP Status 0 received.' ); + + if ( onLoad ) onLoad( response ); + + scope.manager.itemEnd( url ); + + } else { + + if ( onError ) onError( event ); + + scope.manager.itemError( url ); + + } + + }, false ); + + if ( onProgress !== undefined ) { + + request.addEventListener( 'progress', function ( event ) { + + onProgress( event ); + + }, false ); + + } + + request.addEventListener( 'error', function ( event ) { + + if ( onError ) onError( event ); + + scope.manager.itemError( url ); + + }, false ); + + if ( this.responseType !== undefined ) request.responseType = this.responseType; + if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials; + + if ( request.overrideMimeType ) request.overrideMimeType( 'text/plain' ); + + request.send( null ); + + } + + scope.manager.itemStart( url ); + + return request; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + }, + + setResponseType: function ( value ) { + + this.responseType = value; + return this; + + }, + + setWithCredentials: function ( value ) { + + this.withCredentials = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * + * Abstract Base class to block based textures loader (dds, pvr, ...) + */ + + function CompressedTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + + } + + Object.assign( CompressedTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var images = []; + + var texture = new CompressedTexture(); + texture.image = images; + + var loader = new XHRLoader( this.manager ); + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + + function loadTexture( i ) { + + loader.load( url[ i ], function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + images[ i ] = { + width: texDatas.width, + height: texDatas.height, + format: texDatas.format, + mipmaps: texDatas.mipmaps + }; + + loaded += 1; + + if ( loaded === 6 ) { + + if ( texDatas.mipmapCount === 1 ) + texture.minFilter = LinearFilter; + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, onProgress, onError ); + + } + + if ( Array.isArray( url ) ) { + + var loaded = 0; + + for ( var i = 0, il = url.length; i < il; ++ i ) { + + loadTexture( i ); + + } + + } else { + + // compressed cubemap texture stored in a single DDS file + + loader.load( url, function ( buffer ) { + + var texDatas = scope._parser( buffer, true ); + + if ( texDatas.isCubemap ) { + + var faces = texDatas.mipmaps.length / texDatas.mipmapCount; + + for ( var f = 0; f < faces; f ++ ) { + + images[ f ] = { mipmaps : [] }; + + for ( var i = 0; i < texDatas.mipmapCount; i ++ ) { + + images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] ); + images[ f ].format = texDatas.format; + images[ f ].width = texDatas.width; + images[ f ].height = texDatas.height; + + } + + } + + } else { + + texture.image.width = texDatas.width; + texture.image.height = texDatas.height; + texture.mipmaps = texDatas.mipmaps; + + } + + if ( texDatas.mipmapCount === 1 ) { + + texture.minFilter = LinearFilter; + + } + + texture.format = texDatas.format; + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + }, onProgress, onError ); + + } + + return texture; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author Nikos M. / https://github.com/foo123/ + * + * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...) + */ + + var DataTextureLoader = BinaryTextureLoader; + function BinaryTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + // override in sub classes + this._parser = null; + + } + + Object.assign( BinaryTextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texture = new DataTexture(); + + var loader = new XHRLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + + loader.load( url, function ( buffer ) { + + var texData = scope._parser( buffer ); + + if ( ! texData ) return; + + if ( undefined !== texData.image ) { + + texture.image = texData.image; + + } else if ( undefined !== texData.data ) { + + texture.image.width = texData.width; + texture.image.height = texData.height; + texture.image.data = texData.data; + + } + + texture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping; + texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping; + + texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter; + texture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter; + + texture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1; + + if ( undefined !== texData.format ) { + + texture.format = texData.format; + + } + if ( undefined !== texData.type ) { + + texture.type = texData.type; + + } + + if ( undefined !== texData.mipmaps ) { + + texture.mipmaps = texData.mipmaps; + + } + + if ( 1 === texData.mipmapCount ) { + + texture.minFilter = LinearFilter; + + } + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture, texData ); + + }, onProgress, onError ); + + + return texture; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ImageLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( ImageLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' ); + image.onload = function () { + + image.onload = null; + + URL.revokeObjectURL( image.src ); + + if ( onLoad ) onLoad( image ); + + scope.manager.itemEnd( url ); + + }; + image.onerror = onError; + + if ( url.indexOf( 'data:' ) === 0 ) { + + image.src = url; + + } else { + + var loader = new XHRLoader(); + loader.setPath( this.path ); + loader.setResponseType( 'blob' ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( blob ) { + + image.src = URL.createObjectURL( blob ); + + }, onProgress, onError ); + + } + + scope.manager.itemStart( url ); + + return image; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setWithCredentials: function ( value ) { + + this.withCredentials = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function CubeTextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( CubeTextureLoader.prototype, { + + load: function ( urls, onLoad, onProgress, onError ) { + + var texture = new CubeTexture(); + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setPath( this.path ); + + var loaded = 0; + + function loadTexture( i ) { + + loader.load( urls[ i ], function ( image ) { + + texture.images[ i ] = image; + + loaded ++; + + if ( loaded === 6 ) { + + texture.needsUpdate = true; + + if ( onLoad ) onLoad( texture ); + + } + + }, undefined, onError ); + + } + + for ( var i = 0; i < urls.length; ++ i ) { + + loadTexture( i ); + + } + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function TextureLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( TextureLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var texture = new Texture(); + + var loader = new ImageLoader( this.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.setWithCredentials( this.withCredentials ); + loader.setPath( this.path ); + loader.load( url, function ( image ) { + + // JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB. + var isJPEG = url.search( /\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\:image\/jpeg/ ) === 0; + + texture.format = isJPEG ? RGBFormat : RGBAFormat; + texture.image = image; + texture.needsUpdate = true; + + if ( onLoad !== undefined ) { + + onLoad( texture ); + + } + + }, onProgress, onError ); + + return texture; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + return this; + + }, + + setWithCredentials: function ( value ) { + + this.withCredentials = value; + return this; + + }, + + setPath: function ( value ) { + + this.path = value; + return this; + + } + + + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Light( color, intensity ) { + + Object3D.call( this ); + + this.type = 'Light'; + + this.color = new Color( color ); + this.intensity = intensity !== undefined ? intensity : 1; + + this.receiveShadow = undefined; + + } + + Light.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Light, + + isLight: true, + + copy: function ( source ) { + + Object3D.prototype.copy.call( this, source ); + + this.color.copy( source.color ); + this.intensity = source.intensity; + + return this; + + }, + + toJSON: function ( meta ) { + + var data = Object3D.prototype.toJSON.call( this, meta ); + + data.object.color = this.color.getHex(); + data.object.intensity = this.intensity; + + if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex(); + + if ( this.distance !== undefined ) data.object.distance = this.distance; + if ( this.angle !== undefined ) data.object.angle = this.angle; + if ( this.decay !== undefined ) data.object.decay = this.decay; + if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra; + + if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON(); + + return data; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function HemisphereLight( skyColor, groundColor, intensity ) { + + Light.call( this, skyColor, intensity ); + + this.type = 'HemisphereLight'; + + this.castShadow = undefined; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.groundColor = new Color( groundColor ); + + } + + HemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: HemisphereLight, + + isHemisphereLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.groundColor.copy( source.groundColor ); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function LightShadow( camera ) { + + this.camera = camera; + + this.bias = 0; + this.radius = 1; + + this.mapSize = new Vector2( 512, 512 ); + + this.map = null; + this.matrix = new Matrix4(); + + } + + Object.assign( LightShadow.prototype, { + + copy: function ( source ) { + + this.camera = source.camera.clone(); + + this.bias = source.bias; + this.radius = source.radius; + + this.mapSize.copy( source.mapSize ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + toJSON: function () { + + var object = {}; + + if ( this.bias !== 0 ) object.bias = this.bias; + if ( this.radius !== 1 ) object.radius = this.radius; + if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray(); + + object.camera = this.camera.toJSON( false ).object; + delete object.camera.matrix; + + return object; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function SpotLightShadow() { + + LightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) ); + + } + + SpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: SpotLightShadow, + + isSpotLightShadow: true, + + update: function ( light ) { + + var fov = _Math.RAD2DEG * 2 * light.angle; + var aspect = this.mapSize.width / this.mapSize.height; + var far = light.distance || 500; + + var camera = this.camera; + + if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) { + + camera.fov = fov; + camera.aspect = aspect; + camera.far = far; + camera.updateProjectionMatrix(); + + } + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function SpotLight( color, intensity, distance, angle, penumbra, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'SpotLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + Object.defineProperty( this, 'power', { + get: function () { + // intensity = power per solid angle. + // ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + return this.intensity * Math.PI; + }, + set: function ( power ) { + // intensity = power per solid angle. + // ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + this.intensity = power / Math.PI; + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.angle = ( angle !== undefined ) ? angle : Math.PI / 3; + this.penumbra = ( penumbra !== undefined ) ? penumbra : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new SpotLightShadow(); + + } + + SpotLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: SpotLight, + + isSpotLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.angle = source.angle; + this.penumbra = source.penumbra; + this.decay = source.decay; + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + + function PointLight( color, intensity, distance, decay ) { + + Light.call( this, color, intensity ); + + this.type = 'PointLight'; + + Object.defineProperty( this, 'power', { + get: function () { + // intensity = power per solid angle. + // ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + return this.intensity * 4 * Math.PI; + + }, + set: function ( power ) { + // intensity = power per solid angle. + // ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf + this.intensity = power / ( 4 * Math.PI ); + } + } ); + + this.distance = ( distance !== undefined ) ? distance : 0; + this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2. + + this.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) ); + + } + + PointLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: PointLight, + + isPointLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.distance = source.distance; + this.decay = source.decay; + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function DirectionalLightShadow( light ) { + + LightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) ); + + } + + DirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), { + + constructor: DirectionalLightShadow + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function DirectionalLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'DirectionalLight'; + + this.position.copy( Object3D.DefaultUp ); + this.updateMatrix(); + + this.target = new Object3D(); + + this.shadow = new DirectionalLightShadow(); + + } + + DirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: DirectionalLight, + + isDirectionalLight: true, + + copy: function ( source ) { + + Light.prototype.copy.call( this, source ); + + this.target = source.target.clone(); + + this.shadow = source.shadow.clone(); + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AmbientLight( color, intensity ) { + + Light.call( this, color, intensity ); + + this.type = 'AmbientLight'; + + this.castShadow = undefined; + + } + + AmbientLight.prototype = Object.assign( Object.create( Light.prototype ), { + + constructor: AmbientLight, + + isAmbientLight: true, + + } ); + + /** + * @author tschw + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + var AnimationUtils = { + + // same as Array.prototype.slice, but also works on typed arrays + arraySlice: function( array, from, to ) { + + if ( AnimationUtils.isTypedArray( array ) ) { + + return new array.constructor( array.subarray( from, to ) ); + + } + + return array.slice( from, to ); + + }, + + // converts an array to a specific type + convertArray: function( array, type, forceClone ) { + + if ( ! array || // let 'undefined' and 'null' pass + ! forceClone && array.constructor === type ) return array; + + if ( typeof type.BYTES_PER_ELEMENT === 'number' ) { + + return new type( array ); // create typed array + + } + + return Array.prototype.slice.call( array ); // create Array + + }, + + isTypedArray: function( object ) { + + return ArrayBuffer.isView( object ) && + ! ( object instanceof DataView ); + + }, + + // returns an array by which times and values can be sorted + getKeyframeOrder: function( times ) { + + function compareTime( i, j ) { + + return times[ i ] - times[ j ]; + + } + + var n = times.length; + var result = new Array( n ); + for ( var i = 0; i !== n; ++ i ) result[ i ] = i; + + result.sort( compareTime ); + + return result; + + }, + + // uses the array previously returned by 'getKeyframeOrder' to sort data + sortedArray: function( values, stride, order ) { + + var nValues = values.length; + var result = new values.constructor( nValues ); + + for ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) { + + var srcOffset = order[ i ] * stride; + + for ( var j = 0; j !== stride; ++ j ) { + + result[ dstOffset ++ ] = values[ srcOffset + j ]; + + } + + } + + return result; + + }, + + // function for parsing AOS keyframe formats + flattenJSON: function( jsonKeys, times, values, valuePropertyName ) { + + var i = 1, key = jsonKeys[ 0 ]; + + while ( key !== undefined && key[ valuePropertyName ] === undefined ) { + + key = jsonKeys[ i ++ ]; + + } + + if ( key === undefined ) return; // no data + + var value = key[ valuePropertyName ]; + if ( value === undefined ) return; // no data + + if ( Array.isArray( value ) ) { + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push.apply( values, value ); // push all elements + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else if ( value.toArray !== undefined ) { + // ...assume THREE.Math-ish + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + value.toArray( values, values.length ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } else { + // otherwise push as-is + + do { + + value = key[ valuePropertyName ]; + + if ( value !== undefined ) { + + times.push( key.time ); + values.push( value ); + + } + + key = jsonKeys[ i ++ ]; + + } while ( key !== undefined ); + + } + + } + + }; + + /** + * Abstract base class of interpolants over parametric samples. + * + * The parameter domain is one dimensional, typically the time or a path + * along a curve defined by the data. + * + * The sample values can have any dimensionality and derived classes may + * apply special interpretations to the data. + * + * This class provides the interval seek in a Template Method, deferring + * the actual interpolation to derived classes. + * + * Time complexity is O(1) for linear access crossing at most two points + * and O(log N) for random access, where N is the number of positions. + * + * References: + * + * http://www.oodesign.com/template-method-pattern.html + * + * @author tschw + */ + + function Interpolant( + parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + this.parameterPositions = parameterPositions; + this._cachedIndex = 0; + + this.resultBuffer = resultBuffer !== undefined ? + resultBuffer : new sampleValues.constructor( sampleSize ); + this.sampleValues = sampleValues; + this.valueSize = sampleSize; + + } + + Interpolant.prototype = { + + constructor: Interpolant, + + evaluate: function( t ) { + + var pp = this.parameterPositions, + i1 = this._cachedIndex, + + t1 = pp[ i1 ], + t0 = pp[ i1 - 1 ]; + + validate_interval: { + + seek: { + + var right; + + linear_scan: { + //- See http://jsperf.com/comparison-to-undefined/3 + //- slower code: + //- + //- if ( t >= t1 || t1 === undefined ) { + forward_scan: if ( ! ( t < t1 ) ) { + + for ( var giveUpAt = i1 + 2; ;) { + + if ( t1 === undefined ) { + + if ( t < t0 ) break forward_scan; + + // after end + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t, t0 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t0 = t1; + t1 = pp[ ++ i1 ]; + + if ( t < t1 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the right side of the index + right = pp.length; + break linear_scan; + + } + + //- slower code: + //- if ( t < t0 || t0 === undefined ) { + if ( ! ( t >= t0 ) ) { + + // looping? + + var t1global = pp[ 1 ]; + + if ( t < t1global ) { + + i1 = 2; // + 1, using the scan for the details + t0 = t1global; + + } + + // linear reverse scan + + for ( var giveUpAt = i1 - 2; ;) { + + if ( t0 === undefined ) { + + // before start + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( i1 === giveUpAt ) break; // this loop + + t1 = t0; + t0 = pp[ -- i1 - 1 ]; + + if ( t >= t0 ) { + + // we have arrived at the sought interval + break seek; + + } + + } + + // prepare binary search on the left side of the index + right = i1; + i1 = 0; + break linear_scan; + + } + + // the interval is valid + + break validate_interval; + + } // linear scan + + // binary search + + while ( i1 < right ) { + + var mid = ( i1 + right ) >>> 1; + + if ( t < pp[ mid ] ) { + + right = mid; + + } else { + + i1 = mid + 1; + + } + + } + + t1 = pp[ i1 ]; + t0 = pp[ i1 - 1 ]; + + // check boundary cases, again + + if ( t0 === undefined ) { + + this._cachedIndex = 0; + return this.beforeStart_( 0, t, t1 ); + + } + + if ( t1 === undefined ) { + + i1 = pp.length; + this._cachedIndex = i1; + return this.afterEnd_( i1 - 1, t0, t ); + + } + + } // seek + + this._cachedIndex = i1; + + this.intervalChanged_( i1, t0, t1 ); + + } // validate_interval + + return this.interpolate_( i1, t0, t, t1 ); + + }, + + settings: null, // optional, subclass-specific settings structure + // Note: The indirection allows central control of many interpolants. + + // --- Protected interface + + DefaultSettings_: {}, + + getSettings_: function() { + + return this.settings || this.DefaultSettings_; + + }, + + copySampleValue_: function( index ) { + + // copies a sample value to the result buffer + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + offset = index * stride; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + }, + + // Template methods for derived classes: + + interpolate_: function( i1, t0, t, t1 ) { + + throw new Error( "call to abstract method" ); + // implementations shall return this.resultBuffer + + }, + + intervalChanged_: function( i1, t0, t1 ) { + + // empty + + } + + }; + + Object.assign( Interpolant.prototype, { + + beforeStart_: //( 0, t, t0 ), returns this.resultBuffer + Interpolant.prototype.copySampleValue_, + + afterEnd_: //( N-1, tN-1, t ), returns this.resultBuffer + Interpolant.prototype.copySampleValue_ + + } ); + + /** + * Fast and simple cubic spline interpolant. + * + * It was derived from a Hermitian construction setting the first derivative + * at each sample position to the linear slope between neighboring positions + * over their parameter interval. + * + * @author tschw + */ + + function CubicInterpolant( + parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( + this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + this._weightPrev = -0; + this._offsetPrev = -0; + this._weightNext = -0; + this._offsetNext = -0; + + } + + CubicInterpolant.prototype = + Object.assign( Object.create( Interpolant.prototype ), { + + constructor: CubicInterpolant, + + DefaultSettings_: { + + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + + }, + + intervalChanged_: function( i1, t0, t1 ) { + + var pp = this.parameterPositions, + iPrev = i1 - 2, + iNext = i1 + 1, + + tPrev = pp[ iPrev ], + tNext = pp[ iNext ]; + + if ( tPrev === undefined ) { + + switch ( this.getSettings_().endingStart ) { + + case ZeroSlopeEnding: + + // f'(t0) = 0 + iPrev = i1; + tPrev = 2 * t0 - t1; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iPrev = pp.length - 2; + tPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(t0) = 0 a.k.a. Natural Spline + iPrev = i1; + tPrev = t1; + + } + + } + + if ( tNext === undefined ) { + + switch ( this.getSettings_().endingEnd ) { + + case ZeroSlopeEnding: + + // f'(tN) = 0 + iNext = i1; + tNext = 2 * t1 - t0; + + break; + + case WrapAroundEnding: + + // use the other end of the curve + iNext = 1; + tNext = t1 + pp[ 1 ] - pp[ 0 ]; + + break; + + default: // ZeroCurvatureEnding + + // f''(tN) = 0, a.k.a. Natural Spline + iNext = i1 - 1; + tNext = t0; + + } + + } + + var halfDt = ( t1 - t0 ) * 0.5, + stride = this.valueSize; + + this._weightPrev = halfDt / ( t0 - tPrev ); + this._weightNext = halfDt / ( tNext - t1 ); + this._offsetPrev = iPrev * stride; + this._offsetNext = iNext * stride; + + }, + + interpolate_: function( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + o1 = i1 * stride, o0 = o1 - stride, + oP = this._offsetPrev, oN = this._offsetNext, + wP = this._weightPrev, wN = this._weightNext, + + p = ( t - t0 ) / ( t1 - t0 ), + pp = p * p, + ppp = pp * p; + + // evaluate polynomials + + var sP = - wP * ppp + 2 * wP * pp - wP * p; + var s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1; + var s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p; + var sN = wN * ppp - wN * pp; + + // combine data linearly + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + sP * values[ oP + i ] + + s0 * values[ o0 + i ] + + s1 * values[ o1 + i ] + + sN * values[ oN + i ]; + + } + + return result; + + } + + } ); + + /** + * @author tschw + */ + + function LinearInterpolant( + parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( + this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + LinearInterpolant.prototype = + Object.assign( Object.create( Interpolant.prototype ), { + + constructor: LinearInterpolant, + + interpolate_: function( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset1 = i1 * stride, + offset0 = offset1 - stride, + + weight1 = ( t - t0 ) / ( t1 - t0 ), + weight0 = 1 - weight1; + + for ( var i = 0; i !== stride; ++ i ) { + + result[ i ] = + values[ offset0 + i ] * weight0 + + values[ offset1 + i ] * weight1; + + } + + return result; + + } + + } ); + + /** + * + * Interpolant that evaluates to the sample value at the position preceeding + * the parameter. + * + * @author tschw + */ + + function DiscreteInterpolant( + parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( + this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + DiscreteInterpolant.prototype = + Object.assign( Object.create( Interpolant.prototype ), { + + constructor: DiscreteInterpolant, + + interpolate_: function( i1, t0, t, t1 ) { + + return this.copySampleValue_( i1 - 1 ); + + } + + } ); + + var KeyframeTrackPrototype; + + KeyframeTrackPrototype = { + + TimeBufferType: Float32Array, + ValueBufferType: Float32Array, + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodDiscrete: function( result ) { + + return new DiscreteInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodLinear: function( result ) { + + return new LinearInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: function( result ) { + + return new CubicInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + setInterpolation: function( interpolation ) { + + var factoryMethod; + + switch ( interpolation ) { + + case InterpolateDiscrete: + + factoryMethod = this.InterpolantFactoryMethodDiscrete; + + break; + + case InterpolateLinear: + + factoryMethod = this.InterpolantFactoryMethodLinear; + + break; + + case InterpolateSmooth: + + factoryMethod = this.InterpolantFactoryMethodSmooth; + + break; + + } + + if ( factoryMethod === undefined ) { + + var message = "unsupported interpolation for " + + this.ValueTypeName + " keyframe track named " + this.name; + + if ( this.createInterpolant === undefined ) { + + // fall back to default, unless the default itself is messed up + if ( interpolation !== this.DefaultInterpolation ) { + + this.setInterpolation( this.DefaultInterpolation ); + + } else { + + throw new Error( message ); // fatal, in this case + + } + + } + + console.warn( message ); + return; + + } + + this.createInterpolant = factoryMethod; + + }, + + getInterpolation: function() { + + switch ( this.createInterpolant ) { + + case this.InterpolantFactoryMethodDiscrete: + + return InterpolateDiscrete; + + case this.InterpolantFactoryMethodLinear: + + return InterpolateLinear; + + case this.InterpolantFactoryMethodSmooth: + + return InterpolateSmooth; + + } + + }, + + getValueSize: function() { + + return this.values.length / this.times.length; + + }, + + // move all keyframes either forwards or backwards in time + shift: function( timeOffset ) { + + if( timeOffset !== 0.0 ) { + + var times = this.times; + + for( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] += timeOffset; + + } + + } + + return this; + + }, + + // scale all keyframe times by a factor (useful for frame <-> seconds conversions) + scale: function( timeScale ) { + + if( timeScale !== 1.0 ) { + + var times = this.times; + + for( var i = 0, n = times.length; i !== n; ++ i ) { + + times[ i ] *= timeScale; + + } + + } + + return this; + + }, + + // removes keyframes before and after animation without changing any values within the range [startTime, endTime]. + // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values + trim: function( startTime, endTime ) { + + var times = this.times, + nKeys = times.length, + from = 0, + to = nKeys - 1; + + while ( from !== nKeys && times[ from ] < startTime ) ++ from; + while ( to !== -1 && times[ to ] > endTime ) -- to; + + ++ to; // inclusive -> exclusive bound + + if( from !== 0 || to !== nKeys ) { + + // empty tracks are forbidden, so keep at least one keyframe + if ( from >= to ) to = Math.max( to , 1 ), from = to - 1; + + var stride = this.getValueSize(); + this.times = AnimationUtils.arraySlice( times, from, to ); + this.values = AnimationUtils. + arraySlice( this.values, from * stride, to * stride ); + + } + + return this; + + }, + + // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable + validate: function() { + + var valid = true; + + var valueSize = this.getValueSize(); + if ( valueSize - Math.floor( valueSize ) !== 0 ) { + + console.error( "invalid value size in track", this ); + valid = false; + + } + + var times = this.times, + values = this.values, + + nKeys = times.length; + + if( nKeys === 0 ) { + + console.error( "track is empty", this ); + valid = false; + + } + + var prevTime = null; + + for( var i = 0; i !== nKeys; i ++ ) { + + var currTime = times[ i ]; + + if ( typeof currTime === 'number' && isNaN( currTime ) ) { + + console.error( "time is not a valid number", this, i, currTime ); + valid = false; + break; + + } + + if( prevTime !== null && prevTime > currTime ) { + + console.error( "out of order keys", this, i, currTime, prevTime ); + valid = false; + break; + + } + + prevTime = currTime; + + } + + if ( values !== undefined ) { + + if ( AnimationUtils.isTypedArray( values ) ) { + + for ( var i = 0, n = values.length; i !== n; ++ i ) { + + var value = values[ i ]; + + if ( isNaN( value ) ) { + + console.error( "value is not a valid number", this, i, value ); + valid = false; + break; + + } + + } + + } + + } + + return valid; + + }, + + // removes equivalent sequential keys as common in morph target sequences + // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) + optimize: function() { + + var times = this.times, + values = this.values, + stride = this.getValueSize(), + + smoothInterpolation = this.getInterpolation() === InterpolateSmooth, + + writeIndex = 1, + lastIndex = times.length - 1; + + for( var i = 1; i < lastIndex; ++ i ) { + + var keep = false; + + var time = times[ i ]; + var timeNext = times[ i + 1 ]; + + // remove adjacent keyframes scheduled at the same time + + if ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) { + + if ( ! smoothInterpolation ) { + + // remove unnecessary keyframes same as their neighbors + + var offset = i * stride, + offsetP = offset - stride, + offsetN = offset + stride; + + for ( var j = 0; j !== stride; ++ j ) { + + var value = values[ offset + j ]; + + if ( value !== values[ offsetP + j ] || + value !== values[ offsetN + j ] ) { + + keep = true; + break; + + } + + } + + } else keep = true; + + } + + // in-place compaction + + if ( keep ) { + + if ( i !== writeIndex ) { + + times[ writeIndex ] = times[ i ]; + + var readOffset = i * stride, + writeOffset = writeIndex * stride; + + for ( var j = 0; j !== stride; ++ j ) + + values[ writeOffset + j ] = values[ readOffset + j ]; + + } + + ++ writeIndex; + + } + + } + + // flush last keyframe (compaction looks ahead) + + if ( lastIndex > 0 ) { + + times[ writeIndex ] = times[ lastIndex ]; + + for ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) + + values[ writeOffset + j ] = values[ readOffset + j ]; + + ++ writeIndex; + + } + + if ( writeIndex !== times.length ) { + + this.times = AnimationUtils.arraySlice( times, 0, writeIndex ); + this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride ); + + } + + return this; + + } + + }; + + function KeyframeTrackConstructor( name, times, values, interpolation ) { + + if( name === undefined ) throw new Error( "track name is undefined" ); + + if( times === undefined || times.length === 0 ) { + + throw new Error( "no keyframes in track named " + name ); + + } + + this.name = name; + + this.times = AnimationUtils.convertArray( times, this.TimeBufferType ); + this.values = AnimationUtils.convertArray( values, this.ValueBufferType ); + + this.setInterpolation( interpolation || this.DefaultInterpolation ); + + this.validate(); + this.optimize(); + + } + + /** + * + * A Track of vectored keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function VectorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + VectorKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: VectorKeyframeTrack, + + ValueTypeName: 'vector' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + /** + * Spherical linear unit quaternion interpolant. + * + * @author tschw + */ + + function QuaternionLinearInterpolant( + parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + Interpolant.call( + this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + QuaternionLinearInterpolant.prototype = + Object.assign( Object.create( Interpolant.prototype ), { + + constructor: QuaternionLinearInterpolant, + + interpolate_: function( i1, t0, t, t1 ) { + + var result = this.resultBuffer, + values = this.sampleValues, + stride = this.valueSize, + + offset = i1 * stride, + + alpha = ( t - t0 ) / ( t1 - t0 ); + + for ( var end = offset + stride; offset !== end; offset += 4 ) { + + Quaternion.slerpFlat( result, 0, + values, offset - stride, values, offset, alpha ); + + } + + return result; + + } + + } ); + + /** + * + * A Track of quaternion keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function QuaternionKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + QuaternionKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: QuaternionKeyframeTrack, + + ValueTypeName: 'quaternion', + + // ValueBufferType is inherited + + DefaultInterpolation: InterpolateLinear, + + InterpolantFactoryMethodLinear: function( result ) { + + return new QuaternionLinearInterpolant( + this.times, this.values, this.getValueSize(), result ); + + }, + + InterpolantFactoryMethodSmooth: undefined // not yet implemented + + } ); + + /** + * + * A Track of numeric keyframe values. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function NumberKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + NumberKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: NumberKeyframeTrack, + + ValueTypeName: 'number', + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + } ); + + /** + * + * A Track that interpolates Strings + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function StringKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + StringKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: StringKeyframeTrack, + + ValueTypeName: 'string', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + + InterpolantFactoryMethodSmooth: undefined + + } ); + + /** + * + * A Track of Boolean keyframe values. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function BooleanKeyframeTrack( name, times, values ) { + + KeyframeTrackConstructor.call( this, name, times, values ); + + } + + BooleanKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: BooleanKeyframeTrack, + + ValueTypeName: 'bool', + ValueBufferType: Array, + + DefaultInterpolation: InterpolateDiscrete, + + InterpolantFactoryMethodLinear: undefined, + InterpolantFactoryMethodSmooth: undefined + + // Note: Actually this track could have a optimized / compressed + // representation of a single value and a custom interpolant that + // computes "firstValue ^ isOdd( index )". + + } ); + + /** + * + * A Track of keyframe values that represent color. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function ColorKeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.call( this, name, times, values, interpolation ); + + } + + ColorKeyframeTrack.prototype = + Object.assign( Object.create( KeyframeTrackPrototype ), { + + constructor: ColorKeyframeTrack, + + ValueTypeName: 'color' + + // ValueBufferType is inherited + + // DefaultInterpolation is inherited + + + // Note: Very basic implementation and nothing special yet. + // However, this is the place for color space parameterization. + + } ); + + /** + * + * A timed sequence of keyframes for a specific property. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function KeyframeTrack( name, times, values, interpolation ) { + + KeyframeTrackConstructor.apply( this, arguments ); + + } + + KeyframeTrack.prototype = KeyframeTrackPrototype; + KeyframeTrackPrototype.constructor = KeyframeTrack; + + // Static methods: + + Object.assign( KeyframeTrack, { + + // Serialization (in static context, because of constructor invocation + // and automatic invocation of .toJSON): + + parse: function( json ) { + + if( json.type === undefined ) { + + throw new Error( "track type undefined, can not parse" ); + + } + + var trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type ); + + if ( json.times === undefined ) { + + var times = [], values = []; + + AnimationUtils.flattenJSON( json.keys, times, values, 'value' ); + + json.times = times; + json.values = values; + + } + + // derived classes can define a static parse method + if ( trackType.parse !== undefined ) { + + return trackType.parse( json ); + + } else { + + // by default, we asssume a constructor compatible with the base + return new trackType( + json.name, json.times, json.values, json.interpolation ); + + } + + }, + + toJSON: function( track ) { + + var trackType = track.constructor; + + var json; + + // derived classes can define a static toJSON method + if ( trackType.toJSON !== undefined ) { + + json = trackType.toJSON( track ); + + } else { + + // by default, we assume the data can be serialized as-is + json = { + + 'name': track.name, + 'times': AnimationUtils.convertArray( track.times, Array ), + 'values': AnimationUtils.convertArray( track.values, Array ) + + }; + + var interpolation = track.getInterpolation(); + + if ( interpolation !== track.DefaultInterpolation ) { + + json.interpolation = interpolation; + + } + + } + + json.type = track.ValueTypeName; // mandatory + + return json; + + }, + + _getTrackTypeForValueTypeName: function( typeName ) { + + switch( typeName.toLowerCase() ) { + + case "scalar": + case "double": + case "float": + case "number": + case "integer": + + return NumberKeyframeTrack; + + case "vector": + case "vector2": + case "vector3": + case "vector4": + + return VectorKeyframeTrack; + + case "color": + + return ColorKeyframeTrack; + + case "quaternion": + + return QuaternionKeyframeTrack; + + case "bool": + case "boolean": + + return BooleanKeyframeTrack; + + case "string": + + return StringKeyframeTrack; + + } + + throw new Error( "Unsupported typeName: " + typeName ); + + } + + } ); + + /** + * + * Reusable set of Tracks that represent an animation. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + */ + + function AnimationClip( name, duration, tracks ) { + + this.name = name; + this.tracks = tracks; + this.duration = ( duration !== undefined ) ? duration : -1; + + this.uuid = _Math.generateUUID(); + + // this means it should figure out its duration by scanning the tracks + if ( this.duration < 0 ) { + + this.resetDuration(); + + } + + this.optimize(); + + } + + AnimationClip.prototype = { + + constructor: AnimationClip, + + resetDuration: function() { + + var tracks = this.tracks, + duration = 0; + + for ( var i = 0, n = tracks.length; i !== n; ++ i ) { + + var track = this.tracks[ i ]; + + duration = Math.max( + duration, track.times[ track.times.length - 1 ] ); + + } + + this.duration = duration; + + }, + + trim: function() { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].trim( 0, this.duration ); + + } + + return this; + + }, + + optimize: function() { + + for ( var i = 0; i < this.tracks.length; i ++ ) { + + this.tracks[ i ].optimize(); + + } + + return this; + + } + + }; + + // Static methods: + + Object.assign( AnimationClip, { + + parse: function( json ) { + + var tracks = [], + jsonTracks = json.tracks, + frameTime = 1.0 / ( json.fps || 1.0 ); + + for ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) ); + + } + + return new AnimationClip( json.name, json.duration, tracks ); + + }, + + + toJSON: function( clip ) { + + var tracks = [], + clipTracks = clip.tracks; + + var json = { + + 'name': clip.name, + 'duration': clip.duration, + 'tracks': tracks + + }; + + for ( var i = 0, n = clipTracks.length; i !== n; ++ i ) { + + tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) ); + + } + + return json; + + }, + + + CreateFromMorphTargetSequence: function( name, morphTargetSequence, fps, noLoop ) { + + var numMorphTargets = morphTargetSequence.length; + var tracks = []; + + for ( var i = 0; i < numMorphTargets; i ++ ) { + + var times = []; + var values = []; + + times.push( + ( i + numMorphTargets - 1 ) % numMorphTargets, + i, + ( i + 1 ) % numMorphTargets ); + + values.push( 0, 1, 0 ); + + var order = AnimationUtils.getKeyframeOrder( times ); + times = AnimationUtils.sortedArray( times, 1, order ); + values = AnimationUtils.sortedArray( values, 1, order ); + + // if there is a key at the first frame, duplicate it as the + // last frame as well for perfect loop. + if ( ! noLoop && times[ 0 ] === 0 ) { + + times.push( numMorphTargets ); + values.push( values[ 0 ] ); + + } + + tracks.push( + new NumberKeyframeTrack( + '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']', + times, values + ).scale( 1.0 / fps ) ); + } + + return new AnimationClip( name, -1, tracks ); + + }, + + findByName: function( objectOrClipArray, name ) { + + var clipArray = objectOrClipArray; + + if ( ! Array.isArray( objectOrClipArray ) ) { + + var o = objectOrClipArray; + clipArray = o.geometry && o.geometry.animations || o.animations; + + } + + for ( var i = 0; i < clipArray.length; i ++ ) { + + if ( clipArray[ i ].name === name ) { + + return clipArray[ i ]; + + } + } + + return null; + + }, + + CreateClipsFromMorphTargetSequences: function( morphTargets, fps, noLoop ) { + + var animationToMorphTargets = {}; + + // tested with https://regex101.com/ on trick sequences + // such flamingo_flyA_003, flamingo_run1_003, crdeath0059 + var pattern = /^([\w-]*?)([\d]+)$/; + + // sort morph target names into animation groups based + // patterns like Walk_001, Walk_002, Run_001, Run_002 + for ( var i = 0, il = morphTargets.length; i < il; i ++ ) { + + var morphTarget = morphTargets[ i ]; + var parts = morphTarget.name.match( pattern ); + + if ( parts && parts.length > 1 ) { + + var name = parts[ 1 ]; + + var animationMorphTargets = animationToMorphTargets[ name ]; + if ( ! animationMorphTargets ) { + + animationToMorphTargets[ name ] = animationMorphTargets = []; + + } + + animationMorphTargets.push( morphTarget ); + + } + + } + + var clips = []; + + for ( var name in animationToMorphTargets ) { + + clips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) ); + + } + + return clips; + + }, + + // parse the animation.hierarchy format + parseAnimation: function( animation, bones ) { + + if ( ! animation ) { + + console.error( " no animation in JSONLoader data" ); + return null; + + } + + var addNonemptyTrack = function( + trackType, trackName, animationKeys, propertyName, destTracks ) { + + // only return track if there are actually keys. + if ( animationKeys.length !== 0 ) { + + var times = []; + var values = []; + + AnimationUtils.flattenJSON( + animationKeys, times, values, propertyName ); + + // empty keys are filtered out, so check again + if ( times.length !== 0 ) { + + destTracks.push( new trackType( trackName, times, values ) ); + + } + + } + + }; + + var tracks = []; + + var clipName = animation.name || 'default'; + // automatic length determination in AnimationClip. + var duration = animation.length || -1; + var fps = animation.fps || 30; + + var hierarchyTracks = animation.hierarchy || []; + + for ( var h = 0; h < hierarchyTracks.length; h ++ ) { + + var animationKeys = hierarchyTracks[ h ].keys; + + // skip empty tracks + if ( ! animationKeys || animationKeys.length === 0 ) continue; + + // process morph targets in a way exactly compatible + // with AnimationHandler.init( animation ) + if ( animationKeys[0].morphTargets ) { + + // figure out all morph targets used in this track + var morphTargetNames = {}; + for ( var k = 0; k < animationKeys.length; k ++ ) { + + if ( animationKeys[k].morphTargets ) { + + for ( var m = 0; m < animationKeys[k].morphTargets.length; m ++ ) { + + morphTargetNames[ animationKeys[k].morphTargets[m] ] = -1; + } + + } + + } + + // create a track for each morph target with all zero + // morphTargetInfluences except for the keys in which + // the morphTarget is named. + for ( var morphTargetName in morphTargetNames ) { + + var times = []; + var values = []; + + for ( var m = 0; + m !== animationKeys[k].morphTargets.length; ++ m ) { + + var animationKey = animationKeys[k]; + + times.push( animationKey.time ); + values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 ); + + } + + tracks.push( new NumberKeyframeTrack( + '.morphTargetInfluence[' + morphTargetName + ']', times, values ) ); + + } + + duration = morphTargetNames.length * ( fps || 1.0 ); + + } else { + // ...assume skeletal animation + + var boneName = '.bones[' + bones[ h ].name + ']'; + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.position', + animationKeys, 'pos', tracks ); + + addNonemptyTrack( + QuaternionKeyframeTrack, boneName + '.quaternion', + animationKeys, 'rot', tracks ); + + addNonemptyTrack( + VectorKeyframeTrack, boneName + '.scale', + animationKeys, 'scl', tracks ); + + } + + } + + if ( tracks.length === 0 ) { + + return null; + + } + + var clip = new AnimationClip( clipName, duration, tracks ); + + return clip; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function MaterialLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.textures = {}; + + } + + Object.assign( MaterialLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new XHRLoader( scope.manager ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + setTextures: function ( value ) { + + this.textures = value; + + }, + + parse: function ( json ) { + + var textures = this.textures; + + function getTexture( name ) { + + if ( textures[ name ] === undefined ) { + + console.warn( 'THREE.MaterialLoader: Undefined texture', name ); + + } + + return textures[ name ]; + + } + + var material = new Materials[ json.type ](); + + if ( json.uuid !== undefined ) material.uuid = json.uuid; + if ( json.name !== undefined ) material.name = json.name; + if ( json.color !== undefined ) material.color.setHex( json.color ); + if ( json.roughness !== undefined ) material.roughness = json.roughness; + if ( json.metalness !== undefined ) material.metalness = json.metalness; + if ( json.emissive !== undefined ) material.emissive.setHex( json.emissive ); + if ( json.specular !== undefined ) material.specular.setHex( json.specular ); + if ( json.shininess !== undefined ) material.shininess = json.shininess; + if ( json.uniforms !== undefined ) material.uniforms = json.uniforms; + if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader; + if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader; + if ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors; + if ( json.fog !== undefined ) material.fog = json.fog; + if ( json.shading !== undefined ) material.shading = json.shading; + if ( json.blending !== undefined ) material.blending = json.blending; + if ( json.side !== undefined ) material.side = json.side; + if ( json.opacity !== undefined ) material.opacity = json.opacity; + if ( json.transparent !== undefined ) material.transparent = json.transparent; + if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest; + if ( json.depthTest !== undefined ) material.depthTest = json.depthTest; + if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite; + if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite; + if ( json.wireframe !== undefined ) material.wireframe = json.wireframe; + if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth; + if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap; + if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin; + if ( json.skinning !== undefined ) material.skinning = json.skinning; + if ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets; + + // for PointsMaterial + + if ( json.size !== undefined ) material.size = json.size; + if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation; + + // maps + + if ( json.map !== undefined ) material.map = getTexture( json.map ); + + if ( json.alphaMap !== undefined ) { + + material.alphaMap = getTexture( json.alphaMap ); + material.transparent = true; + + } + + if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap ); + if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale; + + if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap ); + if ( json.normalScale !== undefined ) { + + var normalScale = json.normalScale; + + if ( Array.isArray( normalScale ) === false ) { + + // Blender exporter used to export a scalar. See #7459 + + normalScale = [ normalScale, normalScale ]; + + } + + material.normalScale = new Vector2().fromArray( normalScale ); + + } + + if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap ); + if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale; + if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias; + + if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap ); + if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap ); + + if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap ); + if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity; + + if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap ); + + if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap ); + + if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity; + + if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap ); + if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity; + + if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap ); + if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity; + + // MultiMaterial + + if ( json.materials !== undefined ) { + + for ( var i = 0, l = json.materials.length; i < l; i ++ ) { + + material.materials.push( this.parse( json.materials[ i ] ) ); + + } + + } + + return material; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BufferGeometryLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( BufferGeometryLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new XHRLoader( scope.manager ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( JSON.parse( text ) ) ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + var geometry = new BufferGeometry(); + + var index = json.data.index; + + var TYPED_ARRAYS = { + 'Int8Array': Int8Array, + 'Uint8Array': Uint8Array, + 'Uint8ClampedArray': Uint8ClampedArray, + 'Int16Array': Int16Array, + 'Uint16Array': Uint16Array, + 'Int32Array': Int32Array, + 'Uint32Array': Uint32Array, + 'Float32Array': Float32Array, + 'Float64Array': Float64Array + }; + + if ( index !== undefined ) { + + var typedArray = new TYPED_ARRAYS[ index.type ]( index.array ); + geometry.setIndex( new BufferAttribute( typedArray, 1 ) ); + + } + + var attributes = json.data.attributes; + + for ( var key in attributes ) { + + var attribute = attributes[ key ]; + var typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array ); + + geometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) ); + + } + + var groups = json.data.groups || json.data.drawcalls || json.data.offsets; + + if ( groups !== undefined ) { + + for ( var i = 0, n = groups.length; i !== n; ++ i ) { + + var group = groups[ i ]; + + geometry.addGroup( group.start, group.count, group.materialIndex ); + + } + + } + + var boundingSphere = json.data.boundingSphere; + + if ( boundingSphere !== undefined ) { + + var center = new Vector3(); + + if ( boundingSphere.center !== undefined ) { + + center.fromArray( boundingSphere.center ); + + } + + geometry.boundingSphere = new Sphere( center, boundingSphere.radius ); + + } + + return geometry; + + } + + } ); + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Loader() { + + this.onLoadStart = function () {}; + this.onLoadProgress = function () {}; + this.onLoadComplete = function () {}; + + } + + Loader.prototype = { + + constructor: Loader, + + crossOrigin: undefined, + + extractUrlBase: function ( url ) { + + var parts = url.split( '/' ); + + if ( parts.length === 1 ) return './'; + + parts.pop(); + + return parts.join( '/' ) + '/'; + + }, + + initMaterials: function ( materials, texturePath, crossOrigin ) { + + var array = []; + + for ( var i = 0; i < materials.length; ++ i ) { + + array[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin ); + + } + + return array; + + }, + + createMaterial: ( function () { + + var color, textureLoader, materialLoader; + + return function createMaterial( m, texturePath, crossOrigin ) { + + if ( color === undefined ) color = new Color(); + if ( textureLoader === undefined ) textureLoader = new TextureLoader(); + if ( materialLoader === undefined ) materialLoader = new MaterialLoader(); + + // convert from old material format + + var textures = {}; + + function loadTexture( path, repeat, offset, wrap, anisotropy ) { + + var fullPath = texturePath + path; + var loader = Loader.Handlers.get( fullPath ); + + var texture; + + if ( loader !== null ) { + + texture = loader.load( fullPath ); + + } else { + + textureLoader.setCrossOrigin( crossOrigin ); + texture = textureLoader.load( fullPath ); + + } + + if ( repeat !== undefined ) { + + texture.repeat.fromArray( repeat ); + + if ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping; + if ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping; + + } + + if ( offset !== undefined ) { + + texture.offset.fromArray( offset ); + + } + + if ( wrap !== undefined ) { + + if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping; + if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping; + + if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping; + if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping; + + } + + if ( anisotropy !== undefined ) { + + texture.anisotropy = anisotropy; + + } + + var uuid = _Math.generateUUID(); + + textures[ uuid ] = texture; + + return uuid; + + } + + // + + var json = { + uuid: _Math.generateUUID(), + type: 'MeshLambertMaterial' + }; + + for ( var name in m ) { + + var value = m[ name ]; + + switch ( name ) { + case 'DbgColor': + case 'DbgIndex': + case 'opticalDensity': + case 'illumination': + break; + case 'DbgName': + json.name = value; + break; + case 'blending': + json.blending = BlendingMode[ value ]; + break; + case 'colorAmbient': + case 'mapAmbient': + console.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' ); + break; + case 'colorDiffuse': + json.color = color.fromArray( value ).getHex(); + break; + case 'colorSpecular': + json.specular = color.fromArray( value ).getHex(); + break; + case 'colorEmissive': + json.emissive = color.fromArray( value ).getHex(); + break; + case 'specularCoef': + json.shininess = value; + break; + case 'shading': + if ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial'; + if ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial'; + if ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial'; + break; + case 'mapDiffuse': + json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy ); + break; + case 'mapDiffuseRepeat': + case 'mapDiffuseOffset': + case 'mapDiffuseWrap': + case 'mapDiffuseAnisotropy': + break; + case 'mapEmissive': + json.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy ); + break; + case 'mapEmissiveRepeat': + case 'mapEmissiveOffset': + case 'mapEmissiveWrap': + case 'mapEmissiveAnisotropy': + break; + case 'mapLight': + json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy ); + break; + case 'mapLightRepeat': + case 'mapLightOffset': + case 'mapLightWrap': + case 'mapLightAnisotropy': + break; + case 'mapAO': + json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy ); + break; + case 'mapAORepeat': + case 'mapAOOffset': + case 'mapAOWrap': + case 'mapAOAnisotropy': + break; + case 'mapBump': + json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy ); + break; + case 'mapBumpScale': + json.bumpScale = value; + break; + case 'mapBumpRepeat': + case 'mapBumpOffset': + case 'mapBumpWrap': + case 'mapBumpAnisotropy': + break; + case 'mapNormal': + json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy ); + break; + case 'mapNormalFactor': + json.normalScale = [ value, value ]; + break; + case 'mapNormalRepeat': + case 'mapNormalOffset': + case 'mapNormalWrap': + case 'mapNormalAnisotropy': + break; + case 'mapSpecular': + json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy ); + break; + case 'mapSpecularRepeat': + case 'mapSpecularOffset': + case 'mapSpecularWrap': + case 'mapSpecularAnisotropy': + break; + case 'mapMetalness': + json.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy ); + break; + case 'mapMetalnessRepeat': + case 'mapMetalnessOffset': + case 'mapMetalnessWrap': + case 'mapMetalnessAnisotropy': + break; + case 'mapRoughness': + json.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy ); + break; + case 'mapRoughnessRepeat': + case 'mapRoughnessOffset': + case 'mapRoughnessWrap': + case 'mapRoughnessAnisotropy': + break; + case 'mapAlpha': + json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy ); + break; + case 'mapAlphaRepeat': + case 'mapAlphaOffset': + case 'mapAlphaWrap': + case 'mapAlphaAnisotropy': + break; + case 'flipSided': + json.side = BackSide; + break; + case 'doubleSided': + json.side = DoubleSide; + break; + case 'transparency': + console.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' ); + json.opacity = value; + break; + case 'depthTest': + case 'depthWrite': + case 'colorWrite': + case 'opacity': + case 'reflectivity': + case 'transparent': + case 'visible': + case 'wireframe': + json[ name ] = value; + break; + case 'vertexColors': + if ( value === true ) json.vertexColors = VertexColors; + if ( value === 'face' ) json.vertexColors = FaceColors; + break; + default: + console.error( 'THREE.Loader.createMaterial: Unsupported', name, value ); + break; + } + + } + + if ( json.type === 'MeshBasicMaterial' ) delete json.emissive; + if ( json.type !== 'MeshPhongMaterial' ) delete json.specular; + + if ( json.opacity < 1 ) json.transparent = true; + + materialLoader.setTextures( textures ); + + return materialLoader.parse( json ); + + }; + + } )() + + }; + + Loader.Handlers = { + + handlers: [], + + add: function ( regex, loader ) { + + this.handlers.push( regex, loader ); + + }, + + get: function ( file ) { + + var handlers = this.handlers; + + for ( var i = 0, l = handlers.length; i < l; i += 2 ) { + + var regex = handlers[ i ]; + var loader = handlers[ i + 1 ]; + + if ( regex.test( file ) ) { + + return loader; + + } + + } + + return null; + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function JSONLoader( manager ) { + + if ( typeof manager === 'boolean' ) { + + console.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' ); + manager = undefined; + + } + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + this.withCredentials = false; + + } + + Object.assign( JSONLoader.prototype, { + + load: function( url, onLoad, onProgress, onError ) { + + var scope = this; + + var texturePath = this.texturePath && ( typeof this.texturePath === "string" ) ? this.texturePath : Loader.prototype.extractUrlBase( url ); + + var loader = new XHRLoader( this.manager ); + loader.setWithCredentials( this.withCredentials ); + loader.load( url, function ( text ) { + + var json = JSON.parse( text ); + var metadata = json.metadata; + + if ( metadata !== undefined ) { + + var type = metadata.type; + + if ( type !== undefined ) { + + if ( type.toLowerCase() === 'object' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' ); + return; + + } + + if ( type.toLowerCase() === 'scene' ) { + + console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' ); + return; + + } + + } + + } + + var object = scope.parse( json, texturePath ); + onLoad( object.geometry, object.materials ); + + }, onProgress, onError ); + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + parse: function ( json, texturePath ) { + + var geometry = new Geometry(), + scale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0; + + parseModel( scale ); + + parseSkin(); + parseMorphing( scale ); + parseAnimations(); + + geometry.computeFaceNormals(); + geometry.computeBoundingSphere(); + + function parseModel( scale ) { + + function isBitSet( value, position ) { + + return value & ( 1 << position ); + + } + + var i, j, fi, + + offset, zLength, + + colorIndex, normalIndex, uvIndex, materialIndex, + + type, + isQuad, + hasMaterial, + hasFaceVertexUv, + hasFaceNormal, hasFaceVertexNormal, + hasFaceColor, hasFaceVertexColor, + + vertex, face, faceA, faceB, hex, normal, + + uvLayer, uv, u, v, + + faces = json.faces, + vertices = json.vertices, + normals = json.normals, + colors = json.colors, + + nUvLayers = 0; + + if ( json.uvs !== undefined ) { + + // disregard empty arrays + + for ( i = 0; i < json.uvs.length; i ++ ) { + + if ( json.uvs[ i ].length ) nUvLayers ++; + + } + + for ( i = 0; i < nUvLayers; i ++ ) { + + geometry.faceVertexUvs[ i ] = []; + + } + + } + + offset = 0; + zLength = vertices.length; + + while ( offset < zLength ) { + + vertex = new Vector3(); + + vertex.x = vertices[ offset ++ ] * scale; + vertex.y = vertices[ offset ++ ] * scale; + vertex.z = vertices[ offset ++ ] * scale; + + geometry.vertices.push( vertex ); + + } + + offset = 0; + zLength = faces.length; + + while ( offset < zLength ) { + + type = faces[ offset ++ ]; + + + isQuad = isBitSet( type, 0 ); + hasMaterial = isBitSet( type, 1 ); + hasFaceVertexUv = isBitSet( type, 3 ); + hasFaceNormal = isBitSet( type, 4 ); + hasFaceVertexNormal = isBitSet( type, 5 ); + hasFaceColor = isBitSet( type, 6 ); + hasFaceVertexColor = isBitSet( type, 7 ); + + // console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor); + + if ( isQuad ) { + + faceA = new Face3(); + faceA.a = faces[ offset ]; + faceA.b = faces[ offset + 1 ]; + faceA.c = faces[ offset + 3 ]; + + faceB = new Face3(); + faceB.a = faces[ offset + 1 ]; + faceB.b = faces[ offset + 2 ]; + faceB.c = faces[ offset + 3 ]; + + offset += 4; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + faceA.materialIndex = materialIndex; + faceB.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + geometry.faceVertexUvs[ i ][ fi + 1 ] = []; + + for ( j = 0; j < 4; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + if ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv ); + if ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + faceA.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + faceB.normal.copy( faceA.normal ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 4; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + + if ( i !== 2 ) faceA.vertexNormals.push( normal ); + if ( i !== 0 ) faceB.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + faceA.color.setHex( hex ); + faceB.color.setHex( hex ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 4; i ++ ) { + + colorIndex = faces[ offset ++ ]; + hex = colors[ colorIndex ]; + + if ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) ); + if ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) ); + + } + + } + + geometry.faces.push( faceA ); + geometry.faces.push( faceB ); + + } else { + + face = new Face3(); + face.a = faces[ offset ++ ]; + face.b = faces[ offset ++ ]; + face.c = faces[ offset ++ ]; + + if ( hasMaterial ) { + + materialIndex = faces[ offset ++ ]; + face.materialIndex = materialIndex; + + } + + // to get face <=> uv index correspondence + + fi = geometry.faces.length; + + if ( hasFaceVertexUv ) { + + for ( i = 0; i < nUvLayers; i ++ ) { + + uvLayer = json.uvs[ i ]; + + geometry.faceVertexUvs[ i ][ fi ] = []; + + for ( j = 0; j < 3; j ++ ) { + + uvIndex = faces[ offset ++ ]; + + u = uvLayer[ uvIndex * 2 ]; + v = uvLayer[ uvIndex * 2 + 1 ]; + + uv = new Vector2( u, v ); + + geometry.faceVertexUvs[ i ][ fi ].push( uv ); + + } + + } + + } + + if ( hasFaceNormal ) { + + normalIndex = faces[ offset ++ ] * 3; + + face.normal.set( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + } + + if ( hasFaceVertexNormal ) { + + for ( i = 0; i < 3; i ++ ) { + + normalIndex = faces[ offset ++ ] * 3; + + normal = new Vector3( + normals[ normalIndex ++ ], + normals[ normalIndex ++ ], + normals[ normalIndex ] + ); + + face.vertexNormals.push( normal ); + + } + + } + + + if ( hasFaceColor ) { + + colorIndex = faces[ offset ++ ]; + face.color.setHex( colors[ colorIndex ] ); + + } + + + if ( hasFaceVertexColor ) { + + for ( i = 0; i < 3; i ++ ) { + + colorIndex = faces[ offset ++ ]; + face.vertexColors.push( new Color( colors[ colorIndex ] ) ); + + } + + } + + geometry.faces.push( face ); + + } + + } + + } + + function parseSkin() { + + var influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2; + + if ( json.skinWeights ) { + + for ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) { + + var x = json.skinWeights[ i ]; + var y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0; + var z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0; + var w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0; + + geometry.skinWeights.push( new Vector4( x, y, z, w ) ); + + } + + } + + if ( json.skinIndices ) { + + for ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) { + + var a = json.skinIndices[ i ]; + var b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0; + var c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0; + var d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0; + + geometry.skinIndices.push( new Vector4( a, b, c, d ) ); + + } + + } + + geometry.bones = json.bones; + + if ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) { + + console.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' + + geometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' ); + + } + + } + + function parseMorphing( scale ) { + + if ( json.morphTargets !== undefined ) { + + for ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) { + + geometry.morphTargets[ i ] = {}; + geometry.morphTargets[ i ].name = json.morphTargets[ i ].name; + geometry.morphTargets[ i ].vertices = []; + + var dstVertices = geometry.morphTargets[ i ].vertices; + var srcVertices = json.morphTargets[ i ].vertices; + + for ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) { + + var vertex = new Vector3(); + vertex.x = srcVertices[ v ] * scale; + vertex.y = srcVertices[ v + 1 ] * scale; + vertex.z = srcVertices[ v + 2 ] * scale; + + dstVertices.push( vertex ); + + } + + } + + } + + if ( json.morphColors !== undefined && json.morphColors.length > 0 ) { + + console.warn( 'THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.' ); + + var faces = geometry.faces; + var morphColors = json.morphColors[ 0 ].colors; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + faces[ i ].color.fromArray( morphColors, i * 3 ); + + } + + } + + } + + function parseAnimations() { + + var outputAnimations = []; + + // parse old style Bone/Hierarchy animations + var animations = []; + + if ( json.animation !== undefined ) { + + animations.push( json.animation ); + + } + + if ( json.animations !== undefined ) { + + if ( json.animations.length ) { + + animations = animations.concat( json.animations ); + + } else { + + animations.push( json.animations ); + + } + + } + + for ( var i = 0; i < animations.length; i ++ ) { + + var clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones ); + if ( clip ) outputAnimations.push( clip ); + + } + + // parse implicit morph animations + if ( geometry.morphTargets ) { + + // TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary. + var morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 ); + outputAnimations = outputAnimations.concat( morphAnimationClips ); + + } + + if ( outputAnimations.length > 0 ) geometry.animations = outputAnimations; + + } + + if ( json.materials === undefined || json.materials.length === 0 ) { + + return { geometry: geometry }; + + } else { + + var materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin ); + + return { geometry: geometry, materials: materials }; + + } + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function ObjectLoader ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + this.texturePath = ''; + + } + + Object.assign( ObjectLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + if ( this.texturePath === '' ) { + + this.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 ); + + } + + var scope = this; + + var loader = new XHRLoader( scope.manager ); + loader.load( url, function ( text ) { + + scope.parse( JSON.parse( text ), onLoad ); + + }, onProgress, onError ); + + }, + + setTexturePath: function ( value ) { + + this.texturePath = value; + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + parse: function ( json, onLoad ) { + + var geometries = this.parseGeometries( json.geometries ); + + var images = this.parseImages( json.images, function () { + + if ( onLoad !== undefined ) onLoad( object ); + + } ); + + var textures = this.parseTextures( json.textures, images ); + var materials = this.parseMaterials( json.materials, textures ); + + var object = this.parseObject( json.object, geometries, materials ); + + if ( json.animations ) { + + object.animations = this.parseAnimations( json.animations ); + + } + + if ( json.images === undefined || json.images.length === 0 ) { + + if ( onLoad !== undefined ) onLoad( object ); + + } + + return object; + + }, + + parseGeometries: function ( json ) { + + var geometries = {}; + + if ( json !== undefined ) { + + var geometryLoader = new JSONLoader(); + var bufferGeometryLoader = new BufferGeometryLoader(); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var geometry; + var data = json[ i ]; + + switch ( data.type ) { + + case 'PlaneGeometry': + case 'PlaneBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.widthSegments, + data.heightSegments + ); + + break; + + case 'BoxGeometry': + case 'BoxBufferGeometry': + case 'CubeGeometry': // backwards compatible + + geometry = new Geometries[ data.type ]( + data.width, + data.height, + data.depth, + data.widthSegments, + data.heightSegments, + data.depthSegments + ); + + break; + + case 'CircleGeometry': + case 'CircleBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.segments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'CylinderGeometry': + case 'CylinderBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radiusTop, + data.radiusBottom, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'ConeGeometry': + case 'ConeBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.height, + data.radialSegments, + data.heightSegments, + data.openEnded, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'SphereGeometry': + case 'SphereBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.widthSegments, + data.heightSegments, + data.phiStart, + data.phiLength, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'DodecahedronGeometry': + case 'IcosahedronGeometry': + case 'OctahedronGeometry': + case 'TetrahedronGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.detail + ); + + break; + + case 'RingGeometry': + case 'RingBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.innerRadius, + data.outerRadius, + data.thetaSegments, + data.phiSegments, + data.thetaStart, + data.thetaLength + ); + + break; + + case 'TorusGeometry': + case 'TorusBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.radialSegments, + data.tubularSegments, + data.arc + ); + + break; + + case 'TorusKnotGeometry': + case 'TorusKnotBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.radius, + data.tube, + data.tubularSegments, + data.radialSegments, + data.p, + data.q + ); + + break; + + case 'LatheGeometry': + case 'LatheBufferGeometry': + + geometry = new Geometries[ data.type ]( + data.points, + data.segments, + data.phiStart, + data.phiLength + ); + + break; + + case 'BufferGeometry': + + geometry = bufferGeometryLoader.parse( data ); + + break; + + case 'Geometry': + + geometry = geometryLoader.parse( data.data, this.texturePath ).geometry; + + break; + + default: + + console.warn( 'THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"' ); + + continue; + + } + + geometry.uuid = data.uuid; + + if ( data.name !== undefined ) geometry.name = data.name; + + geometries[ data.uuid ] = geometry; + + } + + } + + return geometries; + + }, + + parseMaterials: function ( json, textures ) { + + var materials = {}; + + if ( json !== undefined ) { + + var loader = new MaterialLoader(); + loader.setTextures( textures ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var material = loader.parse( json[ i ] ); + materials[ material.uuid ] = material; + + } + + } + + return materials; + + }, + + parseAnimations: function ( json ) { + + var animations = []; + + for ( var i = 0; i < json.length; i ++ ) { + + var clip = AnimationClip.parse( json[ i ] ); + + animations.push( clip ); + + } + + return animations; + + }, + + parseImages: function ( json, onLoad ) { + + var scope = this; + var images = {}; + + function loadImage( url ) { + + scope.manager.itemStart( url ); + + return loader.load( url, function () { + + scope.manager.itemEnd( url ); + + }, undefined, function () { + + scope.manager.itemError( url ); + + } ); + + } + + if ( json !== undefined && json.length > 0 ) { + + var manager = new LoadingManager( onLoad ); + + var loader = new ImageLoader( manager ); + loader.setCrossOrigin( this.crossOrigin ); + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var image = json[ i ]; + var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url; + + images[ image.uuid ] = loadImage( path ); + + } + + } + + return images; + + }, + + parseTextures: function ( json, images ) { + + function parseConstant( value, type ) { + + if ( typeof( value ) === 'number' ) return value; + + console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value ); + + return type[ value ]; + + } + + var textures = {}; + + if ( json !== undefined ) { + + for ( var i = 0, l = json.length; i < l; i ++ ) { + + var data = json[ i ]; + + if ( data.image === undefined ) { + + console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid ); + + } + + if ( images[ data.image ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined image', data.image ); + + } + + var texture = new Texture( images[ data.image ] ); + texture.needsUpdate = true; + + texture.uuid = data.uuid; + + if ( data.name !== undefined ) texture.name = data.name; + + if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TextureMapping ); + + if ( data.offset !== undefined ) texture.offset.fromArray( data.offset ); + if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat ); + if ( data.wrap !== undefined ) { + + texture.wrapS = parseConstant( data.wrap[ 0 ], TextureWrapping ); + texture.wrapT = parseConstant( data.wrap[ 1 ], TextureWrapping ); + + } + + if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TextureFilter ); + if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TextureFilter ); + if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy; + + if ( data.flipY !== undefined ) texture.flipY = data.flipY; + + textures[ data.uuid ] = texture; + + } + + } + + return textures; + + }, + + parseObject: function () { + + var matrix = new Matrix4(); + + return function parseObject( data, geometries, materials ) { + + var object; + + function getGeometry( name ) { + + if ( geometries[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined geometry', name ); + + } + + return geometries[ name ]; + + } + + function getMaterial( name ) { + + if ( name === undefined ) return undefined; + + if ( materials[ name ] === undefined ) { + + console.warn( 'THREE.ObjectLoader: Undefined material', name ); + + } + + return materials[ name ]; + + } + + switch ( data.type ) { + + case 'Scene': + + object = new Scene(); + + if ( data.background !== undefined ) { + + if ( Number.isInteger( data.background ) ) { + + object.background = new Color( data.background ); + + } + + } + + if ( data.fog !== undefined ) { + + if ( data.fog.type === 'Fog' ) { + + object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far ); + + } else if ( data.fog.type === 'FogExp2' ) { + + object.fog = new FogExp2( data.fog.color, data.fog.density ); + + } + + } + + break; + + case 'PerspectiveCamera': + + object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far ); + + if ( data.focus !== undefined ) object.focus = data.focus; + if ( data.zoom !== undefined ) object.zoom = data.zoom; + if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge; + if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset; + if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); + + break; + + case 'OrthographicCamera': + + object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far ); + + break; + + case 'AmbientLight': + + object = new AmbientLight( data.color, data.intensity ); + + break; + + case 'DirectionalLight': + + object = new DirectionalLight( data.color, data.intensity ); + + break; + + case 'PointLight': + + object = new PointLight( data.color, data.intensity, data.distance, data.decay ); + + break; + + case 'SpotLight': + + object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay ); + + break; + + case 'HemisphereLight': + + object = new HemisphereLight( data.color, data.groundColor, data.intensity ); + + break; + + case 'Mesh': + + var geometry = getGeometry( data.geometry ); + var material = getMaterial( data.material ); + + if ( geometry.bones && geometry.bones.length > 0 ) { + + object = new SkinnedMesh( geometry, material ); + + } else { + + object = new Mesh( geometry, material ); + + } + + break; + + case 'LOD': + + object = new LOD(); + + break; + + case 'Line': + + object = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode ); + + break; + + case 'LineSegments': + + object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'PointCloud': + case 'Points': + + object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) ); + + break; + + case 'Sprite': + + object = new Sprite( getMaterial( data.material ) ); + + break; + + case 'Group': + + object = new Group(); + + break; + + default: + + object = new Object3D(); + + } + + object.uuid = data.uuid; + + if ( data.name !== undefined ) object.name = data.name; + if ( data.matrix !== undefined ) { + + matrix.fromArray( data.matrix ); + matrix.decompose( object.position, object.quaternion, object.scale ); + + } else { + + if ( data.position !== undefined ) object.position.fromArray( data.position ); + if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation ); + if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion ); + if ( data.scale !== undefined ) object.scale.fromArray( data.scale ); + + } + + if ( data.castShadow !== undefined ) object.castShadow = data.castShadow; + if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow; + + if ( data.shadow ) { + + if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias; + if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius; + if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize ); + if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera ); + + } + + if ( data.visible !== undefined ) object.visible = data.visible; + if ( data.userData !== undefined ) object.userData = data.userData; + + if ( data.children !== undefined ) { + + for ( var child in data.children ) { + + object.add( this.parseObject( data.children[ child ], geometries, materials ) ); + + } + + } + + if ( data.type === 'LOD' ) { + + var levels = data.levels; + + for ( var l = 0; l < levels.length; l ++ ) { + + var level = levels[ l ]; + var child = object.getObjectByProperty( 'uuid', level.object ); + + if ( child !== undefined ) { + + object.addLevel( child, level.distance ); + + } + + } + + } + + return object; + + }; + + }() + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Extensible curve object + * + * Some common of Curve methods + * .getPoint(t), getTangent(t) + * .getPointAt(u), getTangentAt(u) + * .getPoints(), .getSpacedPoints() + * .getLength() + * .updateArcLengths() + * + * This following classes subclasses THREE.Curve: + * + * -- 2d classes -- + * THREE.LineCurve + * THREE.QuadraticBezierCurve + * THREE.CubicBezierCurve + * THREE.SplineCurve + * THREE.ArcCurve + * THREE.EllipseCurve + * + * -- 3d classes -- + * THREE.LineCurve3 + * THREE.QuadraticBezierCurve3 + * THREE.CubicBezierCurve3 + * THREE.SplineCurve3 + * + * A series of curves can be represented as a THREE.CurvePath + * + **/ + + /************************************************************** + * Abstract Curve base class + **************************************************************/ + + function Curve() {} + + Curve.prototype = { + + constructor: Curve, + + // Virtual base class method to overwrite and implement in subclasses + // - t [0 .. 1] + + getPoint: function ( t ) { + + console.warn( "THREE.Curve: Warning, getPoint() not implemented!" ); + return null; + + }, + + // Get point at relative position in curve according to arc length + // - u [0 .. 1] + + getPointAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getPoint( t ); + + }, + + // Get sequence of points using getPoint( t ) + + getPoints: function ( divisions ) { + + if ( ! divisions ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPoint( d / divisions ) ); + + } + + return points; + + }, + + // Get sequence of points using getPointAt( u ) + + getSpacedPoints: function ( divisions ) { + + if ( ! divisions ) divisions = 5; + + var points = []; + + for ( var d = 0; d <= divisions; d ++ ) { + + points.push( this.getPointAt( d / divisions ) ); + + } + + return points; + + }, + + // Get total curve arc length + + getLength: function () { + + var lengths = this.getLengths(); + return lengths[ lengths.length - 1 ]; + + }, + + // Get list of cumulative segment lengths + + getLengths: function ( divisions ) { + + if ( ! divisions ) divisions = ( this.__arcLengthDivisions ) ? ( this.__arcLengthDivisions ) : 200; + + if ( this.cacheArcLengths + && ( this.cacheArcLengths.length === divisions + 1 ) + && ! this.needsUpdate ) { + + //console.log( "cached", this.cacheArcLengths ); + return this.cacheArcLengths; + + } + + this.needsUpdate = false; + + var cache = []; + var current, last = this.getPoint( 0 ); + var p, sum = 0; + + cache.push( 0 ); + + for ( p = 1; p <= divisions; p ++ ) { + + current = this.getPoint ( p / divisions ); + sum += current.distanceTo( last ); + cache.push( sum ); + last = current; + + } + + this.cacheArcLengths = cache; + + return cache; // { sums: cache, sum:sum }; Sum is in the last element. + + }, + + updateArcLengths: function() { + + this.needsUpdate = true; + this.getLengths(); + + }, + + // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant + + getUtoTmapping: function ( u, distance ) { + + var arcLengths = this.getLengths(); + + var i = 0, il = arcLengths.length; + + var targetArcLength; // The targeted u distance value to get + + if ( distance ) { + + targetArcLength = distance; + + } else { + + targetArcLength = u * arcLengths[ il - 1 ]; + + } + + //var time = Date.now(); + + // binary search for the index with largest value smaller than target u distance + + var low = 0, high = il - 1, comparison; + + while ( low <= high ) { + + i = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats + + comparison = arcLengths[ i ] - targetArcLength; + + if ( comparison < 0 ) { + + low = i + 1; + + } else if ( comparison > 0 ) { + + high = i - 1; + + } else { + + high = i; + break; + + // DONE + + } + + } + + i = high; + + //console.log('b' , i, low, high, Date.now()- time); + + if ( arcLengths[ i ] === targetArcLength ) { + + var t = i / ( il - 1 ); + return t; + + } + + // we could get finer grain at lengths, or use simple interpolation between two points + + var lengthBefore = arcLengths[ i ]; + var lengthAfter = arcLengths[ i + 1 ]; + + var segmentLength = lengthAfter - lengthBefore; + + // determine where we are between the 'before' and 'after' points + + var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength; + + // add that fractional amount to t + + var t = ( i + segmentFraction ) / ( il - 1 ); + + return t; + + }, + + // Returns a unit vector tangent at t + // In case any sub curve does not implement its tangent derivation, + // 2 points a small delta apart will be used to find its gradient + // which seems to give a reasonable approximation + + getTangent: function( t ) { + + var delta = 0.0001; + var t1 = t - delta; + var t2 = t + delta; + + // Capping in case of danger + + if ( t1 < 0 ) t1 = 0; + if ( t2 > 1 ) t2 = 1; + + var pt1 = this.getPoint( t1 ); + var pt2 = this.getPoint( t2 ); + + var vec = pt2.clone().sub( pt1 ); + return vec.normalize(); + + }, + + getTangentAt: function ( u ) { + + var t = this.getUtoTmapping( u ); + return this.getTangent( t ); + + }, + + computeFrenetFrames: function ( segments, closed ) { + + // see http://www.cs.indiana.edu/pub/techreports/TR425.pdf + + var normal = new Vector3(); + + var tangents = []; + var normals = []; + var binormals = []; + + var vec = new Vector3(); + var mat = new Matrix4(); + + var i, u, theta; + + // compute the tangent vectors for each segment on the curve + + for ( i = 0; i <= segments; i ++ ) { + + u = i / segments; + + tangents[ i ] = this.getTangentAt( u ); + tangents[ i ].normalize(); + + } + + // select an initial normal vector perpendicular to the first tangent vector, + // and in the direction of the minimum tangent xyz component + + normals[ 0 ] = new Vector3(); + binormals[ 0 ] = new Vector3(); + var min = Number.MAX_VALUE; + var tx = Math.abs( tangents[ 0 ].x ); + var ty = Math.abs( tangents[ 0 ].y ); + var tz = Math.abs( tangents[ 0 ].z ); + + if ( tx <= min ) { + + min = tx; + normal.set( 1, 0, 0 ); + + } + + if ( ty <= min ) { + + min = ty; + normal.set( 0, 1, 0 ); + + } + + if ( tz <= min ) { + + normal.set( 0, 0, 1 ); + + } + + vec.crossVectors( tangents[ 0 ], normal ).normalize(); + + normals[ 0 ].crossVectors( tangents[ 0 ], vec ); + binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ); + + + // compute the slowly-varying normal and binormal vectors for each segment on the curve + + for ( i = 1; i <= segments; i ++ ) { + + normals[ i ] = normals[ i - 1 ].clone(); + + binormals[ i ] = binormals[ i - 1 ].clone(); + + vec.crossVectors( tangents[ i - 1 ], tangents[ i ] ); + + if ( vec.length() > Number.EPSILON ) { + + vec.normalize(); + + theta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors + + normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) ); + + } + + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same + + if ( closed === true ) { + + theta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) ); + theta /= segments; + + if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) { + + theta = - theta; + + } + + for ( i = 1; i <= segments; i ++ ) { + + // twist a little... + normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) ); + binormals[ i ].crossVectors( tangents[ i ], normals[ i ] ); + + } + + } + + return { + tangents: tangents, + normals: normals, + binormals: binormals + }; + + } + + }; + + // TODO: Transformation for Curves? + + /************************************************************** + * 3D Curves + **************************************************************/ + + // A Factory method for creating new curve subclasses + + Curve.create = function ( constructor, getPointFunc ) { + + constructor.prototype = Object.create( Curve.prototype ); + constructor.prototype.constructor = constructor; + constructor.prototype.getPoint = getPointFunc; + + return constructor; + + }; + + /************************************************************** + * Line + **************************************************************/ + + function LineCurve( v1, v2 ) { + + this.v1 = v1; + this.v2 = v2; + + } + + LineCurve.prototype = Object.create( Curve.prototype ); + LineCurve.prototype.constructor = LineCurve; + + LineCurve.prototype.isLineCurve = true; + + LineCurve.prototype.getPoint = function ( t ) { + + if ( t === 1 ) { + + return this.v2.clone(); + + } + + var point = this.v2.clone().sub( this.v1 ); + point.multiplyScalar( t ).add( this.v1 ); + + return point; + + }; + + // Line curve is linear, so we can overwrite default getPointAt + + LineCurve.prototype.getPointAt = function ( u ) { + + return this.getPoint( u ); + + }; + + LineCurve.prototype.getTangent = function( t ) { + + var tangent = this.v2.clone().sub( this.v1 ); + + return tangent.normalize(); + + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * + **/ + + /************************************************************** + * Curved Path - a curve path is simply a array of connected + * curves, but retains the api of a curve + **************************************************************/ + + function CurvePath() { + + this.curves = []; + + this.autoClose = false; // Automatically closes the path + + } + + CurvePath.prototype = Object.assign( Object.create( Curve.prototype ), { + + constructor: CurvePath, + + add: function ( curve ) { + + this.curves.push( curve ); + + }, + + closePath: function () { + + // Add a line curve if start and end of lines are not connected + var startPoint = this.curves[ 0 ].getPoint( 0 ); + var endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 ); + + if ( ! startPoint.equals( endPoint ) ) { + + this.curves.push( new LineCurve( endPoint, startPoint ) ); + + } + + }, + + // To get accurate point with reference to + // entire path distance at time t, + // following has to be done: + + // 1. Length of each sub path have to be known + // 2. Locate and identify type of curve + // 3. Get t for the curve + // 4. Return curve.getPointAt(t') + + getPoint: function ( t ) { + + var d = t * this.getLength(); + var curveLengths = this.getCurveLengths(); + var i = 0; + + // To think about boundaries points. + + while ( i < curveLengths.length ) { + + if ( curveLengths[ i ] >= d ) { + + var diff = curveLengths[ i ] - d; + var curve = this.curves[ i ]; + + var segmentLength = curve.getLength(); + var u = segmentLength === 0 ? 0 : 1 - diff / segmentLength; + + return curve.getPointAt( u ); + + } + + i ++; + + } + + return null; + + // loop where sum != 0, sum > d , sum+1 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) { + + points.push( points[ 0 ] ); + + } + + return points; + + }, + + /************************************************************** + * Create Geometries Helpers + **************************************************************/ + + /// Generate geometry from path points (for Line or Points objects) + + createPointsGeometry: function ( divisions ) { + + var pts = this.getPoints( divisions ); + return this.createGeometry( pts ); + + }, + + // Generate geometry from equidistant sampling along the path + + createSpacedPointsGeometry: function ( divisions ) { + + var pts = this.getSpacedPoints( divisions ); + return this.createGeometry( pts ); + + }, + + createGeometry: function ( points ) { + + var geometry = new Geometry(); + + for ( var i = 0, l = points.length; i < l; i ++ ) { + + var point = points[ i ]; + geometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) ); + + } + + return geometry; + + } + + } ); + + /************************************************************** + * Ellipse curve + **************************************************************/ + + function EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + this.aX = aX; + this.aY = aY; + + this.xRadius = xRadius; + this.yRadius = yRadius; + + this.aStartAngle = aStartAngle; + this.aEndAngle = aEndAngle; + + this.aClockwise = aClockwise; + + this.aRotation = aRotation || 0; + + } + + EllipseCurve.prototype = Object.create( Curve.prototype ); + EllipseCurve.prototype.constructor = EllipseCurve; + + EllipseCurve.prototype.isEllipseCurve = true; + + EllipseCurve.prototype.getPoint = function( t ) { + + var twoPi = Math.PI * 2; + var deltaAngle = this.aEndAngle - this.aStartAngle; + var samePoints = Math.abs( deltaAngle ) < Number.EPSILON; + + // ensures that deltaAngle is 0 .. 2 PI + while ( deltaAngle < 0 ) deltaAngle += twoPi; + while ( deltaAngle > twoPi ) deltaAngle -= twoPi; + + if ( deltaAngle < Number.EPSILON ) { + + if ( samePoints ) { + + deltaAngle = 0; + + } else { + + deltaAngle = twoPi; + + } + + } + + if ( this.aClockwise === true && ! samePoints ) { + + if ( deltaAngle === twoPi ) { + + deltaAngle = - twoPi; + + } else { + + deltaAngle = deltaAngle - twoPi; + + } + + } + + var angle = this.aStartAngle + t * deltaAngle; + var x = this.aX + this.xRadius * Math.cos( angle ); + var y = this.aY + this.yRadius * Math.sin( angle ); + + if ( this.aRotation !== 0 ) { + + var cos = Math.cos( this.aRotation ); + var sin = Math.sin( this.aRotation ); + + var tx = x - this.aX; + var ty = y - this.aY; + + // Rotate the point about the center of the ellipse. + x = tx * cos - ty * sin + this.aX; + y = tx * sin + ty * cos + this.aY; + + } + + return new Vector2( x, y ); + + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + */ + + var CurveUtils = { + + tangentQuadraticBezier: function ( t, p0, p1, p2 ) { + + return 2 * ( 1 - t ) * ( p1 - p0 ) + 2 * t * ( p2 - p1 ); + + }, + + // Puay Bing, thanks for helping with this derivative! + + tangentCubicBezier: function ( t, p0, p1, p2, p3 ) { + + return - 3 * p0 * ( 1 - t ) * ( 1 - t ) + + 3 * p1 * ( 1 - t ) * ( 1 - t ) - 6 * t * p1 * ( 1 - t ) + + 6 * t * p2 * ( 1 - t ) - 3 * t * t * p2 + + 3 * t * t * p3; + + }, + + tangentSpline: function ( t, p0, p1, p2, p3 ) { + + // To check if my formulas are correct + + var h00 = 6 * t * t - 6 * t; // derived from 2t^3 − 3t^2 + 1 + var h10 = 3 * t * t - 4 * t + 1; // t^3 − 2t^2 + t + var h01 = - 6 * t * t + 6 * t; // − 2t3 + 3t2 + var h11 = 3 * t * t - 2 * t; // t3 − t2 + + return h00 + h10 + h01 + h11; + + }, + + // Catmull-Rom + + interpolate: function( p0, p1, p2, p3, t ) { + + var v0 = ( p2 - p0 ) * 0.5; + var v1 = ( p3 - p1 ) * 0.5; + var t2 = t * t; + var t3 = t * t2; + return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; + + } + + }; + + /************************************************************** + * Spline curve + **************************************************************/ + + function SplineCurve( points /* array of Vector2 */ ) { + + this.points = ( points === undefined ) ? [] : points; + + } + + SplineCurve.prototype = Object.create( Curve.prototype ); + SplineCurve.prototype.constructor = SplineCurve; + + SplineCurve.prototype.isSplineCurve = true; + + SplineCurve.prototype.getPoint = function ( t ) { + + var points = this.points; + var point = ( points.length - 1 ) * t; + + var intPoint = Math.floor( point ); + var weight = point - intPoint; + + var point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ]; + var point1 = points[ intPoint ]; + var point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + var point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + var interpolate = CurveUtils.interpolate; + + return new Vector2( + interpolate( point0.x, point1.x, point2.x, point3.x, weight ), + interpolate( point0.y, point1.y, point2.y, point3.y, weight ) + ); + + }; + + /************************************************************** + * Cubic Bezier curve + **************************************************************/ + + function CubicBezierCurve( v0, v1, v2, v3 ) { + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + + } + + CubicBezierCurve.prototype = Object.create( Curve.prototype ); + CubicBezierCurve.prototype.constructor = CubicBezierCurve; + + CubicBezierCurve.prototype.getPoint = function ( t ) { + + var b3 = ShapeUtils.b3; + + return new Vector2( + b3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ), + b3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ) + ); + + }; + + CubicBezierCurve.prototype.getTangent = function( t ) { + + var tangentCubicBezier = CurveUtils.tangentCubicBezier; + + return new Vector2( + tangentCubicBezier( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ), + tangentCubicBezier( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ) + ).normalize(); + + }; + + /************************************************************** + * Quadratic Bezier curve + **************************************************************/ + + + function QuadraticBezierCurve( v0, v1, v2 ) { + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + + } + + QuadraticBezierCurve.prototype = Object.create( Curve.prototype ); + QuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve; + + + QuadraticBezierCurve.prototype.getPoint = function ( t ) { + + var b2 = ShapeUtils.b2; + + return new Vector2( + b2( t, this.v0.x, this.v1.x, this.v2.x ), + b2( t, this.v0.y, this.v1.y, this.v2.y ) + ); + + }; + + + QuadraticBezierCurve.prototype.getTangent = function( t ) { + + var tangentQuadraticBezier = CurveUtils.tangentQuadraticBezier; + + return new Vector2( + tangentQuadraticBezier( t, this.v0.x, this.v1.x, this.v2.x ), + tangentQuadraticBezier( t, this.v0.y, this.v1.y, this.v2.y ) + ).normalize(); + + }; + + var PathPrototype = Object.assign( Object.create( CurvePath.prototype ), { + + fromPoints: function ( vectors ) { + + this.moveTo( vectors[ 0 ].x, vectors[ 0 ].y ); + + for ( var i = 1, l = vectors.length; i < l; i ++ ) { + + this.lineTo( vectors[ i ].x, vectors[ i ].y ); + + } + + }, + + moveTo: function ( x, y ) { + + this.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying? + + }, + + lineTo: function ( x, y ) { + + var curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) ); + this.curves.push( curve ); + + this.currentPoint.set( x, y ); + + }, + + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + + var curve = new QuadraticBezierCurve( + this.currentPoint.clone(), + new Vector2( aCPx, aCPy ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + + var curve = new CubicBezierCurve( + this.currentPoint.clone(), + new Vector2( aCP1x, aCP1y ), + new Vector2( aCP2x, aCP2y ), + new Vector2( aX, aY ) + ); + + this.curves.push( curve ); + + this.currentPoint.set( aX, aY ); + + }, + + splineThru: function ( pts /*Array of Vector*/ ) { + + var npts = [ this.currentPoint.clone() ].concat( pts ); + + var curve = new SplineCurve( npts ); + this.curves.push( curve ); + + this.currentPoint.copy( pts[ pts.length - 1 ] ); + + }, + + arc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absarc( aX + x0, aY + y0, aRadius, + aStartAngle, aEndAngle, aClockwise ); + + }, + + absarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + this.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + }, + + ellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var x0 = this.currentPoint.x; + var y0 = this.currentPoint.y; + + this.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + }, + + absellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { + + var curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ); + + if ( this.curves.length > 0 ) { + + // if a previous curve is present, attempt to join + var firstPoint = curve.getPoint( 0 ); + + if ( ! firstPoint.equals( this.currentPoint ) ) { + + this.lineTo( firstPoint.x, firstPoint.y ); + + } + + } + + this.curves.push( curve ); + + var lastPoint = curve.getPoint( 1 ); + this.currentPoint.copy( lastPoint ); + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Defines a 2d shape plane using paths. + **/ + + // STEP 1 Create a path. + // STEP 2 Turn path into shape. + // STEP 3 ExtrudeGeometry takes in Shape/Shapes + // STEP 3a - Extract points from each shape, turn to vertices + // STEP 3b - Triangulate each shape, add faces. + + function Shape() { + + Path.apply( this, arguments ); + + this.holes = []; + + } + + Shape.prototype = Object.assign( Object.create( PathPrototype ), { + + constructor: Shape, + + getPointsHoles: function ( divisions ) { + + var holesPts = []; + + for ( var i = 0, l = this.holes.length; i < l; i ++ ) { + + holesPts[ i ] = this.holes[ i ].getPoints( divisions ); + + } + + return holesPts; + + }, + + // Get points of shape and holes (keypoints based on segments parameter) + + extractAllPoints: function ( divisions ) { + + return { + + shape: this.getPoints( divisions ), + holes: this.getPointsHoles( divisions ) + + }; + + }, + + extractPoints: function ( divisions ) { + + return this.extractAllPoints( divisions ); + + } + + } ); + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * Creates free form 2d path using series of points, lines or curves. + * + **/ + + function Path( points ) { + + CurvePath.call( this ); + this.currentPoint = new Vector2(); + + if ( points ) { + + this.fromPoints( points ); + + } + + } + + Path.prototype = PathPrototype; + PathPrototype.constructor = Path; + + + // minimal class for proxing functions to Path. Replaces old "extractSubpaths()" + function ShapePath() { + this.subPaths = []; + this.currentPath = null; + } + + ShapePath.prototype = { + moveTo: function ( x, y ) { + this.currentPath = new Path(); + this.subPaths.push(this.currentPath); + this.currentPath.moveTo( x, y ); + }, + lineTo: function ( x, y ) { + this.currentPath.lineTo( x, y ); + }, + quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { + this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY ); + }, + bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { + this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ); + }, + splineThru: function ( pts ) { + this.currentPath.splineThru( pts ); + }, + + toShapes: function ( isCCW, noHoles ) { + + function toShapesNoHoles( inSubpaths ) { + + var shapes = []; + + for ( var i = 0, l = inSubpaths.length; i < l; i ++ ) { + + var tmpPath = inSubpaths[ i ]; + + var tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + + shapes.push( tmpShape ); + + } + + return shapes; + + } + + function isPointInsidePolygon( inPt, inPolygon ) { + + var polyLen = inPolygon.length; + + // inPt on polygon contour => immediate success or + // toggling of inside/outside at every single! intersection point of an edge + // with the horizontal line through inPt, left of inPt + // not counting lowerY endpoints of edges and whole edges on that line + var inside = false; + for ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) { + + var edgeLowPt = inPolygon[ p ]; + var edgeHighPt = inPolygon[ q ]; + + var edgeDx = edgeHighPt.x - edgeLowPt.x; + var edgeDy = edgeHighPt.y - edgeLowPt.y; + + if ( Math.abs( edgeDy ) > Number.EPSILON ) { + + // not parallel + if ( edgeDy < 0 ) { + + edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx; + edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy; + + } + if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue; + + if ( inPt.y === edgeLowPt.y ) { + + if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ? + // continue; // no intersection or edgeLowPt => doesn't count !!! + + } else { + + var perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y ); + if ( perpEdge === 0 ) return true; // inPt is on contour ? + if ( perpEdge < 0 ) continue; + inside = ! inside; // true intersection left of inPt + + } + + } else { + + // parallel or collinear + if ( inPt.y !== edgeLowPt.y ) continue; // parallel + // edge lies on the same horizontal line as inPt + if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) || + ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour ! + // continue; + + } + + } + + return inside; + + } + + var isClockWise = ShapeUtils.isClockWise; + + var subPaths = this.subPaths; + if ( subPaths.length === 0 ) return []; + + if ( noHoles === true ) return toShapesNoHoles( subPaths ); + + + var solid, tmpPath, tmpShape, shapes = []; + + if ( subPaths.length === 1 ) { + + tmpPath = subPaths[ 0 ]; + tmpShape = new Shape(); + tmpShape.curves = tmpPath.curves; + shapes.push( tmpShape ); + return shapes; + + } + + var holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() ); + holesFirst = isCCW ? ! holesFirst : holesFirst; + + // console.log("Holes first", holesFirst); + + var betterShapeHoles = []; + var newShapes = []; + var newShapeHoles = []; + var mainIdx = 0; + var tmpPoints; + + newShapes[ mainIdx ] = undefined; + newShapeHoles[ mainIdx ] = []; + + for ( var i = 0, l = subPaths.length; i < l; i ++ ) { + + tmpPath = subPaths[ i ]; + tmpPoints = tmpPath.getPoints(); + solid = isClockWise( tmpPoints ); + solid = isCCW ? ! solid : solid; + + if ( solid ) { + + if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++; + + newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints }; + newShapes[ mainIdx ].s.curves = tmpPath.curves; + + if ( holesFirst ) mainIdx ++; + newShapeHoles[ mainIdx ] = []; + + //console.log('cw', i); + + } else { + + newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } ); + + //console.log('ccw', i); + + } + + } + + // only Holes? -> probably all Shapes with wrong orientation + if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths ); + + + if ( newShapes.length > 1 ) { + + var ambiguous = false; + var toChange = []; + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + betterShapeHoles[ sIdx ] = []; + + } + + for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { + + var sho = newShapeHoles[ sIdx ]; + + for ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) { + + var ho = sho[ hIdx ]; + var hole_unassigned = true; + + for ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) { + + if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) { + + if ( sIdx !== s2Idx ) toChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } ); + if ( hole_unassigned ) { + + hole_unassigned = false; + betterShapeHoles[ s2Idx ].push( ho ); + + } else { + + ambiguous = true; + + } + + } + + } + if ( hole_unassigned ) { + + betterShapeHoles[ sIdx ].push( ho ); + + } + + } + + } + // console.log("ambiguous: ", ambiguous); + if ( toChange.length > 0 ) { + + // console.log("to change: ", toChange); + if ( ! ambiguous ) newShapeHoles = betterShapeHoles; + + } + + } + + var tmpHoles; + + for ( var i = 0, il = newShapes.length; i < il; i ++ ) { + + tmpShape = newShapes[ i ].s; + shapes.push( tmpShape ); + tmpHoles = newShapeHoles[ i ]; + + for ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) { + + tmpShape.holes.push( tmpHoles[ j ].h ); + + } + + } + + //console.log("shape", shapes); + + return shapes; + + } + }; + + /** + * @author zz85 / http://www.lab4games.net/zz85/blog + * @author mrdoob / http://mrdoob.com/ + */ + + function Font( data ) { + + this.data = data; + + } + + Object.assign( Font.prototype, { + + isFont: true, + + generateShapes: function ( text, size, divisions ) { + + function createPaths( text ) { + + var chars = String( text ).split( '' ); + var scale = size / data.resolution; + var offset = 0; + + var paths = []; + + for ( var i = 0; i < chars.length; i ++ ) { + + var ret = createPath( chars[ i ], scale, offset ); + offset += ret.offset; + + paths.push( ret.path ); + + } + + return paths; + + } + + function createPath( c, scale, offset ) { + + var glyph = data.glyphs[ c ] || data.glyphs[ '?' ]; + + if ( ! glyph ) return; + + var path = new ShapePath(); + + var pts = [], b2 = ShapeUtils.b2, b3 = ShapeUtils.b3; + var x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste; + + if ( glyph.o ) { + + var outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) ); + + for ( var i = 0, l = outline.length; i < l; ) { + + var action = outline[ i ++ ]; + + switch ( action ) { + + case 'm': // moveTo + + x = outline[ i ++ ] * scale + offset; + y = outline[ i ++ ] * scale; + + path.moveTo( x, y ); + + break; + + case 'l': // lineTo + + x = outline[ i ++ ] * scale + offset; + y = outline[ i ++ ] * scale; + + path.lineTo( x, y ); + + break; + + case 'q': // quadraticCurveTo + + cpx = outline[ i ++ ] * scale + offset; + cpy = outline[ i ++ ] * scale; + cpx1 = outline[ i ++ ] * scale + offset; + cpy1 = outline[ i ++ ] * scale; + + path.quadraticCurveTo( cpx1, cpy1, cpx, cpy ); + + laste = pts[ pts.length - 1 ]; + + if ( laste ) { + + cpx0 = laste.x; + cpy0 = laste.y; + + for ( var i2 = 1; i2 <= divisions; i2 ++ ) { + + var t = i2 / divisions; + b2( t, cpx0, cpx1, cpx ); + b2( t, cpy0, cpy1, cpy ); + + } + + } + + break; + + case 'b': // bezierCurveTo + + cpx = outline[ i ++ ] * scale + offset; + cpy = outline[ i ++ ] * scale; + cpx1 = outline[ i ++ ] * scale + offset; + cpy1 = outline[ i ++ ] * scale; + cpx2 = outline[ i ++ ] * scale + offset; + cpy2 = outline[ i ++ ] * scale; + + path.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy ); + + laste = pts[ pts.length - 1 ]; + + if ( laste ) { + + cpx0 = laste.x; + cpy0 = laste.y; + + for ( var i2 = 1; i2 <= divisions; i2 ++ ) { + + var t = i2 / divisions; + b3( t, cpx0, cpx1, cpx2, cpx ); + b3( t, cpy0, cpy1, cpy2, cpy ); + + } + + } + + break; + + } + + } + + } + + return { offset: glyph.ha * scale, path: path }; + + } + + // + + if ( size === undefined ) size = 100; + if ( divisions === undefined ) divisions = 4; + + var data = this.data; + + var paths = createPaths( text ); + var shapes = []; + + for ( var p = 0, pl = paths.length; p < pl; p ++ ) { + + Array.prototype.push.apply( shapes, paths[ p ].toShapes() ); + + } + + return shapes; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function FontLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( FontLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new XHRLoader( this.manager ); + loader.load( url, function ( text ) { + + var json; + + try { + + json = JSON.parse( text ); + + } catch ( e ) { + + console.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' ); + json = JSON.parse( text.substring( 65, text.length - 2 ) ); + + } + + var font = scope.parse( json ); + + if ( onLoad ) onLoad( font ); + + }, onProgress, onError ); + + }, + + parse: function ( json ) { + + return new Font( json ); + + } + + } ); + + var context; + + function getAudioContext() { + + if ( context === undefined ) { + + context = new ( window.AudioContext || window.webkitAudioContext )(); + + } + + return context; + + } + + /** + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function AudioLoader( manager ) { + + this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; + + } + + Object.assign( AudioLoader.prototype, { + + load: function ( url, onLoad, onProgress, onError ) { + + var loader = new XHRLoader( this.manager ); + loader.setResponseType( 'arraybuffer' ); + loader.load( url, function ( buffer ) { + + var context = getAudioContext(); + + context.decodeAudioData( buffer, function ( audioBuffer ) { + + onLoad( audioBuffer ); + + } ); + + }, onProgress, onError ); + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function StereoCamera() { + + this.type = 'StereoCamera'; + + this.aspect = 1; + + this.eyeSep = 0.064; + + this.cameraL = new PerspectiveCamera(); + this.cameraL.layers.enable( 1 ); + this.cameraL.matrixAutoUpdate = false; + + this.cameraR = new PerspectiveCamera(); + this.cameraR.layers.enable( 2 ); + this.cameraR.matrixAutoUpdate = false; + + } + + Object.assign( StereoCamera.prototype, { + + update: ( function () { + + var instance, focus, fov, aspect, near, far, zoom; + + var eyeRight = new Matrix4(); + var eyeLeft = new Matrix4(); + + return function update( camera ) { + + var needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov || + aspect !== camera.aspect * this.aspect || near !== camera.near || + far !== camera.far || zoom !== camera.zoom; + + if ( needsUpdate ) { + + instance = this; + focus = camera.focus; + fov = camera.fov; + aspect = camera.aspect * this.aspect; + near = camera.near; + far = camera.far; + zoom = camera.zoom; + + // Off-axis stereoscopic effect based on + // http://paulbourke.net/stereographics/stereorender/ + + var projectionMatrix = camera.projectionMatrix.clone(); + var eyeSep = this.eyeSep / 2; + var eyeSepOnProjection = eyeSep * near / focus; + var ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom; + var xmin, xmax; + + // translate xOffset + + eyeLeft.elements[ 12 ] = - eyeSep; + eyeRight.elements[ 12 ] = eyeSep; + + // for left eye + + xmin = - ymax * aspect + eyeSepOnProjection; + xmax = ymax * aspect + eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraL.projectionMatrix.copy( projectionMatrix ); + + // for right eye + + xmin = - ymax * aspect - eyeSepOnProjection; + xmax = ymax * aspect - eyeSepOnProjection; + + projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin ); + projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); + + this.cameraR.projectionMatrix.copy( projectionMatrix ); + + } + + this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft ); + this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight ); + + }; + + } )() + + } ); + + /** + * Camera for rendering cube maps + * - renders scene into axis-aligned cube + * + * @author alteredq / http://alteredqualia.com/ + */ + + function CubeCamera( near, far, cubeResolution ) { + + Object3D.call( this ); + + this.type = 'CubeCamera'; + + var fov = 90, aspect = 1; + + var cameraPX = new PerspectiveCamera( fov, aspect, near, far ); + cameraPX.up.set( 0, - 1, 0 ); + cameraPX.lookAt( new Vector3( 1, 0, 0 ) ); + this.add( cameraPX ); + + var cameraNX = new PerspectiveCamera( fov, aspect, near, far ); + cameraNX.up.set( 0, - 1, 0 ); + cameraNX.lookAt( new Vector3( - 1, 0, 0 ) ); + this.add( cameraNX ); + + var cameraPY = new PerspectiveCamera( fov, aspect, near, far ); + cameraPY.up.set( 0, 0, 1 ); + cameraPY.lookAt( new Vector3( 0, 1, 0 ) ); + this.add( cameraPY ); + + var cameraNY = new PerspectiveCamera( fov, aspect, near, far ); + cameraNY.up.set( 0, 0, - 1 ); + cameraNY.lookAt( new Vector3( 0, - 1, 0 ) ); + this.add( cameraNY ); + + var cameraPZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraPZ.up.set( 0, - 1, 0 ); + cameraPZ.lookAt( new Vector3( 0, 0, 1 ) ); + this.add( cameraPZ ); + + var cameraNZ = new PerspectiveCamera( fov, aspect, near, far ); + cameraNZ.up.set( 0, - 1, 0 ); + cameraNZ.lookAt( new Vector3( 0, 0, - 1 ) ); + this.add( cameraNZ ); + + var options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter }; + + this.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options ); + + this.updateCubeMap = function ( renderer, scene ) { + + if ( this.parent === null ) this.updateMatrixWorld(); + + var renderTarget = this.renderTarget; + var generateMipmaps = renderTarget.texture.generateMipmaps; + + renderTarget.texture.generateMipmaps = false; + + renderTarget.activeCubeFace = 0; + renderer.render( scene, cameraPX, renderTarget ); + + renderTarget.activeCubeFace = 1; + renderer.render( scene, cameraNX, renderTarget ); + + renderTarget.activeCubeFace = 2; + renderer.render( scene, cameraPY, renderTarget ); + + renderTarget.activeCubeFace = 3; + renderer.render( scene, cameraNY, renderTarget ); + + renderTarget.activeCubeFace = 4; + renderer.render( scene, cameraPZ, renderTarget ); + + renderTarget.texture.generateMipmaps = generateMipmaps; + + renderTarget.activeCubeFace = 5; + renderer.render( scene, cameraNZ, renderTarget ); + + renderer.setRenderTarget( null ); + + }; + + } + + CubeCamera.prototype = Object.create( Object3D.prototype ); + CubeCamera.prototype.constructor = CubeCamera; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioListener() { + + Object3D.call( this ); + + this.type = 'AudioListener'; + + this.context = getAudioContext(); + + this.gain = this.context.createGain(); + this.gain.connect( this.context.destination ); + + this.filter = null; + + } + + AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: AudioListener, + + getInput: function () { + + return this.gain; + + }, + + removeFilter: function ( ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + this.gain.connect( this.context.destination ); + this.filter = null; + + } + + }, + + getFilter: function () { + + return this.filter; + + }, + + setFilter: function ( value ) { + + if ( this.filter !== null ) { + + this.gain.disconnect( this.filter ); + this.filter.disconnect( this.context.destination ); + + } else { + + this.gain.disconnect( this.context.destination ); + + } + + this.filter = value; + this.gain.connect( this.filter ); + this.filter.connect( this.context.destination ); + + }, + + getMasterVolume: function () { + + return this.gain.gain.value; + + }, + + setMasterVolume: function ( value ) { + + this.gain.gain.value = value; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + var quaternion = new Quaternion(); + var scale = new Vector3(); + + var orientation = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + var listener = this.context.listener; + var up = this.up; + + this.matrixWorld.decompose( position, quaternion, scale ); + + orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion ); + + listener.setPosition( position.x, position.y, position.z ); + listener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z ); + + }; + + } )() + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + * @author Reece Aaron Lecrivain / http://reecenotes.com/ + */ + + function Audio( listener ) { + + Object3D.call( this ); + + this.type = 'Audio'; + + this.context = listener.context; + this.source = this.context.createBufferSource(); + this.source.onended = this.onEnded.bind( this ); + + this.gain = this.context.createGain(); + this.gain.connect( listener.getInput() ); + + this.autoplay = false; + + this.startTime = 0; + this.playbackRate = 1; + this.isPlaying = false; + this.hasPlaybackControl = true; + this.sourceType = 'empty'; + + this.filters = []; + + } + + Audio.prototype = Object.assign( Object.create( Object3D.prototype ), { + + constructor: Audio, + + getOutput: function () { + + return this.gain; + + }, + + setNodeSource: function ( audioNode ) { + + this.hasPlaybackControl = false; + this.sourceType = 'audioNode'; + this.source = audioNode; + this.connect(); + + return this; + + }, + + setBuffer: function ( audioBuffer ) { + + this.source.buffer = audioBuffer; + this.sourceType = 'buffer'; + + if ( this.autoplay ) this.play(); + + return this; + + }, + + play: function () { + + if ( this.isPlaying === true ) { + + console.warn( 'THREE.Audio: Audio is already playing.' ); + return; + + } + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + var source = this.context.createBufferSource(); + + source.buffer = this.source.buffer; + source.loop = this.source.loop; + source.onended = this.source.onended; + source.start( 0, this.startTime ); + source.playbackRate.value = this.playbackRate; + + this.isPlaying = true; + + this.source = source; + + return this.connect(); + + }, + + pause: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.source.stop(); + this.startTime = this.context.currentTime; + this.isPlaying = false; + + return this; + + }, + + stop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.source.stop(); + this.startTime = 0; + this.isPlaying = false; + + return this; + + }, + + connect: function () { + + if ( this.filters.length > 0 ) { + + this.source.connect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].connect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].connect( this.getOutput() ); + + } else { + + this.source.connect( this.getOutput() ); + + } + + return this; + + }, + + disconnect: function () { + + if ( this.filters.length > 0 ) { + + this.source.disconnect( this.filters[ 0 ] ); + + for ( var i = 1, l = this.filters.length; i < l; i ++ ) { + + this.filters[ i - 1 ].disconnect( this.filters[ i ] ); + + } + + this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() ); + + } else { + + this.source.disconnect( this.getOutput() ); + + } + + return this; + + }, + + getFilters: function () { + + return this.filters; + + }, + + setFilters: function ( value ) { + + if ( ! value ) value = []; + + if ( this.isPlaying === true ) { + + this.disconnect(); + this.filters = value; + this.connect(); + + } else { + + this.filters = value; + + } + + return this; + + }, + + getFilter: function () { + + return this.getFilters()[ 0 ]; + + }, + + setFilter: function ( filter ) { + + return this.setFilters( filter ? [ filter ] : [] ); + + }, + + setPlaybackRate: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.playbackRate = value; + + if ( this.isPlaying === true ) { + + this.source.playbackRate.value = this.playbackRate; + + } + + return this; + + }, + + getPlaybackRate: function () { + + return this.playbackRate; + + }, + + onEnded: function () { + + this.isPlaying = false; + + }, + + getLoop: function () { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return false; + + } + + return this.source.loop; + + }, + + setLoop: function ( value ) { + + if ( this.hasPlaybackControl === false ) { + + console.warn( 'THREE.Audio: this Audio has no playback control.' ); + return; + + } + + this.source.loop = value; + + }, + + getVolume: function () { + + return this.gain.gain.value; + + }, + + + setVolume: function ( value ) { + + this.gain.gain.value = value; + + return this; + + } + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function PositionalAudio( listener ) { + + Audio.call( this, listener ); + + this.panner = this.context.createPanner(); + this.panner.connect( this.gain ); + + } + + PositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), { + + constructor: PositionalAudio, + + getOutput: function () { + + return this.panner; + + }, + + getRefDistance: function () { + + return this.panner.refDistance; + + }, + + setRefDistance: function ( value ) { + + this.panner.refDistance = value; + + }, + + getRolloffFactor: function () { + + return this.panner.rolloffFactor; + + }, + + setRolloffFactor: function ( value ) { + + this.panner.rolloffFactor = value; + + }, + + getDistanceModel: function () { + + return this.panner.distanceModel; + + }, + + setDistanceModel: function ( value ) { + + this.panner.distanceModel = value; + + }, + + getMaxDistance: function () { + + return this.panner.maxDistance; + + }, + + setMaxDistance: function ( value ) { + + this.panner.maxDistance = value; + + }, + + updateMatrixWorld: ( function () { + + var position = new Vector3(); + + return function updateMatrixWorld( force ) { + + Object3D.prototype.updateMatrixWorld.call( this, force ); + + position.setFromMatrixPosition( this.matrixWorld ); + + this.panner.setPosition( position.x, position.y, position.z ); + + }; + + } )() + + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function AudioAnalyser( audio, fftSize ) { + + this.analyser = audio.context.createAnalyser(); + this.analyser.fftSize = fftSize !== undefined ? fftSize : 2048; + + this.data = new Uint8Array( this.analyser.frequencyBinCount ); + + audio.getOutput().connect( this.analyser ); + + } + + Object.assign( AudioAnalyser.prototype, { + + getFrequencyData: function () { + + this.analyser.getByteFrequencyData( this.data ); + + return this.data; + + }, + + getAverageFrequency: function () { + + var value = 0, data = this.getFrequencyData(); + + for ( var i = 0; i < data.length; i ++ ) { + + value += data[ i ]; + + } + + return value / data.length; + + } + + } ); + + /** + * + * Buffered scene graph property that allows weighted accumulation. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function PropertyMixer( binding, typeName, valueSize ) { + + this.binding = binding; + this.valueSize = valueSize; + + var bufferType = Float64Array, + mixFunction; + + switch ( typeName ) { + + case 'quaternion': mixFunction = this._slerp; break; + + case 'string': + case 'bool': + + bufferType = Array, mixFunction = this._select; break; + + default: mixFunction = this._lerp; + + } + + this.buffer = new bufferType( valueSize * 4 ); + // layout: [ incoming | accu0 | accu1 | orig ] + // + // interpolators can use .buffer as their .result + // the data then goes to 'incoming' + // + // 'accu0' and 'accu1' are used frame-interleaved for + // the cumulative result and are compared to detect + // changes + // + // 'orig' stores the original state of the property + + this._mixBufferRegion = mixFunction; + + this.cumulativeWeight = 0; + + this.useCount = 0; + this.referenceCount = 0; + + } + + PropertyMixer.prototype = { + + constructor: PropertyMixer, + + // accumulate data in the 'incoming' region into 'accu' + accumulate: function( accuIndex, weight ) { + + // note: happily accumulating nothing when weight = 0, the caller knows + // the weight and shouldn't have made the call in the first place + + var buffer = this.buffer, + stride = this.valueSize, + offset = accuIndex * stride + stride, + + currentWeight = this.cumulativeWeight; + + if ( currentWeight === 0 ) { + + // accuN := incoming * weight + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ offset + i ] = buffer[ i ]; + + } + + currentWeight = weight; + + } else { + + // accuN := accuN + incoming * weight + + currentWeight += weight; + var mix = weight / currentWeight; + this._mixBufferRegion( buffer, offset, 0, mix, stride ); + + } + + this.cumulativeWeight = currentWeight; + + }, + + // apply the state of 'accu' to the binding when accus differ + apply: function( accuIndex ) { + + var stride = this.valueSize, + buffer = this.buffer, + offset = accuIndex * stride + stride, + + weight = this.cumulativeWeight, + + binding = this.binding; + + this.cumulativeWeight = 0; + + if ( weight < 1 ) { + + // accuN := accuN + original * ( 1 - cumulativeWeight ) + + var originalValueOffset = stride * 3; + + this._mixBufferRegion( + buffer, offset, originalValueOffset, 1 - weight, stride ); + + } + + for ( var i = stride, e = stride + stride; i !== e; ++ i ) { + + if ( buffer[ i ] !== buffer[ i + stride ] ) { + + // value has changed -> update scene graph + + binding.setValue( buffer, offset ); + break; + + } + + } + + }, + + // remember the state of the bound property and copy it to both accus + saveOriginalState: function() { + + var binding = this.binding; + + var buffer = this.buffer, + stride = this.valueSize, + + originalValueOffset = stride * 3; + + binding.getValue( buffer, originalValueOffset ); + + // accu[0..1] := orig -- initially detect changes against the original + for ( var i = stride, e = originalValueOffset; i !== e; ++ i ) { + + buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ]; + + } + + this.cumulativeWeight = 0; + + }, + + // apply the state previously taken via 'saveOriginalState' to the binding + restoreOriginalState: function() { + + var originalValueOffset = this.valueSize * 3; + this.binding.setValue( this.buffer, originalValueOffset ); + + }, + + + // mix functions + + _select: function( buffer, dstOffset, srcOffset, t, stride ) { + + if ( t >= 0.5 ) { + + for ( var i = 0; i !== stride; ++ i ) { + + buffer[ dstOffset + i ] = buffer[ srcOffset + i ]; + + } + + } + + }, + + _slerp: function( buffer, dstOffset, srcOffset, t, stride ) { + + Quaternion.slerpFlat( buffer, dstOffset, + buffer, dstOffset, buffer, srcOffset, t ); + + }, + + _lerp: function( buffer, dstOffset, srcOffset, t, stride ) { + + var s = 1 - t; + + for ( var i = 0; i !== stride; ++ i ) { + + var j = dstOffset + i; + + buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t; + + } + + } + + }; + + /** + * + * A reference to a real property in the scene graph. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function PropertyBinding( rootNode, path, parsedPath ) { + + this.path = path; + this.parsedPath = parsedPath || + PropertyBinding.parseTrackName( path ); + + this.node = PropertyBinding.findNode( + rootNode, this.parsedPath.nodeName ) || rootNode; + + this.rootNode = rootNode; + + } + + PropertyBinding.prototype = { + + constructor: PropertyBinding, + + getValue: function getValue_unbound( targetArray, offset ) { + + this.bind(); + this.getValue( targetArray, offset ); + + // Note: This class uses a State pattern on a per-method basis: + // 'bind' sets 'this.getValue' / 'setValue' and shadows the + // prototype version of these methods with one that represents + // the bound state. When the property is not found, the methods + // become no-ops. + + }, + + setValue: function getValue_unbound( sourceArray, offset ) { + + this.bind(); + this.setValue( sourceArray, offset ); + + }, + + // create getter / setter pair for a property in the scene graph + bind: function() { + + var targetObject = this.node, + parsedPath = this.parsedPath, + + objectName = parsedPath.objectName, + propertyName = parsedPath.propertyName, + propertyIndex = parsedPath.propertyIndex; + + if ( ! targetObject ) { + + targetObject = PropertyBinding.findNode( + this.rootNode, parsedPath.nodeName ) || this.rootNode; + + this.node = targetObject; + + } + + // set fail state so we can just 'return' on error + this.getValue = this._getValue_unavailable; + this.setValue = this._setValue_unavailable; + + // ensure there is a value node + if ( ! targetObject ) { + + console.error( " trying to update node for track: " + this.path + " but it wasn't found." ); + return; + + } + + if ( objectName ) { + + var objectIndex = parsedPath.objectIndex; + + // special cases were we need to reach deeper into the hierarchy to get the face materials.... + switch ( objectName ) { + + case 'materials': + + if ( ! targetObject.material ) { + + console.error( ' can not bind to material as node does not have a material', this ); + return; + + } + + if ( ! targetObject.material.materials ) { + + console.error( ' can not bind to material.materials as node.material does not have a materials array', this ); + return; + + } + + targetObject = targetObject.material.materials; + + break; + + case 'bones': + + if ( ! targetObject.skeleton ) { + + console.error( ' can not bind to bones as node does not have a skeleton', this ); + return; + + } + + // potential future optimization: skip this if propertyIndex is already an integer + // and convert the integer string to a true integer. + + targetObject = targetObject.skeleton.bones; + + // support resolving morphTarget names into indices. + for ( var i = 0; i < targetObject.length; i ++ ) { + + if ( targetObject[ i ].name === objectIndex ) { + + objectIndex = i; + break; + + } + + } + + break; + + default: + + if ( targetObject[ objectName ] === undefined ) { + + console.error( ' can not bind to objectName of node, undefined', this ); + return; + + } + + targetObject = targetObject[ objectName ]; + + } + + + if ( objectIndex !== undefined ) { + + if ( targetObject[ objectIndex ] === undefined ) { + + console.error( " trying to bind to objectIndex of objectName, but is undefined:", this, targetObject ); + return; + + } + + targetObject = targetObject[ objectIndex ]; + + } + + } + + // resolve property + var nodeProperty = targetObject[ propertyName ]; + + if ( nodeProperty === undefined ) { + + var nodeName = parsedPath.nodeName; + + console.error( " trying to update property for track: " + nodeName + + '.' + propertyName + " but it wasn't found.", targetObject ); + return; + + } + + // determine versioning scheme + var versioning = this.Versioning.None; + + if ( targetObject.needsUpdate !== undefined ) { // material + + versioning = this.Versioning.NeedsUpdate; + this.targetObject = targetObject; + + } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform + + versioning = this.Versioning.MatrixWorldNeedsUpdate; + this.targetObject = targetObject; + + } + + // determine how the property gets bound + var bindingType = this.BindingType.Direct; + + if ( propertyIndex !== undefined ) { + // access a sub element of the property array (only primitives are supported right now) + + if ( propertyName === "morphTargetInfluences" ) { + // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer. + + // support resolving morphTarget names into indices. + if ( ! targetObject.geometry ) { + + console.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this ); + return; + + } + + if ( ! targetObject.geometry.morphTargets ) { + + console.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this ); + return; + + } + + for ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) { + + if ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) { + + propertyIndex = i; + break; + + } + + } + + } + + bindingType = this.BindingType.ArrayElement; + + this.resolvedProperty = nodeProperty; + this.propertyIndex = propertyIndex; + + } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) { + // must use copy for Object3D.Euler/Quaternion + + bindingType = this.BindingType.HasFromToArray; + + this.resolvedProperty = nodeProperty; + + } else if ( nodeProperty.length !== undefined ) { + + bindingType = this.BindingType.EntireArray; + + this.resolvedProperty = nodeProperty; + + } else { + + this.propertyName = propertyName; + + } + + // select getter / setter + this.getValue = this.GetterByBindingType[ bindingType ]; + this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ]; + + }, + + unbind: function() { + + this.node = null; + + // back to the prototype version of getValue / setValue + // note: avoiding to mutate the shape of 'this' via 'delete' + this.getValue = this._getValue_unbound; + this.setValue = this._setValue_unbound; + + } + + }; + + Object.assign( PropertyBinding.prototype, { // prototype, continued + + // these are used to "bind" a nonexistent property + _getValue_unavailable: function() {}, + _setValue_unavailable: function() {}, + + // initial state of these methods that calls 'bind' + _getValue_unbound: PropertyBinding.prototype.getValue, + _setValue_unbound: PropertyBinding.prototype.setValue, + + BindingType: { + Direct: 0, + EntireArray: 1, + ArrayElement: 2, + HasFromToArray: 3 + }, + + Versioning: { + None: 0, + NeedsUpdate: 1, + MatrixWorldNeedsUpdate: 2 + }, + + GetterByBindingType: [ + + function getValue_direct( buffer, offset ) { + + buffer[ offset ] = this.node[ this.propertyName ]; + + }, + + function getValue_array( buffer, offset ) { + + var source = this.resolvedProperty; + + for ( var i = 0, n = source.length; i !== n; ++ i ) { + + buffer[ offset ++ ] = source[ i ]; + + } + + }, + + function getValue_arrayElement( buffer, offset ) { + + buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ]; + + }, + + function getValue_toArray( buffer, offset ) { + + this.resolvedProperty.toArray( buffer, offset ); + + } + + ], + + SetterByBindingTypeAndVersioning: [ + + [ + // Direct + + function setValue_direct( buffer, offset ) { + + this.node[ this.propertyName ] = buffer[ offset ]; + + }, + + function setValue_direct_setNeedsUpdate( buffer, offset ) { + + this.node[ this.propertyName ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.node[ this.propertyName ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // EntireArray + + function setValue_array( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + }, + + function setValue_array_setNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.needsUpdate = true; + + }, + + function setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) { + + var dest = this.resolvedProperty; + + for ( var i = 0, n = dest.length; i !== n; ++ i ) { + + dest[ i ] = buffer[ offset ++ ]; + + } + + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // ArrayElement + + function setValue_arrayElement( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + + }, + + function setValue_arrayElement_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.needsUpdate = true; + + }, + + function setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ], [ + + // HasToFromArray + + function setValue_fromArray( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + + }, + + function setValue_fromArray_setNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.needsUpdate = true; + + }, + + function setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) { + + this.resolvedProperty.fromArray( buffer, offset ); + this.targetObject.matrixWorldNeedsUpdate = true; + + } + + ] + + ] + + } ); + + PropertyBinding.Composite = + function( targetGroup, path, optionalParsedPath ) { + + var parsedPath = optionalParsedPath || + PropertyBinding.parseTrackName( path ); + + this._targetGroup = targetGroup; + this._bindings = targetGroup.subscribe_( path, parsedPath ); + + }; + + PropertyBinding.Composite.prototype = { + + constructor: PropertyBinding.Composite, + + getValue: function( array, offset ) { + + this.bind(); // bind all binding + + var firstValidIndex = this._targetGroup.nCachedObjects_, + binding = this._bindings[ firstValidIndex ]; + + // and only call .getValue on the first + if ( binding !== undefined ) binding.getValue( array, offset ); + + }, + + setValue: function( array, offset ) { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].setValue( array, offset ); + + } + + }, + + bind: function() { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].bind(); + + } + + }, + + unbind: function() { + + var bindings = this._bindings; + + for ( var i = this._targetGroup.nCachedObjects_, + n = bindings.length; i !== n; ++ i ) { + + bindings[ i ].unbind(); + + } + + } + + }; + + PropertyBinding.create = function( root, path, parsedPath ) { + + if ( ! ( (root && root.isAnimationObjectGroup) ) ) { + + return new PropertyBinding( root, path, parsedPath ); + + } else { + + return new PropertyBinding.Composite( root, path, parsedPath ); + + } + + }; + + PropertyBinding.parseTrackName = function( trackName ) { + + // matches strings in the form of: + // nodeName.property + // nodeName.property[accessor] + // nodeName.material.property[accessor] + // uuid.property[accessor] + // uuid.objectName[objectIndex].propertyName[propertyIndex] + // parentName/nodeName.property + // parentName/parentName/nodeName.property[index] + // .bone[Armature.DEF_cog].position + // scene:helium_balloon_model:helium_balloon_model.position + // created and tested via https://regex101.com/#javascript + + var re = /^((?:\w+[\/:])*)(\w+)?(?:\.(\w+)(?:\[(.+)\])?)?\.(\w+)(?:\[(.+)\])?$/; + var matches = re.exec( trackName ); + + if ( ! matches ) { + + throw new Error( "cannot parse trackName at all: " + trackName ); + + } + + var results = { + // directoryName: matches[ 1 ], // (tschw) currently unused + nodeName: matches[ 2 ], // allowed to be null, specified root node. + objectName: matches[ 3 ], + objectIndex: matches[ 4 ], + propertyName: matches[ 5 ], + propertyIndex: matches[ 6 ] // allowed to be null, specifies that the whole property is set. + }; + + if ( results.propertyName === null || results.propertyName.length === 0 ) { + + throw new Error( "can not parse propertyName from trackName: " + trackName ); + + } + + return results; + + }; + + PropertyBinding.findNode = function( root, nodeName ) { + + if ( ! nodeName || nodeName === "" || nodeName === "root" || nodeName === "." || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) { + + return root; + + } + + // search into skeleton bones. + if ( root.skeleton ) { + + var searchSkeleton = function( skeleton ) { + + for( var i = 0; i < skeleton.bones.length; i ++ ) { + + var bone = skeleton.bones[ i ]; + + if ( bone.name === nodeName ) { + + return bone; + + } + } + + return null; + + }; + + var bone = searchSkeleton( root.skeleton ); + + if ( bone ) { + + return bone; + + } + } + + // search into node subtree. + if ( root.children ) { + + var searchNodeSubtree = function( children ) { + + for( var i = 0; i < children.length; i ++ ) { + + var childNode = children[ i ]; + + if ( childNode.name === nodeName || childNode.uuid === nodeName ) { + + return childNode; + + } + + var result = searchNodeSubtree( childNode.children ); + + if ( result ) return result; + + } + + return null; + + }; + + var subTreeNode = searchNodeSubtree( root.children ); + + if ( subTreeNode ) { + + return subTreeNode; + + } + + } + + return null; + + }; + + /** + * + * A group of objects that receives a shared animation state. + * + * Usage: + * + * - Add objects you would otherwise pass as 'root' to the + * constructor or the .clipAction method of AnimationMixer. + * + * - Instead pass this object as 'root'. + * + * - You can also add and remove objects later when the mixer + * is running. + * + * Note: + * + * Objects of this class appear as one object to the mixer, + * so cache control of the individual objects must be done + * on the group. + * + * Limitation: + * + * - The animated properties must be compatible among the + * all objects in the group. + * + * - A single property can either be controlled through a + * target group or directly, but not both. + * + * @author tschw + */ + + function AnimationObjectGroup( var_args ) { + + this.uuid = _Math.generateUUID(); + + // cached objects followed by the active ones + this._objects = Array.prototype.slice.call( arguments ); + + this.nCachedObjects_ = 0; // threshold + // note: read by PropertyBinding.Composite + + var indices = {}; + this._indicesByUUID = indices; // for bookkeeping + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + indices[ arguments[ i ].uuid ] = i; + + } + + this._paths = []; // inside: string + this._parsedPaths = []; // inside: { we don't care, here } + this._bindings = []; // inside: Array< PropertyBinding > + this._bindingsIndicesByPath = {}; // inside: indices in these arrays + + var scope = this; + + this.stats = { + + objects: { + get total() { return scope._objects.length; }, + get inUse() { return this.total - scope.nCachedObjects_; } + }, + + get bindingsPerObject() { return scope._bindings.length; } + + }; + + } + + AnimationObjectGroup.prototype = { + + constructor: AnimationObjectGroup, + + isAnimationObjectGroup: true, + + add: function( var_args ) { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index === undefined ) { + + // unknown object -> add it to the ACTIVE region + + index = nObjects ++; + indicesByUUID[ uuid ] = index; + objects.push( object ); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + bindings[ j ].push( + new PropertyBinding( + object, paths[ j ], parsedPaths[ j ] ) ); + + } + + } else if ( index < nCachedObjects ) { + + var knownObject = objects[ index ]; + + // move existing object to the ACTIVE region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ]; + + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + indicesByUUID[ uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = lastCached; + + if ( binding === undefined ) { + + // since we do not bother to create new bindings + // for objects that are cached, the binding may + // or may not exist + + binding = new PropertyBinding( + object, paths[ j ], parsedPaths[ j ] ); + + } + + bindingsForPath[ firstActiveIndex ] = binding; + + } + + } else if ( objects[ index ] !== knownObject) { + + console.error( "Different objects with the same UUID " + + "detected. Clean the caches or recreate your " + + "infrastructure when reloading scenes..." ); + + } // else the object is already where we want it to be + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + remove: function( var_args ) { + + var objects = this._objects, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined && index >= nCachedObjects ) { + + // move existing object into the CACHED region + + var lastCachedIndex = nCachedObjects ++, + firstActiveObject = objects[ lastCachedIndex ]; + + indicesByUUID[ firstActiveObject.uuid ] = index; + objects[ index ] = firstActiveObject; + + indicesByUUID[ uuid ] = lastCachedIndex; + objects[ lastCachedIndex ] = object; + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + firstActive = bindingsForPath[ lastCachedIndex ], + binding = bindingsForPath[ index ]; + + bindingsForPath[ index ] = firstActive; + bindingsForPath[ lastCachedIndex ] = binding; + + } + + } + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // remove & forget + uncache: function( var_args ) { + + var objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + indicesByUUID = this._indicesByUUID, + bindings = this._bindings, + nBindings = bindings.length; + + for ( var i = 0, n = arguments.length; i !== n; ++ i ) { + + var object = arguments[ i ], + uuid = object.uuid, + index = indicesByUUID[ uuid ]; + + if ( index !== undefined ) { + + delete indicesByUUID[ uuid ]; + + if ( index < nCachedObjects ) { + + // object is cached, shrink the CACHED region + + var firstActiveIndex = -- nCachedObjects, + lastCachedObject = objects[ firstActiveIndex ], + lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + // last cached object takes this object's place + indicesByUUID[ lastCachedObject.uuid ] = index; + objects[ index ] = lastCachedObject; + + // last object goes to the activated slot and pop + indicesByUUID[ lastObject.uuid ] = firstActiveIndex; + objects[ firstActiveIndex ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ], + lastCached = bindingsForPath[ firstActiveIndex ], + last = bindingsForPath[ lastIndex ]; + + bindingsForPath[ index ] = lastCached; + bindingsForPath[ firstActiveIndex ] = last; + bindingsForPath.pop(); + + } + + } else { + + // object is active, just swap with the last and pop + + var lastIndex = -- nObjects, + lastObject = objects[ lastIndex ]; + + indicesByUUID[ lastObject.uuid ] = index; + objects[ index ] = lastObject; + objects.pop(); + + // accounting is done, now do the same for all bindings + + for ( var j = 0, m = nBindings; j !== m; ++ j ) { + + var bindingsForPath = bindings[ j ]; + + bindingsForPath[ index ] = bindingsForPath[ lastIndex ]; + bindingsForPath.pop(); + + } + + } // cached or active + + } // if object is known + + } // for arguments + + this.nCachedObjects_ = nCachedObjects; + + }, + + // Internal interface used by befriended PropertyBinding.Composite: + + subscribe_: function( path, parsedPath ) { + // returns an array of bindings for the given path that is changed + // according to the contained objects in the group + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ], + bindings = this._bindings; + + if ( index !== undefined ) return bindings[ index ]; + + var paths = this._paths, + parsedPaths = this._parsedPaths, + objects = this._objects, + nObjects = objects.length, + nCachedObjects = this.nCachedObjects_, + bindingsForPath = new Array( nObjects ); + + index = bindings.length; + + indicesByPath[ path ] = index; + + paths.push( path ); + parsedPaths.push( parsedPath ); + bindings.push( bindingsForPath ); + + for ( var i = nCachedObjects, + n = objects.length; i !== n; ++ i ) { + + var object = objects[ i ]; + + bindingsForPath[ i ] = + new PropertyBinding( object, path, parsedPath ); + + } + + return bindingsForPath; + + }, + + unsubscribe_: function( path ) { + // tells the group to forget about a property path and no longer + // update the array previously obtained with 'subscribe_' + + var indicesByPath = this._bindingsIndicesByPath, + index = indicesByPath[ path ]; + + if ( index !== undefined ) { + + var paths = this._paths, + parsedPaths = this._parsedPaths, + bindings = this._bindings, + lastBindingsIndex = bindings.length - 1, + lastBindings = bindings[ lastBindingsIndex ], + lastBindingsPath = path[ lastBindingsIndex ]; + + indicesByPath[ lastBindingsPath ] = index; + + bindings[ index ] = lastBindings; + bindings.pop(); + + parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ]; + parsedPaths.pop(); + + paths[ index ] = paths[ lastBindingsIndex ]; + paths.pop(); + + } + + } + + }; + + /** + * + * Action provided by AnimationMixer for scheduling clip playback on specific + * objects. + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + * + */ + + function AnimationAction( mixer, clip, localRoot ) { + + this._mixer = mixer; + this._clip = clip; + this._localRoot = localRoot || null; + + var tracks = clip.tracks, + nTracks = tracks.length, + interpolants = new Array( nTracks ); + + var interpolantSettings = { + endingStart: ZeroCurvatureEnding, + endingEnd: ZeroCurvatureEnding + }; + + for ( var i = 0; i !== nTracks; ++ i ) { + + var interpolant = tracks[ i ].createInterpolant( null ); + interpolants[ i ] = interpolant; + interpolant.settings = interpolantSettings; + + } + + this._interpolantSettings = interpolantSettings; + + this._interpolants = interpolants; // bound by the mixer + + // inside: PropertyMixer (managed by the mixer) + this._propertyBindings = new Array( nTracks ); + + this._cacheIndex = null; // for the memory manager + this._byClipCacheIndex = null; // for the memory manager + + this._timeScaleInterpolant = null; + this._weightInterpolant = null; + + this.loop = LoopRepeat; + this._loopCount = -1; + + // global mixer time when the action is to be started + // it's set back to 'null' upon start of the action + this._startTime = null; + + // scaled local time of the action + // gets clamped or wrapped to 0..clip.duration according to loop + this.time = 0; + + this.timeScale = 1; + this._effectiveTimeScale = 1; + + this.weight = 1; + this._effectiveWeight = 1; + + this.repetitions = Infinity; // no. of repetitions when looping + + this.paused = false; // false -> zero effective time scale + this.enabled = true; // true -> zero effective weight + + this.clampWhenFinished = false; // keep feeding the last frame? + + this.zeroSlopeAtStart = true; // for smooth interpolation w/o separate + this.zeroSlopeAtEnd = true; // clips for start, loop and end + + } + + AnimationAction.prototype = { + + constructor: AnimationAction, + + // State & Scheduling + + play: function() { + + this._mixer._activateAction( this ); + + return this; + + }, + + stop: function() { + + this._mixer._deactivateAction( this ); + + return this.reset(); + + }, + + reset: function() { + + this.paused = false; + this.enabled = true; + + this.time = 0; // restart clip + this._loopCount = -1; // forget previous loops + this._startTime = null; // forget scheduling + + return this.stopFading().stopWarping(); + + }, + + isRunning: function() { + + return this.enabled && ! this.paused && this.timeScale !== 0 && + this._startTime === null && this._mixer._isActiveAction( this ); + + }, + + // return true when play has been called + isScheduled: function() { + + return this._mixer._isActiveAction( this ); + + }, + + startAt: function( time ) { + + this._startTime = time; + + return this; + + }, + + setLoop: function( mode, repetitions ) { + + this.loop = mode; + this.repetitions = repetitions; + + return this; + + }, + + // Weight + + // set the weight stopping any scheduled fading + // although .enabled = false yields an effective weight of zero, this + // method does *not* change .enabled, because it would be confusing + setEffectiveWeight: function( weight ) { + + this.weight = weight; + + // note: same logic as when updated at runtime + this._effectiveWeight = this.enabled ? weight : 0; + + return this.stopFading(); + + }, + + // return the weight considering fading and .enabled + getEffectiveWeight: function() { + + return this._effectiveWeight; + + }, + + fadeIn: function( duration ) { + + return this._scheduleFading( duration, 0, 1 ); + + }, + + fadeOut: function( duration ) { + + return this._scheduleFading( duration, 1, 0 ); + + }, + + crossFadeFrom: function( fadeOutAction, duration, warp ) { + + fadeOutAction.fadeOut( duration ); + this.fadeIn( duration ); + + if( warp ) { + + var fadeInDuration = this._clip.duration, + fadeOutDuration = fadeOutAction._clip.duration, + + startEndRatio = fadeOutDuration / fadeInDuration, + endStartRatio = fadeInDuration / fadeOutDuration; + + fadeOutAction.warp( 1.0, startEndRatio, duration ); + this.warp( endStartRatio, 1.0, duration ); + + } + + return this; + + }, + + crossFadeTo: function( fadeInAction, duration, warp ) { + + return fadeInAction.crossFadeFrom( this, duration, warp ); + + }, + + stopFading: function() { + + var weightInterpolant = this._weightInterpolant; + + if ( weightInterpolant !== null ) { + + this._weightInterpolant = null; + this._mixer._takeBackControlInterpolant( weightInterpolant ); + + } + + return this; + + }, + + // Time Scale Control + + // set the weight stopping any scheduled warping + // although .paused = true yields an effective time scale of zero, this + // method does *not* change .paused, because it would be confusing + setEffectiveTimeScale: function( timeScale ) { + + this.timeScale = timeScale; + this._effectiveTimeScale = this.paused ? 0 :timeScale; + + return this.stopWarping(); + + }, + + // return the time scale considering warping and .paused + getEffectiveTimeScale: function() { + + return this._effectiveTimeScale; + + }, + + setDuration: function( duration ) { + + this.timeScale = this._clip.duration / duration; + + return this.stopWarping(); + + }, + + syncWith: function( action ) { + + this.time = action.time; + this.timeScale = action.timeScale; + + return this.stopWarping(); + + }, + + halt: function( duration ) { + + return this.warp( this._effectiveTimeScale, 0, duration ); + + }, + + warp: function( startTimeScale, endTimeScale, duration ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._timeScaleInterpolant, + + timeScale = this.timeScale; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(), + this._timeScaleInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; + times[ 1 ] = now + duration; + + values[ 0 ] = startTimeScale / timeScale; + values[ 1 ] = endTimeScale / timeScale; + + return this; + + }, + + stopWarping: function() { + + var timeScaleInterpolant = this._timeScaleInterpolant; + + if ( timeScaleInterpolant !== null ) { + + this._timeScaleInterpolant = null; + this._mixer._takeBackControlInterpolant( timeScaleInterpolant ); + + } + + return this; + + }, + + // Object Accessors + + getMixer: function() { + + return this._mixer; + + }, + + getClip: function() { + + return this._clip; + + }, + + getRoot: function() { + + return this._localRoot || this._mixer._root; + + }, + + // Interna + + _update: function( time, deltaTime, timeDirection, accuIndex ) { + // called by the mixer + + var startTime = this._startTime; + + if ( startTime !== null ) { + + // check for scheduled start of action + + var timeRunning = ( time - startTime ) * timeDirection; + if ( timeRunning < 0 || timeDirection === 0 ) { + + return; // yet to come / don't decide when delta = 0 + + } + + // start + + this._startTime = null; // unschedule + deltaTime = timeDirection * timeRunning; + + } + + // apply time scale and advance time + + deltaTime *= this._updateTimeScale( time ); + var clipTime = this._updateTime( deltaTime ); + + // note: _updateTime may disable the action resulting in + // an effective weight of 0 + + var weight = this._updateWeight( time ); + + if ( weight > 0 ) { + + var interpolants = this._interpolants; + var propertyMixers = this._propertyBindings; + + for ( var j = 0, m = interpolants.length; j !== m; ++ j ) { + + interpolants[ j ].evaluate( clipTime ); + propertyMixers[ j ].accumulate( accuIndex, weight ); + + } + + } + + }, + + _updateWeight: function( time ) { + + var weight = 0; + + if ( this.enabled ) { + + weight = this.weight; + var interpolant = this._weightInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + weight *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopFading(); + + if ( interpolantValue === 0 ) { + + // faded out, disable + this.enabled = false; + + } + + } + + } + + } + + this._effectiveWeight = weight; + return weight; + + }, + + _updateTimeScale: function( time ) { + + var timeScale = 0; + + if ( ! this.paused ) { + + timeScale = this.timeScale; + + var interpolant = this._timeScaleInterpolant; + + if ( interpolant !== null ) { + + var interpolantValue = interpolant.evaluate( time )[ 0 ]; + + timeScale *= interpolantValue; + + if ( time > interpolant.parameterPositions[ 1 ] ) { + + this.stopWarping(); + + if ( timeScale === 0 ) { + + // motion has halted, pause + this.paused = true; + + } else { + + // warp done - apply final time scale + this.timeScale = timeScale; + + } + + } + + } + + } + + this._effectiveTimeScale = timeScale; + return timeScale; + + }, + + _updateTime: function( deltaTime ) { + + var time = this.time + deltaTime; + + if ( deltaTime === 0 ) return time; + + var duration = this._clip.duration, + + loop = this.loop, + loopCount = this._loopCount; + + if ( loop === LoopOnce ) { + + if ( loopCount === -1 ) { + // just started + + this.loopCount = 0; + this._setEndings( true, true, false ); + + } + + handle_stop: { + + if ( time >= duration ) { + + time = duration; + + } else if ( time < 0 ) { + + time = 0; + + } else break handle_stop; + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime < 0 ? -1 : 1 + } ); + + } + + } else { // repetitive Repeat or PingPong + + var pingPong = ( loop === LoopPingPong ); + + if ( loopCount === -1 ) { + // just started + + if ( deltaTime >= 0 ) { + + loopCount = 0; + + this._setEndings( + true, this.repetitions === 0, pingPong ); + + } else { + + // when looping in reverse direction, the initial + // transition through zero counts as a repetition, + // so leave loopCount at -1 + + this._setEndings( + this.repetitions === 0, true, pingPong ); + + } + + } + + if ( time >= duration || time < 0 ) { + // wrap around + + var loopDelta = Math.floor( time / duration ); // signed + time -= duration * loopDelta; + + loopCount += Math.abs( loopDelta ); + + var pending = this.repetitions - loopCount; + + if ( pending < 0 ) { + // have to stop (switch state, clamp time, fire event) + + if ( this.clampWhenFinished ) this.paused = true; + else this.enabled = false; + + time = deltaTime > 0 ? duration : 0; + + this._mixer.dispatchEvent( { + type: 'finished', action: this, + direction: deltaTime > 0 ? 1 : -1 + } ); + + } else { + // keep running + + if ( pending === 0 ) { + // entering the last round + + var atStart = deltaTime < 0; + this._setEndings( atStart, ! atStart, pingPong ); + + } else { + + this._setEndings( false, false, pingPong ); + + } + + this._loopCount = loopCount; + + this._mixer.dispatchEvent( { + type: 'loop', action: this, loopDelta: loopDelta + } ); + + } + + } + + if ( pingPong && ( loopCount & 1 ) === 1 ) { + // invert time for the "pong round" + + this.time = time; + return duration - time; + + } + + } + + this.time = time; + return time; + + }, + + _setEndings: function( atStart, atEnd, pingPong ) { + + var settings = this._interpolantSettings; + + if ( pingPong ) { + + settings.endingStart = ZeroSlopeEnding; + settings.endingEnd = ZeroSlopeEnding; + + } else { + + // assuming for LoopOnce atStart == atEnd == true + + if ( atStart ) { + + settings.endingStart = this.zeroSlopeAtStart ? + ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingStart = WrapAroundEnding; + + } + + if ( atEnd ) { + + settings.endingEnd = this.zeroSlopeAtEnd ? + ZeroSlopeEnding : ZeroCurvatureEnding; + + } else { + + settings.endingEnd = WrapAroundEnding; + + } + + } + + }, + + _scheduleFading: function( duration, weightNow, weightThen ) { + + var mixer = this._mixer, now = mixer.time, + interpolant = this._weightInterpolant; + + if ( interpolant === null ) { + + interpolant = mixer._lendControlInterpolant(), + this._weightInterpolant = interpolant; + + } + + var times = interpolant.parameterPositions, + values = interpolant.sampleValues; + + times[ 0 ] = now; values[ 0 ] = weightNow; + times[ 1 ] = now + duration; values[ 1 ] = weightThen; + + return this; + + } + + }; + + /** + * + * Player for AnimationClips. + * + * + * @author Ben Houston / http://clara.io/ + * @author David Sarno / http://lighthaus.us/ + * @author tschw + */ + + function AnimationMixer( root ) { + + this._root = root; + this._initMemoryManager(); + this._accuIndex = 0; + + this.time = 0; + + this.timeScale = 1.0; + + } + + Object.assign( AnimationMixer.prototype, EventDispatcher.prototype, { + + // return an action for a clip optionally using a custom root target + // object (this method allocates a lot of dynamic memory in case a + // previously unknown clip/root combination is specified) + clipAction: function( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject !== null ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ], + prototypeAction = null; + + if ( actionsForClip !== undefined ) { + + var existingAction = + actionsForClip.actionByRoot[ rootUuid ]; + + if ( existingAction !== undefined ) { + + return existingAction; + + } + + // we know the clip, so we don't have to parse all + // the bindings again but can just copy + prototypeAction = actionsForClip.knownActions[ 0 ]; + + // also, take the clip from the prototype action + if ( clipObject === null ) + clipObject = prototypeAction._clip; + + } + + // clip must be known when specified via string + if ( clipObject === null ) return null; + + // allocate all resources required to run it + var newAction = new AnimationAction( this, clipObject, optionalRoot ); + + this._bindAction( newAction, prototypeAction ); + + // and make the action known to the memory manager + this._addInactiveAction( newAction, clipUuid, rootUuid ); + + return newAction; + + }, + + // get an existing action + existingAction: function( clip, optionalRoot ) { + + var root = optionalRoot || this._root, + rootUuid = root.uuid, + + clipObject = typeof clip === 'string' ? + AnimationClip.findByName( root, clip ) : clip, + + clipUuid = clipObject ? clipObject.uuid : clip, + + actionsForClip = this._actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + return actionsForClip.actionByRoot[ rootUuid ] || null; + + } + + return null; + + }, + + // deactivates all previously scheduled actions + stopAllAction: function() { + + var actions = this._actions, + nActions = this._nActiveActions, + bindings = this._bindings, + nBindings = this._nActiveBindings; + + this._nActiveActions = 0; + this._nActiveBindings = 0; + + for ( var i = 0; i !== nActions; ++ i ) { + + actions[ i ].reset(); + + } + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].useCount = 0; + + } + + return this; + + }, + + // advance the time and update apply the animation + update: function( deltaTime ) { + + deltaTime *= this.timeScale; + + var actions = this._actions, + nActions = this._nActiveActions, + + time = this.time += deltaTime, + timeDirection = Math.sign( deltaTime ), + + accuIndex = this._accuIndex ^= 1; + + // run active actions + + for ( var i = 0; i !== nActions; ++ i ) { + + var action = actions[ i ]; + + if ( action.enabled ) { + + action._update( time, deltaTime, timeDirection, accuIndex ); + + } + + } + + // update scene graph + + var bindings = this._bindings, + nBindings = this._nActiveBindings; + + for ( var i = 0; i !== nBindings; ++ i ) { + + bindings[ i ].apply( accuIndex ); + + } + + return this; + + }, + + // return this mixer's root target object + getRoot: function() { + + return this._root; + + }, + + // free all resources specific to a particular clip + uncacheClip: function( clip ) { + + var actions = this._actions, + clipUuid = clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip !== undefined ) { + + // note: just calling _removeInactiveAction would mess up the + // iteration state and also require updating the state we can + // just throw away + + var actionsToRemove = actionsForClip.knownActions; + + for ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) { + + var action = actionsToRemove[ i ]; + + this._deactivateAction( action ); + + var cacheIndex = action._cacheIndex, + lastInactiveAction = actions[ actions.length - 1 ]; + + action._cacheIndex = null; + action._byClipCacheIndex = null; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + this._removeInactiveBindingsForAction( action ); + + } + + delete actionsByClip[ clipUuid ]; + + } + + }, + + // free all resources specific to a particular root target object + uncacheRoot: function( root ) { + + var rootUuid = root.uuid, + actionsByClip = this._actionsByClip; + + for ( var clipUuid in actionsByClip ) { + + var actionByRoot = actionsByClip[ clipUuid ].actionByRoot, + action = actionByRoot[ rootUuid ]; + + if ( action !== undefined ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ]; + + if ( bindingByName !== undefined ) { + + for ( var trackName in bindingByName ) { + + var binding = bindingByName[ trackName ]; + binding.restoreOriginalState(); + this._removeInactiveBinding( binding ); + + } + + } + + }, + + // remove a targeted clip from the cache + uncacheAction: function( clip, optionalRoot ) { + + var action = this.existingAction( clip, optionalRoot ); + + if ( action !== null ) { + + this._deactivateAction( action ); + this._removeInactiveAction( action ); + + } + + } + + } ); + + // Implementation details: + + Object.assign( AnimationMixer.prototype, { + + _bindAction: function( action, prototypeAction ) { + + var root = action._localRoot || this._root, + tracks = action._clip.tracks, + nTracks = tracks.length, + bindings = action._propertyBindings, + interpolants = action._interpolants, + rootUuid = root.uuid, + bindingsByRoot = this._bindingsByRootAndName, + bindingsByName = bindingsByRoot[ rootUuid ]; + + if ( bindingsByName === undefined ) { + + bindingsByName = {}; + bindingsByRoot[ rootUuid ] = bindingsByName; + + } + + for ( var i = 0; i !== nTracks; ++ i ) { + + var track = tracks[ i ], + trackName = track.name, + binding = bindingsByName[ trackName ]; + + if ( binding !== undefined ) { + + bindings[ i ] = binding; + + } else { + + binding = bindings[ i ]; + + if ( binding !== undefined ) { + + // existing binding, make sure the cache knows + + if ( binding._cacheIndex === null ) { + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + } + + continue; + + } + + var path = prototypeAction && prototypeAction. + _propertyBindings[ i ].binding.parsedPath; + + binding = new PropertyMixer( + PropertyBinding.create( root, trackName, path ), + track.ValueTypeName, track.getValueSize() ); + + ++ binding.referenceCount; + this._addInactiveBinding( binding, rootUuid, trackName ); + + bindings[ i ] = binding; + + } + + interpolants[ i ].resultBuffer = binding.buffer; + + } + + }, + + _activateAction: function( action ) { + + if ( ! this._isActiveAction( action ) ) { + + if ( action._cacheIndex === null ) { + + // this action has been forgotten by the cache, but the user + // appears to be still using it -> rebind + + var rootUuid = ( action._localRoot || this._root ).uuid, + clipUuid = action._clip.uuid, + actionsForClip = this._actionsByClip[ clipUuid ]; + + this._bindAction( action, + actionsForClip && actionsForClip.knownActions[ 0 ] ); + + this._addInactiveAction( action, clipUuid, rootUuid ); + + } + + var bindings = action._propertyBindings; + + // increment reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( binding.useCount ++ === 0 ) { + + this._lendBinding( binding ); + binding.saveOriginalState(); + + } + + } + + this._lendAction( action ); + + } + + }, + + _deactivateAction: function( action ) { + + if ( this._isActiveAction( action ) ) { + + var bindings = action._propertyBindings; + + // decrement reference counts / sort out state + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.useCount === 0 ) { + + binding.restoreOriginalState(); + this._takeBackBinding( binding ); + + } + + } + + this._takeBackAction( action ); + + } + + }, + + // Memory manager + + _initMemoryManager: function() { + + this._actions = []; // 'nActiveActions' followed by inactive ones + this._nActiveActions = 0; + + this._actionsByClip = {}; + // inside: + // { + // knownActions: Array< AnimationAction > - used as prototypes + // actionByRoot: AnimationAction - lookup + // } + + + this._bindings = []; // 'nActiveBindings' followed by inactive ones + this._nActiveBindings = 0; + + this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer > + + + this._controlInterpolants = []; // same game as above + this._nActiveControlInterpolants = 0; + + var scope = this; + + this.stats = { + + actions: { + get total() { return scope._actions.length; }, + get inUse() { return scope._nActiveActions; } + }, + bindings: { + get total() { return scope._bindings.length; }, + get inUse() { return scope._nActiveBindings; } + }, + controlInterpolants: { + get total() { return scope._controlInterpolants.length; }, + get inUse() { return scope._nActiveControlInterpolants; } + } + + }; + + }, + + // Memory management for AnimationAction objects + + _isActiveAction: function( action ) { + + var index = action._cacheIndex; + return index !== null && index < this._nActiveActions; + + }, + + _addInactiveAction: function( action, clipUuid, rootUuid ) { + + var actions = this._actions, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ]; + + if ( actionsForClip === undefined ) { + + actionsForClip = { + + knownActions: [ action ], + actionByRoot: {} + + }; + + action._byClipCacheIndex = 0; + + actionsByClip[ clipUuid ] = actionsForClip; + + } else { + + var knownActions = actionsForClip.knownActions; + + action._byClipCacheIndex = knownActions.length; + knownActions.push( action ); + + } + + action._cacheIndex = actions.length; + actions.push( action ); + + actionsForClip.actionByRoot[ rootUuid ] = action; + + }, + + _removeInactiveAction: function( action ) { + + var actions = this._actions, + lastInactiveAction = actions[ actions.length - 1 ], + cacheIndex = action._cacheIndex; + + lastInactiveAction._cacheIndex = cacheIndex; + actions[ cacheIndex ] = lastInactiveAction; + actions.pop(); + + action._cacheIndex = null; + + + var clipUuid = action._clip.uuid, + actionsByClip = this._actionsByClip, + actionsForClip = actionsByClip[ clipUuid ], + knownActionsForClip = actionsForClip.knownActions, + + lastKnownAction = + knownActionsForClip[ knownActionsForClip.length - 1 ], + + byClipCacheIndex = action._byClipCacheIndex; + + lastKnownAction._byClipCacheIndex = byClipCacheIndex; + knownActionsForClip[ byClipCacheIndex ] = lastKnownAction; + knownActionsForClip.pop(); + + action._byClipCacheIndex = null; + + + var actionByRoot = actionsForClip.actionByRoot, + rootUuid = ( actions._localRoot || this._root ).uuid; + + delete actionByRoot[ rootUuid ]; + + if ( knownActionsForClip.length === 0 ) { + + delete actionsByClip[ clipUuid ]; + + } + + this._removeInactiveBindingsForAction( action ); + + }, + + _removeInactiveBindingsForAction: function( action ) { + + var bindings = action._propertyBindings; + for ( var i = 0, n = bindings.length; i !== n; ++ i ) { + + var binding = bindings[ i ]; + + if ( -- binding.referenceCount === 0 ) { + + this._removeInactiveBinding( binding ); + + } + + } + + }, + + _lendAction: function( action ) { + + // [ active actions | inactive actions ] + // [ active actions >| inactive actions ] + // s a + // <-swap-> + // a s + + var actions = this._actions, + prevIndex = action._cacheIndex, + + lastActiveIndex = this._nActiveActions ++, + + firstInactiveAction = actions[ lastActiveIndex ]; + + action._cacheIndex = lastActiveIndex; + actions[ lastActiveIndex ] = action; + + firstInactiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = firstInactiveAction; + + }, + + _takeBackAction: function( action ) { + + // [ active actions | inactive actions ] + // [ active actions |< inactive actions ] + // a s + // <-swap-> + // s a + + var actions = this._actions, + prevIndex = action._cacheIndex, + + firstInactiveIndex = -- this._nActiveActions, + + lastActiveAction = actions[ firstInactiveIndex ]; + + action._cacheIndex = firstInactiveIndex; + actions[ firstInactiveIndex ] = action; + + lastActiveAction._cacheIndex = prevIndex; + actions[ prevIndex ] = lastActiveAction; + + }, + + // Memory management for PropertyMixer objects + + _addInactiveBinding: function( binding, rootUuid, trackName ) { + + var bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + bindings = this._bindings; + + if ( bindingByName === undefined ) { + + bindingByName = {}; + bindingsByRoot[ rootUuid ] = bindingByName; + + } + + bindingByName[ trackName ] = binding; + + binding._cacheIndex = bindings.length; + bindings.push( binding ); + + }, + + _removeInactiveBinding: function( binding ) { + + var bindings = this._bindings, + propBinding = binding.binding, + rootUuid = propBinding.rootNode.uuid, + trackName = propBinding.path, + bindingsByRoot = this._bindingsByRootAndName, + bindingByName = bindingsByRoot[ rootUuid ], + + lastInactiveBinding = bindings[ bindings.length - 1 ], + cacheIndex = binding._cacheIndex; + + lastInactiveBinding._cacheIndex = cacheIndex; + bindings[ cacheIndex ] = lastInactiveBinding; + bindings.pop(); + + delete bindingByName[ trackName ]; + + remove_empty_map: { + + for ( var _ in bindingByName ) break remove_empty_map; + + delete bindingsByRoot[ rootUuid ]; + + } + + }, + + _lendBinding: function( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + lastActiveIndex = this._nActiveBindings ++, + + firstInactiveBinding = bindings[ lastActiveIndex ]; + + binding._cacheIndex = lastActiveIndex; + bindings[ lastActiveIndex ] = binding; + + firstInactiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = firstInactiveBinding; + + }, + + _takeBackBinding: function( binding ) { + + var bindings = this._bindings, + prevIndex = binding._cacheIndex, + + firstInactiveIndex = -- this._nActiveBindings, + + lastActiveBinding = bindings[ firstInactiveIndex ]; + + binding._cacheIndex = firstInactiveIndex; + bindings[ firstInactiveIndex ] = binding; + + lastActiveBinding._cacheIndex = prevIndex; + bindings[ prevIndex ] = lastActiveBinding; + + }, + + + // Memory management of Interpolants for weight and time scale + + _lendControlInterpolant: function() { + + var interpolants = this._controlInterpolants, + lastActiveIndex = this._nActiveControlInterpolants ++, + interpolant = interpolants[ lastActiveIndex ]; + + if ( interpolant === undefined ) { + + interpolant = new LinearInterpolant( + new Float32Array( 2 ), new Float32Array( 2 ), + 1, this._controlInterpolantsResultBuffer ); + + interpolant.__cacheIndex = lastActiveIndex; + interpolants[ lastActiveIndex ] = interpolant; + + } + + return interpolant; + + }, + + _takeBackControlInterpolant: function( interpolant ) { + + var interpolants = this._controlInterpolants, + prevIndex = interpolant.__cacheIndex, + + firstInactiveIndex = -- this._nActiveControlInterpolants, + + lastActiveInterpolant = interpolants[ firstInactiveIndex ]; + + interpolant.__cacheIndex = firstInactiveIndex; + interpolants[ firstInactiveIndex ] = interpolant; + + lastActiveInterpolant.__cacheIndex = prevIndex; + interpolants[ prevIndex ] = lastActiveInterpolant; + + }, + + _controlInterpolantsResultBuffer: new Float32Array( 1 ) + + } ); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Uniform( value ) { + + if ( typeof value === 'string' ) { + + console.warn( 'THREE.Uniform: Type parameter is no longer needed.' ); + value = arguments[ 1 ]; + + } + + this.value = value; + + } + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferGeometry() { + + BufferGeometry.call( this ); + + this.type = 'InstancedBufferGeometry'; + this.maxInstancedCount = undefined; + + } + + InstancedBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); + InstancedBufferGeometry.prototype.constructor = InstancedBufferGeometry; + + InstancedBufferGeometry.prototype.isInstancedBufferGeometry = true; + + InstancedBufferGeometry.prototype.addGroup = function ( start, count, materialIndex ) { + + this.groups.push( { + + start: start, + count: count, + materialIndex: materialIndex + + } ); + + }; + + InstancedBufferGeometry.prototype.copy = function ( source ) { + + var index = source.index; + + if ( index !== null ) { + + this.setIndex( index.clone() ); + + } + + var attributes = source.attributes; + + for ( var name in attributes ) { + + var attribute = attributes[ name ]; + this.addAttribute( name, attribute.clone() ); + + } + + var groups = source.groups; + + for ( var i = 0, l = groups.length; i < l; i ++ ) { + + var group = groups[ i ]; + this.addGroup( group.start, group.count, group.materialIndex ); + + } + + return this; + + }; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) { + + this.uuid = _Math.generateUUID(); + + this.data = interleavedBuffer; + this.itemSize = itemSize; + this.offset = offset; + + this.normalized = normalized === true; + + } + + + InterleavedBufferAttribute.prototype = { + + constructor: InterleavedBufferAttribute, + + isInterleavedBufferAttribute: true, + + get count() { + + return this.data.count; + + }, + + get array() { + + return this.data.array; + + }, + + setX: function ( index, x ) { + + this.data.array[ index * this.data.stride + this.offset ] = x; + + return this; + + }, + + setY: function ( index, y ) { + + this.data.array[ index * this.data.stride + this.offset + 1 ] = y; + + return this; + + }, + + setZ: function ( index, z ) { + + this.data.array[ index * this.data.stride + this.offset + 2 ] = z; + + return this; + + }, + + setW: function ( index, w ) { + + this.data.array[ index * this.data.stride + this.offset + 3 ] = w; + + return this; + + }, + + getX: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset ]; + + }, + + getY: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 1 ]; + + }, + + getZ: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 2 ]; + + }, + + getW: function ( index ) { + + return this.data.array[ index * this.data.stride + this.offset + 3 ]; + + }, + + setXY: function ( index, x, y ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + + return this; + + }, + + setXYZ: function ( index, x, y, z ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + + return this; + + }, + + setXYZW: function ( index, x, y, z, w ) { + + index = index * this.data.stride + this.offset; + + this.data.array[ index + 0 ] = x; + this.data.array[ index + 1 ] = y; + this.data.array[ index + 2 ] = z; + this.data.array[ index + 3 ] = w; + + return this; + + } + + }; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InterleavedBuffer( array, stride ) { + + this.uuid = _Math.generateUUID(); + + this.array = array; + this.stride = stride; + this.count = array !== undefined ? array.length / stride : 0; + + this.dynamic = false; + this.updateRange = { offset: 0, count: - 1 }; + + this.version = 0; + + } + + InterleavedBuffer.prototype = { + + constructor: InterleavedBuffer, + + isInterleavedBuffer: true, + + set needsUpdate( value ) { + + if ( value === true ) this.version ++; + + }, + + setArray: function ( array ) { + + if ( Array.isArray( array ) ) { + + throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); + + } + + this.count = array !== undefined ? array.length / this.stride : 0; + this.array = array; + + }, + + setDynamic: function ( value ) { + + this.dynamic = value; + + return this; + + }, + + copy: function ( source ) { + + this.array = new source.array.constructor( source.array ); + this.count = source.count; + this.stride = source.stride; + this.dynamic = source.dynamic; + + return this; + + }, + + copyAt: function ( index1, attribute, index2 ) { + + index1 *= this.stride; + index2 *= attribute.stride; + + for ( var i = 0, l = this.stride; i < l; i ++ ) { + + this.array[ index1 + i ] = attribute.array[ index2 + i ]; + + } + + return this; + + }, + + set: function ( value, offset ) { + + if ( offset === undefined ) offset = 0; + + this.array.set( value, offset ); + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + } + + }; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedInterleavedBuffer( array, stride, meshPerAttribute ) { + + InterleavedBuffer.call( this, array, stride ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedInterleavedBuffer.prototype = Object.create( InterleavedBuffer.prototype ); + InstancedInterleavedBuffer.prototype.constructor = InstancedInterleavedBuffer; + + InstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true; + + InstancedInterleavedBuffer.prototype.copy = function ( source ) { + + InterleavedBuffer.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + }; + + /** + * @author benaadams / https://twitter.com/ben_a_adams + */ + + function InstancedBufferAttribute( array, itemSize, meshPerAttribute ) { + + BufferAttribute.call( this, array, itemSize ); + + this.meshPerAttribute = meshPerAttribute || 1; + + } + + InstancedBufferAttribute.prototype = Object.create( BufferAttribute.prototype ); + InstancedBufferAttribute.prototype.constructor = InstancedBufferAttribute; + + InstancedBufferAttribute.prototype.isInstancedBufferAttribute = true; + + InstancedBufferAttribute.prototype.copy = function ( source ) { + + BufferAttribute.prototype.copy.call( this, source ); + + this.meshPerAttribute = source.meshPerAttribute; + + return this; + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author bhouston / http://clara.io/ + * @author stephomi / http://stephaneginier.com/ + */ + + function Raycaster( origin, direction, near, far ) { + + this.ray = new Ray( origin, direction ); + // direction is assumed to be normalized (for accurate distance calculations) + + this.near = near || 0; + this.far = far || Infinity; + + this.params = { + Mesh: {}, + Line: {}, + LOD: {}, + Points: { threshold: 1 }, + Sprite: {} + }; + + Object.defineProperties( this.params, { + PointCloud: { + get: function () { + console.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' ); + return this.Points; + } + } + } ); + + } + + function ascSort( a, b ) { + + return a.distance - b.distance; + + } + + function intersectObject( object, raycaster, intersects, recursive ) { + + if ( object.visible === false ) return; + + object.raycast( raycaster, intersects ); + + if ( recursive === true ) { + + var children = object.children; + + for ( var i = 0, l = children.length; i < l; i ++ ) { + + intersectObject( children[ i ], raycaster, intersects, true ); + + } + + } + + } + + // + + Raycaster.prototype = { + + constructor: Raycaster, + + linePrecision: 1, + + set: function ( origin, direction ) { + + // direction is assumed to be normalized (for accurate distance calculations) + + this.ray.set( origin, direction ); + + }, + + setFromCamera: function ( coords, camera ) { + + if ( (camera && camera.isPerspectiveCamera) ) { + + this.ray.origin.setFromMatrixPosition( camera.matrixWorld ); + this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize(); + + } else if ( (camera && camera.isOrthographicCamera) ) { + + this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera + this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ); + + } else { + + console.error( 'THREE.Raycaster: Unsupported camera type.' ); + + } + + }, + + intersectObject: function ( object, recursive ) { + + var intersects = []; + + intersectObject( object, this, intersects, recursive ); + + intersects.sort( ascSort ); + + return intersects; + + }, + + intersectObjects: function ( objects, recursive ) { + + var intersects = []; + + if ( Array.isArray( objects ) === false ) { + + console.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' ); + return intersects; + + } + + for ( var i = 0, l = objects.length; i < l; i ++ ) { + + intersectObject( objects[ i ], this, intersects, recursive ); + + } + + intersects.sort( ascSort ); + + return intersects; + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function Clock( autoStart ) { + + this.autoStart = ( autoStart !== undefined ) ? autoStart : true; + + this.startTime = 0; + this.oldTime = 0; + this.elapsedTime = 0; + + this.running = false; + + } + + Clock.prototype = { + + constructor: Clock, + + start: function () { + + this.startTime = ( performance || Date ).now(); + + this.oldTime = this.startTime; + this.elapsedTime = 0; + this.running = true; + + }, + + stop: function () { + + this.getElapsedTime(); + this.running = false; + + }, + + getElapsedTime: function () { + + this.getDelta(); + return this.elapsedTime; + + }, + + getDelta: function () { + + var diff = 0; + + if ( this.autoStart && ! this.running ) { + + this.start(); + + } + + if ( this.running ) { + + var newTime = ( performance || Date ).now(); + + diff = ( newTime - this.oldTime ) / 1000; + this.oldTime = newTime; + + this.elapsedTime += diff; + + } + + return diff; + + } + + }; + + /** + * Spline from Tween.js, slightly optimized (and trashed) + * http://sole.github.com/tween.js/examples/05_spline.html + * + * @author mrdoob / http://mrdoob.com/ + * @author alteredq / http://alteredqualia.com/ + */ + + function Spline( points ) { + + this.points = points; + + var c = [], v3 = { x: 0, y: 0, z: 0 }, + point, intPoint, weight, w2, w3, + pa, pb, pc, pd; + + this.initFromArray = function ( a ) { + + this.points = []; + + for ( var i = 0; i < a.length; i ++ ) { + + this.points[ i ] = { x: a[ i ][ 0 ], y: a[ i ][ 1 ], z: a[ i ][ 2 ] }; + + } + + }; + + this.getPoint = function ( k ) { + + point = ( this.points.length - 1 ) * k; + intPoint = Math.floor( point ); + weight = point - intPoint; + + c[ 0 ] = intPoint === 0 ? intPoint : intPoint - 1; + c[ 1 ] = intPoint; + c[ 2 ] = intPoint > this.points.length - 2 ? this.points.length - 1 : intPoint + 1; + c[ 3 ] = intPoint > this.points.length - 3 ? this.points.length - 1 : intPoint + 2; + + pa = this.points[ c[ 0 ] ]; + pb = this.points[ c[ 1 ] ]; + pc = this.points[ c[ 2 ] ]; + pd = this.points[ c[ 3 ] ]; + + w2 = weight * weight; + w3 = weight * w2; + + v3.x = interpolate( pa.x, pb.x, pc.x, pd.x, weight, w2, w3 ); + v3.y = interpolate( pa.y, pb.y, pc.y, pd.y, weight, w2, w3 ); + v3.z = interpolate( pa.z, pb.z, pc.z, pd.z, weight, w2, w3 ); + + return v3; + + }; + + this.getControlPointsArray = function () { + + var i, p, l = this.points.length, + coords = []; + + for ( i = 0; i < l; i ++ ) { + + p = this.points[ i ]; + coords[ i ] = [ p.x, p.y, p.z ]; + + } + + return coords; + + }; + + // approximate length by summing linear segments + + this.getLength = function ( nSubDivisions ) { + + var i, index, nSamples, position, + point = 0, intPoint = 0, oldIntPoint = 0, + oldPosition = new Vector3(), + tmpVec = new Vector3(), + chunkLengths = [], + totalLength = 0; + + // first point has 0 length + + chunkLengths[ 0 ] = 0; + + if ( ! nSubDivisions ) nSubDivisions = 100; + + nSamples = this.points.length * nSubDivisions; + + oldPosition.copy( this.points[ 0 ] ); + + for ( i = 1; i < nSamples; i ++ ) { + + index = i / nSamples; + + position = this.getPoint( index ); + tmpVec.copy( position ); + + totalLength += tmpVec.distanceTo( oldPosition ); + + oldPosition.copy( position ); + + point = ( this.points.length - 1 ) * index; + intPoint = Math.floor( point ); + + if ( intPoint !== oldIntPoint ) { + + chunkLengths[ intPoint ] = totalLength; + oldIntPoint = intPoint; + + } + + } + + // last point ends with total length + + chunkLengths[ chunkLengths.length ] = totalLength; + + return { chunks: chunkLengths, total: totalLength }; + + }; + + this.reparametrizeByArcLength = function ( samplingCoef ) { + + var i, j, + index, indexCurrent, indexNext, + realDistance, + sampling, position, + newpoints = [], + tmpVec = new Vector3(), + sl = this.getLength(); + + newpoints.push( tmpVec.copy( this.points[ 0 ] ).clone() ); + + for ( i = 1; i < this.points.length; i ++ ) { + + //tmpVec.copy( this.points[ i - 1 ] ); + //linearDistance = tmpVec.distanceTo( this.points[ i ] ); + + realDistance = sl.chunks[ i ] - sl.chunks[ i - 1 ]; + + sampling = Math.ceil( samplingCoef * realDistance / sl.total ); + + indexCurrent = ( i - 1 ) / ( this.points.length - 1 ); + indexNext = i / ( this.points.length - 1 ); + + for ( j = 1; j < sampling - 1; j ++ ) { + + index = indexCurrent + j * ( 1 / sampling ) * ( indexNext - indexCurrent ); + + position = this.getPoint( index ); + newpoints.push( tmpVec.copy( position ).clone() ); + + } + + newpoints.push( tmpVec.copy( this.points[ i ] ).clone() ); + + } + + this.points = newpoints; + + }; + + // Catmull-Rom + + function interpolate( p0, p1, p2, p3, t, t2, t3 ) { + + var v0 = ( p2 - p0 ) * 0.5, + v1 = ( p3 - p1 ) * 0.5; + + return ( 2 * ( p1 - p2 ) + v0 + v1 ) * t3 + ( - 3 * ( p1 - p2 ) - 2 * v0 - v1 ) * t2 + v0 * t + p1; + + } + + } + + /** + * @author bhouston / http://clara.io + * @author WestLangley / http://github.com/WestLangley + * + * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system + * + * The poles (phi) are at the positive and negative y axis. + * The equator starts at positive z. + */ + + function Spherical( radius, phi, theta ) { + + this.radius = ( radius !== undefined ) ? radius : 1.0; + this.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole + this.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere + + return this; + + } + + Spherical.prototype = { + + constructor: Spherical, + + set: function ( radius, phi, theta ) { + + this.radius = radius; + this.phi = phi; + this.theta = theta; + + return this; + + }, + + clone: function () { + + return new this.constructor().copy( this ); + + }, + + copy: function ( other ) { + + this.radius = other.radius; + this.phi = other.phi; + this.theta = other.theta; + + return this; + + }, + + // restrict phi to be betwee EPS and PI-EPS + makeSafe: function() { + + var EPS = 0.000001; + this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) ); + + return this; + + }, + + setFromVector3: function( vec3 ) { + + this.radius = vec3.length(); + + if ( this.radius === 0 ) { + + this.theta = 0; + this.phi = 0; + + } else { + + this.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis + this.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle + + } + + return this; + + }, + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function MorphBlendMesh( geometry, material ) { + + Mesh.call( this, geometry, material ); + + this.animationsMap = {}; + this.animationsList = []; + + // prepare default animation + // (all frames played together in 1 second) + + var numFrames = this.geometry.morphTargets.length; + + var name = "__default"; + + var startFrame = 0; + var endFrame = numFrames - 1; + + var fps = numFrames / 1; + + this.createAnimation( name, startFrame, endFrame, fps ); + this.setAnimationWeight( name, 1 ); + + } + + MorphBlendMesh.prototype = Object.create( Mesh.prototype ); + MorphBlendMesh.prototype.constructor = MorphBlendMesh; + + MorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) { + + var animation = { + + start: start, + end: end, + + length: end - start + 1, + + fps: fps, + duration: ( end - start ) / fps, + + lastFrame: 0, + currentFrame: 0, + + active: false, + + time: 0, + direction: 1, + weight: 1, + + directionBackwards: false, + mirroredLoop: false + + }; + + this.animationsMap[ name ] = animation; + this.animationsList.push( animation ); + + }; + + MorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) { + + var pattern = /([a-z]+)_?(\d+)/i; + + var firstAnimation, frameRanges = {}; + + var geometry = this.geometry; + + for ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) { + + var morph = geometry.morphTargets[ i ]; + var chunks = morph.name.match( pattern ); + + if ( chunks && chunks.length > 1 ) { + + var name = chunks[ 1 ]; + + if ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity }; + + var range = frameRanges[ name ]; + + if ( i < range.start ) range.start = i; + if ( i > range.end ) range.end = i; + + if ( ! firstAnimation ) firstAnimation = name; + + } + + } + + for ( var name in frameRanges ) { + + var range = frameRanges[ name ]; + this.createAnimation( name, range.start, range.end, fps ); + + } + + this.firstAnimation = firstAnimation; + + }; + + MorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.direction = 1; + animation.directionBackwards = false; + + } + + }; + + MorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.direction = - 1; + animation.directionBackwards = true; + + } + + }; + + MorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.fps = fps; + animation.duration = ( animation.end - animation.start ) / animation.fps; + + } + + }; + + MorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.duration = duration; + animation.fps = ( animation.end - animation.start ) / animation.duration; + + } + + }; + + MorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.weight = weight; + + } + + }; + + MorphBlendMesh.prototype.setAnimationTime = function ( name, time ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.time = time; + + } + + }; + + MorphBlendMesh.prototype.getAnimationTime = function ( name ) { + + var time = 0; + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + time = animation.time; + + } + + return time; + + }; + + MorphBlendMesh.prototype.getAnimationDuration = function ( name ) { + + var duration = - 1; + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + duration = animation.duration; + + } + + return duration; + + }; + + MorphBlendMesh.prototype.playAnimation = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.time = 0; + animation.active = true; + + } else { + + console.warn( "THREE.MorphBlendMesh: animation[" + name + "] undefined in .playAnimation()" ); + + } + + }; + + MorphBlendMesh.prototype.stopAnimation = function ( name ) { + + var animation = this.animationsMap[ name ]; + + if ( animation ) { + + animation.active = false; + + } + + }; + + MorphBlendMesh.prototype.update = function ( delta ) { + + for ( var i = 0, il = this.animationsList.length; i < il; i ++ ) { + + var animation = this.animationsList[ i ]; + + if ( ! animation.active ) continue; + + var frameTime = animation.duration / animation.length; + + animation.time += animation.direction * delta; + + if ( animation.mirroredLoop ) { + + if ( animation.time > animation.duration || animation.time < 0 ) { + + animation.direction *= - 1; + + if ( animation.time > animation.duration ) { + + animation.time = animation.duration; + animation.directionBackwards = true; + + } + + if ( animation.time < 0 ) { + + animation.time = 0; + animation.directionBackwards = false; + + } + + } + + } else { + + animation.time = animation.time % animation.duration; + + if ( animation.time < 0 ) animation.time += animation.duration; + + } + + var keyframe = animation.start + _Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 ); + var weight = animation.weight; + + if ( keyframe !== animation.currentFrame ) { + + this.morphTargetInfluences[ animation.lastFrame ] = 0; + this.morphTargetInfluences[ animation.currentFrame ] = 1 * weight; + + this.morphTargetInfluences[ keyframe ] = 0; + + animation.lastFrame = animation.currentFrame; + animation.currentFrame = keyframe; + + } + + var mix = ( animation.time % frameTime ) / frameTime; + + if ( animation.directionBackwards ) mix = 1 - mix; + + if ( animation.currentFrame !== animation.lastFrame ) { + + this.morphTargetInfluences[ animation.currentFrame ] = mix * weight; + this.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight; + + } else { + + this.morphTargetInfluences[ animation.currentFrame ] = weight; + + } + + } + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + function ImmediateRenderObject( material ) { + + Object3D.call( this ); + + this.material = material; + this.render = function ( renderCallback ) {}; + + } + + ImmediateRenderObject.prototype = Object.create( Object3D.prototype ); + ImmediateRenderObject.prototype.constructor = ImmediateRenderObject; + + ImmediateRenderObject.prototype.isImmediateRenderObject = true; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function VertexNormalsHelper( object, size, hex, linewidth ) { + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xff0000; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( (objGeometry && objGeometry.isGeometry) ) { + + nNormals = objGeometry.faces.length * 3; + + } else if ( (objGeometry && objGeometry.isBufferGeometry) ) { + + nNormals = objGeometry.attributes.normal.count; + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32Attribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + + this.update(); + + } + + VertexNormalsHelper.prototype = Object.create( LineSegments.prototype ); + VertexNormalsHelper.prototype.constructor = VertexNormalsHelper; + + VertexNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + var keys = [ 'a', 'b', 'c' ]; + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + if ( (objGeometry && objGeometry.isGeometry) ) { + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { + + var vertex = vertices[ face[ keys[ j ] ] ]; + + var normal = face.vertexNormals[ j ]; + + v1.copy( vertex ).applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + } else if ( (objGeometry && objGeometry.isBufferGeometry) ) { + + var objPos = objGeometry.attributes.position; + + var objNorm = objGeometry.attributes.normal; + + var idx = 0; + + // for simplicity, ignore index and drawcalls, and render every normal + + for ( var j = 0, jl = objPos.count; j < jl; j ++ ) { + + v1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld ); + + v2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) ); + + v2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + } + + position.needsUpdate = true; + + return this; + + }; + + }() ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function SpotLightHelper( light ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + var geometry = new BufferGeometry(); + + var positions = [ + 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 0, 1, + 0, 0, 0, - 1, 0, 1, + 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, - 1, 1 + ]; + + for ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) { + + var p1 = ( i / l ) * Math.PI * 2; + var p2 = ( j / l ) * Math.PI * 2; + + positions.push( + Math.cos( p1 ), Math.sin( p1 ), 1, + Math.cos( p2 ), Math.sin( p2 ), 1 + ); + + } + + geometry.addAttribute( 'position', new Float32Attribute( positions, 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.cone = new LineSegments( geometry, material ); + this.add( this.cone ); + + this.update(); + + } + + SpotLightHelper.prototype = Object.create( Object3D.prototype ); + SpotLightHelper.prototype.constructor = SpotLightHelper; + + SpotLightHelper.prototype.dispose = function () { + + this.cone.geometry.dispose(); + this.cone.material.dispose(); + + }; + + SpotLightHelper.prototype.update = function () { + + var vector = new Vector3(); + var vector2 = new Vector3(); + + return function update() { + + var coneLength = this.light.distance ? this.light.distance : 1000; + var coneWidth = coneLength * Math.tan( this.light.angle ); + + this.cone.scale.set( coneWidth, coneWidth, coneLength ); + + vector.setFromMatrixPosition( this.light.matrixWorld ); + vector2.setFromMatrixPosition( this.light.target.matrixWorld ); + + this.cone.lookAt( vector2.sub( vector ) ); + + this.cone.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + }; + + }(); + + /** + * @author Sean Griffin / http://twitter.com/sgrif + * @author Michael Guerrero / http://realitymeltdown.com + * @author mrdoob / http://mrdoob.com/ + * @author ikerr / http://verold.com + */ + + function SkeletonHelper( object ) { + + this.bones = this.getBoneList( object ); + + var geometry = new Geometry(); + + for ( var i = 0; i < this.bones.length; i ++ ) { + + var bone = this.bones[ i ]; + + if ( (bone.parent && bone.parent.isBone) ) { + + geometry.vertices.push( new Vector3() ); + geometry.vertices.push( new Vector3() ); + geometry.colors.push( new Color( 0, 0, 1 ) ); + geometry.colors.push( new Color( 0, 1, 0 ) ); + + } + + } + + geometry.dynamic = true; + + var material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } ); + + LineSegments.call( this, geometry, material ); + + this.root = object; + + this.matrix = object.matrixWorld; + this.matrixAutoUpdate = false; + + this.update(); + + } + + + SkeletonHelper.prototype = Object.create( LineSegments.prototype ); + SkeletonHelper.prototype.constructor = SkeletonHelper; + + SkeletonHelper.prototype.getBoneList = function( object ) { + + var boneList = []; + + if ( (object && object.isBone) ) { + + boneList.push( object ); + + } + + for ( var i = 0; i < object.children.length; i ++ ) { + + boneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) ); + + } + + return boneList; + + }; + + SkeletonHelper.prototype.update = function () { + + var geometry = this.geometry; + + var matrixWorldInv = new Matrix4().getInverse( this.root.matrixWorld ); + + var boneMatrix = new Matrix4(); + + var j = 0; + + for ( var i = 0; i < this.bones.length; i ++ ) { + + var bone = this.bones[ i ]; + + if ( (bone.parent && bone.parent.isBone) ) { + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld ); + geometry.vertices[ j ].setFromMatrixPosition( boneMatrix ); + + boneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld ); + geometry.vertices[ j + 1 ].setFromMatrixPosition( boneMatrix ); + + j += 2; + + } + + } + + geometry.verticesNeedUpdate = true; + + geometry.computeBoundingSphere(); + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function PointLightHelper( light, sphereSize ) { + + this.light = light; + this.light.updateMatrixWorld(); + + var geometry = new SphereBufferGeometry( sphereSize, 4, 2 ); + var material = new MeshBasicMaterial( { wireframe: true, fog: false } ); + material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + Mesh.call( this, geometry, material ); + + this.matrix = this.light.matrixWorld; + this.matrixAutoUpdate = false; + + /* + var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 ); + var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } ); + + this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial ); + this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial ); + + var d = light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.scale.set( d, d, d ); + + } + + this.add( this.lightDistance ); + */ + + } + + PointLightHelper.prototype = Object.create( Mesh.prototype ); + PointLightHelper.prototype.constructor = PointLightHelper; + + PointLightHelper.prototype.dispose = function () { + + this.geometry.dispose(); + this.material.dispose(); + + }; + + PointLightHelper.prototype.update = function () { + + this.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + /* + var d = this.light.distance; + + if ( d === 0.0 ) { + + this.lightDistance.visible = false; + + } else { + + this.lightDistance.visible = true; + this.lightDistance.scale.set( d, d, d ); + + } + */ + + }; + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + */ + + function HemisphereLightHelper( light, sphereSize ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + this.colors = [ new Color(), new Color() ]; + + var geometry = new SphereGeometry( sphereSize, 4, 2 ); + geometry.rotateX( - Math.PI / 2 ); + + for ( var i = 0, il = 8; i < il; i ++ ) { + + geometry.faces[ i ].color = this.colors[ i < 4 ? 0 : 1 ]; + + } + + var material = new MeshBasicMaterial( { vertexColors: FaceColors, wireframe: true } ); + + this.lightSphere = new Mesh( geometry, material ); + this.add( this.lightSphere ); + + this.update(); + + } + + HemisphereLightHelper.prototype = Object.create( Object3D.prototype ); + HemisphereLightHelper.prototype.constructor = HemisphereLightHelper; + + HemisphereLightHelper.prototype.dispose = function () { + + this.lightSphere.geometry.dispose(); + this.lightSphere.material.dispose(); + + }; + + HemisphereLightHelper.prototype.update = function () { + + var vector = new Vector3(); + + return function update() { + + this.colors[ 0 ].copy( this.light.color ).multiplyScalar( this.light.intensity ); + this.colors[ 1 ].copy( this.light.groundColor ).multiplyScalar( this.light.intensity ); + + this.lightSphere.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() ); + this.lightSphere.geometry.colorsNeedUpdate = true; + + }; + + }(); + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function GridHelper( size, divisions, color1, color2 ) { + + divisions = divisions || 1; + color1 = new Color( color1 !== undefined ? color1 : 0x444444 ); + color2 = new Color( color2 !== undefined ? color2 : 0x888888 ); + + var center = divisions / 2; + var step = ( size * 2 ) / divisions; + var vertices = [], colors = []; + + for ( var i = 0, j = 0, k = - size; i <= divisions; i ++, k += step ) { + + vertices.push( - size, 0, k, size, 0, k ); + vertices.push( k, 0, - size, k, 0, size ); + + var color = i === center ? color1 : color2; + + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + color.toArray( colors, j ); j += 3; + + } + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32Attribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new Float32Attribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + GridHelper.prototype = Object.create( LineSegments.prototype ); + GridHelper.prototype.constructor = GridHelper; + + GridHelper.prototype.setColors = function () { + + console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' ); + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function FaceNormalsHelper( object, size, hex, linewidth ) { + + // FaceNormalsHelper only supports THREE.Geometry + + this.object = object; + + this.size = ( size !== undefined ) ? size : 1; + + var color = ( hex !== undefined ) ? hex : 0xffff00; + + var width = ( linewidth !== undefined ) ? linewidth : 1; + + // + + var nNormals = 0; + + var objGeometry = this.object.geometry; + + if ( (objGeometry && objGeometry.isGeometry) ) { + + nNormals = objGeometry.faces.length; + + } else { + + console.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' ); + + } + + // + + var geometry = new BufferGeometry(); + + var positions = new Float32Attribute( nNormals * 2 * 3, 3 ); + + geometry.addAttribute( 'position', positions ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) ); + + // + + this.matrixAutoUpdate = false; + this.update(); + + } + + FaceNormalsHelper.prototype = Object.create( LineSegments.prototype ); + FaceNormalsHelper.prototype.constructor = FaceNormalsHelper; + + FaceNormalsHelper.prototype.update = ( function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var normalMatrix = new Matrix3(); + + return function update() { + + this.object.updateMatrixWorld( true ); + + normalMatrix.getNormalMatrix( this.object.matrixWorld ); + + var matrixWorld = this.object.matrixWorld; + + var position = this.geometry.attributes.position; + + // + + var objGeometry = this.object.geometry; + + var vertices = objGeometry.vertices; + + var faces = objGeometry.faces; + + var idx = 0; + + for ( var i = 0, l = faces.length; i < l; i ++ ) { + + var face = faces[ i ]; + + var normal = face.normal; + + v1.copy( vertices[ face.a ] ) + .add( vertices[ face.b ] ) + .add( vertices[ face.c ] ) + .divideScalar( 3 ) + .applyMatrix4( matrixWorld ); + + v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 ); + + position.setXYZ( idx, v1.x, v1.y, v1.z ); + + idx = idx + 1; + + position.setXYZ( idx, v2.x, v2.y, v2.z ); + + idx = idx + 1; + + } + + position.needsUpdate = true; + + return this; + + }; + + }() ); + + /** + * @author alteredq / http://alteredqualia.com/ + * @author mrdoob / http://mrdoob.com/ + * @author WestLangley / http://github.com/WestLangley + */ + + function DirectionalLightHelper( light, size ) { + + Object3D.call( this ); + + this.light = light; + this.light.updateMatrixWorld(); + + this.matrix = light.matrixWorld; + this.matrixAutoUpdate = false; + + if ( size === undefined ) size = 1; + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32Attribute( [ + - size, size, 0, + size, size, 0, + size, - size, 0, + - size, - size, 0, + - size, size, 0 + ], 3 ) ); + + var material = new LineBasicMaterial( { fog: false } ); + + this.add( new Line( geometry, material ) ); + + geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new Float32Attribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); + + this.add( new Line( geometry, material )); + + this.update(); + + } + + DirectionalLightHelper.prototype = Object.create( Object3D.prototype ); + DirectionalLightHelper.prototype.constructor = DirectionalLightHelper; + + DirectionalLightHelper.prototype.dispose = function () { + + var lightPlane = this.children[ 0 ]; + var targetLine = this.children[ 1 ]; + + lightPlane.geometry.dispose(); + lightPlane.material.dispose(); + targetLine.geometry.dispose(); + targetLine.material.dispose(); + + }; + + DirectionalLightHelper.prototype.update = function () { + + var v1 = new Vector3(); + var v2 = new Vector3(); + var v3 = new Vector3(); + + return function update() { + + v1.setFromMatrixPosition( this.light.matrixWorld ); + v2.setFromMatrixPosition( this.light.target.matrixWorld ); + v3.subVectors( v2, v1 ); + + var lightPlane = this.children[ 0 ]; + var targetLine = this.children[ 1 ]; + + lightPlane.lookAt( v3 ); + lightPlane.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity ); + + targetLine.lookAt( v3 ); + targetLine.scale.z = v3.length(); + + }; + + }(); + + /** + * @author alteredq / http://alteredqualia.com/ + * + * - shows frustum, line of sight and up of the camera + * - suitable for fast updates + * - based on frustum visualization in lightgl.js shadowmap example + * http://evanw.github.com/lightgl.js/tests/shadowmap.html + */ + + function CameraHelper( camera ) { + + var geometry = new Geometry(); + var material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } ); + + var pointMap = {}; + + // colors + + var hexFrustum = 0xffaa00; + var hexCone = 0xff0000; + var hexUp = 0x00aaff; + var hexTarget = 0xffffff; + var hexCross = 0x333333; + + // near + + addLine( "n1", "n2", hexFrustum ); + addLine( "n2", "n4", hexFrustum ); + addLine( "n4", "n3", hexFrustum ); + addLine( "n3", "n1", hexFrustum ); + + // far + + addLine( "f1", "f2", hexFrustum ); + addLine( "f2", "f4", hexFrustum ); + addLine( "f4", "f3", hexFrustum ); + addLine( "f3", "f1", hexFrustum ); + + // sides + + addLine( "n1", "f1", hexFrustum ); + addLine( "n2", "f2", hexFrustum ); + addLine( "n3", "f3", hexFrustum ); + addLine( "n4", "f4", hexFrustum ); + + // cone + + addLine( "p", "n1", hexCone ); + addLine( "p", "n2", hexCone ); + addLine( "p", "n3", hexCone ); + addLine( "p", "n4", hexCone ); + + // up + + addLine( "u1", "u2", hexUp ); + addLine( "u2", "u3", hexUp ); + addLine( "u3", "u1", hexUp ); + + // target + + addLine( "c", "t", hexTarget ); + addLine( "p", "c", hexCross ); + + // cross + + addLine( "cn1", "cn2", hexCross ); + addLine( "cn3", "cn4", hexCross ); + + addLine( "cf1", "cf2", hexCross ); + addLine( "cf3", "cf4", hexCross ); + + function addLine( a, b, hex ) { + + addPoint( a, hex ); + addPoint( b, hex ); + + } + + function addPoint( id, hex ) { + + geometry.vertices.push( new Vector3() ); + geometry.colors.push( new Color( hex ) ); + + if ( pointMap[ id ] === undefined ) { + + pointMap[ id ] = []; + + } + + pointMap[ id ].push( geometry.vertices.length - 1 ); + + } + + LineSegments.call( this, geometry, material ); + + this.camera = camera; + if( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix(); + + this.matrix = camera.matrixWorld; + this.matrixAutoUpdate = false; + + this.pointMap = pointMap; + + this.update(); + + } + + CameraHelper.prototype = Object.create( LineSegments.prototype ); + CameraHelper.prototype.constructor = CameraHelper; + + CameraHelper.prototype.update = function () { + + var geometry, pointMap; + + var vector = new Vector3(); + var camera = new Camera(); + + function setPoint( point, x, y, z ) { + + vector.set( x, y, z ).unproject( camera ); + + var points = pointMap[ point ]; + + if ( points !== undefined ) { + + for ( var i = 0, il = points.length; i < il; i ++ ) { + + geometry.vertices[ points[ i ] ].copy( vector ); + + } + + } + + } + + return function update() { + + geometry = this.geometry; + pointMap = this.pointMap; + + var w = 1, h = 1; + + // we need just camera projection matrix + // world matrix must be identity + + camera.projectionMatrix.copy( this.camera.projectionMatrix ); + + // center / target + + setPoint( "c", 0, 0, - 1 ); + setPoint( "t", 0, 0, 1 ); + + // near + + setPoint( "n1", - w, - h, - 1 ); + setPoint( "n2", w, - h, - 1 ); + setPoint( "n3", - w, h, - 1 ); + setPoint( "n4", w, h, - 1 ); + + // far + + setPoint( "f1", - w, - h, 1 ); + setPoint( "f2", w, - h, 1 ); + setPoint( "f3", - w, h, 1 ); + setPoint( "f4", w, h, 1 ); + + // up + + setPoint( "u1", w * 0.7, h * 1.1, - 1 ); + setPoint( "u2", - w * 0.7, h * 1.1, - 1 ); + setPoint( "u3", 0, h * 2, - 1 ); + + // cross + + setPoint( "cf1", - w, 0, 1 ); + setPoint( "cf2", w, 0, 1 ); + setPoint( "cf3", 0, - h, 1 ); + setPoint( "cf4", 0, h, 1 ); + + setPoint( "cn1", - w, 0, - 1 ); + setPoint( "cn2", w, 0, - 1 ); + setPoint( "cn3", 0, - h, - 1 ); + setPoint( "cn4", 0, h, - 1 ); + + geometry.verticesNeedUpdate = true; + + }; + + }(); + + /** + * @author WestLangley / http://github.com/WestLangley + */ + + // a helper to show the world-axis-aligned bounding box for an object + + function BoundingBoxHelper( object, hex ) { + + var color = ( hex !== undefined ) ? hex : 0x888888; + + this.object = object; + + this.box = new Box3(); + + Mesh.call( this, new BoxGeometry( 1, 1, 1 ), new MeshBasicMaterial( { color: color, wireframe: true } ) ); + + } + + BoundingBoxHelper.prototype = Object.create( Mesh.prototype ); + BoundingBoxHelper.prototype.constructor = BoundingBoxHelper; + + BoundingBoxHelper.prototype.update = function () { + + this.box.setFromObject( this.object ); + + this.box.getSize( this.scale ); + + this.box.getCenter( this.position ); + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function BoxHelper( object, color ) { + + if ( color === undefined ) color = 0xffff00; + + var indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] ); + var positions = new Float32Array( 8 * 3 ); + + var geometry = new BufferGeometry(); + geometry.setIndex( new BufferAttribute( indices, 1 ) ); + geometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) ); + + LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) ); + + if ( object !== undefined ) { + + this.update( object ); + + } + + } + + BoxHelper.prototype = Object.create( LineSegments.prototype ); + BoxHelper.prototype.constructor = BoxHelper; + + BoxHelper.prototype.update = ( function () { + + var box = new Box3(); + + return function update( object ) { + + if ( (object && object.isBox3) ) { + + box.copy( object ); + + } else { + + box.setFromObject( object ); + + } + + if ( box.isEmpty() ) return; + + var min = box.min; + var max = box.max; + + /* + 5____4 + 1/___0/| + | 6__|_7 + 2/___3/ + + 0: max.x, max.y, max.z + 1: min.x, max.y, max.z + 2: min.x, min.y, max.z + 3: max.x, min.y, max.z + 4: max.x, max.y, min.z + 5: min.x, max.y, min.z + 6: min.x, min.y, min.z + 7: max.x, min.y, min.z + */ + + var position = this.geometry.attributes.position; + var array = position.array; + + array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z; + array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z; + array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z; + array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z; + array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z; + array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z; + array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z; + array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z; + + position.needsUpdate = true; + + this.geometry.computeBoundingSphere(); + + }; + + } )(); + + /** + * @author WestLangley / http://github.com/WestLangley + * @author zz85 / http://github.com/zz85 + * @author bhouston / http://clara.io + * + * Creates an arrow for visualizing directions + * + * Parameters: + * dir - Vector3 + * origin - Vector3 + * length - Number + * color - color in hex value + * headLength - Number + * headWidth - Number + */ + + var lineGeometry = new BufferGeometry(); + lineGeometry.addAttribute( 'position', new Float32Attribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); + + var coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 ); + coneGeometry.translate( 0, - 0.5, 0 ); + + function ArrowHelper( dir, origin, length, color, headLength, headWidth ) { + + // dir is assumed to be normalized + + Object3D.call( this ); + + if ( color === undefined ) color = 0xffff00; + if ( length === undefined ) length = 1; + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + this.position.copy( origin ); + + this.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) ); + this.line.matrixAutoUpdate = false; + this.add( this.line ); + + this.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) ); + this.cone.matrixAutoUpdate = false; + this.add( this.cone ); + + this.setDirection( dir ); + this.setLength( length, headLength, headWidth ); + + } + + ArrowHelper.prototype = Object.create( Object3D.prototype ); + ArrowHelper.prototype.constructor = ArrowHelper; + + ArrowHelper.prototype.setDirection = ( function () { + + var axis = new Vector3(); + var radians; + + return function setDirection( dir ) { + + // dir is assumed to be normalized + + if ( dir.y > 0.99999 ) { + + this.quaternion.set( 0, 0, 0, 1 ); + + } else if ( dir.y < - 0.99999 ) { + + this.quaternion.set( 1, 0, 0, 0 ); + + } else { + + axis.set( dir.z, 0, - dir.x ).normalize(); + + radians = Math.acos( dir.y ); + + this.quaternion.setFromAxisAngle( axis, radians ); + + } + + }; + + }() ); + + ArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) { + + if ( headLength === undefined ) headLength = 0.2 * length; + if ( headWidth === undefined ) headWidth = 0.2 * headLength; + + this.line.scale.set( 1, Math.max( 0, length - headLength ), 1 ); + this.line.updateMatrix(); + + this.cone.scale.set( headWidth, headLength, headWidth ); + this.cone.position.y = length; + this.cone.updateMatrix(); + + }; + + ArrowHelper.prototype.setColor = function ( color ) { + + this.line.material.color.copy( color ); + this.cone.material.color.copy( color ); + + }; + + /** + * @author sroucheray / http://sroucheray.org/ + * @author mrdoob / http://mrdoob.com/ + */ + + function AxisHelper( size ) { + + size = size || 1; + + var vertices = new Float32Array( [ + 0, 0, 0, size, 0, 0, + 0, 0, 0, 0, size, 0, + 0, 0, 0, 0, 0, size + ] ); + + var colors = new Float32Array( [ + 1, 0, 0, 1, 0.6, 0, + 0, 1, 0, 0.6, 1, 0, + 0, 0, 1, 0, 0.6, 1 + ] ); + + var geometry = new BufferGeometry(); + geometry.addAttribute( 'position', new BufferAttribute( vertices, 3 ) ); + geometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) ); + + var material = new LineBasicMaterial( { vertexColors: VertexColors } ); + + LineSegments.call( this, geometry, material ); + + } + + AxisHelper.prototype = Object.create( LineSegments.prototype ); + AxisHelper.prototype.constructor = AxisHelper; + + /** + * @author zz85 https://github.com/zz85 + * + * Centripetal CatmullRom Curve - which is useful for avoiding + * cusps and self-intersections in non-uniform catmull rom curves. + * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf + * + * curve.type accepts centripetal(default), chordal and catmullrom + * curve.tension is used for catmullrom which defaults to 0.5 + */ + + var CatmullRomCurve3 = ( function() { + + var + tmp = new Vector3(), + px = new CubicPoly(), + py = new CubicPoly(), + pz = new CubicPoly(); + + /* + Based on an optimized c++ solution in + - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/ + - http://ideone.com/NoEbVM + + This CubicPoly class could be used for reusing some variables and calculations, + but for three.js curve use, it could be possible inlined and flatten into a single function call + which can be placed in CurveUtils. + */ + + function CubicPoly() {} + + /* + * Compute coefficients for a cubic polynomial + * p(s) = c0 + c1*s + c2*s^2 + c3*s^3 + * such that + * p(0) = x0, p(1) = x1 + * and + * p'(0) = t0, p'(1) = t1. + */ + CubicPoly.prototype.init = function( x0, x1, t0, t1 ) { + + this.c0 = x0; + this.c1 = t0; + this.c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1; + this.c3 = 2 * x0 - 2 * x1 + t0 + t1; + + }; + + CubicPoly.prototype.initNonuniformCatmullRom = function( x0, x1, x2, x3, dt0, dt1, dt2 ) { + + // compute tangents when parameterized in [t1,t2] + var t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1; + var t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2; + + // rescale tangents for parametrization in [0,1] + t1 *= dt1; + t2 *= dt1; + + // initCubicPoly + this.init( x1, x2, t1, t2 ); + + }; + + // standard Catmull-Rom spline: interpolate between x1 and x2 with previous/following points x1/x4 + CubicPoly.prototype.initCatmullRom = function( x0, x1, x2, x3, tension ) { + + this.init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) ); + + }; + + CubicPoly.prototype.calc = function( t ) { + + var t2 = t * t; + var t3 = t2 * t; + return this.c0 + this.c1 * t + this.c2 * t2 + this.c3 * t3; + + }; + + // Subclass Three.js curve + return Curve.create( + + function ( p /* array of Vector3 */ ) { + + this.points = p || []; + this.closed = false; + + }, + + function ( t ) { + + var points = this.points, + point, intPoint, weight, l; + + l = points.length; + + if ( l < 2 ) console.log( 'duh, you need at least 2 points' ); + + point = ( l - ( this.closed ? 0 : 1 ) ) * t; + intPoint = Math.floor( point ); + weight = point - intPoint; + + if ( this.closed ) { + + intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length; + + } else if ( weight === 0 && intPoint === l - 1 ) { + + intPoint = l - 2; + weight = 1; + + } + + var p0, p1, p2, p3; // 4 points + + if ( this.closed || intPoint > 0 ) { + + p0 = points[ ( intPoint - 1 ) % l ]; + + } else { + + // extrapolate first point + tmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] ); + p0 = tmp; + + } + + p1 = points[ intPoint % l ]; + p2 = points[ ( intPoint + 1 ) % l ]; + + if ( this.closed || intPoint + 2 < l ) { + + p3 = points[ ( intPoint + 2 ) % l ]; + + } else { + + // extrapolate last point + tmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] ); + p3 = tmp; + + } + + if ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) { + + // init Centripetal / Chordal Catmull-Rom + var pow = this.type === 'chordal' ? 0.5 : 0.25; + var dt0 = Math.pow( p0.distanceToSquared( p1 ), pow ); + var dt1 = Math.pow( p1.distanceToSquared( p2 ), pow ); + var dt2 = Math.pow( p2.distanceToSquared( p3 ), pow ); + + // safety check for repeated points + if ( dt1 < 1e-4 ) dt1 = 1.0; + if ( dt0 < 1e-4 ) dt0 = dt1; + if ( dt2 < 1e-4 ) dt2 = dt1; + + px.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 ); + py.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 ); + pz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 ); + + } else if ( this.type === 'catmullrom' ) { + + var tension = this.tension !== undefined ? this.tension : 0.5; + px.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension ); + py.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension ); + pz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension ); + + } + + var v = new Vector3( + px.calc( weight ), + py.calc( weight ), + pz.calc( weight ) + ); + + return v; + + } + + ); + + } )(); + + /************************************************************** + * Closed Spline 3D curve + **************************************************************/ + + + function ClosedSplineCurve3( points ) { + + console.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Please use THREE.CatmullRomCurve3.' ); + + CatmullRomCurve3.call( this, points ); + this.type = 'catmullrom'; + this.closed = true; + + } + + ClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype ); + + /************************************************************** + * Spline 3D curve + **************************************************************/ + + + var SplineCurve3 = Curve.create( + + function ( points /* array of Vector3 */ ) { + + console.warn( 'THREE.SplineCurve3 will be deprecated. Please use THREE.CatmullRomCurve3' ); + this.points = ( points === undefined ) ? [] : points; + + }, + + function ( t ) { + + var points = this.points; + var point = ( points.length - 1 ) * t; + + var intPoint = Math.floor( point ); + var weight = point - intPoint; + + var point0 = points[ intPoint == 0 ? intPoint : intPoint - 1 ]; + var point1 = points[ intPoint ]; + var point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; + var point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; + + var interpolate = CurveUtils.interpolate; + + return new Vector3( + interpolate( point0.x, point1.x, point2.x, point3.x, weight ), + interpolate( point0.y, point1.y, point2.y, point3.y, weight ), + interpolate( point0.z, point1.z, point2.z, point3.z, weight ) + ); + + } + + ); + + /************************************************************** + * Cubic Bezier 3D curve + **************************************************************/ + + var CubicBezierCurve3 = Curve.create( + + function ( v0, v1, v2, v3 ) { + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + + }, + + function ( t ) { + + var b3 = ShapeUtils.b3; + + return new Vector3( + b3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ), + b3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ), + b3( t, this.v0.z, this.v1.z, this.v2.z, this.v3.z ) + ); + + } + + ); + + /************************************************************** + * Quadratic Bezier 3D curve + **************************************************************/ + + var QuadraticBezierCurve3 = Curve.create( + + function ( v0, v1, v2 ) { + + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + + }, + + function ( t ) { + + var b2 = ShapeUtils.b2; + + return new Vector3( + b2( t, this.v0.x, this.v1.x, this.v2.x ), + b2( t, this.v0.y, this.v1.y, this.v2.y ), + b2( t, this.v0.z, this.v1.z, this.v2.z ) + ); + + } + + ); + + /************************************************************** + * Line3D + **************************************************************/ + + var LineCurve3 = Curve.create( + + function ( v1, v2 ) { + + this.v1 = v1; + this.v2 = v2; + + }, + + function ( t ) { + + if ( t === 1 ) { + + return this.v2.clone(); + + } + + var vector = new Vector3(); + + vector.subVectors( this.v2, this.v1 ); // diff + vector.multiplyScalar( t ); + vector.add( this.v1 ); + + return vector; + + } + + ); + + /************************************************************** + * Arc curve + **************************************************************/ + + function ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { + + EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); + + } + + ArcCurve.prototype = Object.create( EllipseCurve.prototype ); + ArcCurve.prototype.constructor = ArcCurve; + + /** + * @author alteredq / http://alteredqualia.com/ + */ + + var SceneUtils = { + + createMultiMaterialObject: function ( geometry, materials ) { + + var group = new Group(); + + for ( var i = 0, l = materials.length; i < l; i ++ ) { + + group.add( new Mesh( geometry, materials[ i ] ) ); + + } + + return group; + + }, + + detach: function ( child, parent, scene ) { + + child.applyMatrix( parent.matrixWorld ); + parent.remove( child ); + scene.add( child ); + + }, + + attach: function ( child, scene, parent ) { + + var matrixWorldInverse = new Matrix4(); + matrixWorldInverse.getInverse( parent.matrixWorld ); + child.applyMatrix( matrixWorldInverse ); + + scene.remove( child ); + parent.add( child ); + + } + + }; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + function Face4 ( a, b, c, d, normal, color, materialIndex ) { + console.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' ); + return new Face3( a, b, c, normal, color, materialIndex ); + } + + var LineStrip = 0; + + var LinePieces = 1; + + function PointCloud ( geometry, material ) { + console.warn( 'THREE.PointCloud has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + } + + function ParticleSystem ( geometry, material ) { + console.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' ); + return new Points( geometry, material ); + } + + function PointCloudMaterial ( parameters ) { + console.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + } + + function ParticleBasicMaterial ( parameters ) { + console.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + } + + function ParticleSystemMaterial ( parameters ) { + console.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' ); + return new PointsMaterial( parameters ); + } + + function Vertex ( x, y, z ) { + console.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' ); + return new Vector3( x, y, z ); + } + + // + + function EdgesHelper( object, hex ) { + console.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' ); + return new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + } + + function WireframeHelper( object, hex ) { + console.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' ); + return new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); + } + + // + + Object.assign( Box2.prototype, { + center: function ( optionalTarget ) { + console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + }, + empty: function () { + console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + }, + isIntersectionBox: function ( box ) { + console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + }, + size: function ( optionalTarget ) { + console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + } + } ); + + Object.assign( Box3.prototype, { + center: function ( optionalTarget ) { + console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + }, + empty: function () { + console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' ); + return this.isEmpty(); + }, + isIntersectionBox: function ( box ) { + console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + }, + isIntersectionSphere: function ( sphere ) { + console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + }, + size: function ( optionalTarget ) { + console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' ); + return this.getSize( optionalTarget ); + } + } ); + + Object.assign( Line3.prototype, { + center: function ( optionalTarget ) { + console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' ); + return this.getCenter( optionalTarget ); + } + } ); + + Object.assign( Matrix3.prototype, { + multiplyVector3: function ( vector ) { + console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' ); + return vector.applyMatrix3( this ); + }, + multiplyVector3Array: function ( a ) { + console.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' ); + return this.applyToVector3Array( a ); + } + } ); + + Object.assign( Matrix4.prototype, { + extractPosition: function ( m ) { + console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' ); + return this.copyPosition( m ); + }, + setRotationFromQuaternion: function ( q ) { + console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' ); + return this.makeRotationFromQuaternion( q ); + }, + multiplyVector3: function ( vector ) { + console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.' ); + return vector.applyProjection( this ); + }, + multiplyVector4: function ( vector ) { + console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + }, + multiplyVector3Array: function ( a ) { + console.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' ); + return this.applyToVector3Array( a ); + }, + rotateAxis: function ( v ) { + console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' ); + v.transformDirection( this ); + }, + crossVector: function ( vector ) { + console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); + return vector.applyMatrix4( this ); + }, + translate: function ( v ) { + console.error( 'THREE.Matrix4: .translate() has been removed.' ); + }, + rotateX: function ( angle ) { + console.error( 'THREE.Matrix4: .rotateX() has been removed.' ); + }, + rotateY: function ( angle ) { + console.error( 'THREE.Matrix4: .rotateY() has been removed.' ); + }, + rotateZ: function ( angle ) { + console.error( 'THREE.Matrix4: .rotateZ() has been removed.' ); + }, + rotateByAxis: function ( axis, angle ) { + console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' ); + } + } ); + + Object.assign( Plane.prototype, { + isIntersectionLine: function ( line ) { + console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' ); + return this.intersectsLine( line ); + } + } ); + + Object.assign( Quaternion.prototype, { + multiplyVector3: function ( vector ) { + console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ); + return vector.applyQuaternion( this ); + } + } ); + + Object.assign( Ray.prototype, { + isIntersectionBox: function ( box ) { + console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' ); + return this.intersectsBox( box ); + }, + isIntersectionPlane: function ( plane ) { + console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' ); + return this.intersectsPlane( plane ); + }, + isIntersectionSphere: function ( sphere ) { + console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); + return this.intersectsSphere( sphere ); + } + } ); + + Object.assign( Shape.prototype, { + extrude: function ( options ) { + console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' ); + return new ExtrudeGeometry( this, options ); + }, + makeGeometry: function ( options ) { + console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' ); + return new ShapeGeometry( this, options ); + } + } ); + + Object.assign( Vector3.prototype, { + setEulerFromRotationMatrix: function () { + console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' ); + }, + setEulerFromQuaternion: function () { + console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' ); + }, + getPositionFromMatrix: function ( m ) { + console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' ); + return this.setFromMatrixPosition( m ); + }, + getScaleFromMatrix: function ( m ) { + console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' ); + return this.setFromMatrixScale( m ); + }, + getColumnFromMatrix: function ( index, matrix ) { + console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' ); + return this.setFromMatrixColumn( matrix, index ); + } + } ); + + // + + Object.assign( Object3D.prototype, { + getChildByName: function ( name ) { + console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' ); + return this.getObjectByName( name ); + }, + renderDepth: function ( value ) { + console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' ); + }, + translate: function ( distance, axis ) { + console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' ); + return this.translateOnAxis( axis, distance ); + } + } ); + + Object.defineProperties( Object3D.prototype, { + eulerOrder: { + get: function () { + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + return this.rotation.order; + }, + set: function ( value ) { + console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); + this.rotation.order = value; + } + }, + useQuaternion: { + get: function () { + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + }, + set: function ( value ) { + console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); + } + } + } ); + + Object.defineProperties( LOD.prototype, { + objects: { + get: function () { + console.warn( 'THREE.LOD: .objects has been renamed to .levels.' ); + return this.levels; + } + } + } ); + + // + + PerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) { + + console.warn( "THREE.PerspectiveCamera.setLens is deprecated. " + + "Use .setFocalLength and .filmGauge for a photographic setup." ); + + if ( filmGauge !== undefined ) this.filmGauge = filmGauge; + this.setFocalLength( focalLength ); + + }; + + // + + Object.defineProperties( Light.prototype, { + onlyShadow: { + set: function ( value ) { + console.warn( 'THREE.Light: .onlyShadow has been removed.' ); + } + }, + shadowCameraFov: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' ); + this.shadow.camera.fov = value; + } + }, + shadowCameraLeft: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' ); + this.shadow.camera.left = value; + } + }, + shadowCameraRight: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' ); + this.shadow.camera.right = value; + } + }, + shadowCameraTop: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' ); + this.shadow.camera.top = value; + } + }, + shadowCameraBottom: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' ); + this.shadow.camera.bottom = value; + } + }, + shadowCameraNear: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' ); + this.shadow.camera.near = value; + } + }, + shadowCameraFar: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' ); + this.shadow.camera.far = value; + } + }, + shadowCameraVisible: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' ); + } + }, + shadowBias: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' ); + this.shadow.bias = value; + } + }, + shadowDarkness: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowDarkness has been removed.' ); + } + }, + shadowMapWidth: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' ); + this.shadow.mapSize.width = value; + } + }, + shadowMapHeight: { + set: function ( value ) { + console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' ); + this.shadow.mapSize.height = value; + } + } + } ); + + // + + Object.defineProperties( BufferAttribute.prototype, { + length: { + get: function () { + console.warn( 'THREE.BufferAttribute: .length has been deprecated. Please use .count.' ); + return this.array.length; + } + } + } ); + + Object.assign( BufferGeometry.prototype, { + addIndex: function ( index ) { + console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' ); + this.setIndex( index ); + }, + addDrawCall: function ( start, count, indexOffset ) { + if ( indexOffset !== undefined ) { + console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' ); + } + console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' ); + this.addGroup( start, count ); + }, + clearDrawCalls: function () { + console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' ); + this.clearGroups(); + }, + computeTangents: function () { + console.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' ); + }, + computeOffsets: function () { + console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' ); + } + } ); + + Object.defineProperties( BufferGeometry.prototype, { + drawcalls: { + get: function () { + console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' ); + return this.groups; + } + }, + offsets: { + get: function () { + console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' ); + return this.groups; + } + } + } ); + + // + + Object.defineProperties( Material.prototype, { + wrapAround: { + get: function () { + console.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' ); + }, + set: function ( value ) { + console.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' ); + } + }, + wrapRGB: { + get: function () { + console.warn( 'THREE.' + this.type + ': .wrapRGB has been removed.' ); + return new Color(); + } + } + } ); + + Object.defineProperties( MeshPhongMaterial.prototype, { + metal: { + get: function () { + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' ); + return false; + }, + set: function ( value ) { + console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' ); + } + } + } ); + + Object.defineProperties( ShaderMaterial.prototype, { + derivatives: { + get: function () { + console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + return this.extensions.derivatives; + }, + set: function ( value ) { + console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); + this.extensions.derivatives = value; + } + } + } ); + + // + + EventDispatcher.prototype = Object.assign( Object.create( { + + // Note: Extra base ensures these properties are not 'assign'ed. + + constructor: EventDispatcher, + + apply: function ( target ) { + + console.warn( "THREE.EventDispatcher: .apply is deprecated, " + + "just inherit or Object.assign the prototype to mix-in." ); + + Object.assign( target, this ); + + } + + } ), EventDispatcher.prototype ); + + // + + Object.defineProperties( Uniform.prototype, { + dynamic: { + set: function ( value ) { + console.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' ); + } + }, + onUpdate: { + value: function () { + console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' ); + return this; + } + } + } ); + + // + + Object.assign( WebGLRenderer.prototype, { + supportsFloatTextures: function () { + console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' ); + return this.extensions.get( 'OES_texture_float' ); + }, + supportsHalfFloatTextures: function () { + console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' ); + return this.extensions.get( 'OES_texture_half_float' ); + }, + supportsStandardDerivatives: function () { + console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' ); + return this.extensions.get( 'OES_standard_derivatives' ); + }, + supportsCompressedTextureS3TC: function () { + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_s3tc' ); + }, + supportsCompressedTexturePVRTC: function () { + console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' ); + return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' ); + }, + supportsBlendMinMax: function () { + console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' ); + return this.extensions.get( 'EXT_blend_minmax' ); + }, + supportsVertexTextures: function () { + return this.capabilities.vertexTextures; + }, + supportsInstancedArrays: function () { + console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' ); + return this.extensions.get( 'ANGLE_instanced_arrays' ); + }, + enableScissorTest: function ( boolean ) { + console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' ); + this.setScissorTest( boolean ); + }, + initMaterial: function () { + console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' ); + }, + addPrePlugin: function () { + console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' ); + }, + addPostPlugin: function () { + console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' ); + }, + updateShadowMap: function () { + console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' ); + } + } ); + + Object.defineProperties( WebGLRenderer.prototype, { + shadowMapEnabled: { + get: function () { + return this.shadowMap.enabled; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' ); + this.shadowMap.enabled = value; + } + }, + shadowMapType: { + get: function () { + return this.shadowMap.type; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' ); + this.shadowMap.type = value; + } + }, + shadowMapCullFace: { + get: function () { + return this.shadowMap.cullFace; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' ); + this.shadowMap.cullFace = value; + } + } + } ); + + Object.defineProperties( WebGLShadowMap.prototype, { + cullFace: { + get: function () { + return this.renderReverseSided ? CullFaceFront : CullFaceBack; + }, + set: function ( cullFace ) { + var value = ( cullFace !== CullFaceBack ); + console.warn( "WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to " + value + "." ); + this.renderReverseSided = value; + } + } + } ); + + // + + Object.defineProperties( WebGLRenderTarget.prototype, { + wrapS: { + get: function () { + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + return this.texture.wrapS; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); + this.texture.wrapS = value; + } + }, + wrapT: { + get: function () { + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + return this.texture.wrapT; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); + this.texture.wrapT = value; + } + }, + magFilter: { + get: function () { + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + return this.texture.magFilter; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); + this.texture.magFilter = value; + } + }, + minFilter: { + get: function () { + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + return this.texture.minFilter; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); + this.texture.minFilter = value; + } + }, + anisotropy: { + get: function () { + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + return this.texture.anisotropy; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); + this.texture.anisotropy = value; + } + }, + offset: { + get: function () { + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + return this.texture.offset; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); + this.texture.offset = value; + } + }, + repeat: { + get: function () { + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + return this.texture.repeat; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); + this.texture.repeat = value; + } + }, + format: { + get: function () { + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + return this.texture.format; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); + this.texture.format = value; + } + }, + type: { + get: function () { + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + return this.texture.type; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); + this.texture.type = value; + } + }, + generateMipmaps: { + get: function () { + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + return this.texture.generateMipmaps; + }, + set: function ( value ) { + console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); + this.texture.generateMipmaps = value; + } + } + } ); + + // + + Object.assign( Audio.prototype, { + load: function ( file ) { + console.warn( 'THREE.Audio: .load has been deprecated. Please use THREE.AudioLoader.' ); + var scope = this; + var audioLoader = new AudioLoader(); + audioLoader.load( file, function ( buffer ) { + scope.setBuffer( buffer ); + } ); + return this; + } + } ); + + Object.assign( AudioAnalyser.prototype, { + getData: function ( file ) { + console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' ); + return this.getFrequencyData(); + } + } ); + + // + + var GeometryUtils = { + + merge: function ( geometry1, geometry2, materialIndexOffset ) { + + console.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' ); + + var matrix; + + if ( geometry2.isMesh ) { + + geometry2.matrixAutoUpdate && geometry2.updateMatrix(); + + matrix = geometry2.matrix; + geometry2 = geometry2.geometry; + + } + + geometry1.merge( geometry2, matrix, materialIndexOffset ); + + }, + + center: function ( geometry ) { + + console.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' ); + return geometry.center(); + + } + + }; + + var ImageUtils = { + + crossOrigin: undefined, + + loadTexture: function ( url, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' ); + + var loader = new TextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( url, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }, + + loadTextureCube: function ( urls, mapping, onLoad, onError ) { + + console.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' ); + + var loader = new CubeTextureLoader(); + loader.setCrossOrigin( this.crossOrigin ); + + var texture = loader.load( urls, onLoad, undefined, onError ); + + if ( mapping ) texture.mapping = mapping; + + return texture; + + }, + + loadCompressedTexture: function () { + + console.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' ); + + }, + + loadCompressedTextureCube: function () { + + console.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' ); + + } + + }; + + // + + function Projector () { + + console.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' ); + + this.projectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .projectVector() is now vector.project().' ); + vector.project( camera ); + + }; + + this.unprojectVector = function ( vector, camera ) { + + console.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' ); + vector.unproject( camera ); + + }; + + this.pickingRay = function ( vector, camera ) { + + console.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' ); + + }; + + } + + // + + function CanvasRenderer () { + + console.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' ); + + this.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); + this.clear = function () {}; + this.render = function () {}; + this.setClearColor = function () {}; + this.setSize = function () {}; + + } + + exports.WebGLRenderTargetCube = WebGLRenderTargetCube; + exports.WebGLRenderTarget = WebGLRenderTarget; + exports.WebGLRenderer = WebGLRenderer; + exports.ShaderLib = ShaderLib; + exports.UniformsLib = UniformsLib; + exports.UniformsUtils = UniformsUtils; + exports.ShaderChunk = ShaderChunk; + exports.FogExp2 = FogExp2; + exports.Fog = Fog; + exports.Scene = Scene; + exports.LensFlare = LensFlare; + exports.Sprite = Sprite; + exports.LOD = LOD; + exports.SkinnedMesh = SkinnedMesh; + exports.Skeleton = Skeleton; + exports.Bone = Bone; + exports.Mesh = Mesh; + exports.LineSegments = LineSegments; + exports.Line = Line; + exports.Points = Points; + exports.Group = Group; + exports.VideoTexture = VideoTexture; + exports.DataTexture = DataTexture; + exports.CompressedTexture = CompressedTexture; + exports.CubeTexture = CubeTexture; + exports.CanvasTexture = CanvasTexture; + exports.DepthTexture = DepthTexture; + exports.TextureIdCount = TextureIdCount; + exports.Texture = Texture; + exports.MaterialIdCount = MaterialIdCount; + exports.CompressedTextureLoader = CompressedTextureLoader; + exports.BinaryTextureLoader = BinaryTextureLoader; + exports.DataTextureLoader = DataTextureLoader; + exports.CubeTextureLoader = CubeTextureLoader; + exports.TextureLoader = TextureLoader; + exports.ObjectLoader = ObjectLoader; + exports.MaterialLoader = MaterialLoader; + exports.BufferGeometryLoader = BufferGeometryLoader; + exports.DefaultLoadingManager = DefaultLoadingManager; + exports.LoadingManager = LoadingManager; + exports.JSONLoader = JSONLoader; + exports.ImageLoader = ImageLoader; + exports.FontLoader = FontLoader; + exports.XHRLoader = XHRLoader; + exports.Loader = Loader; + exports.Cache = Cache; + exports.AudioLoader = AudioLoader; + exports.SpotLightShadow = SpotLightShadow; + exports.SpotLight = SpotLight; + exports.PointLight = PointLight; + exports.HemisphereLight = HemisphereLight; + exports.DirectionalLightShadow = DirectionalLightShadow; + exports.DirectionalLight = DirectionalLight; + exports.AmbientLight = AmbientLight; + exports.LightShadow = LightShadow; + exports.Light = Light; + exports.StereoCamera = StereoCamera; + exports.PerspectiveCamera = PerspectiveCamera; + exports.OrthographicCamera = OrthographicCamera; + exports.CubeCamera = CubeCamera; + exports.Camera = Camera; + exports.AudioListener = AudioListener; + exports.PositionalAudio = PositionalAudio; + exports.getAudioContext = getAudioContext; + exports.AudioAnalyser = AudioAnalyser; + exports.Audio = Audio; + exports.VectorKeyframeTrack = VectorKeyframeTrack; + exports.StringKeyframeTrack = StringKeyframeTrack; + exports.QuaternionKeyframeTrack = QuaternionKeyframeTrack; + exports.NumberKeyframeTrack = NumberKeyframeTrack; + exports.ColorKeyframeTrack = ColorKeyframeTrack; + exports.BooleanKeyframeTrack = BooleanKeyframeTrack; + exports.PropertyMixer = PropertyMixer; + exports.PropertyBinding = PropertyBinding; + exports.KeyframeTrack = KeyframeTrack; + exports.AnimationUtils = AnimationUtils; + exports.AnimationObjectGroup = AnimationObjectGroup; + exports.AnimationMixer = AnimationMixer; + exports.AnimationClip = AnimationClip; + exports.Uniform = Uniform; + exports.InstancedBufferGeometry = InstancedBufferGeometry; + exports.BufferGeometry = BufferGeometry; + exports.GeometryIdCount = GeometryIdCount; + exports.Geometry = Geometry; + exports.InterleavedBufferAttribute = InterleavedBufferAttribute; + exports.InstancedInterleavedBuffer = InstancedInterleavedBuffer; + exports.InterleavedBuffer = InterleavedBuffer; + exports.InstancedBufferAttribute = InstancedBufferAttribute; + exports.DynamicBufferAttribute = DynamicBufferAttribute; + exports.Float64Attribute = Float64Attribute; + exports.Float32Attribute = Float32Attribute; + exports.Uint32Attribute = Uint32Attribute; + exports.Int32Attribute = Int32Attribute; + exports.Uint16Attribute = Uint16Attribute; + exports.Int16Attribute = Int16Attribute; + exports.Uint8ClampedAttribute = Uint8ClampedAttribute; + exports.Uint8Attribute = Uint8Attribute; + exports.Int8Attribute = Int8Attribute; + exports.BufferAttribute = BufferAttribute; + exports.Face3 = Face3; + exports.Object3DIdCount = Object3DIdCount; + exports.Object3D = Object3D; + exports.Raycaster = Raycaster; + exports.Layers = Layers; + exports.EventDispatcher = EventDispatcher; + exports.Clock = Clock; + exports.QuaternionLinearInterpolant = QuaternionLinearInterpolant; + exports.LinearInterpolant = LinearInterpolant; + exports.DiscreteInterpolant = DiscreteInterpolant; + exports.CubicInterpolant = CubicInterpolant; + exports.Interpolant = Interpolant; + exports.Triangle = Triangle; + exports.Spline = Spline; + exports.Math = _Math; + exports.Spherical = Spherical; + exports.Plane = Plane; + exports.Frustum = Frustum; + exports.Sphere = Sphere; + exports.Ray = Ray; + exports.Matrix4 = Matrix4; + exports.Matrix3 = Matrix3; + exports.Box3 = Box3; + exports.Box2 = Box2; + exports.Line3 = Line3; + exports.Euler = Euler; + exports.Vector4 = Vector4; + exports.Vector3 = Vector3; + exports.Vector2 = Vector2; + exports.Quaternion = Quaternion; + exports.ColorKeywords = ColorKeywords; + exports.Color = Color; + exports.MorphBlendMesh = MorphBlendMesh; + exports.ImmediateRenderObject = ImmediateRenderObject; + exports.VertexNormalsHelper = VertexNormalsHelper; + exports.SpotLightHelper = SpotLightHelper; + exports.SkeletonHelper = SkeletonHelper; + exports.PointLightHelper = PointLightHelper; + exports.HemisphereLightHelper = HemisphereLightHelper; + exports.GridHelper = GridHelper; + exports.FaceNormalsHelper = FaceNormalsHelper; + exports.DirectionalLightHelper = DirectionalLightHelper; + exports.CameraHelper = CameraHelper; + exports.BoundingBoxHelper = BoundingBoxHelper; + exports.BoxHelper = BoxHelper; + exports.ArrowHelper = ArrowHelper; + exports.AxisHelper = AxisHelper; + exports.ClosedSplineCurve3 = ClosedSplineCurve3; + exports.CatmullRomCurve3 = CatmullRomCurve3; + exports.SplineCurve3 = SplineCurve3; + exports.CubicBezierCurve3 = CubicBezierCurve3; + exports.QuadraticBezierCurve3 = QuadraticBezierCurve3; + exports.LineCurve3 = LineCurve3; + exports.ArcCurve = ArcCurve; + exports.EllipseCurve = EllipseCurve; + exports.SplineCurve = SplineCurve; + exports.CubicBezierCurve = CubicBezierCurve; + exports.QuadraticBezierCurve = QuadraticBezierCurve; + exports.LineCurve = LineCurve; + exports.Shape = Shape; + exports.ShapePath = ShapePath; + exports.Path = Path; + exports.Font = Font; + exports.CurvePath = CurvePath; + exports.Curve = Curve; + exports.ShapeUtils = ShapeUtils; + exports.SceneUtils = SceneUtils; + exports.CurveUtils = CurveUtils; + exports.WireframeGeometry = WireframeGeometry; + exports.ParametricGeometry = ParametricGeometry; + exports.ParametricBufferGeometry = ParametricBufferGeometry; + exports.TetrahedronGeometry = TetrahedronGeometry; + exports.TetrahedronBufferGeometry = TetrahedronBufferGeometry; + exports.OctahedronGeometry = OctahedronGeometry; + exports.OctahedronBufferGeometry = OctahedronBufferGeometry; + exports.IcosahedronGeometry = IcosahedronGeometry; + exports.IcosahedronBufferGeometry = IcosahedronBufferGeometry; + exports.DodecahedronGeometry = DodecahedronGeometry; + exports.DodecahedronBufferGeometry = DodecahedronBufferGeometry; + exports.PolyhedronGeometry = PolyhedronGeometry; + exports.PolyhedronBufferGeometry = PolyhedronBufferGeometry; + exports.TubeGeometry = TubeGeometry; + exports.TubeBufferGeometry = TubeBufferGeometry; + exports.TorusKnotGeometry = TorusKnotGeometry; + exports.TorusKnotBufferGeometry = TorusKnotBufferGeometry; + exports.TorusGeometry = TorusGeometry; + exports.TorusBufferGeometry = TorusBufferGeometry; + exports.TextGeometry = TextGeometry; + exports.SphereBufferGeometry = SphereBufferGeometry; + exports.SphereGeometry = SphereGeometry; + exports.RingGeometry = RingGeometry; + exports.RingBufferGeometry = RingBufferGeometry; + exports.PlaneBufferGeometry = PlaneBufferGeometry; + exports.PlaneGeometry = PlaneGeometry; + exports.LatheGeometry = LatheGeometry; + exports.LatheBufferGeometry = LatheBufferGeometry; + exports.ShapeGeometry = ShapeGeometry; + exports.ExtrudeGeometry = ExtrudeGeometry; + exports.EdgesGeometry = EdgesGeometry; + exports.ConeGeometry = ConeGeometry; + exports.ConeBufferGeometry = ConeBufferGeometry; + exports.CylinderGeometry = CylinderGeometry; + exports.CylinderBufferGeometry = CylinderBufferGeometry; + exports.CircleBufferGeometry = CircleBufferGeometry; + exports.CircleGeometry = CircleGeometry; + exports.BoxBufferGeometry = BoxBufferGeometry; + exports.BoxGeometry = BoxGeometry; + exports.ShadowMaterial = ShadowMaterial; + exports.SpriteMaterial = SpriteMaterial; + exports.RawShaderMaterial = RawShaderMaterial; + exports.ShaderMaterial = ShaderMaterial; + exports.PointsMaterial = PointsMaterial; + exports.MultiMaterial = MultiMaterial; + exports.MeshPhysicalMaterial = MeshPhysicalMaterial; + exports.MeshStandardMaterial = MeshStandardMaterial; + exports.MeshPhongMaterial = MeshPhongMaterial; + exports.MeshNormalMaterial = MeshNormalMaterial; + exports.MeshLambertMaterial = MeshLambertMaterial; + exports.MeshDepthMaterial = MeshDepthMaterial; + exports.MeshBasicMaterial = MeshBasicMaterial; + exports.LineDashedMaterial = LineDashedMaterial; + exports.LineBasicMaterial = LineBasicMaterial; + exports.Material = Material; + exports.REVISION = REVISION; + exports.MOUSE = MOUSE; + exports.CullFaceNone = CullFaceNone; + exports.CullFaceBack = CullFaceBack; + exports.CullFaceFront = CullFaceFront; + exports.CullFaceFrontBack = CullFaceFrontBack; + exports.FrontFaceDirectionCW = FrontFaceDirectionCW; + exports.FrontFaceDirectionCCW = FrontFaceDirectionCCW; + exports.BasicShadowMap = BasicShadowMap; + exports.PCFShadowMap = PCFShadowMap; + exports.PCFSoftShadowMap = PCFSoftShadowMap; + exports.FrontSide = FrontSide; + exports.BackSide = BackSide; + exports.DoubleSide = DoubleSide; + exports.FlatShading = FlatShading; + exports.SmoothShading = SmoothShading; + exports.NoColors = NoColors; + exports.FaceColors = FaceColors; + exports.VertexColors = VertexColors; + exports.NoBlending = NoBlending; + exports.NormalBlending = NormalBlending; + exports.AdditiveBlending = AdditiveBlending; + exports.SubtractiveBlending = SubtractiveBlending; + exports.MultiplyBlending = MultiplyBlending; + exports.CustomBlending = CustomBlending; + exports.BlendingMode = BlendingMode; + exports.AddEquation = AddEquation; + exports.SubtractEquation = SubtractEquation; + exports.ReverseSubtractEquation = ReverseSubtractEquation; + exports.MinEquation = MinEquation; + exports.MaxEquation = MaxEquation; + exports.ZeroFactor = ZeroFactor; + exports.OneFactor = OneFactor; + exports.SrcColorFactor = SrcColorFactor; + exports.OneMinusSrcColorFactor = OneMinusSrcColorFactor; + exports.SrcAlphaFactor = SrcAlphaFactor; + exports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor; + exports.DstAlphaFactor = DstAlphaFactor; + exports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor; + exports.DstColorFactor = DstColorFactor; + exports.OneMinusDstColorFactor = OneMinusDstColorFactor; + exports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor; + exports.NeverDepth = NeverDepth; + exports.AlwaysDepth = AlwaysDepth; + exports.LessDepth = LessDepth; + exports.LessEqualDepth = LessEqualDepth; + exports.EqualDepth = EqualDepth; + exports.GreaterEqualDepth = GreaterEqualDepth; + exports.GreaterDepth = GreaterDepth; + exports.NotEqualDepth = NotEqualDepth; + exports.MultiplyOperation = MultiplyOperation; + exports.MixOperation = MixOperation; + exports.AddOperation = AddOperation; + exports.NoToneMapping = NoToneMapping; + exports.LinearToneMapping = LinearToneMapping; + exports.ReinhardToneMapping = ReinhardToneMapping; + exports.Uncharted2ToneMapping = Uncharted2ToneMapping; + exports.CineonToneMapping = CineonToneMapping; + exports.UVMapping = UVMapping; + exports.CubeReflectionMapping = CubeReflectionMapping; + exports.CubeRefractionMapping = CubeRefractionMapping; + exports.EquirectangularReflectionMapping = EquirectangularReflectionMapping; + exports.EquirectangularRefractionMapping = EquirectangularRefractionMapping; + exports.SphericalReflectionMapping = SphericalReflectionMapping; + exports.CubeUVReflectionMapping = CubeUVReflectionMapping; + exports.CubeUVRefractionMapping = CubeUVRefractionMapping; + exports.TextureMapping = TextureMapping; + exports.RepeatWrapping = RepeatWrapping; + exports.ClampToEdgeWrapping = ClampToEdgeWrapping; + exports.MirroredRepeatWrapping = MirroredRepeatWrapping; + exports.TextureWrapping = TextureWrapping; + exports.NearestFilter = NearestFilter; + exports.NearestMipMapNearestFilter = NearestMipMapNearestFilter; + exports.NearestMipMapLinearFilter = NearestMipMapLinearFilter; + exports.LinearFilter = LinearFilter; + exports.LinearMipMapNearestFilter = LinearMipMapNearestFilter; + exports.LinearMipMapLinearFilter = LinearMipMapLinearFilter; + exports.TextureFilter = TextureFilter; + exports.UnsignedByteType = UnsignedByteType; + exports.ByteType = ByteType; + exports.ShortType = ShortType; + exports.UnsignedShortType = UnsignedShortType; + exports.IntType = IntType; + exports.UnsignedIntType = UnsignedIntType; + exports.FloatType = FloatType; + exports.HalfFloatType = HalfFloatType; + exports.UnsignedShort4444Type = UnsignedShort4444Type; + exports.UnsignedShort5551Type = UnsignedShort5551Type; + exports.UnsignedShort565Type = UnsignedShort565Type; + exports.UnsignedInt248Type = UnsignedInt248Type; + exports.AlphaFormat = AlphaFormat; + exports.RGBFormat = RGBFormat; + exports.RGBAFormat = RGBAFormat; + exports.LuminanceFormat = LuminanceFormat; + exports.LuminanceAlphaFormat = LuminanceAlphaFormat; + exports.RGBEFormat = RGBEFormat; + exports.DepthFormat = DepthFormat; + exports.DepthStencilFormat = DepthStencilFormat; + exports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format; + exports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format; + exports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format; + exports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format; + exports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format; + exports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format; + exports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format; + exports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format; + exports.RGB_ETC1_Format = RGB_ETC1_Format; + exports.LoopOnce = LoopOnce; + exports.LoopRepeat = LoopRepeat; + exports.LoopPingPong = LoopPingPong; + exports.InterpolateDiscrete = InterpolateDiscrete; + exports.InterpolateLinear = InterpolateLinear; + exports.InterpolateSmooth = InterpolateSmooth; + exports.ZeroCurvatureEnding = ZeroCurvatureEnding; + exports.ZeroSlopeEnding = ZeroSlopeEnding; + exports.WrapAroundEnding = WrapAroundEnding; + exports.TrianglesDrawMode = TrianglesDrawMode; + exports.TriangleStripDrawMode = TriangleStripDrawMode; + exports.TriangleFanDrawMode = TriangleFanDrawMode; + exports.LinearEncoding = LinearEncoding; + exports.sRGBEncoding = sRGBEncoding; + exports.GammaEncoding = GammaEncoding; + exports.RGBEEncoding = RGBEEncoding; + exports.LogLuvEncoding = LogLuvEncoding; + exports.RGBM7Encoding = RGBM7Encoding; + exports.RGBM16Encoding = RGBM16Encoding; + exports.RGBDEncoding = RGBDEncoding; + exports.BasicDepthPacking = BasicDepthPacking; + exports.RGBADepthPacking = RGBADepthPacking; + exports.CubeGeometry = BoxGeometry; + exports.Face4 = Face4; + exports.LineStrip = LineStrip; + exports.LinePieces = LinePieces; + exports.MeshFaceMaterial = MultiMaterial; + exports.PointCloud = PointCloud; + exports.Particle = Sprite; + exports.ParticleSystem = ParticleSystem; + exports.PointCloudMaterial = PointCloudMaterial; + exports.ParticleBasicMaterial = ParticleBasicMaterial; + exports.ParticleSystemMaterial = ParticleSystemMaterial; + exports.Vertex = Vertex; + exports.EdgesHelper = EdgesHelper; + exports.WireframeHelper = WireframeHelper; + exports.GeometryUtils = GeometryUtils; + exports.ImageUtils = ImageUtils; + exports.Projector = Projector; + exports.CanvasRenderer = CanvasRenderer; + + Object.defineProperty(exports, '__esModule', { value: true }); + + Object.defineProperty( exports, 'AudioContext', { + get: function () { + return exports.getAudioContext(); + } + }); + + }))); + + +/***/ }, +/* 3 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + var THREE = __webpack_require__(2); + + var Agent = function Agent(id, pos, vel, goal, size, col) { + _classCallCheck(this, Agent); + + this.id = id; + this.position = pos; + this.velocity = vel; + this.goal = goal; + this.size = size; + this.markers = []; + this.color = col; + this.mesh = null; + }; + + exports.default = Agent; + +/***/ }, +/* 4 */ +/***/ function(module, exports) { + + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + var Marker = function Marker(position) { + _classCallCheck(this, Marker); + + this.position = position; + this.color = 0xff0000; + this.owned = false; + this.mesh = null; + this.agent = null; + }; + + exports.default = Marker; + +/***/ }, +/* 5 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + + var _grid = __webpack_require__(1); + + var _grid2 = _interopRequireDefault(_grid); + + var _agent = __webpack_require__(3); + + var _agent2 = _interopRequireDefault(_agent); + + var _marker = __webpack_require__(4); + + var _marker2 = _interopRequireDefault(_marker); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + var THREE = __webpack_require__(2); + + var Crowd = function () { + function Crowd(renderengine) { + _classCallCheck(this, Crowd); + + this.renderengine = renderengine; + this.markers = []; + this.agents = []; + this.board = new _grid2.default(10.0, 100.0); + + this.create_agents(); + this.populate_board(); + this.create_markers(); + this.renderengine.render_plane(100.0); + this.renderengine.render_agents(this.agents); + this.renderengine.render_markers(this.markers); + } + + _createClass(Crowd, [{ + key: 'create_agents', + value: function create_agents() { + var agent_1_pos = new THREE.Vector3(-49, 1, 49); + var agent_2_pos = new THREE.Vector3(49, 1, 49); + var agent_1_goal = new THREE.Vector3(49, 0, -49); + var agent_2_goal = new THREE.Vector3(-49, 0, -49); + var zero = new THREE.Vector3(0, 0, 0); + + var agent_1 = new _agent2.default(0, agent_1_pos, zero, agent_1_goal, 2.0, 0x00ff00); + var agent_2 = new _agent2.default(1, agent_2_pos, zero, agent_2_goal, 2.0, 0x0000ff); + this.agents.push(agent_1); + this.agents.push(agent_2); + } + }, { + key: 'populate_board', + value: function populate_board() { + for (var i = 0; i < this.agents.length; i++) { + var agent = this.agents[i]; + var gs = this.board.find_nearest_grid(agent.position.x, agent.position.z); + this.board.grid[gs.z][gs.x].add(agent); + } + } + }, { + key: 'create_markers', + value: function create_markers() { + for (var i = 0; i < 2000; i++) { + var x = Math.random() * 98 - 49; + var z = Math.random() * 98 - 49; + var marker = new _marker2.default(new THREE.Vector3(x, 0.5, z)); + this.markers.push(marker); + } + } + + /* + update() - for each agent in the crowd, the velocity is calculated based off of the markers that belongs to each agent. + */ + + }, { + key: 'update', + value: function update(time) { + this.update_marker_ownership(); + this.update_agent_velocities(time); + this.renderengine.update_agents(this.agents); + this.renderengine.update_markers(this.markers); + this.reset_ownership(); + } + }, { + key: 'reset_ownership', + value: function reset_ownership() { + for (var i = 0; i < this.agents.length; i++) { + this.agents[i].markers = []; + } + + for (var i = 0; i < this.markers.length; i++) { + this.markers[i].owned = false; + this.markers[i].color = 0xff0000; + this.markers[i].agent = null; + } + } + }, { + key: 'update_marker_ownership', + value: function update_marker_ownership() { + for (var i = 0; i < this.markers.length; i++) { + var marker = this.markers[i]; + if (marker.owned) { + continue; + } + var ngs = this.board.find_nearest_grid(marker.position.x, marker.position.z); + var top_left = { x: ngs.x - 1, z: ngs.z - 1 }; + var top = { x: ngs.x, z: ngs.z - 1 }; + var left = { x: ngs.x - 1, z: ngs.z }; + var grid = this.board.grid; + var eligible_agents = []; + if (top_left.z > -1 && top_left.x > -1 && grid[top_left.z][top_left.x].size > 0) { + grid[top_left.z][top_left.x].forEach(function (agent) { + eligible_agents.push(agent); + }); + } + if (top.z > -1 && top.x > -1 && grid[top.z][top.x].size > 0) { + grid[top.z][top.x].forEach(function (agent) { + eligible_agents.push(agent); + }); + } + if (left.z > -1 && left.x > -1 && grid[left.z][left.x].size > 0) { + grid[left.z][left.x].forEach(function (agent) { + eligible_agents.push(agent); + }); + } + if (ngs.z > -1 && ngs.x > -1 && grid[ngs.z][ngs.x].size > 0) { + grid[ngs.z][ngs.x].forEach(function (agent) { + eligible_agents.push(agent); + }); + } + this.assign_marker_to_agent(eligible_agents, marker); + } + } + }, { + key: 'assign_marker_to_agent', + value: function assign_marker_to_agent(agents, marker) { + if (agents.length === 0) { + marker.color = 0xff0000; + marker.owned = false; + marker.agent = null; + return; + } + var closest = { dist: marker.position.distanceTo(agents[0].position), agent: agents[0] }; + agents.forEach(function (agent) { + var test_dist = marker.position.distanceTo(agent.position); + if (test_dist < closest.dist) { + closest.dist = test_dist; + closest.agent = agent; + } + }); + marker.agent = closest.agent; + marker.color = closest.agent.color; + marker.owned = true; + closest.agent.markers.push(marker); + return; + } + }, { + key: 'update_agent_velocities', + value: function update_agent_velocities(time) { + for (var i = 0; i < this.agents.length; i++) { + var agent = this.agents[i]; + if (agent.position.distanceTo(agent.goal) > 2.0) { + var old_gs = this.board.find_nearest_grid(agent.position.x, agent.position.z); + + // computing total marker influence + var G = new THREE.Vector3(agent.goal.x - agent.position.x, 0, agent.goal.z - agent.position.z); + var total_weight = 0.0; + var total_velocity = new THREE.Vector3(0, 0, 0); + for (var j = 0; j < agent.markers.length; j++) { + var marker = agent.markers[j]; + var m = new THREE.Vector3(marker.position.x - agent.position.x, 0, marker.position.z - agent.position.z); + var weight = (1.0 + Math.cos(m.angleTo(G))) / (1.0 + m.length()); + total_weight += weight; + } + for (var j = 0; j < agent.markers.length; j++) { + var marker = agent.markers[j]; + var m = new THREE.Vector3(marker.position.x - agent.position.x, 0, marker.position.z - agent.position.z); + var weight = (1.0 + Math.cos(m.angleTo(G))) / (1.0 + m.length()); + total_velocity.add(m.multiplyScalar(weight / total_weight)); + } + if (i === 1) {} + // agent.velocity = total_velocity.normalize(); + agent.position.add(total_velocity.multiplyScalar(time).normalize()); + // agent.position.add(G.divideScalar(100.0)); + // check if the movement of this agent causes it to leave its current grid + var agent_gs = this.board.find_nearest_grid(agent.position.x, agent.position.z); + if (old_gs.x !== agent_gs.x || old_gs.z !== agent_gs.z) { + this.board.grid[old_gs.z][old_gs.x].delete(agent); + this.board.grid[agent_gs.z][agent_gs.x].add(agent); + } + } + } + } + }]); + + return Crowd; + }(); + + exports.default = Crowd; + +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + var THREE = __webpack_require__(2); + + var RenderEngine = function () { + function RenderEngine(scene) { + _classCallCheck(this, RenderEngine); + + this.scene = scene; + } + + _createClass(RenderEngine, [{ + key: 'render_plane', + value: function render_plane(size) { + var plane_geo = new THREE.PlaneGeometry(size, size); + var plane_mesh = new THREE.Mesh(plane_geo, new THREE.MeshBasicMaterial({ color: 0xcccccc, side: THREE.DoubleSide })); + plane_mesh.rotation.x = Math.PI / 2.0; + plane_mesh.position.set(0.0, 0.0, 0.0); + this.scene.add(plane_mesh); + } + }, { + key: 'render_agents', + value: function render_agents(agents) { + var cylinder_geo = new THREE.CylinderGeometry(1, 1, 2, 20); + var agent; + for (var i = 0; i < agents.length; i++) { + agent = new THREE.Mesh(cylinder_geo, new THREE.MeshBasicMaterial({ color: agents[i].color, side: THREE.DoubleSide })); + agent.position.set(agents[i].position.x, agents[i].position.y, agents[i].position.z); + agents[i].mesh = agent; + this.scene.add(agent); + } + } + }, { + key: 'render_markers', + value: function render_markers(markers) { + var cube_geo = new THREE.BoxGeometry(0.5, 0.5, 0.5); + var marker; + for (var i = 0; i < markers.length; i++) { + marker = new THREE.Mesh(cube_geo, new THREE.MeshBasicMaterial({ color: markers[i].color, side: THREE.DoubleSide })); + marker.position.set(markers[i].position.x, markers[i].position.y, markers[i].position.z); + markers[i].mesh = marker; + this.scene.add(marker); + } + } + }, { + key: 'update_agents', + value: function update_agents(agents) { + for (var i = 0; i < agents.length; i++) { + var pos = agents[i].position; + var mesh = agents[i].mesh; + mesh.position.set(pos.x, pos.y, pos.z); + mesh.geometry.verticesNeedUpdate = true; + } + } + }, { + key: 'update_markers', + value: function update_markers(markers) { + markers.forEach(function (marker) { + marker.mesh.material.color.setHex(marker.color); + }); + } + }]); + + return RenderEngine; + }(); + + exports.default = RenderEngine; + +/***/ }, +/* 7 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _statsJs = __webpack_require__(8); + + var _statsJs2 = _interopRequireDefault(_statsJs); + + var _datGui = __webpack_require__(9); + + var _datGui2 = _interopRequireDefault(_datGui); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + var THREE = __webpack_require__(2); + var OrbitControls = __webpack_require__(12)(THREE); + + + // when the scene is done initializing, the function passed as `callback` will be executed + // then, every frame, the function passed as `update` will be executed + function init(callback, update) { + var stats = new _statsJs2.default(); + stats.setMode(1); + stats.domElement.style.position = 'absolute'; + stats.domElement.style.left = '0px'; + stats.domElement.style.top = '0px'; + document.body.appendChild(stats.domElement); + + var gui = new _datGui2.default.GUI(); + + var framework = { + gui: gui, + stats: stats + }; + + // run this function after the window loads + window.addEventListener('load', function () { + + var scene = new THREE.Scene(); + var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); + var renderer = new THREE.WebGLRenderer({ antialias: true }); + renderer.setPixelRatio(window.devicePixelRatio); + renderer.setSize(window.innerWidth, window.innerHeight); + renderer.setClearColor(0x020202, 0); + + var controls = new OrbitControls(camera, renderer.domElement); + controls.enableDamping = true; + controls.enableZoom = true; + controls.target.set(0, 0, 0); + controls.rotateSpeed = 0.3; + controls.zoomSpeed = 1.0; + controls.panSpeed = 2.0; + + document.body.appendChild(renderer.domElement); + + // resize the canvas when the window changes + window.addEventListener('resize', function () { + camera.aspect = window.innerWidth / window.innerHeight; + camera.updateProjectionMatrix(); + renderer.setSize(window.innerWidth, window.innerHeight); + }, false); + + // assign THREE.js objects to the object we will return + framework.scene = scene; + framework.camera = camera; + framework.renderer = renderer; + + // begin the animation loop + (function tick() { + stats.begin(); + update(framework); // perform any requested updates + renderer.render(scene, camera); // render the scene + stats.end(); + requestAnimationFrame(tick); // register to call this again when the browser renders a new frame + })(); + + // we will pass the scene, gui, renderer, camera, etc... to the callback function + return callback(framework); + }); + } + + exports.default = { + init: init + }; + +/***/ }, +/* 8 */ +/***/ function(module, exports) { + + // stats.js - http://github.com/mrdoob/stats.js + var Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement("div");f.id="stats";f.addEventListener("mousedown",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText="width:80px;opacity:0.9;cursor:pointer";var a=document.createElement("div");a.id="fps";a.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#002";f.appendChild(a);var i=document.createElement("div");i.id="fpsText";i.style.cssText="color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px"; + i.innerHTML="FPS";a.appendChild(i);var c=document.createElement("div");c.id="fpsGraph";c.style.cssText="position:relative;width:74px;height:30px;background-color:#0ff";for(a.appendChild(c);74>c.children.length;){var j=document.createElement("span");j.style.cssText="width:1px;height:30px;float:left;background-color:#113";c.appendChild(j)}var d=document.createElement("div");d.id="ms";d.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#020;display:none";f.appendChild(d);var k=document.createElement("div"); + k.id="msText";k.style.cssText="color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px";k.innerHTML="MS";d.appendChild(k);var e=document.createElement("div");e.id="msGraph";e.style.cssText="position:relative;width:74px;height:30px;background-color:#0f0";for(d.appendChild(e);74>e.children.length;)j=document.createElement("span"),j.style.cssText="width:1px;height:30px;float:left;background-color:#131",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display= + "block";d.style.display="none";break;case 1:a.style.display="none",d.style.display="block"}};return{REVISION:12,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+" MS ("+n+"-"+o+")";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+"px";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+" FPS ("+p+"-"+q+")",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height= + a+"px",m=b,r=0);return b},update:function(){l=this.end()}}};"object"===typeof module&&(module.exports=Stats); + + +/***/ }, +/* 9 */ +/***/ function(module, exports, __webpack_require__) { + + module.exports = __webpack_require__(10) + module.exports.color = __webpack_require__(11) + +/***/ }, +/* 10 */ +/***/ function(module, exports) { + + /** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + /** @namespace */ + var dat = module.exports = dat || {}; + + /** @namespace */ + dat.gui = dat.gui || {}; + + /** @namespace */ + dat.utils = dat.utils || {}; + + /** @namespace */ + dat.controllers = dat.controllers || {}; + + /** @namespace */ + dat.dom = dat.dom || {}; + + /** @namespace */ + dat.color = dat.color || {}; + + dat.utils.css = (function () { + return { + load: function (url, doc) { + doc = doc || document; + var link = doc.createElement('link'); + link.type = 'text/css'; + link.rel = 'stylesheet'; + link.href = url; + doc.getElementsByTagName('head')[0].appendChild(link); + }, + inject: function(css, doc) { + doc = doc || document; + var injected = document.createElement('style'); + injected.type = 'text/css'; + injected.innerHTML = css; + doc.getElementsByTagName('head')[0].appendChild(injected); + } + } + })(); + + + dat.utils.common = (function () { + + var ARR_EACH = Array.prototype.forEach; + var ARR_SLICE = Array.prototype.slice; + + /** + * Band-aid methods for things that should be a lot easier in JavaScript. + * Implementation and structure inspired by underscore.js + * http://documentcloud.github.com/underscore/ + */ + + return { + + BREAK: {}, + + extend: function(target) { + + this.each(ARR_SLICE.call(arguments, 1), function(obj) { + + for (var key in obj) + if (!this.isUndefined(obj[key])) + target[key] = obj[key]; + + }, this); + + return target; + + }, + + defaults: function(target) { + + this.each(ARR_SLICE.call(arguments, 1), function(obj) { + + for (var key in obj) + if (this.isUndefined(target[key])) + target[key] = obj[key]; + + }, this); + + return target; + + }, + + compose: function() { + var toCall = ARR_SLICE.call(arguments); + return function() { + var args = ARR_SLICE.call(arguments); + for (var i = toCall.length -1; i >= 0; i--) { + args = [toCall[i].apply(this, args)]; + } + return args[0]; + } + }, + + each: function(obj, itr, scope) { + + + if (ARR_EACH && obj.forEach === ARR_EACH) { + + obj.forEach(itr, scope); + + } else if (obj.length === obj.length + 0) { // Is number but not NaN + + for (var key = 0, l = obj.length; key < l; key++) + if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) + return; + + } else { + + for (var key in obj) + if (itr.call(scope, obj[key], key) === this.BREAK) + return; + + } + + }, + + defer: function(fnc) { + setTimeout(fnc, 0); + }, + + toArray: function(obj) { + if (obj.toArray) return obj.toArray(); + return ARR_SLICE.call(obj); + }, + + isUndefined: function(obj) { + return obj === undefined; + }, + + isNull: function(obj) { + return obj === null; + }, + + isNaN: function(obj) { + return obj !== obj; + }, + + isArray: Array.isArray || function(obj) { + return obj.constructor === Array; + }, + + isObject: function(obj) { + return obj === Object(obj); + }, + + isNumber: function(obj) { + return obj === obj+0; + }, + + isString: function(obj) { + return obj === obj+''; + }, + + isBoolean: function(obj) { + return obj === false || obj === true; + }, + + isFunction: function(obj) { + return Object.prototype.toString.call(obj) === '[object Function]'; + } + + }; + + })(); + + + dat.controllers.Controller = (function (common) { + + /** + * @class An "abstract" class that represents a given property of an object. + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * + * @member dat.controllers + */ + var Controller = function(object, property) { + + this.initialValue = object[property]; + + /** + * Those who extend this class will put their DOM elements in here. + * @type {DOMElement} + */ + this.domElement = document.createElement('div'); + + /** + * The object to manipulate + * @type {Object} + */ + this.object = object; + + /** + * The name of the property to manipulate + * @type {String} + */ + this.property = property; + + /** + * The function to be called on change. + * @type {Function} + * @ignore + */ + this.__onChange = undefined; + + /** + * The function to be called on finishing change. + * @type {Function} + * @ignore + */ + this.__onFinishChange = undefined; + + }; + + common.extend( + + Controller.prototype, + + /** @lends dat.controllers.Controller.prototype */ + { + + /** + * Specify that a function fire every time someone changes the value with + * this Controller. + * + * @param {Function} fnc This function will be called whenever the value + * is modified via this Controller. + * @returns {dat.controllers.Controller} this + */ + onChange: function(fnc) { + this.__onChange = fnc; + return this; + }, + + /** + * Specify that a function fire every time someone "finishes" changing + * the value wih this Controller. Useful for values that change + * incrementally like numbers or strings. + * + * @param {Function} fnc This function will be called whenever + * someone "finishes" changing the value via this Controller. + * @returns {dat.controllers.Controller} this + */ + onFinishChange: function(fnc) { + this.__onFinishChange = fnc; + return this; + }, + + /** + * Change the value of object[property] + * + * @param {Object} newValue The new value of object[property] + */ + setValue: function(newValue) { + this.object[this.property] = newValue; + if (this.__onChange) { + this.__onChange.call(this, newValue); + } + this.updateDisplay(); + return this; + }, + + /** + * Gets the value of object[property] + * + * @returns {Object} The current value of object[property] + */ + getValue: function() { + return this.object[this.property]; + }, + + /** + * Refreshes the visual display of a Controller in order to keep sync + * with the object's current value. + * @returns {dat.controllers.Controller} this + */ + updateDisplay: function() { + return this; + }, + + /** + * @returns {Boolean} true if the value has deviated from initialValue + */ + isModified: function() { + return this.initialValue !== this.getValue() + } + + } + + ); + + return Controller; + + + })(dat.utils.common); + + + dat.dom.dom = (function (common) { + + var EVENT_MAP = { + 'HTMLEvents': ['change'], + 'MouseEvents': ['click','mousemove','mousedown','mouseup', 'mouseover'], + 'KeyboardEvents': ['keydown'] + }; + + var EVENT_MAP_INV = {}; + common.each(EVENT_MAP, function(v, k) { + common.each(v, function(e) { + EVENT_MAP_INV[e] = k; + }); + }); + + var CSS_VALUE_PIXELS = /(\d+(\.\d+)?)px/; + + function cssValueToPixels(val) { + + if (val === '0' || common.isUndefined(val)) return 0; + + var match = val.match(CSS_VALUE_PIXELS); + + if (!common.isNull(match)) { + return parseFloat(match[1]); + } + + // TODO ...ems? %? + + return 0; + + } + + /** + * @namespace + * @member dat.dom + */ + var dom = { + + /** + * + * @param elem + * @param selectable + */ + makeSelectable: function(elem, selectable) { + + if (elem === undefined || elem.style === undefined) return; + + elem.onselectstart = selectable ? function() { + return false; + } : function() { + }; + + elem.style.MozUserSelect = selectable ? 'auto' : 'none'; + elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none'; + elem.unselectable = selectable ? 'on' : 'off'; + + }, + + /** + * + * @param elem + * @param horizontal + * @param vertical + */ + makeFullscreen: function(elem, horizontal, vertical) { + + if (common.isUndefined(horizontal)) horizontal = true; + if (common.isUndefined(vertical)) vertical = true; + + elem.style.position = 'absolute'; + + if (horizontal) { + elem.style.left = 0; + elem.style.right = 0; + } + if (vertical) { + elem.style.top = 0; + elem.style.bottom = 0; + } + + }, + + /** + * + * @param elem + * @param eventType + * @param params + */ + fakeEvent: function(elem, eventType, params, aux) { + params = params || {}; + var className = EVENT_MAP_INV[eventType]; + if (!className) { + throw new Error('Event type ' + eventType + ' not supported.'); + } + var evt = document.createEvent(className); + switch (className) { + case 'MouseEvents': + var clientX = params.x || params.clientX || 0; + var clientY = params.y || params.clientY || 0; + evt.initMouseEvent(eventType, params.bubbles || false, + params.cancelable || true, window, params.clickCount || 1, + 0, //screen X + 0, //screen Y + clientX, //client X + clientY, //client Y + false, false, false, false, 0, null); + break; + case 'KeyboardEvents': + var init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz + common.defaults(params, { + cancelable: true, + ctrlKey: false, + altKey: false, + shiftKey: false, + metaKey: false, + keyCode: undefined, + charCode: undefined + }); + init(eventType, params.bubbles || false, + params.cancelable, window, + params.ctrlKey, params.altKey, + params.shiftKey, params.metaKey, + params.keyCode, params.charCode); + break; + default: + evt.initEvent(eventType, params.bubbles || false, + params.cancelable || true); + break; + } + common.defaults(evt, aux); + elem.dispatchEvent(evt); + }, + + /** + * + * @param elem + * @param event + * @param func + * @param bool + */ + bind: function(elem, event, func, bool) { + bool = bool || false; + if (elem.addEventListener) + elem.addEventListener(event, func, bool); + else if (elem.attachEvent) + elem.attachEvent('on' + event, func); + return dom; + }, + + /** + * + * @param elem + * @param event + * @param func + * @param bool + */ + unbind: function(elem, event, func, bool) { + bool = bool || false; + if (elem.removeEventListener) + elem.removeEventListener(event, func, bool); + else if (elem.detachEvent) + elem.detachEvent('on' + event, func); + return dom; + }, + + /** + * + * @param elem + * @param className + */ + addClass: function(elem, className) { + if (elem.className === undefined) { + elem.className = className; + } else if (elem.className !== className) { + var classes = elem.className.split(/ +/); + if (classes.indexOf(className) == -1) { + classes.push(className); + elem.className = classes.join(' ').replace(/^\s+/, '').replace(/\s+$/, ''); + } + } + return dom; + }, + + /** + * + * @param elem + * @param className + */ + removeClass: function(elem, className) { + if (className) { + if (elem.className === undefined) { + // elem.className = className; + } else if (elem.className === className) { + elem.removeAttribute('class'); + } else { + var classes = elem.className.split(/ +/); + var index = classes.indexOf(className); + if (index != -1) { + classes.splice(index, 1); + elem.className = classes.join(' '); + } + } + } else { + elem.className = undefined; + } + return dom; + }, + + hasClass: function(elem, className) { + return new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)').test(elem.className) || false; + }, + + /** + * + * @param elem + */ + getWidth: function(elem) { + + var style = getComputedStyle(elem); + + return cssValueToPixels(style['border-left-width']) + + cssValueToPixels(style['border-right-width']) + + cssValueToPixels(style['padding-left']) + + cssValueToPixels(style['padding-right']) + + cssValueToPixels(style['width']); + }, + + /** + * + * @param elem + */ + getHeight: function(elem) { + + var style = getComputedStyle(elem); + + return cssValueToPixels(style['border-top-width']) + + cssValueToPixels(style['border-bottom-width']) + + cssValueToPixels(style['padding-top']) + + cssValueToPixels(style['padding-bottom']) + + cssValueToPixels(style['height']); + }, + + /** + * + * @param elem + */ + getOffset: function(elem) { + var offset = {left: 0, top:0}; + if (elem.offsetParent) { + do { + offset.left += elem.offsetLeft; + offset.top += elem.offsetTop; + } while (elem = elem.offsetParent); + } + return offset; + }, + + // http://stackoverflow.com/posts/2684561/revisions + /** + * + * @param elem + */ + isActive: function(elem) { + return elem === document.activeElement && ( elem.type || elem.href ); + } + + }; + + return dom; + + })(dat.utils.common); + + + dat.controllers.OptionController = (function (Controller, dom, common) { + + /** + * @class Provides a select input to alter the property of an object, using a + * list of accepted values. + * + * @extends dat.controllers.Controller + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * @param {Object|string[]} options A map of labels to acceptable values, or + * a list of acceptable string values. + * + * @member dat.controllers + */ + var OptionController = function(object, property, options) { + + OptionController.superclass.call(this, object, property); + + var _this = this; + + /** + * The drop down menu + * @ignore + */ + this.__select = document.createElement('select'); + + if (common.isArray(options)) { + var map = {}; + common.each(options, function(element) { + map[element] = element; + }); + options = map; + } + + common.each(options, function(value, key) { + + var opt = document.createElement('option'); + opt.innerHTML = key; + opt.setAttribute('value', value); + _this.__select.appendChild(opt); + + }); + + // Acknowledge original value + this.updateDisplay(); + + dom.bind(this.__select, 'change', function() { + var desiredValue = this.options[this.selectedIndex].value; + _this.setValue(desiredValue); + }); + + this.domElement.appendChild(this.__select); + + }; + + OptionController.superclass = Controller; + + common.extend( + + OptionController.prototype, + Controller.prototype, + + { + + setValue: function(v) { + var toReturn = OptionController.superclass.prototype.setValue.call(this, v); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + return toReturn; + }, + + updateDisplay: function() { + this.__select.value = this.getValue(); + return OptionController.superclass.prototype.updateDisplay.call(this); + } + + } + + ); + + return OptionController; + + })(dat.controllers.Controller, + dat.dom.dom, + dat.utils.common); + + + dat.controllers.NumberController = (function (Controller, common) { + + /** + * @class Represents a given property of an object that is a number. + * + * @extends dat.controllers.Controller + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * @param {Object} [params] Optional parameters + * @param {Number} [params.min] Minimum allowed value + * @param {Number} [params.max] Maximum allowed value + * @param {Number} [params.step] Increment by which to change value + * + * @member dat.controllers + */ + var NumberController = function(object, property, params) { + + NumberController.superclass.call(this, object, property); + + params = params || {}; + + this.__min = params.min; + this.__max = params.max; + this.__step = params.step; + + if (common.isUndefined(this.__step)) { + + if (this.initialValue == 0) { + this.__impliedStep = 1; // What are we, psychics? + } else { + // Hey Doug, check this out. + this.__impliedStep = Math.pow(10, Math.floor(Math.log(this.initialValue)/Math.LN10))/10; + } + + } else { + + this.__impliedStep = this.__step; + + } + + this.__precision = numDecimals(this.__impliedStep); + + + }; + + NumberController.superclass = Controller; + + common.extend( + + NumberController.prototype, + Controller.prototype, + + /** @lends dat.controllers.NumberController.prototype */ + { + + setValue: function(v) { + + if (this.__min !== undefined && v < this.__min) { + v = this.__min; + } else if (this.__max !== undefined && v > this.__max) { + v = this.__max; + } + + if (this.__step !== undefined && v % this.__step != 0) { + v = Math.round(v / this.__step) * this.__step; + } + + return NumberController.superclass.prototype.setValue.call(this, v); + + }, + + /** + * Specify a minimum value for object[property]. + * + * @param {Number} minValue The minimum value for + * object[property] + * @returns {dat.controllers.NumberController} this + */ + min: function(v) { + this.__min = v; + return this; + }, + + /** + * Specify a maximum value for object[property]. + * + * @param {Number} maxValue The maximum value for + * object[property] + * @returns {dat.controllers.NumberController} this + */ + max: function(v) { + this.__max = v; + return this; + }, + + /** + * Specify a step value that dat.controllers.NumberController + * increments by. + * + * @param {Number} stepValue The step value for + * dat.controllers.NumberController + * @default if minimum and maximum specified increment is 1% of the + * difference otherwise stepValue is 1 + * @returns {dat.controllers.NumberController} this + */ + step: function(v) { + this.__step = v; + return this; + } + + } + + ); + + function numDecimals(x) { + x = x.toString(); + if (x.indexOf('.') > -1) { + return x.length - x.indexOf('.') - 1; + } else { + return 0; + } + } + + return NumberController; + + })(dat.controllers.Controller, + dat.utils.common); + + + dat.controllers.NumberControllerBox = (function (NumberController, dom, common) { + + /** + * @class Represents a given property of an object that is a number and + * provides an input element with which to manipulate it. + * + * @extends dat.controllers.Controller + * @extends dat.controllers.NumberController + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * @param {Object} [params] Optional parameters + * @param {Number} [params.min] Minimum allowed value + * @param {Number} [params.max] Maximum allowed value + * @param {Number} [params.step] Increment by which to change value + * + * @member dat.controllers + */ + var NumberControllerBox = function(object, property, params) { + + this.__truncationSuspended = false; + + NumberControllerBox.superclass.call(this, object, property, params); + + var _this = this; + + /** + * {Number} Previous mouse y position + * @ignore + */ + var prev_y; + + this.__input = document.createElement('input'); + this.__input.setAttribute('type', 'text'); + + // Makes it so manually specified values are not truncated. + + dom.bind(this.__input, 'change', onChange); + dom.bind(this.__input, 'blur', onBlur); + dom.bind(this.__input, 'mousedown', onMouseDown); + dom.bind(this.__input, 'keydown', function(e) { + + // When pressing entire, you can be as precise as you want. + if (e.keyCode === 13) { + _this.__truncationSuspended = true; + this.blur(); + _this.__truncationSuspended = false; + } + + }); + + function onChange() { + var attempted = parseFloat(_this.__input.value); + if (!common.isNaN(attempted)) _this.setValue(attempted); + } + + function onBlur() { + onChange(); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + + function onMouseDown(e) { + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + prev_y = e.clientY; + } + + function onMouseDrag(e) { + + var diff = prev_y - e.clientY; + _this.setValue(_this.getValue() + diff * _this.__impliedStep); + + prev_y = e.clientY; + + } + + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + } + + this.updateDisplay(); + + this.domElement.appendChild(this.__input); + + }; + + NumberControllerBox.superclass = NumberController; + + common.extend( + + NumberControllerBox.prototype, + NumberController.prototype, + + { + + updateDisplay: function() { + + this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision); + return NumberControllerBox.superclass.prototype.updateDisplay.call(this); + } + + } + + ); + + function roundToDecimal(value, decimals) { + var tenTo = Math.pow(10, decimals); + return Math.round(value * tenTo) / tenTo; + } + + return NumberControllerBox; + + })(dat.controllers.NumberController, + dat.dom.dom, + dat.utils.common); + + + dat.controllers.NumberControllerSlider = (function (NumberController, dom, css, common, styleSheet) { + + /** + * @class Represents a given property of an object that is a number, contains + * a minimum and maximum, and provides a slider element with which to + * manipulate it. It should be noted that the slider element is made up of + * <div> tags, not the html5 + * <slider> element. + * + * @extends dat.controllers.Controller + * @extends dat.controllers.NumberController + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * @param {Number} minValue Minimum allowed value + * @param {Number} maxValue Maximum allowed value + * @param {Number} stepValue Increment by which to change value + * + * @member dat.controllers + */ + var NumberControllerSlider = function(object, property, min, max, step) { + + NumberControllerSlider.superclass.call(this, object, property, { min: min, max: max, step: step }); + + var _this = this; + + this.__background = document.createElement('div'); + this.__foreground = document.createElement('div'); + + + + dom.bind(this.__background, 'mousedown', onMouseDown); + + dom.addClass(this.__background, 'slider'); + dom.addClass(this.__foreground, 'slider-fg'); + + function onMouseDown(e) { + + dom.bind(window, 'mousemove', onMouseDrag); + dom.bind(window, 'mouseup', onMouseUp); + + onMouseDrag(e); + } + + function onMouseDrag(e) { + + e.preventDefault(); + + var offset = dom.getOffset(_this.__background); + var width = dom.getWidth(_this.__background); + + _this.setValue( + map(e.clientX, offset.left, offset.left + width, _this.__min, _this.__max) + ); + + return false; + + } + + function onMouseUp() { + dom.unbind(window, 'mousemove', onMouseDrag); + dom.unbind(window, 'mouseup', onMouseUp); + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + + this.updateDisplay(); + + this.__background.appendChild(this.__foreground); + this.domElement.appendChild(this.__background); + + }; + + NumberControllerSlider.superclass = NumberController; + + /** + * Injects default stylesheet for slider elements. + */ + NumberControllerSlider.useDefaultStyles = function() { + css.inject(styleSheet); + }; + + common.extend( + + NumberControllerSlider.prototype, + NumberController.prototype, + + { + + updateDisplay: function() { + var pct = (this.getValue() - this.__min)/(this.__max - this.__min); + this.__foreground.style.width = pct*100+'%'; + return NumberControllerSlider.superclass.prototype.updateDisplay.call(this); + } + + } + + + + ); + + function map(v, i1, i2, o1, o2) { + return o1 + (o2 - o1) * ((v - i1) / (i2 - i1)); + } + + return NumberControllerSlider; + + })(dat.controllers.NumberController, + dat.dom.dom, + dat.utils.css, + dat.utils.common, + ".slider {\n box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);\n height: 1em;\n border-radius: 1em;\n background-color: #eee;\n padding: 0 0.5em;\n overflow: hidden;\n}\n\n.slider-fg {\n padding: 1px 0 2px 0;\n background-color: #aaa;\n height: 1em;\n margin-left: -0.5em;\n padding-right: 0.5em;\n border-radius: 1em 0 0 1em;\n}\n\n.slider-fg:after {\n display: inline-block;\n border-radius: 1em;\n background-color: #fff;\n border: 1px solid #aaa;\n content: '';\n float: right;\n margin-right: -1em;\n margin-top: -1px;\n height: 0.9em;\n width: 0.9em;\n}"); + + + dat.controllers.FunctionController = (function (Controller, dom, common) { + + /** + * @class Provides a GUI interface to fire a specified method, a property of an object. + * + * @extends dat.controllers.Controller + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * + * @member dat.controllers + */ + var FunctionController = function(object, property, text) { + + FunctionController.superclass.call(this, object, property); + + var _this = this; + + this.__button = document.createElement('div'); + this.__button.innerHTML = text === undefined ? 'Fire' : text; + dom.bind(this.__button, 'click', function(e) { + e.preventDefault(); + _this.fire(); + return false; + }); + + dom.addClass(this.__button, 'button'); + + this.domElement.appendChild(this.__button); + + + }; + + FunctionController.superclass = Controller; + + common.extend( + + FunctionController.prototype, + Controller.prototype, + { + + fire: function() { + if (this.__onChange) { + this.__onChange.call(this); + } + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + this.getValue().call(this.object); + } + } + + ); + + return FunctionController; + + })(dat.controllers.Controller, + dat.dom.dom, + dat.utils.common); + + + dat.controllers.BooleanController = (function (Controller, dom, common) { + + /** + * @class Provides a checkbox input to alter the boolean property of an object. + * @extends dat.controllers.Controller + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * + * @member dat.controllers + */ + var BooleanController = function(object, property) { + + BooleanController.superclass.call(this, object, property); + + var _this = this; + this.__prev = this.getValue(); + + this.__checkbox = document.createElement('input'); + this.__checkbox.setAttribute('type', 'checkbox'); + + + dom.bind(this.__checkbox, 'change', onChange, false); + + this.domElement.appendChild(this.__checkbox); + + // Match original value + this.updateDisplay(); + + function onChange() { + _this.setValue(!_this.__prev); + } + + }; + + BooleanController.superclass = Controller; + + common.extend( + + BooleanController.prototype, + Controller.prototype, + + { + + setValue: function(v) { + var toReturn = BooleanController.superclass.prototype.setValue.call(this, v); + if (this.__onFinishChange) { + this.__onFinishChange.call(this, this.getValue()); + } + this.__prev = this.getValue(); + return toReturn; + }, + + updateDisplay: function() { + + if (this.getValue() === true) { + this.__checkbox.setAttribute('checked', 'checked'); + this.__checkbox.checked = true; + } else { + this.__checkbox.checked = false; + } + + return BooleanController.superclass.prototype.updateDisplay.call(this); + + } + + + } + + ); + + return BooleanController; + + })(dat.controllers.Controller, + dat.dom.dom, + dat.utils.common); + + + dat.color.toString = (function (common) { + + return function(color) { + + if (color.a == 1 || common.isUndefined(color.a)) { + + var s = color.hex.toString(16); + while (s.length < 6) { + s = '0' + s; + } + + return '#' + s; + + } else { + + return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')'; + + } + + } + + })(dat.utils.common); + + + dat.color.interpret = (function (toString, common) { + + var result, toReturn; + + var interpret = function() { + + toReturn = false; + + var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0]; + + common.each(INTERPRETATIONS, function(family) { + + if (family.litmus(original)) { + + common.each(family.conversions, function(conversion, conversionName) { + + result = conversion.read(original); + + if (toReturn === false && result !== false) { + toReturn = result; + result.conversionName = conversionName; + result.conversion = conversion; + return common.BREAK; + + } + + }); + + return common.BREAK; + + } + + }); + + return toReturn; + + }; + + var INTERPRETATIONS = [ + + // Strings + { + + litmus: common.isString, + + conversions: { + + THREE_CHAR_HEX: { + + read: function(original) { + + var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i); + if (test === null) return false; + + return { + space: 'HEX', + hex: parseInt( + '0x' + + test[1].toString() + test[1].toString() + + test[2].toString() + test[2].toString() + + test[3].toString() + test[3].toString()) + }; + + }, + + write: toString + + }, + + SIX_CHAR_HEX: { + + read: function(original) { + + var test = original.match(/^#([A-F0-9]{6})$/i); + if (test === null) return false; + + return { + space: 'HEX', + hex: parseInt('0x' + test[1].toString()) + }; + + }, + + write: toString + + }, + + CSS_RGB: { + + read: function(original) { + + var test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) return false; + + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]) + }; + + }, + + write: toString + + }, + + CSS_RGBA: { + + read: function(original) { + + var test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\,\s*(.+)\s*\)/); + if (test === null) return false; + + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]), + a: parseFloat(test[4]) + }; + + }, + + write: toString + + } + + } + + }, + + // Numbers + { + + litmus: common.isNumber, + + conversions: { + + HEX: { + read: function(original) { + return { + space: 'HEX', + hex: original, + conversionName: 'HEX' + } + }, + + write: function(color) { + return color.hex; + } + } + + } + + }, + + // Arrays + { + + litmus: common.isArray, + + conversions: { + + RGB_ARRAY: { + read: function(original) { + if (original.length != 3) return false; + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2] + }; + }, + + write: function(color) { + return [color.r, color.g, color.b]; + } + + }, + + RGBA_ARRAY: { + read: function(original) { + if (original.length != 4) return false; + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2], + a: original[3] + }; + }, + + write: function(color) { + return [color.r, color.g, color.b, color.a]; + } + + } + + } + + }, + + // Objects + { + + litmus: common.isObject, + + conversions: { + + RGBA_OBJ: { + read: function(original) { + if (common.isNumber(original.r) && + common.isNumber(original.g) && + common.isNumber(original.b) && + common.isNumber(original.a)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b, + a: original.a + } + } + return false; + }, + + write: function(color) { + return { + r: color.r, + g: color.g, + b: color.b, + a: color.a + } + } + }, + + RGB_OBJ: { + read: function(original) { + if (common.isNumber(original.r) && + common.isNumber(original.g) && + common.isNumber(original.b)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b + } + } + return false; + }, + + write: function(color) { + return { + r: color.r, + g: color.g, + b: color.b + } + } + }, + + HSVA_OBJ: { + read: function(original) { + if (common.isNumber(original.h) && + common.isNumber(original.s) && + common.isNumber(original.v) && + common.isNumber(original.a)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v, + a: original.a + } + } + return false; + }, + + write: function(color) { + return { + h: color.h, + s: color.s, + v: color.v, + a: color.a + } + } + }, + + HSV_OBJ: { + read: function(original) { + if (common.isNumber(original.h) && + common.isNumber(original.s) && + common.isNumber(original.v)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v + } + } + return false; + }, + + write: function(color) { + return { + h: color.h, + s: color.s, + v: color.v + } + } + + } + + } + + } + + + ]; + + return interpret; + + + })(dat.color.toString, + dat.utils.common); + + + dat.GUI = dat.gui.GUI = (function (css, saveDialogueContents, styleSheet, controllerFactory, Controller, BooleanController, FunctionController, NumberControllerBox, NumberControllerSlider, OptionController, ColorController, requestAnimationFrame, CenteredDiv, dom, common) { + + css.inject(styleSheet); + + /** Outer-most className for GUI's */ + var CSS_NAMESPACE = 'dg'; + + var HIDE_KEY_CODE = 72; + + /** The only value shared between the JS and SCSS. Use caution. */ + var CLOSE_BUTTON_HEIGHT = 20; + + var DEFAULT_DEFAULT_PRESET_NAME = 'Default'; + + var SUPPORTS_LOCAL_STORAGE = (function() { + try { + return 'localStorage' in window && window['localStorage'] !== null; + } catch (e) { + return false; + } + })(); + + var SAVE_DIALOGUE; + + /** Have we yet to create an autoPlace GUI? */ + var auto_place_virgin = true; + + /** Fixed position div that auto place GUI's go inside */ + var auto_place_container; + + /** Are we hiding the GUI's ? */ + var hide = false; + + /** GUI's which should be hidden */ + var hideable_guis = []; + + /** + * A lightweight controller library for JavaScript. It allows you to easily + * manipulate variables and fire functions on the fly. + * @class + * + * @member dat.gui + * + * @param {Object} [params] + * @param {String} [params.name] The name of this GUI. + * @param {Object} [params.load] JSON object representing the saved state of + * this GUI. + * @param {Boolean} [params.auto=true] + * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in. + * @param {Boolean} [params.closed] If true, starts closed + */ + var GUI = function(params) { + + var _this = this; + + /** + * Outermost DOM Element + * @type DOMElement + */ + this.domElement = document.createElement('div'); + this.__ul = document.createElement('ul'); + this.domElement.appendChild(this.__ul); + + dom.addClass(this.domElement, CSS_NAMESPACE); + + /** + * Nested GUI's by name + * @ignore + */ + this.__folders = {}; + + this.__controllers = []; + + /** + * List of objects I'm remembering for save, only used in top level GUI + * @ignore + */ + this.__rememberedObjects = []; + + /** + * Maps the index of remembered objects to a map of controllers, only used + * in top level GUI. + * + * @private + * @ignore + * + * @example + * [ + * { + * propertyName: Controller, + * anotherPropertyName: Controller + * }, + * { + * propertyName: Controller + * } + * ] + */ + this.__rememberedObjectIndecesToControllers = []; + + this.__listening = []; + + params = params || {}; + + // Default parameters + params = common.defaults(params, { + autoPlace: true, + width: GUI.DEFAULT_WIDTH + }); + + params = common.defaults(params, { + resizable: params.autoPlace, + hideable: params.autoPlace + }); + + + if (!common.isUndefined(params.load)) { + + // Explicit preset + if (params.preset) params.load.preset = params.preset; + + } else { + + params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME }; + + } + + if (common.isUndefined(params.parent) && params.hideable) { + hideable_guis.push(this); + } + + // Only root level GUI's are resizable. + params.resizable = common.isUndefined(params.parent) && params.resizable; + + + if (params.autoPlace && common.isUndefined(params.scrollable)) { + params.scrollable = true; + } + // params.scrollable = common.isUndefined(params.parent) && params.scrollable === true; + + // Not part of params because I don't want people passing this in via + // constructor. Should be a 'remembered' value. + var use_local_storage = + SUPPORTS_LOCAL_STORAGE && + localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true'; + + Object.defineProperties(this, + + /** @lends dat.gui.GUI.prototype */ + { + + /** + * The parent GUI + * @type dat.gui.GUI + */ + parent: { + get: function() { + return params.parent; + } + }, + + scrollable: { + get: function() { + return params.scrollable; + } + }, + + /** + * Handles GUI's element placement for you + * @type Boolean + */ + autoPlace: { + get: function() { + return params.autoPlace; + } + }, + + /** + * The identifier for a set of saved values + * @type String + */ + preset: { + + get: function() { + if (_this.parent) { + return _this.getRoot().preset; + } else { + return params.load.preset; + } + }, + + set: function(v) { + if (_this.parent) { + _this.getRoot().preset = v; + } else { + params.load.preset = v; + } + setPresetSelectIndex(this); + _this.revert(); + } + + }, + + /** + * The width of GUI element + * @type Number + */ + width: { + get: function() { + return params.width; + }, + set: function(v) { + params.width = v; + setWidth(_this, v); + } + }, + + /** + * The name of GUI. Used for folders. i.e + * a folder's name + * @type String + */ + name: { + get: function() { + return params.name; + }, + set: function(v) { + // TODO Check for collisions among sibling folders + params.name = v; + if (title_row_name) { + title_row_name.innerHTML = params.name; + } + } + }, + + /** + * Whether the GUI is collapsed or not + * @type Boolean + */ + closed: { + get: function() { + return params.closed; + }, + set: function(v) { + params.closed = v; + if (params.closed) { + dom.addClass(_this.__ul, GUI.CLASS_CLOSED); + } else { + dom.removeClass(_this.__ul, GUI.CLASS_CLOSED); + } + // For browsers that aren't going to respect the CSS transition, + // Lets just check our height against the window height right off + // the bat. + this.onResize(); + + if (_this.__closeButton) { + _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED; + } + } + }, + + /** + * Contains all presets + * @type Object + */ + load: { + get: function() { + return params.load; + } + }, + + /** + * Determines whether or not to use localStorage as the means for + * remembering + * @type Boolean + */ + useLocalStorage: { + + get: function() { + return use_local_storage; + }, + set: function(bool) { + if (SUPPORTS_LOCAL_STORAGE) { + use_local_storage = bool; + if (bool) { + dom.bind(window, 'unload', saveToLocalStorage); + } else { + dom.unbind(window, 'unload', saveToLocalStorage); + } + localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool); + } + } + + } + + }); + + // Are we a root level GUI? + if (common.isUndefined(params.parent)) { + + params.closed = false; + + dom.addClass(this.domElement, GUI.CLASS_MAIN); + dom.makeSelectable(this.domElement, false); + + // Are we supposed to be loading locally? + if (SUPPORTS_LOCAL_STORAGE) { + + if (use_local_storage) { + + _this.useLocalStorage = true; + + var saved_gui = localStorage.getItem(getLocalStorageHash(this, 'gui')); + + if (saved_gui) { + params.load = JSON.parse(saved_gui); + } + + } + + } + + this.__closeButton = document.createElement('div'); + this.__closeButton.innerHTML = GUI.TEXT_CLOSED; + dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON); + this.domElement.appendChild(this.__closeButton); + + dom.bind(this.__closeButton, 'click', function() { + + _this.closed = !_this.closed; + + + }); + + + // Oh, you're a nested GUI! + } else { + + if (params.closed === undefined) { + params.closed = true; + } + + var title_row_name = document.createTextNode(params.name); + dom.addClass(title_row_name, 'controller-name'); + + var title_row = addRow(_this, title_row_name); + + var on_click_title = function(e) { + e.preventDefault(); + _this.closed = !_this.closed; + return false; + }; + + dom.addClass(this.__ul, GUI.CLASS_CLOSED); + + dom.addClass(title_row, 'title'); + dom.bind(title_row, 'click', on_click_title); + + if (!params.closed) { + this.closed = false; + } + + } + + if (params.autoPlace) { + + if (common.isUndefined(params.parent)) { + + if (auto_place_virgin) { + auto_place_container = document.createElement('div'); + dom.addClass(auto_place_container, CSS_NAMESPACE); + dom.addClass(auto_place_container, GUI.CLASS_AUTO_PLACE_CONTAINER); + document.body.appendChild(auto_place_container); + auto_place_virgin = false; + } + + // Put it in the dom for you. + auto_place_container.appendChild(this.domElement); + + // Apply the auto styles + dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE); + + } + + + // Make it not elastic. + if (!this.parent) setWidth(_this, params.width); + + } + + dom.bind(window, 'resize', function() { _this.onResize() }); + dom.bind(this.__ul, 'webkitTransitionEnd', function() { _this.onResize(); }); + dom.bind(this.__ul, 'transitionend', function() { _this.onResize() }); + dom.bind(this.__ul, 'oTransitionEnd', function() { _this.onResize() }); + this.onResize(); + + + if (params.resizable) { + addResizeHandle(this); + } + + function saveToLocalStorage() { + localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject())); + } + + var root = _this.getRoot(); + function resetWidth() { + var root = _this.getRoot(); + root.width += 1; + common.defer(function() { + root.width -= 1; + }); + } + + if (!params.parent) { + resetWidth(); + } + + }; + + GUI.toggleHide = function() { + + hide = !hide; + common.each(hideable_guis, function(gui) { + gui.domElement.style.zIndex = hide ? -999 : 999; + gui.domElement.style.opacity = hide ? 0 : 1; + }); + }; + + GUI.CLASS_AUTO_PLACE = 'a'; + GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac'; + GUI.CLASS_MAIN = 'main'; + GUI.CLASS_CONTROLLER_ROW = 'cr'; + GUI.CLASS_TOO_TALL = 'taller-than-window'; + GUI.CLASS_CLOSED = 'closed'; + GUI.CLASS_CLOSE_BUTTON = 'close-button'; + GUI.CLASS_DRAG = 'drag'; + + GUI.DEFAULT_WIDTH = 245; + GUI.TEXT_CLOSED = 'Close Controls'; + GUI.TEXT_OPEN = 'Open Controls'; + + dom.bind(window, 'keydown', function(e) { + + if (document.activeElement.type !== 'text' && + (e.which === HIDE_KEY_CODE || e.keyCode == HIDE_KEY_CODE)) { + GUI.toggleHide(); + } + + }, false); + + common.extend( + + GUI.prototype, + + /** @lends dat.gui.GUI */ + { + + /** + * @param object + * @param property + * @returns {dat.controllers.Controller} The new controller that was added. + * @instance + */ + add: function(object, property) { + + return add( + this, + object, + property, + { + factoryArgs: Array.prototype.slice.call(arguments, 2) + } + ); + + }, + + /** + * @param object + * @param property + * @returns {dat.controllers.ColorController} The new controller that was added. + * @instance + */ + addColor: function(object, property) { + + return add( + this, + object, + property, + { + color: true + } + ); + + }, + + /** + * @param controller + * @instance + */ + remove: function(controller) { + + // TODO listening? + this.__ul.removeChild(controller.__li); + this.__controllers.slice(this.__controllers.indexOf(controller), 1); + var _this = this; + common.defer(function() { + _this.onResize(); + }); + + }, + + destroy: function() { + + if (this.autoPlace) { + auto_place_container.removeChild(this.domElement); + } + + }, + + /** + * @param name + * @returns {dat.gui.GUI} The new folder. + * @throws {Error} if this GUI already has a folder by the specified + * name + * @instance + */ + addFolder: function(name) { + + // We have to prevent collisions on names in order to have a key + // by which to remember saved values + if (this.__folders[name] !== undefined) { + throw new Error('You already have a folder in this GUI by the' + + ' name "' + name + '"'); + } + + var new_gui_params = { name: name, parent: this }; + + // We need to pass down the autoPlace trait so that we can + // attach event listeners to open/close folder actions to + // ensure that a scrollbar appears if the window is too short. + new_gui_params.autoPlace = this.autoPlace; + + // Do we have saved appearance data for this folder? + + if (this.load && // Anything loaded? + this.load.folders && // Was my parent a dead-end? + this.load.folders[name]) { // Did daddy remember me? + + // Start me closed if I was closed + new_gui_params.closed = this.load.folders[name].closed; + + // Pass down the loaded data + new_gui_params.load = this.load.folders[name]; + + } + + var gui = new GUI(new_gui_params); + this.__folders[name] = gui; + + var li = addRow(this, gui.domElement); + dom.addClass(li, 'folder'); + return gui; + + }, + + open: function() { + this.closed = false; + }, + + close: function() { + this.closed = true; + }, + + onResize: function() { + + var root = this.getRoot(); + + if (root.scrollable) { + + var top = dom.getOffset(root.__ul).top; + var h = 0; + + common.each(root.__ul.childNodes, function(node) { + if (! (root.autoPlace && node === root.__save_row)) + h += dom.getHeight(node); + }); + + if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) { + dom.addClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px'; + } else { + dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL); + root.__ul.style.height = 'auto'; + } + + } + + if (root.__resize_handle) { + common.defer(function() { + root.__resize_handle.style.height = root.__ul.offsetHeight + 'px'; + }); + } + + if (root.__closeButton) { + root.__closeButton.style.width = root.width + 'px'; + } + + }, + + /** + * Mark objects for saving. The order of these objects cannot change as + * the GUI grows. When remembering new objects, append them to the end + * of the list. + * + * @param {Object...} objects + * @throws {Error} if not called on a top level GUI. + * @instance + */ + remember: function() { + + if (common.isUndefined(SAVE_DIALOGUE)) { + SAVE_DIALOGUE = new CenteredDiv(); + SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents; + } + + if (this.parent) { + throw new Error("You can only call remember on a top level GUI."); + } + + var _this = this; + + common.each(Array.prototype.slice.call(arguments), function(object) { + if (_this.__rememberedObjects.length == 0) { + addSaveMenu(_this); + } + if (_this.__rememberedObjects.indexOf(object) == -1) { + _this.__rememberedObjects.push(object); + } + }); + + if (this.autoPlace) { + // Set save row width + setWidth(this, this.width); + } + + }, + + /** + * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI. + * @instance + */ + getRoot: function() { + var gui = this; + while (gui.parent) { + gui = gui.parent; + } + return gui; + }, + + /** + * @returns {Object} a JSON object representing the current state of + * this GUI as well as its remembered properties. + * @instance + */ + getSaveObject: function() { + + var toReturn = this.load; + + toReturn.closed = this.closed; + + // Am I remembering any values? + if (this.__rememberedObjects.length > 0) { + + toReturn.preset = this.preset; + + if (!toReturn.remembered) { + toReturn.remembered = {}; + } + + toReturn.remembered[this.preset] = getCurrentPreset(this); + + } + + toReturn.folders = {}; + common.each(this.__folders, function(element, key) { + toReturn.folders[key] = element.getSaveObject(); + }); + + return toReturn; + + }, + + save: function() { + + if (!this.load.remembered) { + this.load.remembered = {}; + } + + this.load.remembered[this.preset] = getCurrentPreset(this); + markPresetModified(this, false); + + }, + + saveAs: function(presetName) { + + if (!this.load.remembered) { + + // Retain default values upon first save + this.load.remembered = {}; + this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true); + + } + + this.load.remembered[presetName] = getCurrentPreset(this); + this.preset = presetName; + addPresetOption(this, presetName, true); + + }, + + revert: function(gui) { + + common.each(this.__controllers, function(controller) { + // Make revert work on Default. + if (!this.getRoot().load.remembered) { + controller.setValue(controller.initialValue); + } else { + recallSavedValue(gui || this.getRoot(), controller); + } + }, this); + + common.each(this.__folders, function(folder) { + folder.revert(folder); + }); + + if (!gui) { + markPresetModified(this.getRoot(), false); + } + + + }, + + listen: function(controller) { + + var init = this.__listening.length == 0; + this.__listening.push(controller); + if (init) updateDisplays(this.__listening); + + } + + } + + ); + + function add(gui, object, property, params) { + + if (object[property] === undefined) { + throw new Error("Object " + object + " has no property \"" + property + "\""); + } + + var controller; + + if (params.color) { + + controller = new ColorController(object, property); + + } else { + + var factoryArgs = [object,property].concat(params.factoryArgs); + controller = controllerFactory.apply(gui, factoryArgs); + + } + + if (params.before instanceof Controller) { + params.before = params.before.__li; + } + + recallSavedValue(gui, controller); + + dom.addClass(controller.domElement, 'c'); + + var name = document.createElement('span'); + dom.addClass(name, 'property-name'); + name.innerHTML = controller.property; + + var container = document.createElement('div'); + container.appendChild(name); + container.appendChild(controller.domElement); + + var li = addRow(gui, container, params.before); + + dom.addClass(li, GUI.CLASS_CONTROLLER_ROW); + dom.addClass(li, typeof controller.getValue()); + + augmentController(gui, li, controller); + + gui.__controllers.push(controller); + + return controller; + + } + + /** + * Add a row to the end of the GUI or before another row. + * + * @param gui + * @param [dom] If specified, inserts the dom content in the new row + * @param [liBefore] If specified, places the new row before another row + */ + function addRow(gui, dom, liBefore) { + var li = document.createElement('li'); + if (dom) li.appendChild(dom); + if (liBefore) { + gui.__ul.insertBefore(li, params.before); + } else { + gui.__ul.appendChild(li); + } + gui.onResize(); + return li; + } + + function augmentController(gui, li, controller) { + + controller.__li = li; + controller.__gui = gui; + + common.extend(controller, { + + options: function(options) { + + if (arguments.length > 1) { + controller.remove(); + + return add( + gui, + controller.object, + controller.property, + { + before: controller.__li.nextElementSibling, + factoryArgs: [common.toArray(arguments)] + } + ); + + } + + if (common.isArray(options) || common.isObject(options)) { + controller.remove(); + + return add( + gui, + controller.object, + controller.property, + { + before: controller.__li.nextElementSibling, + factoryArgs: [options] + } + ); + + } + + }, + + name: function(v) { + controller.__li.firstElementChild.firstElementChild.innerHTML = v; + return controller; + }, + + listen: function() { + controller.__gui.listen(controller); + return controller; + }, + + remove: function() { + controller.__gui.remove(controller); + return controller; + } + + }); + + // All sliders should be accompanied by a box. + if (controller instanceof NumberControllerSlider) { + + var box = new NumberControllerBox(controller.object, controller.property, + { min: controller.__min, max: controller.__max, step: controller.__step }); + + common.each(['updateDisplay', 'onChange', 'onFinishChange'], function(method) { + var pc = controller[method]; + var pb = box[method]; + controller[method] = box[method] = function() { + var args = Array.prototype.slice.call(arguments); + pc.apply(controller, args); + return pb.apply(box, args); + } + }); + + dom.addClass(li, 'has-slider'); + controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild); + + } + else if (controller instanceof NumberControllerBox) { + + var r = function(returned) { + + // Have we defined both boundaries? + if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) { + + // Well, then lets just replace this with a slider. + controller.remove(); + return add( + gui, + controller.object, + controller.property, + { + before: controller.__li.nextElementSibling, + factoryArgs: [controller.__min, controller.__max, controller.__step] + }); + + } + + return returned; + + }; + + controller.min = common.compose(r, controller.min); + controller.max = common.compose(r, controller.max); + + } + else if (controller instanceof BooleanController) { + + dom.bind(li, 'click', function() { + dom.fakeEvent(controller.__checkbox, 'click'); + }); + + dom.bind(controller.__checkbox, 'click', function(e) { + e.stopPropagation(); // Prevents double-toggle + }) + + } + else if (controller instanceof FunctionController) { + + dom.bind(li, 'click', function() { + dom.fakeEvent(controller.__button, 'click'); + }); + + dom.bind(li, 'mouseover', function() { + dom.addClass(controller.__button, 'hover'); + }); + + dom.bind(li, 'mouseout', function() { + dom.removeClass(controller.__button, 'hover'); + }); + + } + else if (controller instanceof ColorController) { + + dom.addClass(li, 'color'); + controller.updateDisplay = common.compose(function(r) { + li.style.borderLeftColor = controller.__color.toString(); + return r; + }, controller.updateDisplay); + + controller.updateDisplay(); + + } + + controller.setValue = common.compose(function(r) { + if (gui.getRoot().__preset_select && controller.isModified()) { + markPresetModified(gui.getRoot(), true); + } + return r; + }, controller.setValue); + + } + + function recallSavedValue(gui, controller) { + + // Find the topmost GUI, that's where remembered objects live. + var root = gui.getRoot(); + + // Does the object we're controlling match anything we've been told to + // remember? + var matched_index = root.__rememberedObjects.indexOf(controller.object); + + // Why yes, it does! + if (matched_index != -1) { + + // Let me fetch a map of controllers for thcommon.isObject. + var controller_map = + root.__rememberedObjectIndecesToControllers[matched_index]; + + // Ohp, I believe this is the first controller we've created for this + // object. Lets make the map fresh. + if (controller_map === undefined) { + controller_map = {}; + root.__rememberedObjectIndecesToControllers[matched_index] = + controller_map; + } + + // Keep track of this controller + controller_map[controller.property] = controller; + + // Okay, now have we saved any values for this controller? + if (root.load && root.load.remembered) { + + var preset_map = root.load.remembered; + + // Which preset are we trying to load? + var preset; + + if (preset_map[gui.preset]) { + + preset = preset_map[gui.preset]; + + } else if (preset_map[DEFAULT_DEFAULT_PRESET_NAME]) { + + // Uhh, you can have the default instead? + preset = preset_map[DEFAULT_DEFAULT_PRESET_NAME]; + + } else { + + // Nada. + + return; + + } + + + // Did the loaded object remember thcommon.isObject? + if (preset[matched_index] && + + // Did we remember this particular property? + preset[matched_index][controller.property] !== undefined) { + + // We did remember something for this guy ... + var value = preset[matched_index][controller.property]; + + // And that's what it is. + controller.initialValue = value; + controller.setValue(value); + + } + + } + + } + + } + + function getLocalStorageHash(gui, key) { + // TODO how does this deal with multiple GUI's? + return document.location.href + '.' + key; + + } + + function addSaveMenu(gui) { + + var div = gui.__save_row = document.createElement('li'); + + dom.addClass(gui.domElement, 'has-save'); + + gui.__ul.insertBefore(div, gui.__ul.firstChild); + + dom.addClass(div, 'save-row'); + + var gears = document.createElement('span'); + gears.innerHTML = ' '; + dom.addClass(gears, 'button gears'); + + // TODO replace with FunctionController + var button = document.createElement('span'); + button.innerHTML = 'Save'; + dom.addClass(button, 'button'); + dom.addClass(button, 'save'); + + var button2 = document.createElement('span'); + button2.innerHTML = 'New'; + dom.addClass(button2, 'button'); + dom.addClass(button2, 'save-as'); + + var button3 = document.createElement('span'); + button3.innerHTML = 'Revert'; + dom.addClass(button3, 'button'); + dom.addClass(button3, 'revert'); + + var select = gui.__preset_select = document.createElement('select'); + + if (gui.load && gui.load.remembered) { + + common.each(gui.load.remembered, function(value, key) { + addPresetOption(gui, key, key == gui.preset); + }); + + } else { + addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false); + } + + dom.bind(select, 'change', function() { + + + for (var index = 0; index < gui.__preset_select.length; index++) { + gui.__preset_select[index].innerHTML = gui.__preset_select[index].value; + } + + gui.preset = this.value; + + }); + + div.appendChild(select); + div.appendChild(gears); + div.appendChild(button); + div.appendChild(button2); + div.appendChild(button3); + + if (SUPPORTS_LOCAL_STORAGE) { + + var saveLocally = document.getElementById('dg-save-locally'); + var explain = document.getElementById('dg-local-explain'); + + saveLocally.style.display = 'block'; + + var localStorageCheckBox = document.getElementById('dg-local-storage'); + + if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') { + localStorageCheckBox.setAttribute('checked', 'checked'); + } + + function showHideExplain() { + explain.style.display = gui.useLocalStorage ? 'block' : 'none'; + } + + showHideExplain(); + + // TODO: Use a boolean controller, fool! + dom.bind(localStorageCheckBox, 'change', function() { + gui.useLocalStorage = !gui.useLocalStorage; + showHideExplain(); + }); + + } + + var newConstructorTextArea = document.getElementById('dg-new-constructor'); + + dom.bind(newConstructorTextArea, 'keydown', function(e) { + if (e.metaKey && (e.which === 67 || e.keyCode == 67)) { + SAVE_DIALOGUE.hide(); + } + }); + + dom.bind(gears, 'click', function() { + newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2); + SAVE_DIALOGUE.show(); + newConstructorTextArea.focus(); + newConstructorTextArea.select(); + }); + + dom.bind(button, 'click', function() { + gui.save(); + }); + + dom.bind(button2, 'click', function() { + var presetName = prompt('Enter a new preset name.'); + if (presetName) gui.saveAs(presetName); + }); + + dom.bind(button3, 'click', function() { + gui.revert(); + }); + + // div.appendChild(button2); + + } + + function addResizeHandle(gui) { + + gui.__resize_handle = document.createElement('div'); + + common.extend(gui.__resize_handle.style, { + + width: '6px', + marginLeft: '-3px', + height: '200px', + cursor: 'ew-resize', + position: 'absolute' + // border: '1px solid blue' + + }); + + var pmouseX; + + dom.bind(gui.__resize_handle, 'mousedown', dragStart); + dom.bind(gui.__closeButton, 'mousedown', dragStart); + + gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild); + + function dragStart(e) { + + e.preventDefault(); + + pmouseX = e.clientX; + + dom.addClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.bind(window, 'mousemove', drag); + dom.bind(window, 'mouseup', dragStop); + + return false; + + } + + function drag(e) { + + e.preventDefault(); + + gui.width += pmouseX - e.clientX; + gui.onResize(); + pmouseX = e.clientX; + + return false; + + } + + function dragStop() { + + dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG); + dom.unbind(window, 'mousemove', drag); + dom.unbind(window, 'mouseup', dragStop); + + } + + } + + function setWidth(gui, w) { + gui.domElement.style.width = w + 'px'; + // Auto placed save-rows are position fixed, so we have to + // set the width manually if we want it to bleed to the edge + if (gui.__save_row && gui.autoPlace) { + gui.__save_row.style.width = w + 'px'; + }if (gui.__closeButton) { + gui.__closeButton.style.width = w + 'px'; + } + } + + function getCurrentPreset(gui, useInitialValues) { + + var toReturn = {}; + + // For each object I'm remembering + common.each(gui.__rememberedObjects, function(val, index) { + + var saved_values = {}; + + // The controllers I've made for thcommon.isObject by property + var controller_map = + gui.__rememberedObjectIndecesToControllers[index]; + + // Remember each value for each property + common.each(controller_map, function(controller, property) { + saved_values[property] = useInitialValues ? controller.initialValue : controller.getValue(); + }); + + // Save the values for thcommon.isObject + toReturn[index] = saved_values; + + }); + + return toReturn; + + } + + function addPresetOption(gui, name, setSelected) { + var opt = document.createElement('option'); + opt.innerHTML = name; + opt.value = name; + gui.__preset_select.appendChild(opt); + if (setSelected) { + gui.__preset_select.selectedIndex = gui.__preset_select.length - 1; + } + } + + function setPresetSelectIndex(gui) { + for (var index = 0; index < gui.__preset_select.length; index++) { + if (gui.__preset_select[index].value == gui.preset) { + gui.__preset_select.selectedIndex = index; + } + } + } + + function markPresetModified(gui, modified) { + var opt = gui.__preset_select[gui.__preset_select.selectedIndex]; + // console.log('mark', modified, opt); + if (modified) { + opt.innerHTML = opt.value + "*"; + } else { + opt.innerHTML = opt.value; + } + } + + function updateDisplays(controllerArray) { + + + if (controllerArray.length != 0) { + + requestAnimationFrame(function() { + updateDisplays(controllerArray); + }); + + } + + common.each(controllerArray, function(c) { + c.updateDisplay(); + }); + + } + + return GUI; + + })(dat.utils.css, + "
\n\n Here's the new load parameter for your GUI's constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI's constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n \n
\n \n
\n\n
", + ".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear;border:0;position:absolute;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save ul{margin-top:27px}.dg.a.has-save ul.closed{margin-top:0}.dg.a .save-row{position:fixed;top:0;z-index:1002}.dg li{-webkit-transition:height 0.1s ease-out;-o-transition:height 0.1s ease-out;-moz-transition:height 0.1s ease-out;transition:height 0.1s ease-out}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:hidden;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li > *{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:9px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n", + dat.controllers.factory = (function (OptionController, NumberControllerBox, NumberControllerSlider, StringController, FunctionController, BooleanController, common) { + + return function(object, property) { + + var initialValue = object[property]; + + // Providing options? + if (common.isArray(arguments[2]) || common.isObject(arguments[2])) { + return new OptionController(object, property, arguments[2]); + } + + // Providing a map? + + if (common.isNumber(initialValue)) { + + if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) { + + // Has min and max. + return new NumberControllerSlider(object, property, arguments[2], arguments[3]); + + } else { + + return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] }); + + } + + } + + if (common.isString(initialValue)) { + return new StringController(object, property); + } + + if (common.isFunction(initialValue)) { + return new FunctionController(object, property, ''); + } + + if (common.isBoolean(initialValue)) { + return new BooleanController(object, property); + } + + } + + })(dat.controllers.OptionController, + dat.controllers.NumberControllerBox, + dat.controllers.NumberControllerSlider, + dat.controllers.StringController = (function (Controller, dom, common) { + + /** + * @class Provides a text input to alter the string property of an object. + * + * @extends dat.controllers.Controller + * + * @param {Object} object The object to be manipulated + * @param {string} property The name of the property to be manipulated + * + * @member dat.controllers + */ + var StringController = function(object, property) { + + StringController.superclass.call(this, object, property); + + var _this = this; + + this.__input = document.createElement('input'); + this.__input.setAttribute('type', 'text'); + + dom.bind(this.__input, 'keyup', onChange); + dom.bind(this.__input, 'change', onChange); + dom.bind(this.__input, 'blur', onBlur); + dom.bind(this.__input, 'keydown', function(e) { + if (e.keyCode === 13) { + this.blur(); + } + }); + + + function onChange() { + _this.setValue(_this.__input.value); + } + + function onBlur() { + if (_this.__onFinishChange) { + _this.__onFinishChange.call(_this, _this.getValue()); + } + } + + this.updateDisplay(); + + this.domElement.appendChild(this.__input); + + }; + + StringController.superclass = Controller; + + common.extend( + + StringController.prototype, + Controller.prototype, + + { + + updateDisplay: function() { + // Stops the caret from moving on account of: + // keyup -> setValue -> updateDisplay + if (!dom.isActive(this.__input)) { + this.__input.value = this.getValue(); + } + return StringController.superclass.prototype.updateDisplay.call(this); + } + + } + + ); + + return StringController; + + })(dat.controllers.Controller, + dat.dom.dom, + dat.utils.common), + dat.controllers.FunctionController, + dat.controllers.BooleanController, + dat.utils.common), + dat.controllers.Controller, + dat.controllers.BooleanController, + dat.controllers.FunctionController, + dat.controllers.NumberControllerBox, + dat.controllers.NumberControllerSlider, + dat.controllers.OptionController, + dat.controllers.ColorController = (function (Controller, dom, Color, interpret, common) { + + var ColorController = function(object, property) { + + ColorController.superclass.call(this, object, property); + + this.__color = new Color(this.getValue()); + this.__temp = new Color(0); + + var _this = this; + + this.domElement = document.createElement('div'); + + dom.makeSelectable(this.domElement, false); + + this.__selector = document.createElement('div'); + this.__selector.className = 'selector'; + + this.__saturation_field = document.createElement('div'); + this.__saturation_field.className = 'saturation-field'; + + this.__field_knob = document.createElement('div'); + this.__field_knob.className = 'field-knob'; + this.__field_knob_border = '2px solid '; + + this.__hue_knob = document.createElement('div'); + this.__hue_knob.className = 'hue-knob'; + + this.__hue_field = document.createElement('div'); + this.__hue_field.className = 'hue-field'; + + this.__input = document.createElement('input'); + this.__input.type = 'text'; + this.__input_textShadow = '0 1px 1px '; + + dom.bind(this.__input, 'keydown', function(e) { + if (e.keyCode === 13) { // on enter + onBlur.call(this); + } + }); + + dom.bind(this.__input, 'blur', onBlur); + + dom.bind(this.__selector, 'mousedown', function(e) { + + dom + .addClass(this, 'drag') + .bind(window, 'mouseup', function(e) { + dom.removeClass(_this.__selector, 'drag'); + }); + + }); + + var value_field = document.createElement('div'); + + common.extend(this.__selector.style, { + width: '122px', + height: '102px', + padding: '3px', + backgroundColor: '#222', + boxShadow: '0px 1px 3px rgba(0,0,0,0.3)' + }); + + common.extend(this.__field_knob.style, { + position: 'absolute', + width: '12px', + height: '12px', + border: this.__field_knob_border + (this.__color.v < .5 ? '#fff' : '#000'), + boxShadow: '0px 1px 3px rgba(0,0,0,0.5)', + borderRadius: '12px', + zIndex: 1 + }); + + common.extend(this.__hue_knob.style, { + position: 'absolute', + width: '15px', + height: '2px', + borderRight: '4px solid #fff', + zIndex: 1 + }); + + common.extend(this.__saturation_field.style, { + width: '100px', + height: '100px', + border: '1px solid #555', + marginRight: '3px', + display: 'inline-block', + cursor: 'pointer' + }); + + common.extend(value_field.style, { + width: '100%', + height: '100%', + background: 'none' + }); + + linearGradient(value_field, 'top', 'rgba(0,0,0,0)', '#000'); + + common.extend(this.__hue_field.style, { + width: '15px', + height: '100px', + display: 'inline-block', + border: '1px solid #555', + cursor: 'ns-resize' + }); + + hueGradient(this.__hue_field); + + common.extend(this.__input.style, { + outline: 'none', + // width: '120px', + textAlign: 'center', + // padding: '4px', + // marginBottom: '6px', + color: '#fff', + border: 0, + fontWeight: 'bold', + textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)' + }); + + dom.bind(this.__saturation_field, 'mousedown', fieldDown); + dom.bind(this.__field_knob, 'mousedown', fieldDown); + + dom.bind(this.__hue_field, 'mousedown', function(e) { + setH(e); + dom.bind(window, 'mousemove', setH); + dom.bind(window, 'mouseup', unbindH); + }); + + function fieldDown(e) { + setSV(e); + // document.body.style.cursor = 'none'; + dom.bind(window, 'mousemove', setSV); + dom.bind(window, 'mouseup', unbindSV); + } + + function unbindSV() { + dom.unbind(window, 'mousemove', setSV); + dom.unbind(window, 'mouseup', unbindSV); + // document.body.style.cursor = 'default'; + } + + function onBlur() { + var i = interpret(this.value); + if (i !== false) { + _this.__color.__state = i; + _this.setValue(_this.__color.toOriginal()); + } else { + this.value = _this.__color.toString(); + } + } + + function unbindH() { + dom.unbind(window, 'mousemove', setH); + dom.unbind(window, 'mouseup', unbindH); + } + + this.__saturation_field.appendChild(value_field); + this.__selector.appendChild(this.__field_knob); + this.__selector.appendChild(this.__saturation_field); + this.__selector.appendChild(this.__hue_field); + this.__hue_field.appendChild(this.__hue_knob); + + this.domElement.appendChild(this.__input); + this.domElement.appendChild(this.__selector); + + this.updateDisplay(); + + function setSV(e) { + + e.preventDefault(); + + var w = dom.getWidth(_this.__saturation_field); + var o = dom.getOffset(_this.__saturation_field); + var s = (e.clientX - o.left + document.body.scrollLeft) / w; + var v = 1 - (e.clientY - o.top + document.body.scrollTop) / w; + + if (v > 1) v = 1; + else if (v < 0) v = 0; + + if (s > 1) s = 1; + else if (s < 0) s = 0; + + _this.__color.v = v; + _this.__color.s = s; + + _this.setValue(_this.__color.toOriginal()); + + + return false; + + } + + function setH(e) { + + e.preventDefault(); + + var s = dom.getHeight(_this.__hue_field); + var o = dom.getOffset(_this.__hue_field); + var h = 1 - (e.clientY - o.top + document.body.scrollTop) / s; + + if (h > 1) h = 1; + else if (h < 0) h = 0; + + _this.__color.h = h * 360; + + _this.setValue(_this.__color.toOriginal()); + + return false; + + } + + }; + + ColorController.superclass = Controller; + + common.extend( + + ColorController.prototype, + Controller.prototype, + + { + + updateDisplay: function() { + + var i = interpret(this.getValue()); + + if (i !== false) { + + var mismatch = false; + + // Check for mismatch on the interpreted value. + + common.each(Color.COMPONENTS, function(component) { + if (!common.isUndefined(i[component]) && + !common.isUndefined(this.__color.__state[component]) && + i[component] !== this.__color.__state[component]) { + mismatch = true; + return {}; // break + } + }, this); + + // If nothing diverges, we keep our previous values + // for statefulness, otherwise we recalculate fresh + if (mismatch) { + common.extend(this.__color.__state, i); + } + + } + + common.extend(this.__temp.__state, this.__color.__state); + + this.__temp.a = 1; + + var flip = (this.__color.v < .5 || this.__color.s > .5) ? 255 : 0; + var _flip = 255 - flip; + + common.extend(this.__field_knob.style, { + marginLeft: 100 * this.__color.s - 7 + 'px', + marginTop: 100 * (1 - this.__color.v) - 7 + 'px', + backgroundColor: this.__temp.toString(), + border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip +')' + }); + + this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px' + + this.__temp.s = 1; + this.__temp.v = 1; + + linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toString()); + + common.extend(this.__input.style, { + backgroundColor: this.__input.value = this.__color.toString(), + color: 'rgb(' + flip + ',' + flip + ',' + flip +')', + textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip +',.7)' + }); + + } + + } + + ); + + var vendors = ['-moz-','-o-','-webkit-','-ms-','']; + + function linearGradient(elem, x, a, b) { + elem.style.background = ''; + common.each(vendors, function(vendor) { + elem.style.cssText += 'background: ' + vendor + 'linear-gradient('+x+', '+a+' 0%, ' + b + ' 100%); '; + }); + } + + function hueGradient(elem) { + elem.style.background = ''; + elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);' + elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);' + elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);' + elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);' + elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);' + } + + + return ColorController; + + })(dat.controllers.Controller, + dat.dom.dom, + dat.color.Color = (function (interpret, math, toString, common) { + + var Color = function() { + + this.__state = interpret.apply(this, arguments); + + if (this.__state === false) { + throw 'Failed to interpret color arguments'; + } + + this.__state.a = this.__state.a || 1; + + + }; + + Color.COMPONENTS = ['r','g','b','h','s','v','hex','a']; + + common.extend(Color.prototype, { + + toString: function() { + return toString(this); + }, + + toOriginal: function() { + return this.__state.conversion.write(this); + } + + }); + + defineRGBComponent(Color.prototype, 'r', 2); + defineRGBComponent(Color.prototype, 'g', 1); + defineRGBComponent(Color.prototype, 'b', 0); + + defineHSVComponent(Color.prototype, 'h'); + defineHSVComponent(Color.prototype, 's'); + defineHSVComponent(Color.prototype, 'v'); + + Object.defineProperty(Color.prototype, 'a', { + + get: function() { + return this.__state.a; + }, + + set: function(v) { + this.__state.a = v; + } + + }); + + Object.defineProperty(Color.prototype, 'hex', { + + get: function() { + + if (!this.__state.space !== 'HEX') { + this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b); + } + + return this.__state.hex; + + }, + + set: function(v) { + + this.__state.space = 'HEX'; + this.__state.hex = v; + + } + + }); + + function defineRGBComponent(target, component, componentHexIndex) { + + Object.defineProperty(target, component, { + + get: function() { + + if (this.__state.space === 'RGB') { + return this.__state[component]; + } + + recalculateRGB(this, component, componentHexIndex); + + return this.__state[component]; + + }, + + set: function(v) { + + if (this.__state.space !== 'RGB') { + recalculateRGB(this, component, componentHexIndex); + this.__state.space = 'RGB'; + } + + this.__state[component] = v; + + } + + }); + + } + + function defineHSVComponent(target, component) { + + Object.defineProperty(target, component, { + + get: function() { + + if (this.__state.space === 'HSV') + return this.__state[component]; + + recalculateHSV(this); + + return this.__state[component]; + + }, + + set: function(v) { + + if (this.__state.space !== 'HSV') { + recalculateHSV(this); + this.__state.space = 'HSV'; + } + + this.__state[component] = v; + + } + + }); + + } + + function recalculateRGB(color, component, componentHexIndex) { + + if (color.__state.space === 'HEX') { + + color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex); + + } else if (color.__state.space === 'HSV') { + + common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v)); + + } else { + + throw 'Corrupted color state'; + + } + + } + + function recalculateHSV(color) { + + var result = math.rgb_to_hsv(color.r, color.g, color.b); + + common.extend(color.__state, + { + s: result.s, + v: result.v + } + ); + + if (!common.isNaN(result.h)) { + color.__state.h = result.h; + } else if (common.isUndefined(color.__state.h)) { + color.__state.h = 0; + } + + } + + return Color; + + })(dat.color.interpret, + dat.color.math = (function () { + + var tmpComponent; + + return { + + hsv_to_rgb: function(h, s, v) { + + var hi = Math.floor(h / 60) % 6; + + var f = h / 60 - Math.floor(h / 60); + var p = v * (1.0 - s); + var q = v * (1.0 - (f * s)); + var t = v * (1.0 - ((1.0 - f) * s)); + var c = [ + [v, t, p], + [q, v, p], + [p, v, t], + [p, q, v], + [t, p, v], + [v, p, q] + ][hi]; + + return { + r: c[0] * 255, + g: c[1] * 255, + b: c[2] * 255 + }; + + }, + + rgb_to_hsv: function(r, g, b) { + + var min = Math.min(r, g, b), + max = Math.max(r, g, b), + delta = max - min, + h, s; + + if (max != 0) { + s = delta / max; + } else { + return { + h: NaN, + s: 0, + v: 0 + }; + } + + if (r == max) { + h = (g - b) / delta; + } else if (g == max) { + h = 2 + (b - r) / delta; + } else { + h = 4 + (r - g) / delta; + } + h /= 6; + if (h < 0) { + h += 1; + } + + return { + h: h * 360, + s: s, + v: max / 255 + }; + }, + + rgb_to_hex: function(r, g, b) { + var hex = this.hex_with_component(0, 2, r); + hex = this.hex_with_component(hex, 1, g); + hex = this.hex_with_component(hex, 0, b); + return hex; + }, + + component_from_hex: function(hex, componentIndex) { + return (hex >> (componentIndex * 8)) & 0xFF; + }, + + hex_with_component: function(hex, componentIndex, value) { + return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent)); + } + + } + + })(), + dat.color.toString, + dat.utils.common), + dat.color.interpret, + dat.utils.common), + dat.utils.requestAnimationFrame = (function () { + + /** + * requirejs version of Paul Irish's RequestAnimationFrame + * http://paulirish.com/2011/requestanimationframe-for-smart-animating/ + */ + + return window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback, element) { + + window.setTimeout(callback, 1000 / 60); + + }; + })(), + dat.dom.CenteredDiv = (function (dom, common) { + + + var CenteredDiv = function() { + + this.backgroundElement = document.createElement('div'); + common.extend(this.backgroundElement.style, { + backgroundColor: 'rgba(0,0,0,0.8)', + top: 0, + left: 0, + display: 'none', + zIndex: '1000', + opacity: 0, + WebkitTransition: 'opacity 0.2s linear' + }); + + dom.makeFullscreen(this.backgroundElement); + this.backgroundElement.style.position = 'fixed'; + + this.domElement = document.createElement('div'); + common.extend(this.domElement.style, { + position: 'fixed', + display: 'none', + zIndex: '1001', + opacity: 0, + WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear' + }); + + + document.body.appendChild(this.backgroundElement); + document.body.appendChild(this.domElement); + + var _this = this; + dom.bind(this.backgroundElement, 'click', function() { + _this.hide(); + }); + + + }; + + CenteredDiv.prototype.show = function() { + + var _this = this; + + + + this.backgroundElement.style.display = 'block'; + + this.domElement.style.display = 'block'; + this.domElement.style.opacity = 0; + // this.domElement.style.top = '52%'; + this.domElement.style.webkitTransform = 'scale(1.1)'; + + this.layout(); + + common.defer(function() { + _this.backgroundElement.style.opacity = 1; + _this.domElement.style.opacity = 1; + _this.domElement.style.webkitTransform = 'scale(1)'; + }); + + }; + + CenteredDiv.prototype.hide = function() { + + var _this = this; + + var hide = function() { + + _this.domElement.style.display = 'none'; + _this.backgroundElement.style.display = 'none'; + + dom.unbind(_this.domElement, 'webkitTransitionEnd', hide); + dom.unbind(_this.domElement, 'transitionend', hide); + dom.unbind(_this.domElement, 'oTransitionEnd', hide); + + }; + + dom.bind(this.domElement, 'webkitTransitionEnd', hide); + dom.bind(this.domElement, 'transitionend', hide); + dom.bind(this.domElement, 'oTransitionEnd', hide); + + this.backgroundElement.style.opacity = 0; + // this.domElement.style.top = '48%'; + this.domElement.style.opacity = 0; + this.domElement.style.webkitTransform = 'scale(1.1)'; + + }; + + CenteredDiv.prototype.layout = function() { + this.domElement.style.left = window.innerWidth/2 - dom.getWidth(this.domElement) / 2 + 'px'; + this.domElement.style.top = window.innerHeight/2 - dom.getHeight(this.domElement) / 2 + 'px'; + }; + + function lockScroll(e) { + console.log(e); + } + + return CenteredDiv; + + })(dat.dom.dom, + dat.utils.common), + dat.dom.dom, + dat.utils.common); + +/***/ }, +/* 11 */ +/***/ function(module, exports) { + + /** + * dat-gui JavaScript Controller Library + * http://code.google.com/p/dat-gui + * + * Copyright 2011 Data Arts Team, Google Creative Lab + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + /** @namespace */ + var dat = module.exports = dat || {}; + + /** @namespace */ + dat.color = dat.color || {}; + + /** @namespace */ + dat.utils = dat.utils || {}; + + dat.utils.common = (function () { + + var ARR_EACH = Array.prototype.forEach; + var ARR_SLICE = Array.prototype.slice; + + /** + * Band-aid methods for things that should be a lot easier in JavaScript. + * Implementation and structure inspired by underscore.js + * http://documentcloud.github.com/underscore/ + */ + + return { + + BREAK: {}, + + extend: function(target) { + + this.each(ARR_SLICE.call(arguments, 1), function(obj) { + + for (var key in obj) + if (!this.isUndefined(obj[key])) + target[key] = obj[key]; + + }, this); + + return target; + + }, + + defaults: function(target) { + + this.each(ARR_SLICE.call(arguments, 1), function(obj) { + + for (var key in obj) + if (this.isUndefined(target[key])) + target[key] = obj[key]; + + }, this); + + return target; + + }, + + compose: function() { + var toCall = ARR_SLICE.call(arguments); + return function() { + var args = ARR_SLICE.call(arguments); + for (var i = toCall.length -1; i >= 0; i--) { + args = [toCall[i].apply(this, args)]; + } + return args[0]; + } + }, + + each: function(obj, itr, scope) { + + + if (ARR_EACH && obj.forEach === ARR_EACH) { + + obj.forEach(itr, scope); + + } else if (obj.length === obj.length + 0) { // Is number but not NaN + + for (var key = 0, l = obj.length; key < l; key++) + if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) + return; + + } else { + + for (var key in obj) + if (itr.call(scope, obj[key], key) === this.BREAK) + return; + + } + + }, + + defer: function(fnc) { + setTimeout(fnc, 0); + }, + + toArray: function(obj) { + if (obj.toArray) return obj.toArray(); + return ARR_SLICE.call(obj); + }, + + isUndefined: function(obj) { + return obj === undefined; + }, + + isNull: function(obj) { + return obj === null; + }, + + isNaN: function(obj) { + return obj !== obj; + }, + + isArray: Array.isArray || function(obj) { + return obj.constructor === Array; + }, + + isObject: function(obj) { + return obj === Object(obj); + }, + + isNumber: function(obj) { + return obj === obj+0; + }, + + isString: function(obj) { + return obj === obj+''; + }, + + isBoolean: function(obj) { + return obj === false || obj === true; + }, + + isFunction: function(obj) { + return Object.prototype.toString.call(obj) === '[object Function]'; + } + + }; + + })(); + + + dat.color.toString = (function (common) { + + return function(color) { + + if (color.a == 1 || common.isUndefined(color.a)) { + + var s = color.hex.toString(16); + while (s.length < 6) { + s = '0' + s; + } + + return '#' + s; + + } else { + + return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')'; + + } + + } + + })(dat.utils.common); + + + dat.Color = dat.color.Color = (function (interpret, math, toString, common) { + + var Color = function() { + + this.__state = interpret.apply(this, arguments); + + if (this.__state === false) { + throw 'Failed to interpret color arguments'; + } + + this.__state.a = this.__state.a || 1; + + + }; + + Color.COMPONENTS = ['r','g','b','h','s','v','hex','a']; + + common.extend(Color.prototype, { + + toString: function() { + return toString(this); + }, + + toOriginal: function() { + return this.__state.conversion.write(this); + } + + }); + + defineRGBComponent(Color.prototype, 'r', 2); + defineRGBComponent(Color.prototype, 'g', 1); + defineRGBComponent(Color.prototype, 'b', 0); + + defineHSVComponent(Color.prototype, 'h'); + defineHSVComponent(Color.prototype, 's'); + defineHSVComponent(Color.prototype, 'v'); + + Object.defineProperty(Color.prototype, 'a', { + + get: function() { + return this.__state.a; + }, + + set: function(v) { + this.__state.a = v; + } + + }); + + Object.defineProperty(Color.prototype, 'hex', { + + get: function() { + + if (!this.__state.space !== 'HEX') { + this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b); + } + + return this.__state.hex; + + }, + + set: function(v) { + + this.__state.space = 'HEX'; + this.__state.hex = v; + + } + + }); + + function defineRGBComponent(target, component, componentHexIndex) { + + Object.defineProperty(target, component, { + + get: function() { + + if (this.__state.space === 'RGB') { + return this.__state[component]; + } + + recalculateRGB(this, component, componentHexIndex); + + return this.__state[component]; + + }, + + set: function(v) { + + if (this.__state.space !== 'RGB') { + recalculateRGB(this, component, componentHexIndex); + this.__state.space = 'RGB'; + } + + this.__state[component] = v; + + } + + }); + + } + + function defineHSVComponent(target, component) { + + Object.defineProperty(target, component, { + + get: function() { + + if (this.__state.space === 'HSV') + return this.__state[component]; + + recalculateHSV(this); + + return this.__state[component]; + + }, + + set: function(v) { + + if (this.__state.space !== 'HSV') { + recalculateHSV(this); + this.__state.space = 'HSV'; + } + + this.__state[component] = v; + + } + + }); + + } + + function recalculateRGB(color, component, componentHexIndex) { + + if (color.__state.space === 'HEX') { + + color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex); + + } else if (color.__state.space === 'HSV') { + + common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v)); + + } else { + + throw 'Corrupted color state'; + + } + + } + + function recalculateHSV(color) { + + var result = math.rgb_to_hsv(color.r, color.g, color.b); + + common.extend(color.__state, + { + s: result.s, + v: result.v + } + ); + + if (!common.isNaN(result.h)) { + color.__state.h = result.h; + } else if (common.isUndefined(color.__state.h)) { + color.__state.h = 0; + } + + } + + return Color; + + })(dat.color.interpret = (function (toString, common) { + + var result, toReturn; + + var interpret = function() { + + toReturn = false; + + var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0]; + + common.each(INTERPRETATIONS, function(family) { + + if (family.litmus(original)) { + + common.each(family.conversions, function(conversion, conversionName) { + + result = conversion.read(original); + + if (toReturn === false && result !== false) { + toReturn = result; + result.conversionName = conversionName; + result.conversion = conversion; + return common.BREAK; + + } + + }); + + return common.BREAK; + + } + + }); + + return toReturn; + + }; + + var INTERPRETATIONS = [ + + // Strings + { + + litmus: common.isString, + + conversions: { + + THREE_CHAR_HEX: { + + read: function(original) { + + var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i); + if (test === null) return false; + + return { + space: 'HEX', + hex: parseInt( + '0x' + + test[1].toString() + test[1].toString() + + test[2].toString() + test[2].toString() + + test[3].toString() + test[3].toString()) + }; + + }, + + write: toString + + }, + + SIX_CHAR_HEX: { + + read: function(original) { + + var test = original.match(/^#([A-F0-9]{6})$/i); + if (test === null) return false; + + return { + space: 'HEX', + hex: parseInt('0x' + test[1].toString()) + }; + + }, + + write: toString + + }, + + CSS_RGB: { + + read: function(original) { + + var test = original.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); + if (test === null) return false; + + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]) + }; + + }, + + write: toString + + }, + + CSS_RGBA: { + + read: function(original) { + + var test = original.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\,\s*(.+)\s*\)/); + if (test === null) return false; + + return { + space: 'RGB', + r: parseFloat(test[1]), + g: parseFloat(test[2]), + b: parseFloat(test[3]), + a: parseFloat(test[4]) + }; + + }, + + write: toString + + } + + } + + }, + + // Numbers + { + + litmus: common.isNumber, + + conversions: { + + HEX: { + read: function(original) { + return { + space: 'HEX', + hex: original, + conversionName: 'HEX' + } + }, + + write: function(color) { + return color.hex; + } + } + + } + + }, + + // Arrays + { + + litmus: common.isArray, + + conversions: { + + RGB_ARRAY: { + read: function(original) { + if (original.length != 3) return false; + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2] + }; + }, + + write: function(color) { + return [color.r, color.g, color.b]; + } + + }, + + RGBA_ARRAY: { + read: function(original) { + if (original.length != 4) return false; + return { + space: 'RGB', + r: original[0], + g: original[1], + b: original[2], + a: original[3] + }; + }, + + write: function(color) { + return [color.r, color.g, color.b, color.a]; + } + + } + + } + + }, + + // Objects + { + + litmus: common.isObject, + + conversions: { + + RGBA_OBJ: { + read: function(original) { + if (common.isNumber(original.r) && + common.isNumber(original.g) && + common.isNumber(original.b) && + common.isNumber(original.a)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b, + a: original.a + } + } + return false; + }, + + write: function(color) { + return { + r: color.r, + g: color.g, + b: color.b, + a: color.a + } + } + }, + + RGB_OBJ: { + read: function(original) { + if (common.isNumber(original.r) && + common.isNumber(original.g) && + common.isNumber(original.b)) { + return { + space: 'RGB', + r: original.r, + g: original.g, + b: original.b + } + } + return false; + }, + + write: function(color) { + return { + r: color.r, + g: color.g, + b: color.b + } + } + }, + + HSVA_OBJ: { + read: function(original) { + if (common.isNumber(original.h) && + common.isNumber(original.s) && + common.isNumber(original.v) && + common.isNumber(original.a)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v, + a: original.a + } + } + return false; + }, + + write: function(color) { + return { + h: color.h, + s: color.s, + v: color.v, + a: color.a + } + } + }, + + HSV_OBJ: { + read: function(original) { + if (common.isNumber(original.h) && + common.isNumber(original.s) && + common.isNumber(original.v)) { + return { + space: 'HSV', + h: original.h, + s: original.s, + v: original.v + } + } + return false; + }, + + write: function(color) { + return { + h: color.h, + s: color.s, + v: color.v + } + } + + } + + } + + } + + + ]; + + return interpret; + + + })(dat.color.toString, + dat.utils.common), + dat.color.math = (function () { + + var tmpComponent; + + return { + + hsv_to_rgb: function(h, s, v) { + + var hi = Math.floor(h / 60) % 6; + + var f = h / 60 - Math.floor(h / 60); + var p = v * (1.0 - s); + var q = v * (1.0 - (f * s)); + var t = v * (1.0 - ((1.0 - f) * s)); + var c = [ + [v, t, p], + [q, v, p], + [p, v, t], + [p, q, v], + [t, p, v], + [v, p, q] + ][hi]; + + return { + r: c[0] * 255, + g: c[1] * 255, + b: c[2] * 255 + }; + + }, + + rgb_to_hsv: function(r, g, b) { + + var min = Math.min(r, g, b), + max = Math.max(r, g, b), + delta = max - min, + h, s; + + if (max != 0) { + s = delta / max; + } else { + return { + h: NaN, + s: 0, + v: 0 + }; + } + + if (r == max) { + h = (g - b) / delta; + } else if (g == max) { + h = 2 + (b - r) / delta; + } else { + h = 4 + (r - g) / delta; + } + h /= 6; + if (h < 0) { + h += 1; + } + + return { + h: h * 360, + s: s, + v: max / 255 + }; + }, + + rgb_to_hex: function(r, g, b) { + var hex = this.hex_with_component(0, 2, r); + hex = this.hex_with_component(hex, 1, g); + hex = this.hex_with_component(hex, 0, b); + return hex; + }, + + component_from_hex: function(hex, componentIndex) { + return (hex >> (componentIndex * 8)) & 0xFF; + }, + + hex_with_component: function(hex, componentIndex, value) { + return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent)); + } + + } + + })(), + dat.color.toString, + dat.utils.common); + +/***/ }, +/* 12 */ +/***/ function(module, exports) { + + module.exports = function( THREE ) { + /** + * @author qiao / https://github.com/qiao + * @author mrdoob / http://mrdoob.com + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author erich666 / http://erichaines.com + */ + + // This set of controls performs orbiting, dollying (zooming), and panning. + // Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). + // + // Orbit - left mouse / touch: one finger move + // Zoom - middle mouse, or mousewheel / touch: two finger spread or squish + // Pan - right mouse, or arrow keys / touch: three finter swipe + + function OrbitControls( object, domElement ) { + + this.object = object; + + this.domElement = ( domElement !== undefined ) ? domElement : document; + + // Set to false to disable this control + this.enabled = true; + + // "target" sets the location of focus, where the object orbits around + this.target = new THREE.Vector3(); + + // How far you can dolly in and out ( PerspectiveCamera only ) + this.minDistance = 0; + this.maxDistance = Infinity; + + // How far you can zoom in and out ( OrthographicCamera only ) + this.minZoom = 0; + this.maxZoom = Infinity; + + // How far you can orbit vertically, upper and lower limits. + // Range is 0 to Math.PI radians. + this.minPolarAngle = 0; // radians + this.maxPolarAngle = Math.PI; // radians + + // How far you can orbit horizontally, upper and lower limits. + // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ]. + this.minAzimuthAngle = - Infinity; // radians + this.maxAzimuthAngle = Infinity; // radians + + // Set to true to enable damping (inertia) + // If damping is enabled, you must call controls.update() in your animation loop + this.enableDamping = false; + this.dampingFactor = 0.25; + + // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. + // Set to false to disable zooming + this.enableZoom = true; + this.zoomSpeed = 1.0; + + // Set to false to disable rotating + this.enableRotate = true; + this.rotateSpeed = 1.0; + + // Set to false to disable panning + this.enablePan = true; + this.keyPanSpeed = 7.0; // pixels moved per arrow key push + + // Set to true to automatically rotate around the target + // If auto-rotate is enabled, you must call controls.update() in your animation loop + this.autoRotate = false; + this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 + + // Set to false to disable use of the keys + this.enableKeys = true; + + // The four arrow keys + this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }; + + // Mouse buttons + this.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT }; + + // for reset + this.target0 = this.target.clone(); + this.position0 = this.object.position.clone(); + this.zoom0 = this.object.zoom; + + // + // public methods + // + + this.getPolarAngle = function () { + + return spherical.phi; + + }; + + this.getAzimuthalAngle = function () { + + return spherical.theta; + + }; + + this.reset = function () { + + scope.target.copy( scope.target0 ); + scope.object.position.copy( scope.position0 ); + scope.object.zoom = scope.zoom0; + + scope.object.updateProjectionMatrix(); + scope.dispatchEvent( changeEvent ); + + scope.update(); + + state = STATE.NONE; + + }; + + // this method is exposed, but perhaps it would be better if we can make it private... + this.update = function() { + + var offset = new THREE.Vector3(); + + // so camera.up is the orbit axis + var quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) ); + var quatInverse = quat.clone().inverse(); + + var lastPosition = new THREE.Vector3(); + var lastQuaternion = new THREE.Quaternion(); + + return function update () { + + var position = scope.object.position; + + offset.copy( position ).sub( scope.target ); + + // rotate offset to "y-axis-is-up" space + offset.applyQuaternion( quat ); + + // angle from z-axis around y-axis + spherical.setFromVector3( offset ); + + if ( scope.autoRotate && state === STATE.NONE ) { + + rotateLeft( getAutoRotationAngle() ); + + } + + spherical.theta += sphericalDelta.theta; + spherical.phi += sphericalDelta.phi; + + // restrict theta to be between desired limits + spherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) ); + + // restrict phi to be between desired limits + spherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) ); + + spherical.makeSafe(); + + + spherical.radius *= scale; + + // restrict radius to be between desired limits + spherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) ); + + // move target to panned location + scope.target.add( panOffset ); + + offset.setFromSpherical( spherical ); + + // rotate offset back to "camera-up-vector-is-up" space + offset.applyQuaternion( quatInverse ); + + position.copy( scope.target ).add( offset ); + + scope.object.lookAt( scope.target ); + + if ( scope.enableDamping === true ) { + + sphericalDelta.theta *= ( 1 - scope.dampingFactor ); + sphericalDelta.phi *= ( 1 - scope.dampingFactor ); + + } else { + + sphericalDelta.set( 0, 0, 0 ); + + } + + scale = 1; + panOffset.set( 0, 0, 0 ); + + // update condition is: + // min(camera displacement, camera rotation in radians)^2 > EPS + // using small-angle approximation cos(x/2) = 1 - x^2 / 8 + + if ( zoomChanged || + lastPosition.distanceToSquared( scope.object.position ) > EPS || + 8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) { + + scope.dispatchEvent( changeEvent ); + + lastPosition.copy( scope.object.position ); + lastQuaternion.copy( scope.object.quaternion ); + zoomChanged = false; + + return true; + + } + + return false; + + }; + + }(); + + this.dispose = function() { + + scope.domElement.removeEventListener( 'contextmenu', onContextMenu, false ); + scope.domElement.removeEventListener( 'mousedown', onMouseDown, false ); + scope.domElement.removeEventListener( 'wheel', onMouseWheel, false ); + + scope.domElement.removeEventListener( 'touchstart', onTouchStart, false ); + scope.domElement.removeEventListener( 'touchend', onTouchEnd, false ); + scope.domElement.removeEventListener( 'touchmove', onTouchMove, false ); + + document.removeEventListener( 'mousemove', onMouseMove, false ); + document.removeEventListener( 'mouseup', onMouseUp, false ); + + window.removeEventListener( 'keydown', onKeyDown, false ); + + //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here? + + }; + + // + // internals + // + + var scope = this; + + var changeEvent = { type: 'change' }; + var startEvent = { type: 'start' }; + var endEvent = { type: 'end' }; + + var STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 }; + + var state = STATE.NONE; + + var EPS = 0.000001; + + // current position in spherical coordinates + var spherical = new THREE.Spherical(); + var sphericalDelta = new THREE.Spherical(); + + var scale = 1; + var panOffset = new THREE.Vector3(); + var zoomChanged = false; + + var rotateStart = new THREE.Vector2(); + var rotateEnd = new THREE.Vector2(); + var rotateDelta = new THREE.Vector2(); + + var panStart = new THREE.Vector2(); + var panEnd = new THREE.Vector2(); + var panDelta = new THREE.Vector2(); + + var dollyStart = new THREE.Vector2(); + var dollyEnd = new THREE.Vector2(); + var dollyDelta = new THREE.Vector2(); + + function getAutoRotationAngle() { + + return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; + + } + + function getZoomScale() { + + return Math.pow( 0.95, scope.zoomSpeed ); + + } + + function rotateLeft( angle ) { + + sphericalDelta.theta -= angle; + + } + + function rotateUp( angle ) { + + sphericalDelta.phi -= angle; + + } + + var panLeft = function() { + + var v = new THREE.Vector3(); + + return function panLeft( distance, objectMatrix ) { + + v.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix + v.multiplyScalar( - distance ); + + panOffset.add( v ); + + }; + + }(); + + var panUp = function() { + + var v = new THREE.Vector3(); + + return function panUp( distance, objectMatrix ) { + + v.setFromMatrixColumn( objectMatrix, 1 ); // get Y column of objectMatrix + v.multiplyScalar( distance ); + + panOffset.add( v ); + + }; + + }(); + + // deltaX and deltaY are in pixels; right and down are positive + var pan = function() { + + var offset = new THREE.Vector3(); + + return function pan ( deltaX, deltaY ) { + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + if ( scope.object instanceof THREE.PerspectiveCamera ) { + + // perspective + var position = scope.object.position; + offset.copy( position ).sub( scope.target ); + var targetDistance = offset.length(); + + // half of the fov is center to top of screen + targetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 ); + + // we actually don't use screenWidth, since perspective camera is fixed to screen height + panLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix ); + panUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix ); + + } else if ( scope.object instanceof THREE.OrthographicCamera ) { + + // orthographic + panLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix ); + panUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix ); + + } else { + + // camera neither orthographic nor perspective + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' ); + scope.enablePan = false; + + } + + }; + + }(); + + function dollyIn( dollyScale ) { + + if ( scope.object instanceof THREE.PerspectiveCamera ) { + + scale /= dollyScale; + + } else if ( scope.object instanceof THREE.OrthographicCamera ) { + + scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) ); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + + } else { + + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' ); + scope.enableZoom = false; + + } + + } + + function dollyOut( dollyScale ) { + + if ( scope.object instanceof THREE.PerspectiveCamera ) { + + scale *= dollyScale; + + } else if ( scope.object instanceof THREE.OrthographicCamera ) { + + scope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) ); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + + } else { + + console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' ); + scope.enableZoom = false; + + } + + } + + // + // event callbacks - update the object state + // + + function handleMouseDownRotate( event ) { + + //console.log( 'handleMouseDownRotate' ); + + rotateStart.set( event.clientX, event.clientY ); + + } + + function handleMouseDownDolly( event ) { + + //console.log( 'handleMouseDownDolly' ); + + dollyStart.set( event.clientX, event.clientY ); + + } + + function handleMouseDownPan( event ) { + + //console.log( 'handleMouseDownPan' ); + + panStart.set( event.clientX, event.clientY ); + + } + + function handleMouseMoveRotate( event ) { + + //console.log( 'handleMouseMoveRotate' ); + + rotateEnd.set( event.clientX, event.clientY ); + rotateDelta.subVectors( rotateEnd, rotateStart ); + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + // rotating across whole screen goes 360 degrees around + rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed ); + + // rotating up and down along whole screen attempts to go 360, but limited to 180 + rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed ); + + rotateStart.copy( rotateEnd ); + + scope.update(); + + } + + function handleMouseMoveDolly( event ) { + + //console.log( 'handleMouseMoveDolly' ); + + dollyEnd.set( event.clientX, event.clientY ); + + dollyDelta.subVectors( dollyEnd, dollyStart ); + + if ( dollyDelta.y > 0 ) { + + dollyIn( getZoomScale() ); + + } else if ( dollyDelta.y < 0 ) { + + dollyOut( getZoomScale() ); + + } + + dollyStart.copy( dollyEnd ); + + scope.update(); + + } + + function handleMouseMovePan( event ) { + + //console.log( 'handleMouseMovePan' ); + + panEnd.set( event.clientX, event.clientY ); + + panDelta.subVectors( panEnd, panStart ); + + pan( panDelta.x, panDelta.y ); + + panStart.copy( panEnd ); + + scope.update(); + + } + + function handleMouseUp( event ) { + + //console.log( 'handleMouseUp' ); + + } + + function handleMouseWheel( event ) { + + //console.log( 'handleMouseWheel' ); + + if ( event.deltaY < 0 ) { + + dollyOut( getZoomScale() ); + + } else if ( event.deltaY > 0 ) { + + dollyIn( getZoomScale() ); + + } + + scope.update(); + + } + + function handleKeyDown( event ) { + + //console.log( 'handleKeyDown' ); + + switch ( event.keyCode ) { + + case scope.keys.UP: + pan( 0, scope.keyPanSpeed ); + scope.update(); + break; + + case scope.keys.BOTTOM: + pan( 0, - scope.keyPanSpeed ); + scope.update(); + break; + + case scope.keys.LEFT: + pan( scope.keyPanSpeed, 0 ); + scope.update(); + break; + + case scope.keys.RIGHT: + pan( - scope.keyPanSpeed, 0 ); + scope.update(); + break; + + } + + } + + function handleTouchStartRotate( event ) { + + //console.log( 'handleTouchStartRotate' ); + + rotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + } + + function handleTouchStartDolly( event ) { + + //console.log( 'handleTouchStartDolly' ); + + var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; + var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; + + var distance = Math.sqrt( dx * dx + dy * dy ); + + dollyStart.set( 0, distance ); + + } + + function handleTouchStartPan( event ) { + + //console.log( 'handleTouchStartPan' ); + + panStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + } + + function handleTouchMoveRotate( event ) { + + //console.log( 'handleTouchMoveRotate' ); + + rotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + rotateDelta.subVectors( rotateEnd, rotateStart ); + + var element = scope.domElement === document ? scope.domElement.body : scope.domElement; + + // rotating across whole screen goes 360 degrees around + rotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed ); + + // rotating up and down along whole screen attempts to go 360, but limited to 180 + rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed ); + + rotateStart.copy( rotateEnd ); + + scope.update(); + + } + + function handleTouchMoveDolly( event ) { + + //console.log( 'handleTouchMoveDolly' ); + + var dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX; + var dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY; + + var distance = Math.sqrt( dx * dx + dy * dy ); + + dollyEnd.set( 0, distance ); + + dollyDelta.subVectors( dollyEnd, dollyStart ); + + if ( dollyDelta.y > 0 ) { + + dollyOut( getZoomScale() ); + + } else if ( dollyDelta.y < 0 ) { + + dollyIn( getZoomScale() ); + + } + + dollyStart.copy( dollyEnd ); + + scope.update(); + + } + + function handleTouchMovePan( event ) { + + //console.log( 'handleTouchMovePan' ); + + panEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY ); + + panDelta.subVectors( panEnd, panStart ); + + pan( panDelta.x, panDelta.y ); + + panStart.copy( panEnd ); + + scope.update(); + + } + + function handleTouchEnd( event ) { + + //console.log( 'handleTouchEnd' ); + + } + + // + // event handlers - FSM: listen for events and reset state + // + + function onMouseDown( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + + if ( event.button === scope.mouseButtons.ORBIT ) { + + if ( scope.enableRotate === false ) return; + + handleMouseDownRotate( event ); + + state = STATE.ROTATE; + + } else if ( event.button === scope.mouseButtons.ZOOM ) { + + if ( scope.enableZoom === false ) return; + + handleMouseDownDolly( event ); + + state = STATE.DOLLY; + + } else if ( event.button === scope.mouseButtons.PAN ) { + + if ( scope.enablePan === false ) return; + + handleMouseDownPan( event ); + + state = STATE.PAN; + + } + + if ( state !== STATE.NONE ) { + + document.addEventListener( 'mousemove', onMouseMove, false ); + document.addEventListener( 'mouseup', onMouseUp, false ); + + scope.dispatchEvent( startEvent ); + + } + + } + + function onMouseMove( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + + if ( state === STATE.ROTATE ) { + + if ( scope.enableRotate === false ) return; + + handleMouseMoveRotate( event ); + + } else if ( state === STATE.DOLLY ) { + + if ( scope.enableZoom === false ) return; + + handleMouseMoveDolly( event ); + + } else if ( state === STATE.PAN ) { + + if ( scope.enablePan === false ) return; + + handleMouseMovePan( event ); + + } + + } + + function onMouseUp( event ) { + + if ( scope.enabled === false ) return; + + handleMouseUp( event ); + + document.removeEventListener( 'mousemove', onMouseMove, false ); + document.removeEventListener( 'mouseup', onMouseUp, false ); + + scope.dispatchEvent( endEvent ); + + state = STATE.NONE; + + } + + function onMouseWheel( event ) { + + if ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return; + + event.preventDefault(); + event.stopPropagation(); + + handleMouseWheel( event ); + + scope.dispatchEvent( startEvent ); // not sure why these are here... + scope.dispatchEvent( endEvent ); + + } + + function onKeyDown( event ) { + + if ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return; + + handleKeyDown( event ); + + } + + function onTouchStart( event ) { + + if ( scope.enabled === false ) return; + + switch ( event.touches.length ) { + + case 1: // one-fingered touch: rotate + + if ( scope.enableRotate === false ) return; + + handleTouchStartRotate( event ); + + state = STATE.TOUCH_ROTATE; + + break; + + case 2: // two-fingered touch: dolly + + if ( scope.enableZoom === false ) return; + + handleTouchStartDolly( event ); + + state = STATE.TOUCH_DOLLY; + + break; + + case 3: // three-fingered touch: pan + + if ( scope.enablePan === false ) return; + + handleTouchStartPan( event ); + + state = STATE.TOUCH_PAN; + + break; + + default: + + state = STATE.NONE; + + } + + if ( state !== STATE.NONE ) { + + scope.dispatchEvent( startEvent ); + + } + + } + + function onTouchMove( event ) { + + if ( scope.enabled === false ) return; + + event.preventDefault(); + event.stopPropagation(); + + switch ( event.touches.length ) { + + case 1: // one-fingered touch: rotate + + if ( scope.enableRotate === false ) return; + if ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?... + + handleTouchMoveRotate( event ); + + break; + + case 2: // two-fingered touch: dolly + + if ( scope.enableZoom === false ) return; + if ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?... + + handleTouchMoveDolly( event ); + + break; + + case 3: // three-fingered touch: pan + + if ( scope.enablePan === false ) return; + if ( state !== STATE.TOUCH_PAN ) return; // is this needed?... + + handleTouchMovePan( event ); + + break; + + default: + + state = STATE.NONE; + + } + + } + + function onTouchEnd( event ) { + + if ( scope.enabled === false ) return; + + handleTouchEnd( event ); + + scope.dispatchEvent( endEvent ); + + state = STATE.NONE; + + } + + function onContextMenu( event ) { + + event.preventDefault(); + + } + + // + + scope.domElement.addEventListener( 'contextmenu', onContextMenu, false ); + + scope.domElement.addEventListener( 'mousedown', onMouseDown, false ); + scope.domElement.addEventListener( 'wheel', onMouseWheel, false ); + + scope.domElement.addEventListener( 'touchstart', onTouchStart, false ); + scope.domElement.addEventListener( 'touchend', onTouchEnd, false ); + scope.domElement.addEventListener( 'touchmove', onTouchMove, false ); + + window.addEventListener( 'keydown', onKeyDown, false ); + + // force an update at start + + this.update(); + + }; + + OrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype ); + OrbitControls.prototype.constructor = OrbitControls; + + Object.defineProperties( OrbitControls.prototype, { + + center: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .center has been renamed to .target' ); + return this.target; + + } + + }, + + // backward compatibility + + noZoom: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' ); + return ! this.enableZoom; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' ); + this.enableZoom = ! value; + + } + + }, + + noRotate: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' ); + return ! this.enableRotate; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' ); + this.enableRotate = ! value; + + } + + }, + + noPan: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' ); + return ! this.enablePan; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' ); + this.enablePan = ! value; + + } + + }, + + noKeys: { + + get: function () { + + console.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' ); + return ! this.enableKeys; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' ); + this.enableKeys = ! value; + + } + + }, + + staticMoving : { + + get: function () { + + console.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' ); + return ! this.enableDamping; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' ); + this.enableDamping = ! value; + + } + + }, + + dynamicDampingFactor : { + + get: function () { + + console.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' ); + return this.dampingFactor; + + }, + + set: function ( value ) { + + console.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' ); + this.dampingFactor = value; + + } + + } + + } ); + + return OrbitControls; + }; + + +/***/ }, +/* 13 */ +/***/ function(module, exports) { + + 'use strict'; + + module.exports = function (THREE) { + + /** + * @author mrdoob / http://mrdoob.com/ + */ + THREE.OBJLoader = function (manager) { + + this.manager = manager !== undefined ? manager : THREE.DefaultLoadingManager; + }; + + THREE.OBJLoader.prototype = { + + constructor: THREE.OBJLoader, + + load: function load(url, onLoad, onProgress, onError) { + + var scope = this; + + var loader = new THREE.XHRLoader(scope.manager); + loader.load(url, function (text) { + + onLoad(scope.parse(text)); + }, onProgress, onError); + }, + + parse: function parse(text) { + + console.time('OBJLoader'); + + var object, + objects = []; + var geometry, material; + + function parseVertexIndex(value) { + + var index = parseInt(value); + + return (index >= 0 ? index - 1 : index + vertices.length / 3) * 3; + } + + function parseNormalIndex(value) { + + var index = parseInt(value); + + return (index >= 0 ? index - 1 : index + normals.length / 3) * 3; + } + + function parseUVIndex(value) { + + var index = parseInt(value); + + return (index >= 0 ? index - 1 : index + uvs.length / 2) * 2; + } + + function addVertex(a, b, c) { + + geometry.vertices.push(vertices[a], vertices[a + 1], vertices[a + 2], vertices[b], vertices[b + 1], vertices[b + 2], vertices[c], vertices[c + 1], vertices[c + 2]); + } + + function addNormal(a, b, c) { + + geometry.normals.push(normals[a], normals[a + 1], normals[a + 2], normals[b], normals[b + 1], normals[b + 2], normals[c], normals[c + 1], normals[c + 2]); + } + + function addUV(a, b, c) { + + geometry.uvs.push(uvs[a], uvs[a + 1], uvs[b], uvs[b + 1], uvs[c], uvs[c + 1]); + } + + function addFace(a, b, c, d, ua, ub, uc, ud, na, nb, nc, nd) { + + var ia = parseVertexIndex(a); + var ib = parseVertexIndex(b); + var ic = parseVertexIndex(c); + var id; + + if (d === undefined) { + + addVertex(ia, ib, ic); + } else { + + id = parseVertexIndex(d); + + addVertex(ia, ib, id); + addVertex(ib, ic, id); + } + + if (ua !== undefined) { + + ia = parseUVIndex(ua); + ib = parseUVIndex(ub); + ic = parseUVIndex(uc); + + if (d === undefined) { + + addUV(ia, ib, ic); + } else { + + id = parseUVIndex(ud); + + addUV(ia, ib, id); + addUV(ib, ic, id); + } + } + + if (na !== undefined) { + + ia = parseNormalIndex(na); + ib = parseNormalIndex(nb); + ic = parseNormalIndex(nc); + + if (d === undefined) { + + addNormal(ia, ib, ic); + } else { + + id = parseNormalIndex(nd); + + addNormal(ia, ib, id); + addNormal(ib, ic, id); + } + } + } + + // create mesh if no objects in text + + if (/^o /gm.test(text) === false) { + + geometry = { + vertices: [], + normals: [], + uvs: [] + }; + + material = { + name: '' + }; + + object = { + name: '', + geometry: geometry, + material: material + }; + + objects.push(object); + } + + var vertices = []; + var normals = []; + var uvs = []; + + // v float float float + + var vertex_pattern = /v( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)/; + + // vn float float float + + var normal_pattern = /vn( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)/; + + // vt float float + + var uv_pattern = /vt( +[\d|\.|\+|\-|e|E]+)( +[\d|\.|\+|\-|e|E]+)/; + + // f vertex vertex vertex ... + + var face_pattern1 = /f( +-?\d+)( +-?\d+)( +-?\d+)( +-?\d+)?/; + + // f vertex/uv vertex/uv vertex/uv ... + + var face_pattern2 = /f( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))?/; + + // f vertex/uv/normal vertex/uv/normal vertex/uv/normal ... + + var face_pattern3 = /f( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))?/; + + // f vertex//normal vertex//normal vertex//normal ... + + var face_pattern4 = /f( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))?/; + + // + + var lines = text.split('\n'); + + for (var i = 0; i < lines.length; i++) { + + var line = lines[i]; + line = line.trim(); + + var result; + + if (line.length === 0 || line.charAt(0) === '#') { + + continue; + } else if ((result = vertex_pattern.exec(line)) !== null) { + + // ["v 1.0 2.0 3.0", "1.0", "2.0", "3.0"] + + vertices.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3])); + } else if ((result = normal_pattern.exec(line)) !== null) { + + // ["vn 1.0 2.0 3.0", "1.0", "2.0", "3.0"] + + normals.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3])); + } else if ((result = uv_pattern.exec(line)) !== null) { + + // ["vt 0.1 0.2", "0.1", "0.2"] + + uvs.push(parseFloat(result[1]), parseFloat(result[2])); + } else if ((result = face_pattern1.exec(line)) !== null) { + + // ["f 1 2 3", "1", "2", "3", undefined] + + addFace(result[1], result[2], result[3], result[4]); + } else if ((result = face_pattern2.exec(line)) !== null) { + + // ["f 1/1 2/2 3/3", " 1/1", "1", "1", " 2/2", "2", "2", " 3/3", "3", "3", undefined, undefined, undefined] + + addFace(result[2], result[5], result[8], result[11], result[3], result[6], result[9], result[12]); + } else if ((result = face_pattern3.exec(line)) !== null) { + + // ["f 1/1/1 2/2/2 3/3/3", " 1/1/1", "1", "1", "1", " 2/2/2", "2", "2", "2", " 3/3/3", "3", "3", "3", undefined, undefined, undefined, undefined] + + addFace(result[2], result[6], result[10], result[14], result[3], result[7], result[11], result[15], result[4], result[8], result[12], result[16]); + } else if ((result = face_pattern4.exec(line)) !== null) { + + // ["f 1//1 2//2 3//3", " 1//1", "1", "1", " 2//2", "2", "2", " 3//3", "3", "3", undefined, undefined, undefined] + + addFace(result[2], result[5], result[8], result[11], undefined, undefined, undefined, undefined, result[3], result[6], result[9], result[12]); + } else if (/^o /.test(line)) { + + geometry = { + vertices: [], + normals: [], + uvs: [] + }; + + material = { + name: '' + }; + + object = { + name: line.substring(2).trim(), + geometry: geometry, + material: material + }; + + objects.push(object); + } else if (/^g /.test(line)) { + + // group + + } else if (/^usemtl /.test(line)) { + + // material + + material.name = line.substring(7).trim(); + } else if (/^mtllib /.test(line)) { + + // mtl file + + } else if (/^s /.test(line)) { + + // smooth shading + + } else { + + // console.log( "THREE.OBJLoader: Unhandled line " + line ); + + } + } + + var container = new THREE.Object3D(); + var l; + + for (i = 0, l = objects.length; i < l; i++) { + + object = objects[i]; + geometry = object.geometry; + + var buffergeometry = new THREE.BufferGeometry(); + + buffergeometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array(geometry.vertices), 3)); + + if (geometry.normals.length > 0) { + + buffergeometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(geometry.normals), 3)); + } + + if (geometry.uvs.length > 0) { + + buffergeometry.addAttribute('uv', new THREE.BufferAttribute(new Float32Array(geometry.uvs), 2)); + } + + material = new THREE.MeshLambertMaterial({ + color: 0xff0000 + }); + material.name = object.material.name; + + var mesh = new THREE.Mesh(buffergeometry, material); + mesh.name = object.name; + + container.add(mesh); + } + + console.timeEnd('OBJLoader'); + + return container; + } + + }; + }; + +/***/ } +/******/ ]); +//# sourceMappingURL=bundle.js.map \ No newline at end of file diff --git a/bundle.js.map b/bundle.js.map new file mode 100644 index 00000000..c1e78ac7 --- /dev/null +++ b/bundle.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap c90c41d011d962588db1","webpack:///./src/main.js","webpack:///./src/grid.js","webpack:///./~/three/build/three.js","webpack:///./src/agent.js","webpack:///./src/marker.js","webpack:///./src/crowd.js","webpack:///./src/renderengine.js","webpack:///./src/framework.js","webpack:///./~/stats-js/build/stats.min.js","webpack:///./~/dat-gui/index.js","webpack:///./~/dat-gui/vendor/dat.gui.js","webpack:///./~/dat-gui/vendor/dat.color.js","webpack:///./~/three-orbit-controls/index.js","webpack:///./~/three-obj-loader/dist/index.js"],"names":["THREE","require","OBJLoader","crowd","renderengine","time","onLoad","framework","scene","camera","renderer","gui","stats","directionalLight","DirectionalLight","color","setHSL","position","set","multiplyScalar","add","ambientLight","AmbientLight","lookAt","Vector3","onChange","newVal","updateProjectionMatrix","onUpdate","update","init","Grid","cell_size","plane_size","grid_cell_size","grid_len","grid","push","Array","i","j","Set","ws_x","ws_z","tgs","ws_to_tgs","gs_z","Math","round","z","gs_x","x","floor","tgs_x","tgs_z","Agent","id","pos","vel","goal","size","col","velocity","markers","mesh","Marker","owned","agent","Crowd","agents","board","create_agents","populate_board","create_markers","render_plane","render_agents","render_markers","agent_1_pos","agent_2_pos","agent_1_goal","agent_2_goal","zero","agent_1","agent_2","length","gs","find_nearest_grid","random","marker","update_marker_ownership","update_agent_velocities","update_agents","update_markers","reset_ownership","ngs","top_left","top","left","eligible_agents","forEach","assign_marker_to_agent","closest","dist","distanceTo","test_dist","old_gs","G","total_weight","total_velocity","m","weight","cos","angleTo","normalize","agent_gs","delete","RenderEngine","plane_geo","PlaneGeometry","plane_mesh","Mesh","MeshBasicMaterial","side","DoubleSide","rotation","PI","cylinder_geo","CylinderGeometry","y","cube_geo","BoxGeometry","geometry","verticesNeedUpdate","material","setHex","OrbitControls","callback","setMode","domElement","style","document","body","appendChild","GUI","window","addEventListener","Scene","PerspectiveCamera","innerWidth","innerHeight","WebGLRenderer","antialias","setPixelRatio","devicePixelRatio","setSize","setClearColor","controls","enableDamping","enableZoom","target","rotateSpeed","zoomSpeed","panSpeed","aspect","tick","begin","render","end","requestAnimationFrame"],"mappings":"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AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,qBAAoB,QAAQ;;AAE5B;;AAEA;;AAEA,OAAM;;AAEN;;AAEA,OAAM;;AAEN;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4BAA2B;AAC3B,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AA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AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA,oEAAmE;;AAEnE;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,kBAAiB,eAAe,eAAe;AAC/C,kBAAiB,eAAe,eAAe;AAC/C,kBAAiB,eAAe,gBAAgB;AAChD,kBAAiB,eAAe,gBAAgB;;AAEhD;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;;AAGA,mBAAkB,eAAe;AACjC,mBAAkB,eAAe;AACjC,mBAAkB,eAAe;;AAEjC;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,qBAAoB,kBAAkB,kBAAkB;AACxD,qBAAoB,kBAAkB,kBAAkB;AACxD,sBAAqB,mBAAmB,oBAAoB;AAC5D,uBAAsB,oBAAoB,oBAAoB;;AAE9D;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,iBAAgB,cAAc,cAAc;AAC5C,iBAAgB,cAAc,cAAc;AAC5C,iBAAgB,cAAc,eAAe;AAC7C,iBAAgB,cAAc,eAAe;;AAE7C;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,iCAAgC,YAAY;;AAE5C;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,iCAAgC,YAAY;;AAE5C;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,kBAAiB,mBAAmB;AACpC,kBAAiB,mBAAmB;AACpC,kBAAiB,mBAAmB;;AAEpC,kBAAiB,oBAAoB;AACrC,kBAAiB,oBAAoB;AACrC,mBAAkB,qBAAqB;;AAEvC;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,iBAAgB,cAAc;AAC9B,iBAAgB,cAAc;AAC9B,iBAAgB,cAAc;AAC9B,iBAAgB,cAAc;;AAE9B;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,0CAAyC;;AAEzC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,gBAAe,aAAa,aAAa;AACzC,gBAAe,aAAa,aAAa;AACzC,gBAAe,aAAa,cAAc;AAC1C,gBAAe,aAAa,gBAAgB;;AAE5C;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAmB,aAAa,aAAa;AAC7C,gBAAe,iBAAiB,aAAa;AAC7C,gBAAe,aAAa,oBAAoB;AAChD,gBAAe,aAAa,cAAc;;AAE1C;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,oBAAmB,QAAQ;;AAE3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,mBAAkB,QAAQ;;AAE1B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,gCAA+B,eAAe;;AAE9C;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,mBAAkB,SAAS;AAC3B;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gCAA+B,8BAA8B;AAC7D,gCAA+B,8BAA8B;;AAE7D;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,iCAAgC,+BAA+B;AAC/D,iCAAgC,+BAA+B;AAC/D,iCAAgC,+BAA+B;;AAE/D;;AAEA;;AAEA;;AAEA,mCAAkC;AAClC,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC,mCAAkC;AAClC,mCAAkC;;AAElC,gDAA+C;AAC/C,iDAAgD;AAChD,iDAAgD;AAChD,iDAAgD;;AAEhD;;AAEA;;AAEA;;AAEA,iCAAgC,+BAA+B;AAC/D,iCAAgC,+BAA+B;;AAE/D;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,mBAAkB,SAAS;;AAE3B;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,mBAAkB,SAAS;;AAE3B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC,oCAAmC;AACnC,oCAAmC;;AAEnC,iDAAgD;AAChD,iDAAgD;AAChD,iDAAgD;AAChD,iDAAgD;;AAEhD;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,kCAAiC;;AAEjC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,kCAAiC;;AAEjC;;AAEA;;AAEA;;AAEA,iCAAgC;;AAEhC;;AAEA;;AAEA;AACA;;AAEA;;AAEA,mCAAkC,SAAS;;AAE3C;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,SAAQ,EAAE;;AAEV;AACA;;AAEA;AACA;AACA;;AAEA,iCAAgC;;AAEhC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,KAAI;AACJ;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB,SAAS;;AAE3B;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA,mCAAkC,SAAS;;AAE3C;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mCAAkC,SAAS;;AAE3C;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,qBAAqB;;AAExC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,iGAAgG;;AAEhG,kFAAiF;;AAEjF,0FAAyF;;AAEzF,iIAAgI,uDAAuD,6HAA6H,yHAAyH;;AAE7a,yEAAwE,iCAAiC;;AAEzG,4DAA2D;;AAE3D,iEAAgE;;AAEhE,qGAAoG,iFAAiF,GAAG,+IAA+I,iCAAiC,kIAAkI,yGAAyG,yDAAyD,8FAA8F,eAAe,iBAAiB,GAAG,2DAA2D,wCAAwC,GAAG,uEAAuE,mEAAmE,6DAA6D,GAAG,yFAAyF,6BAA6B,iEAAiE,iEAAiE,6BAA6B,GAAG,mGAAmG,6BAA6B,iEAAiE,iEAAiE,yCAAyC,GAAG,6DAA6D,6BAA6B,qDAAqD,8CAA8C,GAAG,6JAA6J,oCAAoC,2EAA2E,8EAA8E,uEAAuE,8DAA8D,sEAAsE,+CAA+C,2DAA2D,oCAAoC,yBAAyB,GAAG,mIAAmI,uEAAuE,0DAA0D,oDAAoD,iCAAiC,sEAAsE,gDAAgD,uCAAuC,GAAG,kCAAkC,gBAAgB,GAAG,wEAAwE,+EAA+E,GAAG,oKAAoK,2EAA2E,8DAA8D,sEAAsE,+CAA+C,uCAAuC,+CAA+C,yBAAyB,GAAG,oEAAoE,yDAAyD,GAAG,qEAAqE,iDAAiD,GAAG;;AAEv+H,+EAA8E,4BAA4B,sBAAsB,+BAA+B,+BAA+B,0DAA0D,wEAAwE,wEAAwE,8BAA8B,KAAK,wEAAwE,sCAAsC,sCAAsC,0BAA0B,qCAAqC,qCAAqC,sCAAsC,kEAAkE,0DAA0D,KAAK;;AAE10B,iFAAgF,2BAA2B,SAAS,uCAAuC,+DAA+D,KAAK,mFAAmF,0CAA0C,yBAAyB,SAAS,yCAAyC,2EAA2E,OAAO,6BAA6B;;AAEthB,sJAAqJ,iEAAiE;;AAEtN,8IAA6I;;AAE7I,+IAA8I;;AAE9I,uEAAsE;;AAEtE,qEAAoE;;AAEpE,mEAAkE;;AAElE,iEAAgE;;AAEhE,wTAAuT,YAAY,EAAE,kCAAkC,cAAc,EAAE,kCAAkC,gBAAgB,cAAc,EAAE,wCAAwC,qCAAqC,EAAE,wCAAwC,8DAA8D,mEAAmE,8BAA8B,GAAG,wBAAwB,eAAe,mBAAmB,iBAAiB,IAAI,yBAAyB,uBAAuB,wBAAwB,yBAAyB,0BAA0B,IAAI,2BAA2B,kBAAkB,gBAAgB,iBAAiB,IAAI,0DAA0D,0DAA0D,GAAG,iEAAiE,0DAA0D,GAAG,kFAAkF,8DAA8D,4CAA4C,GAAG,iFAAiF,4DAA4D,GAAG,oHAAoH,gIAAgI,GAAG;;AAE7yD,gJAA+I,uCAAuC,kBAAkB,2CAA2C,mFAAmF,mDAAmD,KAAK,UAAU,mFAAmF,mDAAmD,KAAK,gBAAgB,GAAG,6LAA6L,yDAAyD,wCAAwC,wCAAwC,gDAAgD,gDAAgD,kDAAkD,yCAAyC,mCAAmC,kDAAkD,GAAG,iMAAiM,uEAAuE,2CAA2C,gEAAgE,qDAAqD,mDAAmD,+DAA+D,yEAAyE,gCAAgC,6CAA6C,WAAW,gBAAgB,+CAA+C,uCAAuC,oBAAoB,uDAAuD,sDAAsD,4DAA4D,KAAK,yBAAyB,sDAAsD,yDAAyD,4DAA4D,KAAK,yBAAyB,sDAAsD,6DAA6D,4DAA4D,KAAK,yBAAyB,sDAAsD,qDAAqD,8DAA8D,KAAK,yBAAyB,uDAAuD,wDAAwD,8DAA8D,KAAK,UAAU,uDAAuD,4DAA4D,8DAA8D,KAAK,qBAAqB,oDAAoD,uDAAuD,6CAA6C,oDAAoD,GAAG,gIAAgI,oDAAoD,mCAAmC,wBAAwB,kCAAkC,mEAAmE,wBAAwB,6BAA6B,gCAAgC,yCAAyC,2CAA2C,2DAA2D,iEAAiE,2DAA2D,iEAAiE,2CAA2C,iCAAiC,GAAG;;AAElnI,gFAA+E,+DAA+D;;AAE9I,qGAAoG,oCAAoC,mCAAmC;;AAE3K,oKAAmK;;AAEnK,2GAA0G,sEAAsE,+CAA+C;;AAE/N,2FAA0F;;AAE1F,iFAAgF;;AAEhF,yEAAwE,iBAAiB,GAAG,6DAA6D,kEAAkE,GAAG,6DAA6D,wEAAwE,GAAG,sCAAsC,sLAAsL,GAAG,sCAAsC,uKAAuK,GAAG,sCAAsC,oEAAoE,GAAG,sCAAsC,iEAAiE,sEAAsE,sEAAsE,GAAG,yDAAyD,uDAAuD,GAAG,yDAAyD,2DAA2D,wDAAwD,6CAA6C,mDAAmD,GAAG,yDAAyD,yEAAyE,GAAG,yDAAyD,6DAA6D,mDAAmD,oDAAoD,iEAAiE,GAAG,uGAAuG,yCAAyC,0CAA0C,uDAAuD,iBAAiB,4CAA4C,+CAA+C,0BAA0B,4DAA4D,mBAAmB,GAAG,mHAAmH,wCAAwC,yCAAyC,mBAAmB,2CAA2C,wCAAwC,wCAAwC,gDAAgD,uCAAuC,GAAG;;AAErxF,iMAAgM,yEAAyE,oGAAoG,6FAA6F,sDAAsD,gJAAgJ,4DAA4D,qEAAqE,uGAAuG,oDAAoD,+JAA+J,sEAAsE,2CAA2C,yDAAyD,6IAA6I,kIAAkI,8GAA8G;;AAElnD,6GAA4G,kCAAkC,wKAAwK,sEAAsE,wCAAwC,uCAAuC,yIAAyI,qCAAqC;;AAEznB,6JAA4J,qCAAqC,oCAAoC;;AAErO,+JAA8J,qFAAqF,oFAAoF,6FAA6F,sFAAsF;;AAE1f,uHAAsH,6DAA6D,iIAAiI,sEAAsE,8EAA8E;;AAExc,mEAAkE,kDAAkD,qCAAqC,2BAA2B;;AAEpL,6IAA4I;;AAE5I,kFAAiF,oCAAoC;;AAErH,0DAAyD,4BAA4B,qCAAqC,mDAAmD,kDAAkD,gCAAgC,4CAA4C,yCAAyC,0CAA0C,4BAA4B,kDAAkD,oCAAoC,cAAc,gCAAgC,8CAA8C,sBAAsB,SAAS,+EAA+E,4DAA4D,wDAAwD,kEAAkE,6FAA6F,iBAAiB,qDAAqD,qBAAqB,SAAS,6EAA6E,4DAA4D,wDAAwD,kEAAkE,6FAA6F,iBAAiB,oDAAoD,oBAAoB,SAAS,2FAA2F,4DAA4D,wDAAwD,kEAAkE,6FAA6F,iBAAiB,qDAAqD,qBAAqB,SAAS,qFAAqF,mHAAmH,iBAAiB;;AAE9pE,oDAAmD,qEAAqE,wCAAwC,4DAA4D,gCAAgC,GAAG,qDAAqD,qBAAqB,iBAAiB,iBAAiB,uBAAuB,yBAAyB,yBAAyB,MAAM,iEAAiE,+JAA+J,iDAAiD,yDAAyD,iCAAiC,KAAK,yDAAyD,oBAAoB,iBAAiB,qBAAqB,kBAAkB,iBAAiB,uBAAuB,yBAAyB,yBAAyB,MAAM,uDAAuD,6IAA6I,6DAA6D,mDAAmD,8CAA8C,qEAAqE,6CAA6C,8HAA8H,mCAAmC,OAAO,OAAO,wCAAwC,oCAAoC,OAAO,KAAK,uDAAuD,oBAAoB,qBAAqB,iBAAiB,qBAAqB,kBAAkB,oBAAoB,wBAAwB,iBAAiB,uBAAuB,yBAAyB,yBAAyB,MAAM,oDAAoD,2IAA2I,4DAA4D,mDAAmD,8CAA8C,yEAAyE,kHAAkH,4FAA4F,4CAA4C,yIAAyI,mCAAmC,OAAO,OAAO,wCAAwC,oCAAoC,OAAO,KAAK,6DAA6D,qBAAqB,oBAAoB,uBAAuB,MAAM,gEAAgE,iHAAiH,gEAAgE,kDAAkD,4FAA4F,gEAAgE,oCAAoC,KAAK,oKAAoK,8GAA8G,qHAAqH,uHAAuH,gGAAgG,+EAA+E,kIAAkI,0DAA0D,kDAAkD,gEAAgE,KAAK,kGAAkG,qDAAqD,+GAA+G,8DAA8D,KAAK,+IAA+I,2GAA2G,oGAAoG,+GAA+G,0FAA0F,0HAA0H,0HAA0H,mGAAmG,+EAA+E,uIAAuI,+GAA+G,gEAAgE,uEAAuE,yGAAyG,iHAAiH,0FAA0F,+EAA+E,iKAAiK,mIAAmI,4GAA4G,+EAA+E,2DAA2D,KAAK;;AAE/jO,2DAA0D,2CAA2C,oCAAoC,yCAAyC,+CAA+C;;AAEjO,+DAA8D,8CAA8C,qCAAqC,uBAAuB,wBAAwB,6BAA6B,4BAA4B,IAAI,kLAAkL,4EAA4E,gDAAgD,4DAA4D,yGAAyG,oLAAoL,GAAG,iLAAiL,iGAAiG,GAAG;;AAE5pC,4DAA2D,uEAAuE,mEAAmE,6HAA6H,0IAA0I,+CAA+C,uEAAuE;;AAElkB,gEAA+D,uBAAuB,6BAA6B,wBAAwB,0CAA0C,+BAA+B,cAAc,oKAAoK,6IAA6I,GAAG,8KAA8K,4EAA4E,gDAAgD,4DAA4D,uIAAuI,wCAAwC,oLAAoL,wHAAwH,2MAA2M,aAAa,6KAA6K,iGAAiG,GAAG,6MAA6M,6FAA6F,0BAA0B,yGAAyG,wCAAwC,mLAAmL,mNAAmN,aAAa,ugBAAugB,kHAAkH,GAAG;;AAEpyG,qDAAoD,sCAAsC,2BAA2B,gDAAgD,4BAA4B,gFAAgF,oBAAoB,sBAAsB,SAAS,oCAAoC,yEAAyE,4PAA4P,+EAA+E,KAAK,qFAAqF,oBAAoB,qBAAqB,SAAS,kCAAkC,uEAAuE,iPAAiP,+EAA+E,KAAK,kGAAkG,oBAAoB,oBAAoB,SAAS,gDAAgD,qFAAqF,2RAA2R,+EAA+E,KAAK,gHAAgH,2GAA2G,wEAAwE,mDAAmD,+DAA+D,qBAAqB,SAAS,sFAAsF,OAAO,oKAAoK,mFAAmF,mLAAmL,uJAAuJ,oDAAoD,2GAA2G;;AAE7qG,uJAAsJ;;AAEtJ,yFAAwF,6DAA6D;;AAErJ,oHAAmH,0CAA0C;;AAE7J,gIAA+H,qEAAqE,qEAAqE;;AAEzQ,gFAA+E,gDAAgD,+BAA+B;;AAE9J,mEAAkE;;AAElE,sKAAqK,iDAAiD;;AAEtN,gFAA+E,0BAA0B;;AAEzG,iEAAgE,kFAAkF,wCAAwC;;AAE1L,8FAA6F;;AAE7F,8HAA6H,2EAA2E,2EAA2E,2EAA2E;;AAE9V,iIAAgI,sDAAsD;;AAEtL,+HAA8H,4EAA4E,4EAA4E,4EAA4E,wGAAwG,4EAA4E,4EAA4E,4EAA4E;;AAE9qB,uGAAsG,kCAAkC;;AAExI,4IAA2I,iGAAiG,iDAAiD,2DAA2D,uFAAuF,mGAAmG;;AAElhB,qFAAoF,6BAA6B,4DAA4D,oCAAoC,oCAAoC,gCAAgC,gCAAgC,oDAAoD,qDAAqD,sCAAsC,8DAA8D,sCAAsC,iCAAiC,qCAAqC,KAAK;;AAEnnB,+DAA8D,2CAA2C,GAAG,+CAA+C,+BAA+B,GAAG,wCAAwC,0CAA0C,0EAA0E,uEAAuE,sCAAsC,4CAA4C,iDAAiD,iCAAiC,yBAAyB,GAAG,8CAA8C,mCAAmC,GAAG,mGAAmG,6CAA6C,GAAG,yGAAyG,+CAA+C,GAAG,kGAAkG,iEAAiE,GAAG,qGAAqG,gEAAgE,GAAG;;AAEhzC,uGAAsG;;AAEtG,2FAA0F,wEAAwE,sDAAsD;;AAExN,iEAAgE,kFAAkF,wCAAwC;;AAE1L,8FAA6F;;AAE7F,8IAA6I,6DAA6D,8FAA8F,uDAAuD,iGAAiG,yDAAyD,kFAAkF,2EAA2E,KAAK,sFAAsF,2CAA2C,0CAA0C,wDAAwD,yFAAyF,yFAAyF,yFAAyF,yFAAyF,wCAAwC,mCAAmC,mCAAmC,iCAAiC,eAAe,KAAK,wHAAwH,uCAAuC,kCAAkC,4HAA4H,2CAA2C,sEAAsE,+CAA+C,0BAA0B,4FAA4F,iDAAiD,iDAAiD,iDAAiD,iDAAiD,w0BAAw0B,mGAAmG,iDAAiD,iDAAiD,iDAAiD,iDAAiD,0+BAA0+B,uFAAuF,mBAAmB,iBAAiB,KAAK,+CAA+C,2BAA2B,qEAAqE,0BAA0B,oDAAoD,yBAAyB,4CAA4C,2CAA2C,kCAAkC,uDAAuD,OAAO,kCAAkC,kCAAkC,6CAA6C,OAAO,kCAAkC,kCAAkC,2CAA2C,qCAAqC,OAAO,gEAAgE,KAAK,6HAA6H,0EAA0E,6CAA6C,+CAA+C,qEAAqE,+IAA+I,4zBAA4zB,2FAA2F,iBAAiB;;AAEzhN,0IAAyI,6DAA6D,4FAA4F,uDAAuD,+FAA+F,yDAAyD;;AAEjf,4FAA2F,oBAAoB,SAAS,kFAAkF,KAAK,yDAAyD,qBAAqB,SAAS,oEAAoE,KAAK,0DAA0D,sBAAsB,SAAS,sEAAsE,KAAK;;AAEnhB,yDAAwD,uBAAuB,wFAAwF,oBAAoB,oBAAoB,SAAS,gDAAgD,yNAAyN,KAAK,6DAA6D,oBAAoB,qBAAqB,SAAS,kCAAkC,+KAA+K,KAAK,gEAAgE,oBAAoB,sBAAsB,SAAS,oCAAoC,0LAA0L,KAAK,sCAAsC,GAAG;;AAE1qC,6FAA4F,iDAAiD,iDAAiD,iDAAiD;;AAE/O,6EAA4E,mCAAmC,2DAA2D,mCAAmC,oCAAoC,8CAA8C,0BAA0B,sDAAsD,yDAAyD,mDAAmD,oDAAoD,6BAA6B,wEAAwE,wEAAwE,wEAAwE,wEAAwE,2CAA2C,oBAAoB,OAAO,sDAAsD,8CAA8C,2CAA2C,oBAAoB,OAAO;;AAE5jC,wGAAuG,+BAA+B,oDAAoD,oDAAoD,oDAAoD,oDAAoD,2CAA2C;;AAEjY,gFAA+E,0CAA0C,0CAA0C,0CAA0C,0CAA0C,8DAA8D,sEAAsE;;AAE3X,qDAAoD,+EAA+E,uCAAuC,kCAAkC;;AAE5M,2FAA0F;;AAE1F,gHAA+G;;AAE/G,+GAA8G,sCAAsC,wCAAwC,uCAAuC,GAAG,0CAA0C,iCAAiC,uDAAuD,GAAG,8MAA8M,iCAAiC,qGAAqG,GAAG,iDAAiD,iCAAiC,8CAA8C,4GAA4G,GAAG;;AAEj7B,gRAA+Q;;AAE/Q,8QAA6Q,8BAA8B;;AAE3S,qSAAoS;;AAEpS,oGAAmG;;AAEnG,mGAAkG,sBAAsB;;AAExH,sFAAqF;;AAErF,wNAAuN,2EAA2E;;AAElS,6CAA4C,sBAAsB,wBAAwB,8BAA8B,kCAAkC,6FAA6F,8BAA8B,GAAG;;AAExR,+CAA8C,kCAAkC,iEAAiE,2DAA2D;;AAE5M,uEAAsE,4OAA4O,2EAA2E,4DAA4D,mOAAmO,sFAAsF,aAAa;;AAE/vB,wQAAuQ,2RAA2R;;AAEliB,iDAAgD,8BAA8B,iGAAiG,kIAAkI,GAAG;;AAEpT,uDAAsD,+IAA+I,2PAA2P,GAAG;;AAEnc,mDAAkD,sBAAsB,8BAA8B,kCAAkC,iDAAiD,kBAAkB,8DAA8D,yEAAyE,oDAAoD,GAAG;;AAEzY,mDAAkD,kCAAkC,iEAAiE,2DAA2D;;AAEhN,8CAA6C,wBAAwB,yBAAyB,0BAA0B,8BAA8B,gLAAgL,8FAA8F,cAAc,KAAK,qCAAqC,iDAAiD,qGAAqG,yDAAyD,6IAA6I;;AAExzB,6CAA4C,+BAA+B,8BAA8B,4IAA4I,oEAAoE,8DAA8D,gDAAgD,yEAAyE;;AAEhf,6CAA4C,wBAAwB,8CAA8C,2ZAA2Z,wFAAwF,iOAAiO,+CAA+C,gDAAgD,sDAAsD,kDAAkD,qFAAqF,iHAAiH,6IAA6I;;AAEh2C,6TAA4T,wgBAAwgB;;AAEp0B,+CAA8C,wBAAwB,wBAAwB,2BAA2B,iDAAiD,2mBAA2mB,wFAAwF,yGAAyG,0CAA0C,sTAAsT,+GAA+G,0GAA0G,0DAA0D,yGAAyG,4IAA4I,iHAAiH,6IAA6I;;AAE5jE,oEAAmE,iDAAiD,2XAA2X,4iBAA4iB;;AAE3hC,4DAA2D,wBAAwB,wBAAwB,0BAA0B,wBAAwB,2qBAA2qB,wFAAwF,yGAAyG,0CAA0C,0iBAA0iB,uFAAuF,6IAA6I;;AAEj0D,kEAAiE,8CAA8C,yXAAyX,iTAAiT,+QAA+Q,4FAA4F;;AAEpoC,kEAAiE,wBAAwB,0BAA0B,0BAA0B,wBAAwB,8CAA8C,qCAAqC,wCAAwC,6BAA6B,8CAA8C,swBAAswB,wFAAwF,yGAAyG,0CAA0C,qnBAAqnB,yDAAyD,6IAA6I;;AAEvpE,wEAAuE,8CAA8C,gYAAgY,iTAAiT,+QAA+Q,gEAAgE;;AAErnC,2CAA0C,uBAAuB,sIAAsI,sGAAsG,sCAAsC;;AAEnV,0CAAyC,kJAAkJ,iDAAiD,kKAAkK;;AAE9Y,0CAAyC,wBAAwB,+QAA+Q,4EAA4E,iDAAiD,0KAA0K,yDAAyD,6IAA6I;;AAE7zB,wCAAuC,sBAAsB,8KAA8K,wKAAwK,mCAAmC,gJAAgJ;;AAEtkB,2CAA0C,yKAAyK,+EAA+E,GAAG;;AAErS,oEAAmE,wHAAwH;;AAE3L;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,iCAAgC;;AAEhC;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA,0DAAyD;AACzD,0CAAyC;AACzC,0CAAyC;;AAEzC;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,eAAc,YAAY;;AAE1B;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,uBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,cAAa,+BAA+B;AAC5C,cAAa,aAAa;;AAE1B,UAAS,cAAc;AACvB,mBAAkB,mCAAmC;;AAErD,kBAAiB,cAAc;AAC/B,eAAc,cAAc;;AAE5B,aAAY,cAAc;AAC1B,iBAAgB,aAAa;AAC7B,mBAAkB,aAAa;AAC/B,sBAAqB;;AAErB,IAAG;;AAEH;;AAEA,YAAW,cAAc;AACzB,qBAAoB;;AAEpB,IAAG;;AAEH;;AAEA,eAAc,cAAc;AAC5B,wBAAuB;;AAEvB,IAAG;;AAEH;;AAEA,kBAAiB;;AAEjB,IAAG;;AAEH;;AAEA,cAAa,cAAc;AAC3B,gBAAe;;AAEf,IAAG;;AAEH;;AAEA,gBAAe,cAAc;AAC7B,kBAAiB;;AAEjB,IAAG;;AAEH;;AAEA,sBAAqB,cAAc;AACnC,wBAAuB,WAAW;AAClC,uBAAsB;;AAEtB,IAAG;;AAEH;;AAEA,mBAAkB;;AAElB,IAAG;;AAEH;;AAEA,mBAAkB;;AAElB,IAAG;;AAEH;;AAEA,iBAAgB,iBAAiB;AACjC,cAAa,WAAW;AACxB,aAAY,cAAc;AAC1B,eAAc;;AAEd,IAAG;;AAEH;;AAEA,wBAAuB,YAAY;;AAEnC,wBAAuB;AACvB,kBAAiB;AACjB,cAAa;;AAEb,eAAc;AACd,mBAAkB;AAClB,qBAAoB;AACpB;AACA,KAAI,EAAE;;AAEN,2BAA0B,YAAY;AACtC,8BAA6B,YAAY;;AAEzC,iBAAgB;AAChB,cAAa;AACb,iBAAgB;AAChB,kBAAiB;AACjB,iBAAgB;AAChB,gBAAe;AACf,oBAAmB;AACnB,cAAa;;AAEb,eAAc;AACd,mBAAkB;AAClB,qBAAoB;AACpB;AACA,KAAI,EAAE;;AAEN,oBAAmB,YAAY;AAC/B,uBAAsB,YAAY;;AAElC,kBAAiB;AACjB,cAAa;AACb,iBAAgB;AAChB,cAAa;AACb,iBAAgB;;AAEhB,eAAc;AACd,mBAAkB;AAClB,qBAAoB;AACpB;AACA,KAAI,EAAE;;AAEN,qBAAoB,YAAY;AAChC,wBAAuB,YAAY;;AAEnC,uBAAsB;AACtB,kBAAiB;AACjB,iBAAgB;AAChB;AACA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA,cAAa,+BAA+B;AAC5C,cAAa,aAAa;AAC1B,WAAU,aAAa;AACvB,YAAW,aAAa;AACxB,UAAS,cAAc;AACvB,mBAAkB;;AAElB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kBAAiB;AACjB;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kBAAiB,+BAA+B;AAChD,kBAAiB,+BAA+B;AAChD,kBAAiB;AACjB;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,kBAAiB,+BAA+B;AAChD,kBAAiB,aAAa;AAC9B,kBAAiB,WAAW;AAC5B,yBAAwB,WAAW;AACnC;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA,kBAAiB,WAAW;AAC5B,kBAAiB,WAAW;AAC5B,kBAAiB;AACjB;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,gBAAe;;AAEf,KAAI;;AAEJ;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA,aAAY,cAAc;AAC1B,aAAY,aAAa;AACzB,eAAc;AACd,KAAI;;AAEJ;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA,iBAAgB,cAAc;AAC9B,aAAY;AACZ,KAAI;;AAEJ;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,gBAAe;;AAEf,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,iBAAgB,WAAW;AAC3B,0BAAyB;AACzB;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,wCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mCAAkC;;AAElC,mCAAkC;AAClC,0BAAyB;AACzB,8BAA6B;;AAE7B,sCAAqC;;AAErC,+BAA8B;AAC9B,yBAAwB;;AAExB,wBAAuB;AACvB,iCAAgC;;AAEhC,oBAAmB;;AAEnB,iBAAgB;;AAEhB,4BAA2B;;AAE3B,gCAA+B;;AAE/B,uEAAsE;AACtE,mEAAkE;AAClE,mEAAkE;AAClE,mEAAkE;AAClE,mEAAkE;AAClE,mEAAkE;AAClE,mEAAkE;AAClE,mEAAkE;AAClE,mEAAkE;;AAElE,iDAAgD;AAChD,iDAAgD;AAChD,iDAAgD;AAChD,iDAAgD;;AAEhD,6EAA4E;AAC5E,6EAA4E;;AAE5E,SAAQ;;AAER,4FAA2F;;AAE3F,QAAO;;AAEP;;AAEA;;AAEA,mCAAkC;;AAElC,6BAA4B;AAC5B,6BAA4B;AAC5B,0BAAyB;;AAEzB,wBAAuB;AACvB,iCAAgC;;AAEhC,oBAAmB;;AAEnB;;AAEA,gCAA+B;;AAE/B,mDAAkD;;AAElD;;AAEA,SAAQ,8BAA8B;;AAEtC,8CAA6C;;AAE7C;;AAEA,SAAQ,OAAO;;AAEf,8CAA6C;AAC7C,4CAA2C;AAC3C,gCAA+B;AAC/B,mCAAkC;;AAElC,SAAQ;;AAER,QAAO;;AAEP;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,uCAAsC,OAAO;;AAE7C;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;AACA;AACA;;;AAGA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;AACA;;AAEA,oDAAmD,QAAQ;;AAE3D;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,kEAAiE;;AAEjE;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;;;AAGA;;AAEA,wCAAuC,OAAO;;AAE9C;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,wCAAuC,OAAO;;AAE9C;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,sDAAqD;;AAErD,mCAAkC;AAClC,oCAAmC;AACnC,6BAA4B;AAC5B,yBAAwB;AACxB,4BAA2B;AAC3B,2BAA0B;;AAE1B,8BAA6B;AAC7B,wBAAuB;;AAEvB,uBAAsB;;AAEtB,mBAAkB;;AAElB,qCAAoC;;AAEpC,+CAA8C;;AAE9C,4BAA2B;AAC3B,qGAAoG;AACpG,qGAAoG;;AAEpG,0BAAyB;;AAEzB,oEAAmE;AACnE,2CAA0C;AAC1C,wDAAuD;;AAEvD,mCAAkC;;AAElC,OAAM;;AAEN;;AAEA;;AAEA,sDAAqD;;AAErD,yBAAwB;AACxB,4BAA2B;AAC3B,4BAA2B;;AAE3B,0BAAyB;AACzB,4BAA2B;AAC3B,+BAA8B;AAC9B,4BAA2B;AAC3B,2BAA0B;AAC1B,8BAA6B;;AAE7B,uBAAsB;;AAEtB,mBAAkB;;AAElB,4CAA2C;;AAE3C,4CAA2C;;AAE3C,uEAAsE;;AAEtE,2BAA0B;;AAE1B,sDAAqD;AACrD,8BAA6B;;AAE7B,6BAA4B;;AAE5B,0DAAyD;;AAEzD,SAAQ,OAAO;;AAEf,qCAAoC;AACpC,8EAA6E;AAC7E,wDAAuD;;AAEvD,SAAQ;;AAER,wFAAuF;;AAEvF,QAAO;;AAEP,OAAM;;AAEN;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,uCAAsC,2BAA2B;;AAEjE;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,gCAA+B;AAC/B,gCAA+B;;AAE/B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,yBAAwB;;AAExB;AACA;AACA;;AAEA;AACA;;AAEA,qBAAoB;;AAEpB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA,kBAAiB;AACjB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,2CAA0C;;AAE1C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,qBAAoB,SAAS;AAC7B;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,yBAAwB,iBAAiB;;AAEzC,IAAG;;AAEH;;AAEA,yBAAwB,kBAAkB;;AAE1C;;AAEA;;AAEA;;AAEA;AACA,8BAA6B,kBAAkB;;AAE/C;AACA;AACA;AACA;AACA,gBAAe,oBAAoB;AACnC,iBAAgB,gBAAgB,aAAa,iBAAiB,YAAY,EAAE;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,qCAAoC,6EAA6E,GAAG;AACpH,uCAAsC,8CAA8C,GAAG;;AAEvF;;AAEA;AACA;;AAEA,oBAAmB;AACnB,uBAAsB;AACtB,yBAAwB;;AAExB,yBAAwB;AACxB,6BAA4B;AAC5B,6BAA4B;;AAE5B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sCAAqC,OAAO;;AAE5C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,wCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,8CAA6C,QAAQ;;AAErD;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;;AAEA;;AAEA,iDAAgD,QAAQ;;AAExD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,kFAAiF;AACjF,kFAAiF;AACjF,kFAAiF;AACjF,kFAAiF;AACjF,kFAAiF;AACjF,kFAAiF;AACjF,kFAAiF;AACjF,kFAAiF;;AAEjF;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,yCAAwC,QAAQ;;AAEhD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,kBAAiB,eAAe;AAChC,kBAAiB,eAAe;AAChC,kBAAiB,eAAe;;AAEhC;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,iCAAgC,YAAY;;AAE5C;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,iCAAgC,YAAY;;AAE5C;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,iBAAgB,cAAc;AAC9B,iBAAgB,cAAc;AAC9B,iBAAgB,cAAc;;AAE9B;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,iBAAgB,iBAAiB;AACjC,iBAAgB,iBAAiB;AACjC,iBAAgB,iBAAiB;;AAEjC;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,mBAAkB,OAAO;;AAEzB;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA,+CAA8C;;AAE9C;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AA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AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;A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EA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AA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B;AACpB;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,8BAA8B;;AAEjD;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA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;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,oEAAmE;;AAEnE;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA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A;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,eAAc,sBAAsB;;AAEpC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,gBAAe,qBAAqB;;AAEpC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,sBAAsB;;AAEpC,gBAAe,qBAAqB;;AAEpC;AACA;AACA;AACA;AACA;;AAEA;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,eAAc,qBAAqB;;AAEnC,gBAAe,sBAAsB;;AAErC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,qBAAqB;;AAEnC,gBAAe,sBAAsB;;AAErC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,+BAA8B,OAAO;;AAErC;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,kBAAiB;AACjB,kBAAiB;AACjB,kBAAiB;;AAEjB,iBAAgB,OAAO;;AAEvB;AACA;;AAEA;AACA;AACA;;AAEA,oBAAmB;AACnB,oBAAmB;AACnB,oBAAmB;;AAEnB;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,kBAAiB,OAAO;;AAExB,MAAK;;AAEL,kBAAiB,OAAO;;AAExB;;AAEA;;AAEA;;AAEA,wBAAuB;;AAEvB,sBAAqB,QAAQ;;AAE7B;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,YAAW,yBAAyB;AACpC,gBAAe,uBAAuB;AACtC,gBAAe,uBAAuB;;AAEtC;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;;AAGA;;AAEA;;AAEA,8BAA6B,QAAQ;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,OAAM;;AAEN;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAe;AACf,+CAA8C;;AAE9C,MAAK;;AAEL;AACA;AACA;;AAEA;AACA,4DAA2D;AAC3D,4DAA2D;AAC3D;AACA;;AAEA;AACA,sDAAqD;AACrD,4BAA2B;;AAE3B;AACA;AACA;;AAEA,wFAAuF;AACvF;;AAEA;AACA;AACA;;AAEA,wFAAuF;AACvF;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,4BAA2B;AAC3B,4BAA2B;;AAE3B,QAAO;;AAEP,4BAA2B;AAC3B,4BAA2B;;AAE3B;AACA;;AAEA,4BAA2B;AAC3B,4BAA2B;;AAE3B,QAAO;;AAEP,4BAA2B;AAC3B,4BAA2B;;AAE3B;;AAEA,OAAM;;AAEN;AACA;;AAEA,4BAA2B;AAC3B,4BAA2B;;AAE3B,QAAO;;AAEP,4BAA2B;AAC3B,4BAA2B;;AAE3B;AACA;;AAEA,4BAA2B;AAC3B,4BAA2B;;AAE3B,QAAO;;AAEP,4BAA2B;AAC3B,4BAA2B;;AAE3B;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,kCAAiC,aAAa;AAC9C;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;;AAGA;;AAEA,kCAAiC;AACjC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,qBAAoB,qBAAqB;;AAEzC,0BAAyB;AACzB;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,sBAAqB,2BAA2B;;AAEhD;AACA,sBAAqB,uBAAuB;;AAE5C,2BAA0B;AAC1B;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,wCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,uCAAsC,2BAA2B;;AAEjE;AACA;;AAEA;AACA,uBAAsB,uBAAuB;;AAE7C;;AAEA;AACA;AACA;;AAEA;AACA,yBAAwB,kBAAkB;;AAE1C;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,oCAAmC;;AAEnC,oCAAmC;;AAEnC;AACA,mCAAkC;;AAElC;;AAEA;;AAEA,kBAAiB;;AAEjB;;;AAGA;AACA;AACA;;AAEA;;AAEA;;AAEA,uCAAsC,QAAQ;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA,uCAAsC,QAAQ;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,uEAAsE;AACtE;;AAEA;;AAEA,uCAAsC,QAAQ;;AAE9C;;AAEA,iBAAgB,OAAO;;AAEvB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB,QAAQ;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,0FAAyF;AACzF,4FAA2F;AAC3F;;AAEA,uFAAsF;;AAEtF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,yBAAwB;;AAExB;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,oBAAmB;AACnB;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mCAAkC,QAAQ;;AAE1C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB;;AAEnB;;;AAGA;;AAEA;;AAEA,0BAAyB;;AAEzB,kCAAiC,QAAQ;;AAEzC;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;;AAGA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,4CAA2C;;AAE3C;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,8BAA6B;AAC7B;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA,+DAA8D,QAAQ;;AAEtE;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,kCAAiC,QAAQ;;AAEzC;;AAEA;;AAEA,0DAAyD,QAAQ;;AAEjE;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA,eAAc,mBAAmB;;AAEjC,8BAA6B,OAAO;;AAEpC;AACA;AACA;;AAEA;;AAEA,qCAAoC,QAAQ;;AAE5C;;AAEA;;AAEA;;AAEA;;AAEA,mCAAkC,QAAQ;;AAE1C;AACA;;AAEA,oCAAmC,QAAQ;;AAE3C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,UAAU;;AAExB;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,eAAc,YAAY;;AAE1B,gBAAe,UAAU;;AAEzB;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA,iBAAgB,oBAAoB;AACpC,+BAA8B,QAAQ;;AAEtC;AACA;AACA;;AAEA;;AAEA,qCAAoC,QAAQ;;AAE5C;AACA;;AAEA;;AAEA;;AAEA,mCAAkC,QAAQ;;AAE1C;AACA;;AAEA,oCAAmC,QAAQ;;AAE3C;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA,mBAAkB;AAClB;;AAEA;;AAEA,iBAAgB,UAAU;;AAE1B;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,iBAAgB,UAAU;;AAE1B;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,iBAAgB,UAAU;;AAE1B;AACA;;AAEA;;AAEA;;AAEA,iBAAgB,UAAU;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,mCAAkC,QAAQ;;AAE1C;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,iBAAgB,QAAQ;;AAExB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,mBAAkB,qBAAqB;;AAEvC;;AAEA;;AAEA,oBAAmB,oBAAoB;;AAEvC;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB,oBAAoB;;AAEtC,oBAAmB,mBAAmB;;AAEtC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,eAAc,kBAAkB;;AAEhC,gBAAe,oBAAoB;;AAEnC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,eAAc,iBAAiB;;AAE/B;;AAEA,gBAAe,mBAAmB;;AAElC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,eAAc,eAAe;;AAE7B;;AAEA;AACA;;AAEA,gBAAe,4BAA4B;;AAE3C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,cAAc;;AAE5B,gBAAe,2BAA2B;;AAE1C;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,sBAAqB,mBAAmB;;AAExC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,sCAAqC,OAAO;;AAE5C;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,kCAAiC,OAAO;;AAExC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,iCAAgC,OAAO;;AAEvC;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,eAAc,UAAU;;AAExB;;AAEA;;AAEA;;AAEA,eAAc,UAAU;;AAExB;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,qCAAoC,OAAO;;AAE3C;;AAEA,oBAAmB,OAAO;;AAE1B;AACA;AACA;;AAEA;;AAEA;;AAEA,qBAAoB;;AAEpB,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;;AAEA;AACA;;AAEA,iBAAgB,qBAAqB;;AAErC;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,oBAAoB;;AAEnC,iBAAgB,oBAAoB;;AAEpC;AACA;AACA;AACA;AACA;;AAEA;AACA,sCAAqC;AACrC,sCAAqC;AACrC,sCAAqC;;AAErC;AACA,sCAAqC;AACrC,sCAAqC;AACrC,sCAAqC;;AAErC;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,gBAAe,qBAAqB;;AAEpC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,oBAAoB;;AAEnC;AACA;;AAEA;;AAEA;AACA,qCAAoC;AACpC,yCAAwC;AACxC,qCAAoC;;AAEpC,MAAK;;AAEL;AACA,yCAAwC;AACxC,qCAAoC;AACpC,qCAAoC;;AAEpC;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,mCAAkC,eAAe;;AAEjD;;AAEA;AACA;;AAEA,yBAAwB;;AAExB;AACA;;AAEA;;AAEA;;AAEA,mBAAkB,eAAe;;AAEjC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA,0CAAyC,OAAO;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,2BAA2B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,2BAA0B;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;;AAErC;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA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ACA;AACA,0FAAyF,4CAA4C;AACrI;;AAEA;AACA;AACA,8FAA6F,4CAA4C;AACzI;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AA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MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,QAAQ;AAC7B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,qBAAoB;AACpB;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,gBAAgB;AAC7B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,gCAA+B;AAC/B,QAAO;AACP;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;A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AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA,cAAa,QAAQ;AACrB,cAAa,YAAY;AACzB,cAAa,QAAQ;AACrB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;AACA;;AAEA,MAAK;;AAEL,sBAAqB;;AAErB;;AAEA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;;AAGA,QAAO;;;AAGP;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;AACA;;AAEA;;AAEA,4CAA2C,mBAAmB;AAC9D,4DAA2D,kBAAkB,EAAE;AAC/E,sDAAqD,mBAAmB;AACxE,uDAAsD,mBAAmB;AACzE;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,gCAAgC;AACrD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,sBAAqB,YAAY;AACjC,qBAAoB,MAAM;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAgC;;AAEhC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,yCAAwC;;AAExC;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAa;AACb;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,UAAU;AAC7B,qBAAoB,MAAM;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA,sBAAqB,YAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,YAAW;;AAEX;AACA;AACA,YAAW;;AAEX;AACA;AACA;;;AAGA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,QAAO;;AAEP;AACA;AACA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AEA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;AAGL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,8BAA6B;AAC7B;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,2BAA0B;AAC1B;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,yGAAwG;AACxG,MAAK;AACL;;AAEA;AACA;AACA,8JAA6J;AAC7J,2JAA0J;AAC1J,sJAAqJ;AACrJ,uJAAsJ;AACtJ,mJAAkJ;AAClJ;;;AAGA;;AAEA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;AAGL;AACA;;AAEA;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;;AAEA;;;;AAIA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA,mB;;;;;;AC3kHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,W;;AAEA,cAAa;;AAEb;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA,6CAA4C,QAAQ;AACpD;AACA;AACA;AACA;AACA,MAAK;;AAEL;;;AAGA,kD;;AAEA;;AAEA,QAAO,0CAA0C;;AAEjD,0CAAyC,SAAS;AAClD;AACA;;AAEA,QAAO;;AAEP;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAC;;AAED;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA,oDAAmD,EAAE;AACrD;;AAEA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA,mB;;;;;;AClvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,0BAAyB;AACzB,gCAA+B;;AAE/B;AACA;AACA,qCAAoC;AACpC,mCAAkC;;AAElC;AACA;AACA;AACA;;AAEA,uDAAsD;AACtD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,0BAAyB;;AAEzB;AACA;AACA;AACA,8BAA6B;;AAE7B;AACA;;AAEA;AACA,gBAAe;;AAEf;AACA,wBAAuB;;AAEvB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AA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","file":"./bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap c90c41d011d962588db1","\nconst THREE = require('three'); // older modules are imported like this. You shouldn't have to worry about this much\nconst OBJLoader = require('three-obj-loader')(THREE)\nimport Grid from './grid.js'\nimport Agent from './agent.js'\nimport Marker from './marker.js'\nimport Crowd from './crowd.js'\nimport RenderEngine from './renderengine.js'\nimport Framework from './framework'\n\nvar crowd, renderengine;\nvar time = 0.0;\n// called after the scene loads\nfunction onLoad(framework) {\n var scene = framework.scene;\n var camera = framework.camera;\n var renderer = framework.renderer;\n var gui = framework.gui;\n var stats = framework.stats;\n\n // initialize a simple box and material\n var directionalLight = new THREE.DirectionalLight( 0xffffff, 1.25 );\n directionalLight.color.setHSL(0.1, 1, 0.95);\n directionalLight.position.set(1, 3, 2);\n directionalLight.position.multiplyScalar(10);\n scene.add(directionalLight);\n\n var ambientLight = new THREE.AmbientLight(0x404040);\n scene.add(ambientLight);\n\n // set camera position\n camera.position.set(50, 50, 100);\n camera.lookAt(new THREE.Vector3(0,0,0));\n\n gui.add(camera, 'fov', 0, 180).onChange(function(newVal) {\n camera.updateProjectionMatrix();\n });\n\n renderengine = new RenderEngine(scene);\n crowd = new Crowd(renderengine);\n}\n\n// called on frame updates\nfunction onUpdate(framework) {\n time += 1.0;\n if (crowd) {\n crowd.update(time);\n }\n}\n\n// when the scene is done initializing, it will call onLoad, then on frame updates, call onUpdate\nFramework.init(onLoad, onUpdate);\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.js","const THREE = require('three');\n\n// GRID IS ASSUMED TO BE A SQUARE\nexport default class Grid {\n\tconstructor(cell_size, plane_size) {\n\t\tthis.plane_size = plane_size;\n\t\tthis.grid_cell_size = cell_size;\n\t\tthis.grid_len = plane_size / cell_size;\n\t\tthis.grid = [];\n\t\twhile(this.grid.push(new Array(this.grid_len)) < this.grid_len);\n\t\tfor (var i = 0; i < this.grid_len; i++) {\n\t\t\tfor (var j = 0; j < this.grid_len; j++) {\n\t\t\t\tthis.grid[i][j] = new Set();\n\t\t\t}\n\t\t}\n\t}\n\n\t// find_nearest_grid will be used by marker to ultimately find nearest 4 grid\n\tfind_nearest_grid(ws_x, ws_z) {\n\t\tvar tgs = this.ws_to_tgs(ws_x, ws_z);\n\t\tvar gs_z = Math.round(tgs.z / this.grid_cell_size);\n\t\tvar gs_x = Math.round(tgs.x / this.grid_cell_size);\n\t\tif (gs_z === 10.0) {\n\t\t\tgs_z = 9.0;\n\t\t}\n\t\tif (gs_x === 10.0) {\n\t\t\tgs_x = 9.0;\n\t\t}\n\t\treturn {z: gs_z, x: gs_x};\n\t}\n\n\t// find_absolute_grid will be used by agent to demarcate it's exact grid location\n\tfind_absolute_grid(ws_x, ws_z) {\n\t\tvar tgs = this.ws_to_tgs(ws_x, ws_z);\n\t\t// console.log('tgs:', tgs);\n\t\tvar gs_z = Math.floor(tgs.z / this.grid_cell_size);\n\t\tvar gs_x = Math.floor(tgs.x / this.grid_cell_size);\n\t\treturn {z: gs_z, x: gs_x};\n\t}\n\n\t// convert from world space to uniform grid space\n\tws_to_tgs(ws_x, ws_z) {\n\t\t// perform translation\n\t\tvar tgs_x = ws_x + 50.0;\n\t\tvar tgs_z = ws_z + 50.0;\n\t\treturn {x: tgs_x, z: tgs_z};\n\t}\n}\n\n\n// WEBPACK FOOTER //\n// ./src/grid.js","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.THREE = global.THREE || {})));\n}(this, (function (exports) { 'use strict';\n\n\t// Polyfills\n\n\tif ( Number.EPSILON === undefined ) {\n\n\t\tNumber.EPSILON = Math.pow( 2, - 52 );\n\n\t}\n\n\t//\n\n\tif ( Math.sign === undefined ) {\n\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign\n\n\t\tMath.sign = function ( x ) {\n\n\t\t\treturn ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;\n\n\t\t};\n\n\t}\n\n\tif ( Function.prototype.name === undefined ) {\n\n\t\t// Missing in IE9-11.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\n\n\t\tObject.defineProperty( Function.prototype, 'name', {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.toString().match( /^\\s*function\\s*(\\S*)\\s*\\(/ )[ 1 ];\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tif ( Object.assign === undefined ) {\n\n\t\t// Missing in IE.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n\n\t\t( function () {\n\n\t\t\tObject.assign = function ( target ) {\n\n\t\t\t\t'use strict';\n\n\t\t\t\tif ( target === undefined || target === null ) {\n\n\t\t\t\t\tthrow new TypeError( 'Cannot convert undefined or null to object' );\n\n\t\t\t\t}\n\n\t\t\t\tvar output = Object( target );\n\n\t\t\t\tfor ( var index = 1; index < arguments.length; index ++ ) {\n\n\t\t\t\t\tvar source = arguments[ index ];\n\n\t\t\t\t\tif ( source !== undefined && source !== null ) {\n\n\t\t\t\t\t\tfor ( var nextKey in source ) {\n\n\t\t\t\t\t\t\tif ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {\n\n\t\t\t\t\t\t\t\toutput[ nextKey ] = source[ nextKey ];\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\treturn output;\n\n\t\t\t};\n\n\t\t} )();\n\n\t}\n\n\t/**\n\t * https://github.com/mrdoob/eventdispatcher.js/\n\t */\n\n\tfunction EventDispatcher() {}\n\n\tObject.assign( EventDispatcher.prototype, {\n\n\t\taddEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\t\tlisteners[ type ] = [];\n\n\t\t\t}\n\n\t\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\t\tlisteners[ type ].push( listener );\n\n\t\t\t}\n\n\t\t},\n\n\t\thasEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return false;\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\tif ( listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tremoveEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tvar index = listenerArray.indexOf( listener );\n\n\t\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tdispatchEvent: function ( event ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ event.type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tevent.target = this;\n\n\t\t\t\tvar array = [], i = 0;\n\t\t\t\tvar length = listenerArray.length;\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ] = listenerArray[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\tvar REVISION = '82';\n\tvar MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };\n\tvar CullFaceNone = 0;\n\tvar CullFaceBack = 1;\n\tvar CullFaceFront = 2;\n\tvar CullFaceFrontBack = 3;\n\tvar FrontFaceDirectionCW = 0;\n\tvar FrontFaceDirectionCCW = 1;\n\tvar BasicShadowMap = 0;\n\tvar PCFShadowMap = 1;\n\tvar PCFSoftShadowMap = 2;\n\tvar FrontSide = 0;\n\tvar BackSide = 1;\n\tvar DoubleSide = 2;\n\tvar FlatShading = 1;\n\tvar SmoothShading = 2;\n\tvar NoColors = 0;\n\tvar FaceColors = 1;\n\tvar VertexColors = 2;\n\tvar NoBlending = 0;\n\tvar NormalBlending = 1;\n\tvar AdditiveBlending = 2;\n\tvar SubtractiveBlending = 3;\n\tvar MultiplyBlending = 4;\n\tvar CustomBlending = 5;\n\tvar BlendingMode = {\n\t\tNoBlending: NoBlending,\n\t\tNormalBlending: NormalBlending,\n\t\tAdditiveBlending: AdditiveBlending,\n\t\tSubtractiveBlending: SubtractiveBlending,\n\t\tMultiplyBlending: MultiplyBlending,\n\t\tCustomBlending: CustomBlending\n\t};\n\tvar AddEquation = 100;\n\tvar SubtractEquation = 101;\n\tvar ReverseSubtractEquation = 102;\n\tvar MinEquation = 103;\n\tvar MaxEquation = 104;\n\tvar ZeroFactor = 200;\n\tvar OneFactor = 201;\n\tvar SrcColorFactor = 202;\n\tvar OneMinusSrcColorFactor = 203;\n\tvar SrcAlphaFactor = 204;\n\tvar OneMinusSrcAlphaFactor = 205;\n\tvar DstAlphaFactor = 206;\n\tvar OneMinusDstAlphaFactor = 207;\n\tvar DstColorFactor = 208;\n\tvar OneMinusDstColorFactor = 209;\n\tvar SrcAlphaSaturateFactor = 210;\n\tvar NeverDepth = 0;\n\tvar AlwaysDepth = 1;\n\tvar LessDepth = 2;\n\tvar LessEqualDepth = 3;\n\tvar EqualDepth = 4;\n\tvar GreaterEqualDepth = 5;\n\tvar GreaterDepth = 6;\n\tvar NotEqualDepth = 7;\n\tvar MultiplyOperation = 0;\n\tvar MixOperation = 1;\n\tvar AddOperation = 2;\n\tvar NoToneMapping = 0;\n\tvar LinearToneMapping = 1;\n\tvar ReinhardToneMapping = 2;\n\tvar Uncharted2ToneMapping = 3;\n\tvar CineonToneMapping = 4;\n\tvar UVMapping = 300;\n\tvar CubeReflectionMapping = 301;\n\tvar CubeRefractionMapping = 302;\n\tvar EquirectangularReflectionMapping = 303;\n\tvar EquirectangularRefractionMapping = 304;\n\tvar SphericalReflectionMapping = 305;\n\tvar CubeUVReflectionMapping = 306;\n\tvar CubeUVRefractionMapping = 307;\n\tvar TextureMapping = {\n\t\tUVMapping: UVMapping,\n\t\tCubeReflectionMapping: CubeReflectionMapping,\n\t\tCubeRefractionMapping: CubeRefractionMapping,\n\t\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\t\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\t\tSphericalReflectionMapping: SphericalReflectionMapping,\n\t\tCubeUVReflectionMapping: CubeUVReflectionMapping,\n\t\tCubeUVRefractionMapping: CubeUVRefractionMapping\n\t};\n\tvar RepeatWrapping = 1000;\n\tvar ClampToEdgeWrapping = 1001;\n\tvar MirroredRepeatWrapping = 1002;\n\tvar TextureWrapping = {\n\t\tRepeatWrapping: RepeatWrapping,\n\t\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\t\tMirroredRepeatWrapping: MirroredRepeatWrapping\n\t};\n\tvar NearestFilter = 1003;\n\tvar NearestMipMapNearestFilter = 1004;\n\tvar NearestMipMapLinearFilter = 1005;\n\tvar LinearFilter = 1006;\n\tvar LinearMipMapNearestFilter = 1007;\n\tvar LinearMipMapLinearFilter = 1008;\n\tvar TextureFilter = {\n\t\tNearestFilter: NearestFilter,\n\t\tNearestMipMapNearestFilter: NearestMipMapNearestFilter,\n\t\tNearestMipMapLinearFilter: NearestMipMapLinearFilter,\n\t\tLinearFilter: LinearFilter,\n\t\tLinearMipMapNearestFilter: LinearMipMapNearestFilter,\n\t\tLinearMipMapLinearFilter: LinearMipMapLinearFilter\n\t};\n\tvar UnsignedByteType = 1009;\n\tvar ByteType = 1010;\n\tvar ShortType = 1011;\n\tvar UnsignedShortType = 1012;\n\tvar IntType = 1013;\n\tvar UnsignedIntType = 1014;\n\tvar FloatType = 1015;\n\tvar HalfFloatType = 1016;\n\tvar UnsignedShort4444Type = 1017;\n\tvar UnsignedShort5551Type = 1018;\n\tvar UnsignedShort565Type = 1019;\n\tvar UnsignedInt248Type = 1020;\n\tvar AlphaFormat = 1021;\n\tvar RGBFormat = 1022;\n\tvar RGBAFormat = 1023;\n\tvar LuminanceFormat = 1024;\n\tvar LuminanceAlphaFormat = 1025;\n\tvar RGBEFormat = RGBAFormat;\n\tvar DepthFormat = 1026;\n\tvar DepthStencilFormat = 1027;\n\tvar RGB_S3TC_DXT1_Format = 2001;\n\tvar RGBA_S3TC_DXT1_Format = 2002;\n\tvar RGBA_S3TC_DXT3_Format = 2003;\n\tvar RGBA_S3TC_DXT5_Format = 2004;\n\tvar RGB_PVRTC_4BPPV1_Format = 2100;\n\tvar RGB_PVRTC_2BPPV1_Format = 2101;\n\tvar RGBA_PVRTC_4BPPV1_Format = 2102;\n\tvar RGBA_PVRTC_2BPPV1_Format = 2103;\n\tvar RGB_ETC1_Format = 2151;\n\tvar LoopOnce = 2200;\n\tvar LoopRepeat = 2201;\n\tvar LoopPingPong = 2202;\n\tvar InterpolateDiscrete = 2300;\n\tvar InterpolateLinear = 2301;\n\tvar InterpolateSmooth = 2302;\n\tvar ZeroCurvatureEnding = 2400;\n\tvar ZeroSlopeEnding = 2401;\n\tvar WrapAroundEnding = 2402;\n\tvar TrianglesDrawMode = 0;\n\tvar TriangleStripDrawMode = 1;\n\tvar TriangleFanDrawMode = 2;\n\tvar LinearEncoding = 3000;\n\tvar sRGBEncoding = 3001;\n\tvar GammaEncoding = 3007;\n\tvar RGBEEncoding = 3002;\n\tvar LogLuvEncoding = 3003;\n\tvar RGBM7Encoding = 3004;\n\tvar RGBM16Encoding = 3005;\n\tvar RGBDEncoding = 3006;\n\tvar BasicDepthPacking = 3200;\n\tvar RGBADepthPacking = 3201;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar _Math = {\n\n\t\tDEG2RAD: Math.PI / 180,\n\t\tRAD2DEG: 180 / Math.PI,\n\n\t\tgenerateUUID: function () {\n\n\t\t\t// http://www.broofa.com/Tools/Math.uuid.htm\n\n\t\t\tvar chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' );\n\t\t\tvar uuid = new Array( 36 );\n\t\t\tvar rnd = 0, r;\n\n\t\t\treturn function generateUUID() {\n\n\t\t\t\tfor ( var i = 0; i < 36; i ++ ) {\n\n\t\t\t\t\tif ( i === 8 || i === 13 || i === 18 || i === 23 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '-';\n\n\t\t\t\t\t} else if ( i === 14 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '4';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0;\n\t\t\t\t\t\tr = rnd & 0xf;\n\t\t\t\t\t\trnd = rnd >> 4;\n\t\t\t\t\t\tuuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn uuid.join( '' );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclamp: function ( value, min, max ) {\n\n\t\t\treturn Math.max( min, Math.min( max, value ) );\n\n\t\t},\n\n\t\t// compute euclidian modulo of m % n\n\t\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\t\teuclideanModulo: function ( n, m ) {\n\n\t\t\treturn ( ( n % m ) + m ) % m;\n\n\t\t},\n\n\t\t// Linear mapping from range to range \n\n\t\tmapLinear: function ( x, a1, a2, b1, b2 ) {\n\n\t\t\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n\t\t},\n\n\t\t// https://en.wikipedia.org/wiki/Linear_interpolation\n\n\t\tlerp: function ( x, y, t ) {\n\n\t\t\treturn ( 1 - t ) * x + t * y;\n\n\t\t},\n\n\t\t// http://en.wikipedia.org/wiki/Smoothstep\n\n\t\tsmoothstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * ( 3 - 2 * x );\n\n\t\t},\n\n\t\tsmootherstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n\t\t},\n\n\t\trandom16: function () {\n\n\t\t\tconsole.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' );\n\t\t\treturn Math.random();\n\n\t\t},\n\n\t\t// Random integer from interval\n\n\t\trandInt: function ( low, high ) {\n\n\t\t\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n\t\t},\n\n\t\t// Random float from interval\n\n\t\trandFloat: function ( low, high ) {\n\n\t\t\treturn low + Math.random() * ( high - low );\n\n\t\t},\n\n\t\t// Random float from <-range/2, range/2> interval\n\n\t\trandFloatSpread: function ( range ) {\n\n\t\t\treturn range * ( 0.5 - Math.random() );\n\n\t\t},\n\n\t\tdegToRad: function ( degrees ) {\n\n\t\t\treturn degrees * _Math.DEG2RAD;\n\n\t\t},\n\n\t\tradToDeg: function ( radians ) {\n\n\t\t\treturn radians * _Math.RAD2DEG;\n\n\t\t},\n\n\t\tisPowerOfTwo: function ( value ) {\n\n\t\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t\t},\n\n\t\tnearestPowerOfTwo: function ( value ) {\n\n\t\t\treturn Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) );\n\n\t\t},\n\n\t\tnextPowerOfTwo: function ( value ) {\n\n\t\t\tvalue --;\n\t\t\tvalue |= value >> 1;\n\t\t\tvalue |= value >> 2;\n\t\t\tvalue |= value >> 4;\n\t\t\tvalue |= value >> 8;\n\t\t\tvalue |= value >> 16;\n\t\t\tvalue ++;\n\n\t\t\treturn value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author egraether / http://egraether.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tfunction Vector2( x, y ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\n\t}\n\n\tVector2.prototype = {\n\n\t\tconstructor: Vector2,\n\n\t\tisVector2: true,\n\n\t\tget width() {\n\n\t\t\treturn this.x;\n\n\t\t},\n\n\t\tset width( value ) {\n\n\t\t\tthis.x = value;\n\n\t\t},\n\n\t\tget height() {\n\n\t\t\treturn this.y;\n\n\t\t},\n\n\t\tset height( value ) {\n\n\t\t\tthis.y = value;\n\n\t\t},\n\n\t\t//\n\n\t\tset: function ( x, y ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\t\t\t\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v ) {\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector2();\n\t\t\t\t\tmax = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t\t},\n\n\t\tlengthManhattan: function() {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tangle: function () {\n\n\t\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\t\tvar angle = Math.atan2( this.y, this.x );\n\n\t\t\tif ( angle < 0 ) angle += 2 * Math.PI;\n\n\t\t\treturn angle;\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y;\n\t\t\treturn dx * dx + dy * dy;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tindex = index * attribute.itemSize + offset;\n\n\t\t\tthis.x = attribute.array[ index ];\n\t\t\tthis.y = attribute.array[ index + 1 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateAround: function ( center, angle ) {\n\n\t\t\tvar c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\t\tvar x = this.x - center.x;\n\t\t\tvar y = this.y - center.y;\n\n\t\t\tthis.x = x * c - y * s + center.x;\n\t\t\tthis.y = x * s + y * c + center.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t */\n\n\tfunction Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\tObject.defineProperty( this, 'id', { value: TextureIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.sourceFile = '';\n\n\t\tthis.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;\n\n\t\tthis.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;\n\t\tthis.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter;\n\n\t\tthis.anisotropy = anisotropy !== undefined ? anisotropy : 1;\n\n\t\tthis.format = format !== undefined ? format : RGBAFormat;\n\t\tthis.type = type !== undefined ? type : UnsignedByteType;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\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\n\t\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t\t//\n\t\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\t\tthis.encoding = encoding !== undefined ? encoding : LinearEncoding;\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t}\n\n\tTexture.DEFAULT_IMAGE = undefined;\n\tTexture.DEFAULT_MAPPING = UVMapping;\n\n\tTexture.prototype = {\n\n\t\tconstructor: Texture,\n\n\t\tisTexture: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.image = source.image;\n\t\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\t\tthis.mapping = source.mapping;\n\n\t\t\tthis.wrapS = source.wrapS;\n\t\t\tthis.wrapT = source.wrapT;\n\n\t\t\tthis.magFilter = source.magFilter;\n\t\t\tthis.minFilter = source.minFilter;\n\n\t\t\tthis.anisotropy = source.anisotropy;\n\n\t\t\tthis.format = source.format;\n\t\t\tthis.type = source.type;\n\n\t\t\tthis.offset.copy( source.offset );\n\t\t\tthis.repeat.copy( source.repeat );\n\n\t\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\t\tthis.flipY = source.flipY;\n\t\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\t\tthis.encoding = source.encoding;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tif ( meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t\t}\n\n\t\t\tfunction getDataURL( image ) {\n\n\t\t\t\tvar canvas;\n\n\t\t\t\tif ( image.toDataURL !== undefined ) {\n\n\t\t\t\t\tcanvas = image;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcanvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\t\tcanvas.width = image.width;\n\t\t\t\t\tcanvas.height = image.height;\n\n\t\t\t\t\tcanvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Texture',\n\t\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t\t},\n\n\t\t\t\tuuid: this.uuid,\n\t\t\t\tname: this.name,\n\n\t\t\t\tmapping: this.mapping,\n\n\t\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\t\tminFilter: this.minFilter,\n\t\t\t\tmagFilter: this.magFilter,\n\t\t\t\tanisotropy: this.anisotropy,\n\n\t\t\t\tflipY: this.flipY\n\t\t\t};\n\n\t\t\tif ( this.image !== undefined ) {\n\n\t\t\t\t// TODO: Move to THREE.Image\n\n\t\t\t\tvar image = this.image;\n\n\t\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\t\timage.uuid = _Math.generateUUID(); // UGH\n\n\t\t\t\t}\n\n\t\t\t\tif ( meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\t\turl: getDataURL( image )\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\toutput.image = image.uuid;\n\n\t\t\t}\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t},\n\n\t\ttransformUv: function ( uv ) {\n\n\t\t\tif ( this.mapping !== UVMapping ) return;\n\n\t\t\tuv.multiply( this.repeat );\n\t\t\tuv.add( this.offset );\n\n\t\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.flipY ) {\n\n\t\t\t\tuv.y = 1 - uv.y;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tObject.assign( Texture.prototype, EventDispatcher.prototype );\n\n\tvar count = 0;\n\tfunction TextureIdCount() { return count++; }\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector4( x, y, z, w ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\t\tthis.w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tVector4.prototype = {\n\n\t\tconstructor: Vector4,\n\n\t\tisVector4: true,\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\t\t\tthis.w = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( w ) {\n\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tcase 3: this.w = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\t\t\t\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tcase 3: return this.w;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\t\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\t\t\tthis.w += v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\t\t\tthis.w += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\t\t\tthis.w = a.w + b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\t\t\tthis.w += v.w * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\t\t\tthis.w -= v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\t\t\tthis.w -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\t\t\tthis.w = a.w - b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\t\t\t\tthis.w *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\t\t\t\tthis.w = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z, w = this.w;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tsetAxisAngleFromQuaternion: function ( q ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t\t// q is assumed to be normalized\n\n\t\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\t\tvar s = Math.sqrt( 1 - q.w * q.w );\n\n\t\t\tif ( s < 0.0001 ) {\n\n\t\t\t\t this.x = 1;\n\t\t\t\t this.y = 0;\n\t\t\t\t this.z = 0;\n\n\t\t\t} else {\n\n\t\t\t\t this.x = q.x / s;\n\t\t\t\t this.y = q.y / s;\n\t\t\t\t this.z = q.z / s;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetAxisAngleFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar angle, x, y, z,\t\t// variables for result\n\t\t\t\tepsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\t\tte = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t\t// singularity found\n\t\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t\t}\n\n\t\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\t\tangle = Math.PI;\n\n\t\t\t\tvar xx = ( m11 + 1 ) / 2;\n\t\t\t\tvar yy = ( m22 + 1 ) / 2;\n\t\t\t\tvar zz = ( m33 + 1 ) / 2;\n\t\t\t\tvar xy = ( m12 + m21 ) / 4;\n\t\t\t\tvar xz = ( m13 + m31 ) / 4;\n\t\t\t\tvar yz = ( m23 + m32 ) / 4;\n\n\t\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\t\tx = 0;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\t\ty = xy / x;\n\t\t\t\t\t\tz = xz / x;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\t\tx = xy / y;\n\t\t\t\t\t\tz = yz / y;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\t\tx = xz / z;\n\t\t\t\t\t\ty = yz / z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.set( x, y, z, angle );\n\n\t\t\t\treturn this; // return 180 deg rotation\n\n\t\t\t}\n\n\t\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\t\tvar 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\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t\t// caught by singularity test above, but I've left it in just in case\n\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\t\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\t\t\tthis.w = Math.min( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\t\t\tthis.w = Math.max( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector4();\n\t\t\t\t\tmax = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\t\t\tthis.w = Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\t\t\tthis.w = Math.ceil( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\t\t\tthis.w = Math.round( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\t\t\tthis.w = - this.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\t\t\tthis.w = array[ offset + 3 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\t\t\tarray[ offset + 3 ] = this.w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tindex = index * attribute.itemSize + offset;\n\n\t\t\tthis.x = attribute.array[ index ];\n\t\t\tthis.y = attribute.array[ index + 1 ];\n\t\t\tthis.z = attribute.array[ index + 2 ];\n\t\t\tthis.w = attribute.array[ index + 3 ];\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author szimek / https://github.com/szimek/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Marius Kintel / https://github.com/kintel\n\t */\n\n\t/*\n\t In options, we can specify:\n\t * Texture parameters for an auto-generated target texture\n\t * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n\t*/\n\tfunction WebGLRenderTarget( width, height, options ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\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\toptions = options || {};\n\n\t\tif ( options.minFilter === undefined ) options.minFilter = LinearFilter;\n\n\t\tthis.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\t\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\t\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;\n\t\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n\t}\n\n\tObject.assign( WebGLRenderTarget.prototype, EventDispatcher.prototype, {\n\n\t\tisWebGLRenderTarget: true,\n\n\t\tsetSize: function ( width, height ) {\n\n\t\t\tif ( this.width !== width || this.height !== height ) {\n\n\t\t\t\tthis.width = width;\n\t\t\t\tthis.height = height;\n\n\t\t\t\tthis.dispose();\n\n\t\t\t}\n\n\t\t\tthis.viewport.set( 0, 0, width, height );\n\t\t\tthis.scissor.set( 0, 0, width, height );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\tthis.viewport.copy( source.viewport );\n\n\t\t\tthis.texture = source.texture.clone();\n\n\t\t\tthis.depthBuffer = source.depthBuffer;\n\t\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\t\tthis.depthTexture = source.depthTexture;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com\n\t */\n\n\tfunction WebGLRenderTargetCube( width, height, options ) {\n\n\t\tWebGLRenderTarget.call( this, width, height, options );\n\n\t\tthis.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5\n\t\tthis.activeMipMapLevel = 0;\n\n\t}\n\n\tWebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype );\n\tWebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube;\n\n\tWebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true;\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Quaternion( x, y, z, w ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tQuaternion.prototype = {\n\n\t\tconstructor: Quaternion,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget w () {\n\n\t\t\treturn this._w;\n\n\t\t},\n\n\t\tset w ( value ) {\n\n\t\t\tthis._w = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._w = w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t\t},\n\n\t\tcopy: function ( quaternion ) {\n\n\t\t\tthis._x = quaternion.x;\n\t\t\tthis._y = quaternion.y;\n\t\t\tthis._z = quaternion.z;\n\t\t\tthis._w = quaternion.w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromEuler: function ( euler, update ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t\t//\tcontent/SpinCalc.m\n\n\t\t\tvar c1 = Math.cos( euler._x / 2 );\n\t\t\tvar c2 = Math.cos( euler._y / 2 );\n\t\t\tvar c3 = Math.cos( euler._z / 2 );\n\t\t\tvar s1 = Math.sin( euler._x / 2 );\n\t\t\tvar s2 = Math.sin( euler._y / 2 );\n\t\t\tvar s3 = Math.sin( euler._z / 2 );\n\n\t\t\tvar order = euler.order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\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\n\t\t\t} else if ( order === 'YXZ' ) {\n\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\n\t\t\t} else if ( order === 'ZXY' ) {\n\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\n\t\t\t} else if ( order === 'ZYX' ) {\n\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\n\t\t\t} else if ( order === 'YZX' ) {\n\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\n\t\t\t} else if ( order === 'XZY' ) {\n\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\n\t\t\t}\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tvar halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\t\tthis._x = axis.x * s;\n\t\t\tthis._y = axis.y * s;\n\t\t\tthis._z = axis.z * s;\n\t\t\tthis._w = Math.cos( halfAngle );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\t\ttrace = m11 + m22 + m33,\n\t\t\t\ts;\n\n\t\t\tif ( trace > 0 ) {\n\n\t\t\t\ts = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\t\tthis._w = 0.25 / s;\n\t\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\t\tthis._x = 0.25 * s;\n\t\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t\t} else if ( m22 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\t\tthis._y = 0.25 * s;\n\t\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t\t} else {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\t\tthis._z = 0.25 * s;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromUnitVectors: function () {\n\n\t\t\t// http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n\n\t\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\t\tvar v1, r;\n\n\t\t\tvar EPS = 0.000001;\n\n\t\t\treturn function setFromUnitVectors( vFrom, vTo ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tr = vFrom.dot( vTo ) + 1;\n\n\t\t\t\tif ( r < EPS ) {\n\n\t\t\t\t\tr = 0;\n\n\t\t\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\t\t\tv1.set( - vFrom.y, vFrom.x, 0 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv1.set( 0, - vFrom.z, vFrom.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv1.crossVectors( vFrom, vTo );\n\n\t\t\t\t}\n\n\t\t\t\tthis._x = v1.x;\n\t\t\t\tthis._y = v1.y;\n\t\t\t\tthis._z = v1.z;\n\t\t\t\tthis._w = r;\n\n\t\t\t\treturn this.normalize();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tinverse: function () {\n\n\t\t\treturn this.conjugate().normalize();\n\n\t\t},\n\n\t\tconjugate: function () {\n\n\t\t\tthis._x *= - 1;\n\t\t\tthis._y *= - 1;\n\t\t\tthis._z *= - 1;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tvar l = this.length();\n\n\t\t\tif ( l === 0 ) {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = 0;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = 1;\n\n\t\t\t} else {\n\n\t\t\t\tl = 1 / l;\n\n\t\t\t\tthis._x = this._x * l;\n\t\t\t\tthis._y = this._y * l;\n\t\t\t\tthis._z = this._z * l;\n\t\t\t\tthis._w = this._w * l;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( q, p ) {\n\n\t\t\tif ( p !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyQuaternions( this, q );\n\n\t\t},\n\n\t\tpremultiply: function ( q ) {\n\n\t\t\treturn this.multiplyQuaternions( q, this );\n\n\t\t},\n\n\t\tmultiplyQuaternions: function ( a, b ) {\n\n\t\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\t\tvar qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\t\tvar qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tslerp: function ( qb, t ) {\n\n\t\t\tif ( t === 0 ) return this;\n\t\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\t\tvar x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\t\tvar cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\t\tthis._w = - qb._w;\n\t\t\t\tthis._x = - qb._x;\n\t\t\t\tthis._y = - qb._y;\n\t\t\t\tthis._z = - qb._z;\n\n\t\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t\t} else {\n\n\t\t\t\tthis.copy( qb );\n\n\t\t\t}\n\n\t\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\t\tthis._w = w;\n\t\t\t\tthis._x = x;\n\t\t\t\tthis._y = y;\n\t\t\t\tthis._z = z;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n\t\t\tif ( Math.abs( sinHalfTheta ) < 0.001 ) {\n\n\t\t\t\tthis._w = 0.5 * ( w + this._w );\n\t\t\t\tthis._x = 0.5 * ( x + this._x );\n\t\t\t\tthis._y = 0.5 * ( y + this._y );\n\t\t\t\tthis._z = 0.5 * ( z + this._z );\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\t\tvar ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( quaternion ) {\n\n\t\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis._x = array[ offset ];\n\t\t\tthis._y = array[ offset + 1 ];\n\t\t\tthis._z = array[ offset + 2 ];\n\t\t\tthis._w = array[ offset + 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\tObject.assign( Quaternion, {\n\n\t\tslerp: function( qa, qb, qm, t ) {\n\n\t\t\treturn qm.copy( qa ).slerp( qb, t );\n\n\t\t},\n\n\t\tslerpFlat: function(\n\t\t\t\tdst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\t\tvar x0 = src0[ srcOffset0 + 0 ],\n\t\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\t\tw0 = src0[ srcOffset0 + 3 ],\n\n\t\t\t\tx1 = src1[ srcOffset1 + 0 ],\n\t\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\t\tvar s = 1 - t,\n\n\t\t\t\t\tcos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\n\t\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\t\tvar sin = Math.sqrt( sqrSin ),\n\t\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t\t}\n\n\t\t\t\tvar tDir = t * dir;\n\n\t\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t\t// Normalize in case we just did a lerp:\n\t\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\t\tvar f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\t\tx0 *= f;\n\t\t\t\t\ty0 *= f;\n\t\t\t\t\tz0 *= f;\n\t\t\t\t\tw0 *= f;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdst[ dstOffset ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author *kile / http://kile.stravaganza.org/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector3( x, y, z ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\n\t}\n\n\tVector3.prototype = {\n\n\t\tconstructor: Vector3,\n\n\t\tisVector3: true,\n\n\t\tset: function ( x, y, z ) {\n\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\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\t\t\t\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\t\t\tthis.z *= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x * b.x;\n\t\t\tthis.y = a.y * b.y;\n\t\t\tthis.z = a.z * b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyEuler: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyEuler( euler ) {\n\n\t\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromEuler( euler ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyAxisAngle: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyAxisAngle( axis, angle ) {\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix3: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 affine matrix\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ];\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ];\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyProjection: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 projection matrix\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\t\t\tvar d = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); // perspective divide\n\n\t\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * d;\n\t\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * d;\n\t\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * d;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyQuaternion: function ( q ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t\t// calculate quat * vector\n\n\t\t\tvar ix = qw * x + qy * z - qz * y;\n\t\t\tvar iy = qw * y + qz * x - qx * z;\n\t\t\tvar iz = qw * z + qx * y - qy * x;\n\t\t\tvar iw = - qx * x - qy * y - qz * z;\n\n\t\t\t// calculate result * inverse quat\n\n\t\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function project( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );\n\t\t\t\treturn this.applyProjection( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tunproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function unproject( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );\n\t\t\t\treturn this.applyProjection( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttransformDirection: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 affine matrix\n\t\t\t// vector interpreted as a direction\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\t\treturn this.normalize();\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\t\t\tthis.z /= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector3();\n\t\t\t\t\tmax = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tcross: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\t\treturn this.crossVectors( v, w );\n\n\t\t\t}\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\n\t\t\tthis.x = y * v.z - z * v.y;\n\t\t\tthis.y = z * v.x - x * v.z;\n\t\t\tthis.z = x * v.y - y * v.x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossVectors: function ( a, b ) {\n\n\t\t\tvar ax = a.x, ay = a.y, az = a.z;\n\t\t\tvar bx = b.x, by = b.y, bz = b.z;\n\n\t\t\tthis.x = ay * bz - az * by;\n\t\t\tthis.y = az * bx - ax * bz;\n\t\t\tthis.z = ax * by - ay * bx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tprojectOnVector: function ( vector ) {\n\n\t\t\tvar scalar = vector.dot( this ) / vector.lengthSq();\n\n\t\t\treturn this.copy( vector ).multiplyScalar( scalar );\n\n\t\t},\n\n\t\tprojectOnPlane: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function projectOnPlane( planeNormal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tv1.copy( this ).projectOnVector( planeNormal );\n\n\t\t\t\treturn this.sub( v1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\treflect: function () {\n\n\t\t\t// reflect incident vector off plane orthogonal to normal\n\t\t\t// normal is assumed to have unit length\n\n\t\t\tvar v1;\n\n\t\t\treturn function reflect( normal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\treturn this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tangleTo: function ( v ) {\n\n\t\t\tvar theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );\n\n\t\t\t// clamp, to handle numerical problems\n\n\t\t\treturn Math.acos( _Math.clamp( theta, - 1, 1 ) );\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t\t},\n\n\t\tsetFromSpherical: function( s ) {\n\n\t\t\tvar sinPhiRadius = Math.sin( s.phi ) * s.radius;\n\n\t\t\tthis.x = sinPhiRadius * Math.sin( s.theta );\n\t\t\tthis.y = Math.cos( s.phi ) * s.radius;\n\t\t\tthis.z = sinPhiRadius * Math.cos( s.theta );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixPosition: function ( m ) {\n\n\t\t\treturn this.setFromMatrixColumn( m, 3 );\n\n\t\t},\n\n\t\tsetFromMatrixScale: function ( m ) {\n\n\t\t\tvar sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\t\tvar sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\t\tvar sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\tthis.x = sx;\n\t\t\tthis.y = sy;\n\t\t\tthis.z = sz;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixColumn: function ( m, index ) {\n\n\t\t\tif ( typeof m === 'number' ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: setFromMatrixColumn now expects ( matrix, index ).' );\n\t\t\t\tvar temp = m;\n\t\t\t\tm = index;\n\t\t\t\tindex = temp;\n\n\t\t\t}\n\n\t\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tindex = index * attribute.itemSize + offset;\n\n\t\t\tthis.x = attribute.array[ index ];\n\t\t\tthis.y = attribute.array[ index + 1 ];\n\t\t\tthis.z = attribute.array[ index + 2 ];\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author jordi_ros / http://plattsoft.com\n\t * @author D1plo1d / http://github.com/D1plo1d\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author timknip / http://www.floorplanner.com/\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Matrix4() {\n\n\t\tthis.elements = new Float32Array( [\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 ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix4.prototype = {\n\n\t\tconstructor: Matrix4,\n\n\t\tisMatrix4: true,\n\n\t\tset: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, 1, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new Matrix4().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tthis.elements.set( m.elements );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyPosition: function ( m ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = m.elements;\n\n\t\t\tte[ 12 ] = me[ 12 ];\n\t\t\tte[ 13 ] = me[ 13 ];\n\t\t\tte[ 14 ] = me[ 14 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\tthis.set(\n\t\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractRotation: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function extractRotation( m ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tvar te = this.elements;\n\t\t\t\tvar me = m.elements;\n\n\t\t\t\tvar scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length();\n\t\t\t\tvar scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length();\n\t\t\t\tvar scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\t\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\t\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\n\t\t\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\t\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\t\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\n\t\t\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\t\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\t\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakeRotationFromEuler: function ( euler ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = euler.x, y = euler.y, z = euler.z;\n\t\t\tvar a = Math.cos( x ), b = Math.sin( x );\n\t\t\tvar c = Math.cos( y ), d = Math.sin( y );\n\t\t\tvar e = Math.cos( z ), f = Math.sin( z );\n\n\t\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - c * f;\n\t\t\t\tte[ 8 ] = d;\n\n\t\t\t\tte[ 1 ] = af + be * d;\n\t\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\t\tte[ 9 ] = - b * c;\n\n\t\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\t\tte[ 6 ] = be + af * d;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce + df * b;\n\t\t\t\tte[ 4 ] = de * b - cf;\n\t\t\t\tte[ 8 ] = a * d;\n\n\t\t\t\tte[ 1 ] = a * f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b;\n\n\t\t\t\tte[ 2 ] = cf * b - de;\n\t\t\t\tte[ 6 ] = df + ce * b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce - df * b;\n\t\t\t\tte[ 4 ] = - a * f;\n\t\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\t\tte[ 1 ] = cf + de * b;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\t\tte[ 2 ] = - a * d;\n\t\t\t\tte[ 6 ] = b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = be * d - af;\n\t\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\t\tte[ 1 ] = c * f;\n\t\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\t\tte[ 2 ] = - d;\n\t\t\t\tte[ 6 ] = b * c;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\t\tte[ 1 ] = f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b * e;\n\n\t\t\t\tte[ 2 ] = - d * e;\n\t\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - f;\n\t\t\t\tte[ 8 ] = d * e;\n\n\t\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\t\tte[ 6 ] = b * e;\n\t\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t\t}\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationFromQuaternion: function ( q ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = q.x, y = q.y, z = q.z, w = q.w;\n\t\t\tvar x2 = x + x, y2 = y + y, z2 = z + z;\n\t\t\tvar xx = x * x2, xy = x * y2, xz = x * z2;\n\t\t\tvar yy = y * y2, yz = y * z2, zz = z * z2;\n\t\t\tvar wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\t\tte[ 0 ] = 1 - ( yy + zz );\n\t\t\tte[ 4 ] = xy - wz;\n\t\t\tte[ 8 ] = xz + wy;\n\n\t\t\tte[ 1 ] = xy + wz;\n\t\t\tte[ 5 ] = 1 - ( xx + zz );\n\t\t\tte[ 9 ] = yz - wx;\n\n\t\t\tte[ 2 ] = xz - wy;\n\t\t\tte[ 6 ] = yz + wx;\n\t\t\tte[ 10 ] = 1 - ( xx + yy );\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlookAt: function () {\n\n\t\t\tvar x, y, z;\n\n\t\t\treturn function lookAt( eye, target, up ) {\n\n\t\t\t\tif ( x === undefined ) {\n\n\t\t\t\t\tx = new Vector3();\n\t\t\t\t\ty = new Vector3();\n\t\t\t\t\tz = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tz.subVectors( eye, target ).normalize();\n\n\t\t\t\tif ( z.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z = 1;\n\n\t\t\t\t}\n\n\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\tif ( x.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z += 0.0001;\n\t\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\ty.crossVectors( z, x );\n\n\n\t\t\t\tte[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;\n\t\t\t\tte[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;\n\t\t\t\tte[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiply: function ( m, n ) {\n\n\t\t\tif ( n !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyMatrices( this, m );\n\n\t\t},\n\n\t\tpremultiply: function ( m ) {\n\n\t\t\treturn this.multiplyMatrices( m, this );\n\n\t\t},\n\n\t\tmultiplyMatrices: function ( a, b ) {\n\n\t\t\tvar ae = a.elements;\n\t\t\tvar be = b.elements;\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\t\tvar a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\t\tvar a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\t\tvar a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\t\tvar b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\t\tvar b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\t\tvar b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\t\tvar b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyToArray: function ( a, b, r ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tthis.multiplyMatrices( a, b );\n\n\t\t\tr[ 0 ] = te[ 0 ]; r[ 1 ] = te[ 1 ]; r[ 2 ] = te[ 2 ]; r[ 3 ] = te[ 3 ];\n\t\t\tr[ 4 ] = te[ 4 ]; r[ 5 ] = te[ 5 ]; r[ 6 ] = te[ 6 ]; r[ 7 ] = te[ 7 ];\n\t\t\tr[ 8 ] = te[ 8 ]; r[ 9 ] = te[ 9 ]; r[ 10 ] = te[ 10 ]; r[ 11 ] = te[ 11 ];\n\t\t\tr[ 12 ] = te[ 12 ]; r[ 13 ] = te[ 13 ]; r[ 14 ] = te[ 14 ]; r[ 15 ] = te[ 15 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToVector3Array: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToVector3Array( array, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = array.length;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i += 3, j += 3 ) {\n\n\t\t\t\t\tv1.fromArray( array, j );\n\t\t\t\t\tv1.applyMatrix4( this );\n\t\t\t\t\tv1.toArray( array, j );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyToBuffer: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBuffer( buffer, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = buffer.length / buffer.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i ++, j ++ ) {\n\n\t\t\t\t\tv1.x = buffer.getX( j );\n\t\t\t\t\tv1.y = buffer.getY( j );\n\t\t\t\t\tv1.z = buffer.getZ( j );\n\n\t\t\t\t\tv1.applyMatrix4( this );\n\n\t\t\t\t\tbuffer.setXYZ( j, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn buffer;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\t\tvar n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\t\tvar n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\t\tvar n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t\t//TODO: make this more efficient\n\t\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\t\treturn (\n\t\t\t\tn41 * (\n\t\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t\t - n13 * n24 * n32\n\t\t\t\t\t - n14 * n22 * n33\n\t\t\t\t\t + n12 * n24 * n33\n\t\t\t\t\t + n13 * n22 * n34\n\t\t\t\t\t - n12 * n23 * n34\n\t\t\t\t) +\n\t\t\t\tn42 * (\n\t\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t\t - n11 * n24 * n33\n\t\t\t\t\t + n14 * n21 * n33\n\t\t\t\t\t - n13 * n21 * n34\n\t\t\t\t\t + n13 * n24 * n31\n\t\t\t\t\t - n14 * n23 * n31\n\t\t\t\t) +\n\t\t\t\tn43 * (\n\t\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t\t - n11 * n22 * n34\n\t\t\t\t\t - n14 * n21 * n32\n\t\t\t\t\t + n12 * n21 * n34\n\t\t\t\t\t + n14 * n22 * n31\n\t\t\t\t\t - n12 * n24 * n31\n\t\t\t\t) +\n\t\t\t\tn44 * (\n\t\t\t\t\t- n13 * n22 * n31\n\t\t\t\t\t - n11 * n23 * n32\n\t\t\t\t\t + n11 * n22 * n33\n\t\t\t\t\t + n13 * n21 * n32\n\t\t\t\t\t - n12 * n21 * n33\n\t\t\t\t\t + n12 * n23 * n31\n\t\t\t\t)\n\n\t\t\t);\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar tmp;\n\n\t\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset is deprecated \" +\n\t\t\t\t\t\"- just use .toArray instead.\" );\n\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\n\t\tgetPosition: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function getPosition() {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\n\n\t\t\t\treturn v1.setFromMatrixColumn( this, 3 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetPosition: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 12 ] = v.x;\n\t\t\tte[ 13 ] = v.y;\n\t\t\tte[ 14 ] = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetInverse: function ( m, throwOnDegenerate ) {\n\n\t\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\t\tvar te = this.elements,\n\t\t\t\tme = m.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],\n\t\t\t\tn12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],\n\t\t\t\tn13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],\n\t\t\t\tn14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],\n\n\t\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\t\tvar det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\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\t\tte[ 4 ] = t12 * detInv;\n\t\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\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\t\tte[ 8 ] = t13 * detInv;\n\t\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\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\t\tte[ 12 ] = t14 * detInv;\n\t\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\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\t\treturn this;\n\n\t\t},\n\n\t\tscale: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = v.x, y = v.y, z = v.z;\n\n\t\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetMaxScaleOnAxis: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\t\tvar scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\t\tvar scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t\t},\n\n\t\tmakeTranslation: function ( x, y, z ) {\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\treturn this;\n\n\t\t},\n\n\t\tmakeRotationX: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, c, - s, 0,\n\t\t\t\t0, s, c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationY: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t c, 0, s, 0,\n\t\t\t\t 0, 1, 0, 0,\n\t\t\t\t- s, 0, c, 0,\n\t\t\t\t 0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationZ: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\tc, - s, 0, 0,\n\t\t\t\ts, c, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationAxis: function ( axis, angle ) {\n\n\t\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\t\tvar c = Math.cos( angle );\n\t\t\tvar s = Math.sin( angle );\n\t\t\tvar t = 1 - c;\n\t\t\tvar x = axis.x, y = axis.y, z = axis.z;\n\t\t\tvar tx = t * x, ty = t * y;\n\n\t\t\tthis.set(\n\n\t\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\t return this;\n\n\t\t},\n\n\t\tmakeScale: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\tx, 0, 0, 0,\n\t\t\t\t0, y, 0, 0,\n\t\t\t\t0, 0, z, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcompose: function ( position, quaternion, scale ) {\n\n\t\t\tthis.makeRotationFromQuaternion( quaternion );\n\t\t\tthis.scale( scale );\n\t\t\tthis.setPosition( position );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdecompose: function () {\n\n\t\t\tvar vector, matrix;\n\n\t\t\treturn function decompose( position, quaternion, scale ) {\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tvector = new Vector3();\n\t\t\t\t\tmatrix = new Matrix4();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tvar sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\t\t\tvar sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\t\t\tvar sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t\t\t// if determine is negative, we need to invert one scale\n\t\t\t\tvar det = this.determinant();\n\t\t\t\tif ( det < 0 ) {\n\n\t\t\t\t\tsx = - sx;\n\n\t\t\t\t}\n\n\t\t\t\tposition.x = te[ 12 ];\n\t\t\t\tposition.y = te[ 13 ];\n\t\t\t\tposition.z = te[ 14 ];\n\n\t\t\t\t// scale the rotation part\n\n\t\t\t\tmatrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy()\n\n\t\t\t\tvar invSX = 1 / sx;\n\t\t\t\tvar invSY = 1 / sy;\n\t\t\t\tvar invSZ = 1 / sz;\n\n\t\t\t\tmatrix.elements[ 0 ] *= invSX;\n\t\t\t\tmatrix.elements[ 1 ] *= invSX;\n\t\t\t\tmatrix.elements[ 2 ] *= invSX;\n\n\t\t\t\tmatrix.elements[ 4 ] *= invSY;\n\t\t\t\tmatrix.elements[ 5 ] *= invSY;\n\t\t\t\tmatrix.elements[ 6 ] *= invSY;\n\n\t\t\t\tmatrix.elements[ 8 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 9 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 10 ] *= invSZ;\n\n\t\t\t\tquaternion.setFromRotationMatrix( matrix );\n\n\t\t\t\tscale.x = sx;\n\t\t\t\tscale.y = sy;\n\t\t\t\tscale.z = sz;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakeFrustum: function ( left, right, bottom, top, near, far ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = 2 * near / ( right - left );\n\t\t\tvar y = 2 * near / ( top - bottom );\n\n\t\t\tvar a = ( right + left ) / ( right - left );\n\t\t\tvar b = ( top + bottom ) / ( top - bottom );\n\t\t\tvar c = - ( far + near ) / ( far - near );\n\t\t\tvar d = - 2 * far * near / ( far - near );\n\n\t\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakePerspective: function ( fov, aspect, near, far ) {\n\n\t\t\tvar ymax = near * Math.tan( _Math.DEG2RAD * fov * 0.5 );\n\t\t\tvar ymin = - ymax;\n\t\t\tvar xmin = ymin * aspect;\n\t\t\tvar xmax = ymax * aspect;\n\n\t\t\treturn this.makeFrustum( xmin, xmax, ymin, ymax, near, far );\n\n\t\t},\n\n\t\tmakeOrthographic: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar w = 1.0 / ( right - left );\n\t\t\tvar h = 1.0 / ( top - bottom );\n\t\t\tvar p = 1.0 / ( far - near );\n\n\t\t\tvar x = ( right + left ) * w;\n\t\t\tvar y = ( top + bottom ) * h;\n\t\t\tvar z = ( far + near ) * p;\n\n\t\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( matrix ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = matrix.elements;\n\n\t\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tTexture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tCubeTexture.prototype = Object.create( Texture.prototype );\n\tCubeTexture.prototype.constructor = CubeTexture;\n\n\tCubeTexture.prototype.isCubeTexture = true;\n\n\tObject.defineProperty( CubeTexture.prototype, 'images', {\n\n\t\tget: function () {\n\n\t\t\treturn this.image;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.image = value;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t *\n\t * Uniforms of a program.\n\t * Those form a tree structure with a special top-level container for the root,\n\t * which you get by calling 'new WebGLUniforms( gl, program, renderer )'.\n\t *\n\t *\n\t * Properties of inner nodes including the top-level container:\n\t *\n\t * .seq - array of nested uniforms\n\t * .map - nested uniforms by name\n\t *\n\t *\n\t * Methods of all nodes except the top-level container:\n\t *\n\t * .setValue( gl, value, [renderer] )\n\t *\n\t * \t\tuploads a uniform value(s)\n\t * \tthe 'renderer' parameter is needed for sampler uniforms\n\t *\n\t *\n\t * Static methods of the top-level container (renderer factorizations):\n\t *\n\t * .upload( gl, seq, values, renderer )\n\t *\n\t * \t\tsets uniforms in 'seq' to 'values[id].value'\n\t *\n\t * .seqWithValue( seq, values ) : filteredSeq\n\t *\n\t * \t\tfilters 'seq' entries with corresponding entry in values\n\t *\n\t *\n\t * Methods of the top-level container (renderer factorizations):\n\t *\n\t * .setValue( gl, name, value )\n\t *\n\t * \t\tsets uniform with name 'name' to 'value'\n\t *\n\t * .set( gl, obj, prop )\n\t *\n\t * \t\tsets uniform from object and property with same name than uniform\n\t *\n\t * .setOptional( gl, obj, prop )\n\t *\n\t * \t\tlike .set for an optional property of the object\n\t *\n\t */\n\n\tvar emptyTexture = new Texture();\n\tvar emptyCubeTexture = new CubeTexture();\n\n\t// --- Base for inner nodes (including the root) ---\n\n\tfunction UniformContainer() {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\t// --- Utilities ---\n\n\t// Array Caches (provide typed arrays for temporary by size)\n\n\tvar arrayCacheF32 = [];\n\tvar arrayCacheI32 = [];\n\n\t// Flattening for arrays of vectors and matrices\n\n\tfunction flatten( array, nBlocks, blockSize ) {\n\n\t\tvar firstElem = array[ 0 ];\n\n\t\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t\t// unoptimized: ! isNaN( firstElem )\n\t\t// see http://jacksondunstan.com/articles/983\n\n\t\tvar n = nBlocks * blockSize,\n\t\t\tr = arrayCacheF32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Float32Array( n );\n\t\t\tarrayCacheF32[ n ] = r;\n\n\t\t}\n\n\t\tif ( nBlocks !== 0 ) {\n\n\t\t\tfirstElem.toArray( r, 0 );\n\n\t\t\tfor ( var i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\t\toffset += blockSize;\n\t\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n\t// Texture unit allocation\n\n\tfunction allocTexUnits( renderer, n ) {\n\n\t\tvar r = arrayCacheI32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Int32Array( n );\n\t\t\tarrayCacheI32[ n ] = r;\n\n\t\t}\n\n\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\tr[ i ] = renderer.allocTextureUnit();\n\n\t\treturn r;\n\n\t}\n\n\t// --- Setters ---\n\n\t// Note: Defining these methods externally, because they come in a bunch\n\t// and this way their names minify.\n\n\t// Single scalar\n\n\tfunction setValue1f( gl, v ) { gl.uniform1f( this.addr, v ); }\n\tfunction setValue1i( gl, v ) { gl.uniform1i( this.addr, v ); }\n\n\t// Single float vector (from flat array or THREE.VectorN)\n\n\tfunction setValue2fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform2fv( this.addr, v );\n\t\telse gl.uniform2f( this.addr, v.x, v.y );\n\n\t}\n\n\tfunction setValue3fv( gl, v ) {\n\n\t\tif ( v.x !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\t\telse if ( v.r !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\t\telse\n\t\t\tgl.uniform3fv( this.addr, v );\n\n\t}\n\n\tfunction setValue4fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform4fv( this.addr, v );\n\t\telse gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t}\n\n\t// Single matrix (from flat array or MatrixN)\n\n\tfunction setValue2fm( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue3fm( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue4fm( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v.elements || v );\n\n\t}\n\n\t// Single texture (2D / Cube)\n\n\tfunction setValueT1( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTexture2D( v || emptyTexture, unit );\n\n\t}\n\n\tfunction setValueT6( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTextureCube( v || emptyCubeTexture, unit );\n\n\t}\n\n\t// Integer / Boolean vectors or arrays thereof (always flat arrays)\n\n\tfunction setValue2iv( gl, v ) { gl.uniform2iv( this.addr, v ); }\n\tfunction setValue3iv( gl, v ) { gl.uniform3iv( this.addr, v ); }\n\tfunction setValue4iv( gl, v ) { gl.uniform4iv( this.addr, v ); }\n\n\t// Helper to pick the right setter for the singular case\n\n\tfunction getSingularSetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1f; // FLOAT\n\t\t\tcase 0x8b50: return setValue2fv; // _VEC2\n\t\t\tcase 0x8b51: return setValue3fv; // _VEC3\n\t\t\tcase 0x8b52: return setValue4fv; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValue2fm; // _MAT2\n\t\t\tcase 0x8b5b: return setValue3fm; // _MAT3\n\t\t\tcase 0x8b5c: return setValue4fm; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1i; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// Array of scalars\n\n\tfunction setValue1fv( gl, v ) { gl.uniform1fv( this.addr, v ); }\n\tfunction setValue1iv( gl, v ) { gl.uniform1iv( this.addr, v ); }\n\n\t// Array of vectors (flat or from THREE classes)\n\n\tfunction setValueV2a( gl, v ) {\n\n\t\tgl.uniform2fv( this.addr, flatten( v, this.size, 2 ) );\n\n\t}\n\n\tfunction setValueV3a( gl, v ) {\n\n\t\tgl.uniform3fv( this.addr, flatten( v, this.size, 3 ) );\n\n\t}\n\n\tfunction setValueV4a( gl, v ) {\n\n\t\tgl.uniform4fv( this.addr, flatten( v, this.size, 4 ) );\n\n\t}\n\n\t// Array of matrices (flat or from THREE clases)\n\n\tfunction setValueM2a( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) );\n\n\t}\n\n\tfunction setValueM3a( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) );\n\n\t}\n\n\tfunction setValueM4a( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) );\n\n\t}\n\n\t// Array of textures (2D / Cube)\n\n\tfunction setValueT1a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\tfunction setValueT6a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\t// Helper to pick the right setter for a pure (bottom-level) array\n\n\tfunction getPureArraySetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1fv; // FLOAT\n\t\t\tcase 0x8b50: return setValueV2a; // _VEC2\n\t\t\tcase 0x8b51: return setValueV3a; // _VEC3\n\t\t\tcase 0x8b52: return setValueV4a; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValueM2a; // _MAT2\n\t\t\tcase 0x8b5b: return setValueM3a; // _MAT3\n\t\t\tcase 0x8b5c: return setValueM4a; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1a; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6a; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// --- Uniform Classes ---\n\n\tfunction SingleUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\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\tfunction StructuredUniform( id ) {\n\n\t\tthis.id = id;\n\n\t\tUniformContainer.call( this ); // mix-in\n\n\t}\n\n\tStructuredUniform.prototype.setValue = function( gl, value ) {\n\n\t\t// Note: Don't need an extra 'renderer' parameter, since samplers\n\t\t// are not allowed in structured uniforms.\n\n\t\tvar seq = this.seq;\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ] );\n\n\t\t}\n\n\t};\n\n\t// --- Top-level ---\n\n\t// Parser - builds up the property tree from the path strings\n\n\tvar RePathPart = /([\\w\\d_]+)(\\])?(\\[|\\.)?/g;\n\n\t// extracts\n\t// \t- the identifier (member name or array index)\n\t// - followed by an optional right bracket (found when array index)\n\t// - followed by an optional left bracket or dot (type of subscript)\n\t//\n\t// Note: These portions can be read in a non-overlapping fashion and\n\t// allow straightforward parsing of the hierarchy that WebGL encodes\n\t// in the uniform names.\n\n\tfunction addUniform( container, uniformObject ) {\n\n\t\tcontainer.seq.push( uniformObject );\n\t\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n\t}\n\n\tfunction parseUniform( activeInfo, addr, container ) {\n\n\t\tvar path = activeInfo.name,\n\t\t\tpathLength = path.length;\n\n\t\t// reset RegExp object, because of the early exit of a previous run\n\t\tRePathPart.lastIndex = 0;\n\n\t\tfor (; ;) {\n\n\t\t\tvar match = RePathPart.exec( path ),\n\t\t\t\tmatchEnd = RePathPart.lastIndex,\n\n\t\t\t\tid = match[ 1 ],\n\t\t\t\tidIsIndex = match[ 2 ] === ']',\n\t\t\t\tsubscript = match[ 3 ];\n\n\t\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\t\tif ( subscript === undefined ||\n\t\t\t\t\tsubscript === '[' && matchEnd + 2 === pathLength ) {\n\t\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\t\tbreak;\n\n\t\t\t} else {\n\t\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\t\tvar map = container.map,\n\t\t\t\t\tnext = map[ id ];\n\n\t\t\t\tif ( next === undefined ) {\n\n\t\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\t\taddUniform( container, next );\n\n\t\t\t\t}\n\n\t\t\t\tcontainer = next;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Root Container\n\n\tfunction WebGLUniforms( gl, program, renderer ) {\n\n\t\tUniformContainer.call( this );\n\n\t\tthis.renderer = renderer;\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\tvar info = gl.getActiveUniform( program, i ),\n\t\t\t\tpath = info.name,\n\t\t\t\taddr = gl.getUniformLocation( program, path );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tWebGLUniforms.prototype.setValue = function( gl, name, value ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.set = function( gl, object, name ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, object[ name ], this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.setOptional = function( gl, object, name ) {\n\n\t\tvar v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t};\n\n\n\t// Static interface\n\n\tWebGLUniforms.upload = function( gl, seq, values, renderer ) {\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\n\t\t\t\tu.setValue( gl, v.value, renderer );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tWebGLUniforms.seqWithValue = function( seq, values ) {\n\n\t\tvar r = [];\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar 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\t/**\n\t * Uniform Utilities\n\t */\n\n\tvar UniformsUtils = {\n\n\t\tmerge: function ( uniforms ) {\n\n\t\t\tvar merged = {};\n\n\t\t\tfor ( var u = 0; u < uniforms.length; u ++ ) {\n\n\t\t\t\tvar tmp = this.clone( uniforms[ u ] );\n\n\t\t\t\tfor ( var p in tmp ) {\n\n\t\t\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn merged;\n\n\t\t},\n\n\t\tclone: function ( uniforms_src ) {\n\n\t\t\tvar uniforms_dst = {};\n\n\t\t\tfor ( var u in uniforms_src ) {\n\n\t\t\t\tuniforms_dst[ u ] = {};\n\n\t\t\t\tfor ( var p in uniforms_src[ u ] ) {\n\n\t\t\t\t\tvar parameter_src = uniforms_src[ u ][ p ];\n\n\t\t\t\t\tif ( parameter_src && ( parameter_src.isColor ||\n\t\t\t\t\t\tparameter_src.isMatrix3 || parameter_src.isMatrix4 ||\n\t\t\t\t\t\tparameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 ||\n\t\t\t\t\t\tparameter_src.isTexture ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.clone();\n\n\t\t\t\t\t} else if ( Array.isArray( parameter_src ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.slice();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn uniforms_dst;\n\n\t\t}\n\n\t};\n\n\tvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\\n\";\n\n\tvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\\n\";\n\n\tvar alphatest_fragment = \"#ifdef ALPHATEST\\n\\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\\n\";\n\n\tvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\\n\\t#endif\\n#endif\\n\";\n\n\tvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\n\tvar begin_vertex = \"\\nvec3 transformed = vec3( position );\\n\";\n\n\tvar beginnormal_vertex = \"\\nvec3 objectNormal = vec3( normal );\\n\";\n\n\tvar bsdfs = \"bool testLightInRange( const in float lightDistance, const in float cutoffDistance ) {\\n\\treturn any( bvec2( cutoffDistance == 0.0, lightDistance < cutoffDistance ) );\\n}\\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\t\\tif( decayExponent > 0.0 ) {\\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\\n\\t\\t\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\t\\t\\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t\\t\\treturn distanceFalloff * maxDistanceCutoffFactor;\\n#else\\n\\t\\t\\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\\n#endif\\n\\t\\t}\\n\\t\\treturn 1.0;\\n}\\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\\n\\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\\n\\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\\n}\\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\treturn 1.0 / ( gl * gv );\\n}\\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\tfloat D = D_GGX( alpha, dotNH );\\n\\treturn F * ( G * D );\\n}\\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\\n\\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\\n\\tvec4 r = roughness * c0 + c1;\\n\\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\\n\\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\\n\\treturn specularColor * AB.x + AB.y;\\n}\\nfloat G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n}\\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\\n\\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\\n}\\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\\n\\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\\n}\\n\";\n\n\tvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vUv );\\n\\t\\tvec2 dSTdy = dFdy( vUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\\n\\t\\tvec3 vSigmaX = dFdx( surf_pos );\\n\\t\\tvec3 vSigmaY = dFdy( surf_pos );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 );\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\\n\";\n\n\tvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\\n\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t\\t\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\\n\\t\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\tif ( clipped ) discard;\\n\\t\\n\\t#endif\\n#endif\\n\";\n\n\tvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\t\\tvarying vec3 vViewPosition;\\n\\t#endif\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\\n\";\n\n\tvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n\";\n\n\tvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n\";\n\n\tvar color_fragment = \"#ifdef USE_COLOR\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\n\tvar color_pars_fragment = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\\n\";\n\n\tvar color_pars_vertex = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\";\n\n\tvar color_vertex = \"#ifdef USE_COLOR\\n\\tvColor.xyz = color.xyz;\\n#endif\";\n\n\tvar common = \"#define PI 3.14159265359\\n#define PI2 6.28318530718\\n#define RECIPROCAL_PI 0.31830988618\\n#define RECIPROCAL_PI2 0.15915494\\n#define LOG2 1.442695\\n#define EPSILON 1e-6\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract(sin(sn) * c);\\n}\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\tfloat distance = dot( planeNormal, point - pointOnPlane );\\n\\treturn - distance * planeNormal + point;\\n}\\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn sign( dot( point - pointOnPlane, planeNormal ) );\\n}\\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\\n}\\n\";\n\n\tvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n#define cubeUV_textureSize (1024.0)\\nint getFaceFromDirection(vec3 direction) {\\n\\tvec3 absDirection = abs(direction);\\n\\tint face = -1;\\n\\tif( absDirection.x > absDirection.z ) {\\n\\t\\tif(absDirection.x > absDirection.y )\\n\\t\\t\\tface = direction.x > 0.0 ? 0 : 3;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\telse {\\n\\t\\tif(absDirection.z > absDirection.y )\\n\\t\\t\\tface = direction.z > 0.0 ? 2 : 5;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\treturn face;\\n}\\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\\n\\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\\n\\tfloat dxRoughness = dFdx(roughness);\\n\\tfloat dyRoughness = dFdy(roughness);\\n\\tvec3 dx = dFdx( vec * scale * dxRoughness );\\n\\tvec3 dy = dFdy( vec * scale * dyRoughness );\\n\\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\\n\\td = clamp(d, 1.0, cubeUV_rangeClamp);\\n\\tfloat mipLevel = 0.5 * log2(d);\\n\\treturn vec2(floor(mipLevel), fract(mipLevel));\\n}\\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\\n\\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\\n\\tfloat a = 16.0 * cubeUV_rcpTextureSize;\\n\\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\\n\\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\\n\\tfloat powScale = exp2_packed.x * exp2_packed.y;\\n\\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\\n\\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\\n\\tbool bRes = mipLevel == 0.0;\\n\\tscale = bRes && (scale < a) ? a : scale;\\n\\tvec3 r;\\n\\tvec2 offset;\\n\\tint face = getFaceFromDirection(direction);\\n\\tfloat rcpPowScale = 1.0 / powScale;\\n\\tif( face == 0) {\\n\\t\\tr = vec3(direction.x, -direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 1) {\\n\\t\\tr = vec3(direction.y, direction.x, direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 2) {\\n\\t\\tr = vec3(direction.z, direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 3) {\\n\\t\\tr = vec3(direction.x, direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse if( face == 4) {\\n\\t\\tr = vec3(direction.y, direction.x, -direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse {\\n\\t\\tr = vec3(direction.z, -direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\tr = normalize(r);\\n\\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\\n\\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\\n\\tvec2 base = offset + vec2( texelOffset );\\n\\treturn base + s * ( scale - 2.0 * texelOffset );\\n}\\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\\n\\tfloat roughnessVal = roughness* cubeUV_maxLods3;\\n\\tfloat r1 = floor(roughnessVal);\\n\\tfloat r2 = r1 + 1.0;\\n\\tfloat t = fract(roughnessVal);\\n\\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\\n\\tfloat s = mipInfo.y;\\n\\tfloat level0 = mipInfo.x;\\n\\tfloat level1 = level0 + 1.0;\\n\\tlevel1 = level1 > 5.0 ? 5.0 : level1;\\n\\tlevel0 += min( floor( s + 0.5 ), 5.0 );\\n\\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\\n\\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\\n\\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\\n\\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\\n\\tvec4 result = mix(color10, color20, t);\\n\\treturn vec4(result.rgb, 1.0);\\n}\\n#endif\\n\";\n\n\tvar defaultnormal_vertex = \"#ifdef FLIP_SIDED\\n\\tobjectNormal = -objectNormal;\\n#endif\\nvec3 transformedNormal = normalMatrix * objectNormal;\\n\";\n\n\tvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\\n\";\n\n\tvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\\n#endif\\n\";\n\n\tvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\\n\";\n\n\tvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\\n\";\n\n\tvar encodings_fragment = \" gl_FragColor = linearToOutputTexel( gl_FragColor );\\n\";\n\n\tvar encodings_pars_fragment = \"\\nvec4 LinearToLinear( in vec4 value ) {\\n return value;\\n}\\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\\n return vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\\n}\\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\\n return vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n return vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\\n}\\nvec4 RGBEToLinear( in vec4 value ) {\\n return vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n float maxComponent = max( max( value.r, value.g ), value.b );\\n float fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n return vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n return vec4( value.xyz * value.w * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n float maxRGB = max( value.x, max( value.g, value.b ) );\\n float M = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n M = ceil( M * 255.0 ) / 255.0;\\n return vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n return vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n float maxRGB = max( value.x, max( value.g, value.b ) );\\n float D = max( maxRange / maxRGB, 1.0 );\\n D = min( floor( D ) / 255.0, 1.0 );\\n return vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\\n}\\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\\nvec4 LinearToLogLuv( in vec4 value ) {\\n vec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\\n Xp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\\n vec4 vResult;\\n vResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n float Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n vResult.w = fract(Le);\\n vResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\\n return vResult;\\n}\\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\\nvec4 LogLuvToLinear( in vec4 value ) {\\n float Le = value.z * 255.0 + value.w;\\n vec3 Xp_Y_XYZp;\\n Xp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\\n Xp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n Xp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n vec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\\n return vec4( max(vRGB, 0.0), 1.0 );\\n}\\n\";\n\n\tvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\tvec2 sampleUV;\\n\\t\\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\\n\\t\\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\tvec4 envColor = texture2D( envMap, sampleUV );\\n\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\\n\\t\\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\tenvColor = envMapTexelToLinear( envColor );\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_pars_fragment = \"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\\n\\tuniform float reflectivity;\\n\\tuniform float envMapIntenstiy;\\n#endif\\n#ifdef USE_ENVMAP\\n\\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\tuniform float flipEnvMap;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\\n\";\n\n\tvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tfloat depth = gl_FragDepthEXT / gl_FragCoord.w;\\n\\t#else\\n\\t\\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\n\\t#endif\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, depth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\\n\";\n\n\tvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\n\tvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n#endif\\n\";\n\n\tvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\n\tvar lights_lambert_vertex = \"vec3 diffuse = vec3( 1.0 );\\nGeometricContext geometry;\\ngeometry.position = mvPosition.xyz;\\ngeometry.normal = normalize( transformedNormal );\\ngeometry.viewDir = normalize( -mvPosition.xyz );\\nGeometricContext backGeometry;\\nbackGeometry.position = geometry.position;\\nbackGeometry.normal = -geometry.normal;\\nbackGeometry.viewDir = geometry.viewDir;\\nvLightFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\n\\tvLightBack = vec3( 0.0 );\\n#endif\\nIncidentLight directLight;\\nfloat dotNL;\\nvec3 directLightColor_Diffuse;\\n#if NUM_POINT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_DIR_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar lights_pars = \"uniform vec3 ambientLightColor;\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treturn irradiance;\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tdirectLight.color = directionalLight.color;\\n\\t\\tdirectLight.direction = directionalLight.direction;\\n\\t\\tdirectLight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = pointLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tif ( testLightInRange( lightDistance, pointLight.distance ) ) {\\n\\t\\t\\tdirectLight.color = pointLight.color;\\n\\t\\t\\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tfloat angleCos = dot( directLight.direction, spotLight.direction );\\n\\t\\tif ( all( bvec2( angleCos > spotLight.coneCos, testLightInRange( lightDistance, spotLight.distance ) ) ) ) {\\n\\t\\t\\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\t\\tdirectLight.color = spotLight.color;\\n\\t\\t\\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\\n\\t\\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tirradiance *= PI;\\n\\t\\t#endif\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\\t\\t#include \\n\\t\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\\n\\t\\t#else\\n\\t\\t\\tvec4 envMapColor = vec4( 0.0 );\\n\\t\\t#endif\\n\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t}\\n\\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\tfloat maxMIPLevelScalar = float( maxMIPLevel );\\n\\t\\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\\n\\t\\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\\n\\t}\\n\\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\\n\\t\\t#endif\\n\\t\\t#include \\n\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\\n\\t\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\t\\tvec2 sampleUV;\\n\\t\\t\\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\\n\\t\\t\\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\t\\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#endif\\n\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t}\\n#endif\\n\";\n\n\tvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\\n\";\n\n\tvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\nstruct BlinnPhongMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tvec3\\tspecularColor;\\n\\tfloat\\tspecularShininess;\\n\\tfloat\\tspecularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\\n\";\n\n\tvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\\n#ifdef STANDARD\\n\\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.clearCoat = saturate( clearCoat );\\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\\n#endif\\n\";\n\n\tvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tfloat\\tspecularRoughness;\\n\\tvec3\\tspecularColor;\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoat;\\n\\t\\tfloat clearCoatRoughness;\\n\\t#endif\\n};\\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\\n\\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\\n}\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\\n\\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifndef STANDARD\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\tfloat dotNL = dotNV;\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\\n\";\n\n\tvar lights_template = \"\\nGeometricContext geometry;\\ngeometry.position = - vViewPosition;\\ngeometry.normal = normal;\\ngeometry.viewDir = normalize( vViewPosition );\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tlightMapIrradiance *= PI;\\n\\t\\t#endif\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t}\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t \\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\\n\\t#endif\\n\\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\\n\\t#ifndef STANDARD\\n\\t\\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\\n\\t#else\\n\\t\\tvec3 clearCoatRadiance = vec3( 0.0 );\\n\\t#endif\\n\\t\\t\\n\\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\\n#endif\\n\";\n\n\tvar logdepthbuf_fragment = \"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\\n\\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\\n#endif\";\n\n\tvar logdepthbuf_pars_fragment = \"#ifdef USE_LOGDEPTHBUF\\n\\tuniform float logDepthBufFC;\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n#endif\\n\";\n\n\tvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n\\tuniform float logDepthBufFC;\\n#endif\";\n\n\tvar logdepthbuf_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvFragDepth = 1.0 + gl_Position.w;\\n\\t#else\\n\\t\\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\\n\\t#endif\\n#endif\\n\";\n\n\tvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\ttexelColor = mapTexelToLinear( texelColor );\\n\\tdiffuseColor *= texelColor;\\n#endif\\n\";\n\n\tvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar map_particle_fragment = \"#ifdef USE_MAP\\n\\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\\n\\tdiffuseColor *= mapTexelToLinear( mapTexel );\\n#endif\\n\";\n\n\tvar map_particle_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform vec4 offsetRepeat;\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.r;\\n#endif\\n\";\n\n\tvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\n\tvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\n\\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\n\\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\n\\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\n#endif\\n\";\n\n\tvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_MORPHNORMALS\\n\\tuniform float morphTargetInfluences[ 8 ];\\n\\t#else\\n\\tuniform float morphTargetInfluences[ 4 ];\\n\\t#endif\\n#endif\";\n\n\tvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\n\\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\n\\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\n\\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n\\t#ifndef USE_MORPHNORMALS\\n\\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\n\\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\n\\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\n\\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n\\t#endif\\n#endif\\n\";\n\n\tvar normal_flip = \"#ifdef DOUBLE_SIDED\\n\\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n#else\\n\\tfloat flipNormal = 1.0;\\n#endif\\n\";\n\n\tvar normal_fragment = \"#ifdef FLAT_SHADED\\n\\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\\n\\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal ) * flipNormal;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tnormal = perturbNormal2Arb( -vViewPosition, normal );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\\n#endif\\n\";\n\n\tvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n\\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\\n\\t\\tvec3 q0 = dFdx( eye_pos.xyz );\\n\\t\\tvec3 q1 = dFdy( eye_pos.xyz );\\n\\t\\tvec2 st0 = dFdx( vUv.st );\\n\\t\\tvec2 st1 = dFdy( vUv.st );\\n\\t\\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\\n\\t\\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\\n\\t\\tvec3 N = normalize( surf_norm );\\n\\t\\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t\\tmapN.xy = normalScale * mapN.xy;\\n\\t\\tmat3 tsn = mat3( S, T, N );\\n\\t\\treturn normalize( tsn * mapN );\\n\\t}\\n#endif\\n\";\n\n\tvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n return normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n return 1.0 - 2.0 * rgb.xyz;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n return ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n return linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n return (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n return ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\\n\";\n\n\tvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\\n\";\n\n\tvar project_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 mvPosition = modelViewMatrix * skinned;\\n#else\\n\\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\\n#endif\\ngl_Position = projectionMatrix * mvPosition;\\n\";\n\n\tvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.r;\\n#endif\\n\";\n\n\tvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\n\tvar shadowmap_pars_fragment = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\\n\\t\\tconst vec2 offset = vec2( 0.0, 1.0 );\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / size;\\n\\t\\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\\n\\t\\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\\n\\t\\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\\n\\t\\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\\n\\t\\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\\n\\t\\tvec2 f = fract( uv * size + 0.5 );\\n\\t\\tfloat a = mix( lb, lt, f.y );\\n\\t\\tfloat b = mix( rb, rt, f.y );\\n\\t\\tfloat c = mix( a, b, f.x );\\n\\t\\treturn c;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\n\\t\\tbool inFrustum = all( inFrustumVec );\\n\\t\\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n\\t\\tbool frustumTest = all( frustumTestVec );\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn 1.0;\\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 ) {\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar shadowmap_pars_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n#endif\\n\";\n\n\tvar shadowmap_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n#endif\\n\";\n\n\tvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\tDirectionalLight directionalLight;\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\tSpotLight spotLight;\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\tPointLight pointLight;\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\\n\";\n\n\tvar 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\n\tvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\t#ifdef BONE_TEXTURE\\n\\t\\tuniform sampler2D boneTexture;\\n\\t\\tuniform int boneTextureWidth;\\n\\t\\tuniform int boneTextureHeight;\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tfloat j = i * 4.0;\\n\\t\\t\\tfloat x = mod( j, float( boneTextureWidth ) );\\n\\t\\t\\tfloat y = floor( j / float( boneTextureWidth ) );\\n\\t\\t\\tfloat dx = 1.0 / float( boneTextureWidth );\\n\\t\\t\\tfloat dy = 1.0 / float( boneTextureHeight );\\n\\t\\t\\ty = dy * ( y + 0.5 );\\n\\t\\t\\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n\\t\\t\\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n\\t\\t\\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n\\t\\t\\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n\\t\\t\\tmat4 bone = mat4( v1, v2, v3, v4 );\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#else\\n\\t\\tuniform mat4 boneMatrices[ MAX_BONES ];\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tmat4 bone = boneMatrices[ int(i) ];\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#endif\\n#endif\\n\";\n\n\tvar 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\\tskinned = bindMatrixInverse * skinned;\\n#endif\\n\";\n\n\tvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n#endif\\n\";\n\n\tvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\n\tvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\n\tvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\\n\";\n\n\tvar tonemapping_pars_fragment = \"#define saturate(a) clamp( a, 0.0, 1.0 )\\nuniform float toneMappingExposure;\\nuniform float toneMappingWhitePoint;\\nvec3 LinearToneMapping( vec3 color ) {\\n return toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n color *= toneMappingExposure;\\n return saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\\nvec3 Uncharted2ToneMapping( vec3 color ) {\\n color *= toneMappingExposure;\\n return saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n color *= toneMappingExposure;\\n color = max( vec3( 0.0 ), color - 0.004 );\\n return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\n\";\n\n\tvar uv_pars_fragment = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n#endif\";\n\n\tvar uv_pars_vertex = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n\\tuniform vec4 offsetRepeat;\\n#endif\\n\";\n\n\tvar uv_vertex = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\\n#endif\";\n\n\tvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = uv2;\\n#endif\";\n\n\tvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\\n\\t#ifdef USE_SKINNING\\n\\t\\tvec4 worldPosition = modelMatrix * skinned;\\n\\t#else\\n\\t\\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\\n\\t#endif\\n#endif\\n\";\n\n\tvar cube_frag = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\\n\\tgl_FragColor.a *= opacity;\\n}\\n\";\n\n\tvar cube_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar depth_frag = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\\n\\t#endif\\n}\\n\";\n\n\tvar depth_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar distanceRGBA_frag = \"uniform vec3 lightPos;\\nvarying vec4 vWorldPosition;\\n#include \\n#include \\n#include \\nvoid main () {\\n\\t#include \\n\\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\\n}\\n\";\n\n\tvar distanceRGBA_vert = \"varying vec4 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvWorldPosition = worldPosition;\\n}\\n\";\n\n\tvar equirect_frag = \"uniform sampler2D tEquirect;\\nuniform float tFlip;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvec3 direction = normalize( vWorldPosition );\\n\\tvec2 sampleUV;\\n\\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\\n\\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n}\\n\";\n\n\tvar equirect_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar linedashed_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar linedashed_vert = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvLineDistance = scale * lineDistance;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight;\\n\\treflectedLight.directDiffuse = vec3( 0.0 );\\n\\treflectedLight.directSpecular = vec3( 0.0 );\\n\\treflectedLight.indirectDiffuse = diffuseColor.rgb;\\n\\treflectedLight.indirectSpecular = vec3( 0.0 );\\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_ENVMAP\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshlambert_frag = \"uniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\\n\\t#else\\n\\t\\treflectedLight.directDiffuse = vLightFront;\\n\\t#endif\\n\\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshlambert_vert = \"#define LAMBERT\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphong_frag = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphong_vert = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphysical_frag = \"#define PHYSICAL\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifndef STANDARD\\n\\tuniform float clearCoat;\\n\\tuniform float clearCoatRoughness;\\n#endif\\nuniform float envMapIntensity;\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphysical_vert = \"#define PHYSICAL\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar normal_frag = \"uniform float opacity;\\nvarying vec3 vNormal;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( vNormal ), opacity );\\n\\t#include \\n}\\n\";\n\n\tvar normal_vert = \"varying vec3 vNormal;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvNormal = normalize( normalMatrix * normal );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar points_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar points_vert = \"uniform float size;\\nuniform float scale;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tgl_PointSize = size * ( scale / - mvPosition.z );\\n\\t#else\\n\\t\\tgl_PointSize = size;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar shadow_frag = \"uniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\\n}\\n\";\n\n\tvar shadow_vert = \"#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar ShaderChunk = {\n\t\talphamap_fragment: alphamap_fragment,\n\t\talphamap_pars_fragment: alphamap_pars_fragment,\n\t\talphatest_fragment: alphatest_fragment,\n\t\taomap_fragment: aomap_fragment,\n\t\taomap_pars_fragment: aomap_pars_fragment,\n\t\tbegin_vertex: begin_vertex,\n\t\tbeginnormal_vertex: beginnormal_vertex,\n\t\tbsdfs: bsdfs,\n\t\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\t\tclipping_planes_fragment: clipping_planes_fragment,\n\t\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\t\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\t\tclipping_planes_vertex: clipping_planes_vertex,\n\t\tcolor_fragment: color_fragment,\n\t\tcolor_pars_fragment: color_pars_fragment,\n\t\tcolor_pars_vertex: color_pars_vertex,\n\t\tcolor_vertex: color_vertex,\n\t\tcommon: common,\n\t\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\t\tdefaultnormal_vertex: defaultnormal_vertex,\n\t\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\t\tdisplacementmap_vertex: displacementmap_vertex,\n\t\temissivemap_fragment: emissivemap_fragment,\n\t\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\t\tencodings_fragment: encodings_fragment,\n\t\tencodings_pars_fragment: encodings_pars_fragment,\n\t\tenvmap_fragment: envmap_fragment,\n\t\tenvmap_pars_fragment: envmap_pars_fragment,\n\t\tenvmap_pars_vertex: envmap_pars_vertex,\n\t\tenvmap_vertex: envmap_vertex,\n\t\tfog_fragment: fog_fragment,\n\t\tfog_pars_fragment: fog_pars_fragment,\n\t\tlightmap_fragment: lightmap_fragment,\n\t\tlightmap_pars_fragment: lightmap_pars_fragment,\n\t\tlights_lambert_vertex: lights_lambert_vertex,\n\t\tlights_pars: lights_pars,\n\t\tlights_phong_fragment: lights_phong_fragment,\n\t\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\t\tlights_physical_fragment: lights_physical_fragment,\n\t\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\t\tlights_template: lights_template,\n\t\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\t\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\t\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\t\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\t\tmap_fragment: map_fragment,\n\t\tmap_pars_fragment: map_pars_fragment,\n\t\tmap_particle_fragment: map_particle_fragment,\n\t\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\t\tmetalnessmap_fragment: metalnessmap_fragment,\n\t\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\t\tmorphnormal_vertex: morphnormal_vertex,\n\t\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\t\tmorphtarget_vertex: morphtarget_vertex,\n\t\tnormal_flip: normal_flip,\n\t\tnormal_fragment: normal_fragment,\n\t\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\t\tpacking: packing,\n\t\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\t\tproject_vertex: project_vertex,\n\t\troughnessmap_fragment: roughnessmap_fragment,\n\t\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\t\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\t\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\t\tshadowmap_vertex: shadowmap_vertex,\n\t\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\t\tskinbase_vertex: skinbase_vertex,\n\t\tskinning_pars_vertex: skinning_pars_vertex,\n\t\tskinning_vertex: skinning_vertex,\n\t\tskinnormal_vertex: skinnormal_vertex,\n\t\tspecularmap_fragment: specularmap_fragment,\n\t\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\t\ttonemapping_fragment: tonemapping_fragment,\n\t\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\t\tuv_pars_fragment: uv_pars_fragment,\n\t\tuv_pars_vertex: uv_pars_vertex,\n\t\tuv_vertex: uv_vertex,\n\t\tuv2_pars_fragment: uv2_pars_fragment,\n\t\tuv2_pars_vertex: uv2_pars_vertex,\n\t\tuv2_vertex: uv2_vertex,\n\t\tworldpos_vertex: worldpos_vertex,\n\n\t\tcube_frag: cube_frag,\n\t\tcube_vert: cube_vert,\n\t\tdepth_frag: depth_frag,\n\t\tdepth_vert: depth_vert,\n\t\tdistanceRGBA_frag: distanceRGBA_frag,\n\t\tdistanceRGBA_vert: distanceRGBA_vert,\n\t\tequirect_frag: equirect_frag,\n\t\tequirect_vert: equirect_vert,\n\t\tlinedashed_frag: linedashed_frag,\n\t\tlinedashed_vert: linedashed_vert,\n\t\tmeshbasic_frag: meshbasic_frag,\n\t\tmeshbasic_vert: meshbasic_vert,\n\t\tmeshlambert_frag: meshlambert_frag,\n\t\tmeshlambert_vert: meshlambert_vert,\n\t\tmeshphong_frag: meshphong_frag,\n\t\tmeshphong_vert: meshphong_vert,\n\t\tmeshphysical_frag: meshphysical_frag,\n\t\tmeshphysical_vert: meshphysical_vert,\n\t\tnormal_frag: normal_frag,\n\t\tnormal_vert: normal_vert,\n\t\tpoints_frag: points_frag,\n\t\tpoints_vert: points_vert,\n\t\tshadow_frag: shadow_frag,\n\t\tshadow_vert: shadow_vert\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Color( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\t\t\treturn this.set( r );\n\n\t\t}\n\n\t\treturn this.setRGB( r, g, b );\n\n\t}\n\n\tColor.prototype = {\n\n\t\tconstructor: Color,\n\n\t\tisColor: true,\n\n\t\tr: 1, g: 1, b: 1,\n\n\t\tset: function ( value ) {\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\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.r = scalar;\n\t\t\tthis.g = scalar;\n\t\t\tthis.b = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHex: function ( hex ) {\n\n\t\t\thex = Math.floor( hex );\n\n\t\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetRGB: function ( r, g, b ) {\n\n\t\t\tthis.r = r;\n\t\t\tthis.g = g;\n\t\t\tthis.b = b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHSL: function () {\n\n\t\t\tfunction hue2rgb( p, q, t ) {\n\n\t\t\t\tif ( t < 0 ) t += 1;\n\t\t\t\tif ( t > 1 ) t -= 1;\n\t\t\t\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\t\t\t\tif ( t < 1 / 2 ) return q;\n\t\t\t\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\t\t\t\treturn p;\n\n\t\t\t}\n\n\t\t\treturn function setHSL( h, s, l ) {\n\n\t\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\t\t\th = _Math.euclideanModulo( h, 1 );\n\t\t\t\ts = _Math.clamp( s, 0, 1 );\n\t\t\t\tl = _Math.clamp( l, 0, 1 );\n\n\t\t\t\tif ( s === 0 ) {\n\n\t\t\t\t\tthis.r = this.g = this.b = l;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\t\t\tvar q = ( 2 * l ) - p;\n\n\t\t\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetStyle: function ( style ) {\n\n\t\t\tfunction handleAlpha( string ) {\n\n\t\t\t\tif ( string === undefined ) return;\n\n\t\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tvar m;\n\n\t\t\tif ( m = /^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t\t// rgb / hsl\n\n\t\t\t\tvar color;\n\t\t\t\tvar name = m[ 1 ];\n\t\t\t\tvar components = m[ 2 ];\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'rgb':\n\t\t\t\t\tcase 'rgba':\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'hsl':\n\t\t\t\t\tcase 'hsla':\n\n\t\t\t\t\t\tif ( color = /^([0-9]*\\.?[0-9]+)\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\t\tvar h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\t\tvar s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\t\tvar l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( m = /^\\#([A-Fa-f0-9]+)$/.exec( style ) ) {\n\n\t\t\t\t// hex color\n\n\t\t\t\tvar hex = m[ 1 ];\n\t\t\t\tvar size = hex.length;\n\n\t\t\t\tif ( size === 3 ) {\n\n\t\t\t\t\t// #ff0\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t\t// #ff0000\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( style && style.length > 0 ) {\n\n\t\t\t\t// color keywords\n\t\t\t\tvar hex = ColorKeywords[ style ];\n\n\t\t\t\tif ( hex !== undefined ) {\n\n\t\t\t\t\t// red\n\t\t\t\t\tthis.setHex( hex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// unknown color\n\t\t\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t\t},\n\n\t\tcopy: function ( color ) {\n\n\t\t\tthis.r = color.r;\n\t\t\tthis.g = color.g;\n\t\t\tthis.b = color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyGammaToLinear: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tthis.r = Math.pow( color.r, gammaFactor );\n\t\t\tthis.g = Math.pow( color.g, gammaFactor );\n\t\t\tthis.b = Math.pow( color.b, gammaFactor );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyLinearToGamma: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tvar safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;\n\n\t\t\tthis.r = Math.pow( color.r, safeInverse );\n\t\t\tthis.g = Math.pow( color.g, safeInverse );\n\t\t\tthis.b = Math.pow( color.b, safeInverse );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertGammaToLinear: function () {\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tthis.r = r * r;\n\t\t\tthis.g = g * g;\n\t\t\tthis.b = b * b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertLinearToGamma: function () {\n\n\t\t\tthis.r = Math.sqrt( this.r );\n\t\t\tthis.g = Math.sqrt( this.g );\n\t\t\tthis.b = Math.sqrt( this.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetHex: function () {\n\n\t\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t\t},\n\n\t\tgetHexString: function () {\n\n\t\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t\t},\n\n\t\tgetHSL: function ( optionalTarget ) {\n\n\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\t\tvar hsl = optionalTarget || { h: 0, s: 0, l: 0 };\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tvar max = Math.max( r, g, b );\n\t\t\tvar min = Math.min( r, g, b );\n\n\t\t\tvar hue, saturation;\n\t\t\tvar lightness = ( min + max ) / 2.0;\n\n\t\t\tif ( min === max ) {\n\n\t\t\t\thue = 0;\n\t\t\t\tsaturation = 0;\n\n\t\t\t} else {\n\n\t\t\t\tvar delta = max - min;\n\n\t\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\t\tswitch ( max ) {\n\n\t\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t\t}\n\n\t\t\t\thue /= 6;\n\n\t\t\t}\n\n\t\t\thsl.h = hue;\n\t\t\thsl.s = saturation;\n\t\t\thsl.l = lightness;\n\n\t\t\treturn hsl;\n\n\t\t},\n\n\t\tgetStyle: function () {\n\n\t\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t\t},\n\n\t\toffsetHSL: function ( h, s, l ) {\n\n\t\t\tvar hsl = this.getHSL();\n\n\t\t\thsl.h += h; hsl.s += s; hsl.l += l;\n\n\t\t\tthis.setHSL( hsl.h, hsl.s, hsl.l );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( color ) {\n\n\t\t\tthis.r += color.r;\n\t\t\tthis.g += color.g;\n\t\t\tthis.b += color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddColors: function ( color1, color2 ) {\n\n\t\t\tthis.r = color1.r + color2.r;\n\t\t\tthis.g = color1.g + color2.g;\n\t\t\tthis.b = color1.b + color2.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.r += s;\n\t\t\tthis.g += s;\n\t\t\tthis.b += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function( color ) {\n\n\t\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( color ) {\n\n\t\t\tthis.r *= color.r;\n\t\t\tthis.g *= color.g;\n\t\t\tthis.b *= color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tthis.r *= s;\n\t\t\tthis.g *= s;\n\t\t\tthis.b *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerp: function ( color, alpha ) {\n\n\t\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( c ) {\n\n\t\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.r = array[ offset ];\n\t\t\tthis.g = array[ offset + 1 ];\n\t\t\tthis.b = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.r;\n\t\t\tarray[ offset + 1 ] = this.g;\n\t\t\tarray[ offset + 2 ] = this.b;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\treturn this.getHex();\n\n\t\t}\n\n\t};\n\n\tvar 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, '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\n\t/**\n\t * Uniforms library for shared webgl shaders\n\t */\n\n\tvar UniformsLib = {\n\n\t\tcommon: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) },\n\n\t\t\tspecularMap: { value: null },\n\t\t\talphaMap: { value: null },\n\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: - 1 },\n\t\t\treflectivity: { value: 1.0 },\n\t\t\trefractionRatio: { value: 0.98 }\n\n\t\t},\n\n\t\taomap: {\n\n\t\t\taoMap: { value: null },\n\t\t\taoMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\tlightmap: {\n\n\t\t\tlightMap: { value: null },\n\t\t\tlightMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\temissivemap: {\n\n\t\t\temissiveMap: { value: null }\n\n\t\t},\n\n\t\tbumpmap: {\n\n\t\t\tbumpMap: { value: null },\n\t\t\tbumpScale: { value: 1 }\n\n\t\t},\n\n\t\tnormalmap: {\n\n\t\t\tnormalMap: { value: null },\n\t\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t\t},\n\n\t\tdisplacementmap: {\n\n\t\t\tdisplacementMap: { value: null },\n\t\t\tdisplacementScale: { value: 1 },\n\t\t\tdisplacementBias: { value: 0 }\n\n\t\t},\n\n\t\troughnessmap: {\n\n\t\t\troughnessMap: { value: null }\n\n\t\t},\n\n\t\tmetalnessmap: {\n\n\t\t\tmetalnessMap: { value: null }\n\n\t\t},\n\n\t\tfog: {\n\n\t\t\tfogDensity: { value: 0.00025 },\n\t\t\tfogNear: { value: 1 },\n\t\t\tfogFar: { value: 2000 },\n\t\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t\t},\n\n\t\tlights: {\n\n\t\t\tambientLightColor: { value: [] },\n\n\t\t\tdirectionalLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tcolor: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tdirectionalShadowMap: { value: [] },\n\t\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\t\tspotLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdirection: {},\n\t\t\t\tdistance: {},\n\t\t\t\tconeCos: {},\n\t\t\t\tpenumbraCos: {},\n\t\t\t\tdecay: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tspotShadowMap: { value: [] },\n\t\t\tspotShadowMatrix: { value: [] },\n\n\t\t\tpointLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdecay: {},\n\t\t\t\tdistance: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tpointShadowMap: { value: [] },\n\t\t\tpointShadowMatrix: { value: [] },\n\n\t\t\themisphereLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tskyColor: {},\n\t\t\t\tgroundColor: {}\n\t\t\t} }\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\t\t\tsize: { value: 1.0 },\n\t\t\tscale: { value: 1.0 },\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) }\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t */\n\n\tvar ShaderLib = {\n\n\t\tbasic: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.fog\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t\t},\n\n\t\tlambert: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\n\t\t\t\t{\n\t\t\t\t\temissive : { value: new Color( 0x000000 ) }\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t\t},\n\n\t\tphong: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\n\t\t\t\t{\n\t\t\t\t\temissive : { value: new Color( 0x000000 ) },\n\t\t\t\t\tspecular : { value: new Color( 0x111111 ) },\n\t\t\t\t\tshininess: { value: 30 }\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t\t},\n\n\t\tstandard: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.roughnessmap,\n\t\t\t\tUniformsLib.metalnessmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\n\t\t\t\t{\n\t\t\t\t\temissive : { value: new Color( 0x000000 ) },\n\t\t\t\t\troughness: { value: 0.5 },\n\t\t\t\t\tmetalness: { value: 0 },\n\t\t\t\t\tenvMapIntensity : { value: 1 }, // temporary\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.points,\n\t\t\t\tUniformsLib.fog\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.points_vert,\n\t\t\tfragmentShader: ShaderChunk.points_frag\n\n\t\t},\n\n\t\tdashed: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.fog,\n\n\t\t\t\t{\n\t\t\t\t\tscale : { value: 1 },\n\t\t\t\t\tdashSize : { value: 1 },\n\t\t\t\t\ttotalSize: { value: 2 }\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t\t},\n\n\t\tdepth: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.displacementmap\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.depth_vert,\n\t\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t\t},\n\n\t\tnormal: {\n\n\t\t\tuniforms: {\n\n\t\t\t\topacity : { value: 1.0 }\n\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.normal_vert,\n\t\t\tfragmentShader: ShaderChunk.normal_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tcube: {\n\n\t\t\tuniforms: {\n\t\t\t\ttCube: { value: null },\n\t\t\t\ttFlip: { value: - 1 },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.cube_vert,\n\t\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tequirect: {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t\ttFlip: { value: - 1 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t\t},\n\n\t\tdistanceRGBA: {\n\n\t\t\tuniforms: {\n\n\t\t\t\tlightPos: { value: new Vector3() }\n\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t\t}\n\n\t};\n\n\tShaderLib.physical = {\n\n\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\tShaderLib.standard.uniforms,\n\n\t\t\t{\n\t\t\t\tclearCoat: { value: 0 },\n\t\t\t\tclearCoatRoughness: { value: 0 }\n\t\t\t}\n\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Box2( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );\n\n\t}\n\n\tBox2.prototype = {\n\n\t\tconstructor: Box2,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = + Infinity;\n\t\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\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\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tif ( point.x < this.min.x || point.x > this.max.x ||\n\t\t\t point.y < this.min.y || point.y > this.max.y ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\tif ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) &&\n\t\t\t ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\n\t\t\tif ( box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t box.max.y < this.min.y || box.min.y > this.max.y ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlarePlugin( renderer, flares ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar shader, program, attributes, uniforms;\n\n\t\tvar tempTexture, occlusionTexture;\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 1, - 1, 0, 0,\n\t\t\t\t 1, - 1, 1, 0,\n\t\t\t\t 1, 1, 1, 1,\n\t\t\t\t- 1, 1, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\t// buffers\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\t// textures\n\n\t\t\ttempTexture = gl.createTexture();\n\t\t\tocclusionTexture = gl.createTexture();\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tshader = {\n\n\t\t\t\tvertexShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform vec3 screenPosition;\",\n\t\t\t\t\t\"uniform vec2 scale;\",\n\t\t\t\t\t\"uniform float rotation;\",\n\n\t\t\t\t\t\"uniform sampler2D occlusionMap;\",\n\n\t\t\t\t\t\"attribute vec2 position;\",\n\t\t\t\t\t\"attribute vec2 uv;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t\"vUV = uv;\",\n\n\t\t\t\t\t\t\"vec2 pos = position;\",\n\n\t\t\t\t\t\t\"if ( renderType == 2 ) {\",\n\n\t\t\t\t\t\t\t\"vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\",\n\n\t\t\t\t\t\t\t\"vVisibility = visibility.r / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.g / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= visibility.b / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.a / 9.0;\",\n\n\t\t\t\t\t\t\t\"pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\",\n\t\t\t\t\t\t\t\"pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\t\"gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" ),\n\n\t\t\t\tfragmentShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform sampler2D map;\",\n\t\t\t\t\t\"uniform float opacity;\",\n\t\t\t\t\t\"uniform vec3 color;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t// pink square\n\n\t\t\t\t\t\t\"if ( renderType == 0 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\",\n\n\t\t\t\t\t\t// restore\n\n\t\t\t\t\t\t\"} else if ( renderType == 1 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = texture2D( map, vUV );\",\n\n\t\t\t\t\t\t// flare\n\n\t\t\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\t\t\"vec4 texture = texture2D( map, vUV );\",\n\t\t\t\t\t\t\t\"texture.a *= opacity * vVisibility;\",\n\t\t\t\t\t\t\t\"gl_FragColor = texture;\",\n\t\t\t\t\t\t\t\"gl_FragColor.rgb *= color;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" )\n\n\t\t\t};\n\n\t\t\tprogram = createProgram( shader );\n\n\t\t\tattributes = {\n\t\t\t\tvertex: gl.getAttribLocation ( program, \"position\" ),\n\t\t\t\tuv: gl.getAttribLocation ( program, \"uv\" )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\trenderType: gl.getUniformLocation( program, \"renderType\" ),\n\t\t\t\tmap: gl.getUniformLocation( program, \"map\" ),\n\t\t\t\tocclusionMap: gl.getUniformLocation( program, \"occlusionMap\" ),\n\t\t\t\topacity: gl.getUniformLocation( program, \"opacity\" ),\n\t\t\t\tcolor: gl.getUniformLocation( program, \"color\" ),\n\t\t\t\tscale: gl.getUniformLocation( program, \"scale\" ),\n\t\t\t\trotation: gl.getUniformLocation( program, \"rotation\" ),\n\t\t\t\tscreenPosition: gl.getUniformLocation( program, \"screenPosition\" )\n\t\t\t};\n\n\t\t}\n\n\t\t/*\n\t\t * Render lens flares\n\t\t * Method: renders 16x16 0xff00ff-colored points scattered over the light source area,\n\t\t * reads these back and calculates occlusion.\n\t\t */\n\n\t\tthis.render = function ( scene, camera, viewport ) {\n\n\t\t\tif ( flares.length === 0 ) return;\n\n\t\t\tvar tempPosition = new Vector3();\n\n\t\t\tvar invAspect = viewport.w / viewport.z,\n\t\t\t\thalfViewportWidth = viewport.z * 0.5,\n\t\t\t\thalfViewportHeight = viewport.w * 0.5;\n\n\t\t\tvar size = 16 / viewport.w,\n\t\t\t\tscale = new Vector2( size * invAspect, size );\n\n\t\t\tvar screenPosition = new Vector3( 1, 1, 0 ),\n\t\t\t\tscreenPositionPixels = new Vector2( 1, 1 );\n\n\t\t\tvar validArea = new Box2();\n\n\t\t\tvalidArea.min.set( viewport.x, viewport.y );\n\t\t\tvalidArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) );\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.vertex );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t// loop through all lens flares to update their occlusion and positions\n\t\t\t// setup gl and common used attribs/uniforms\n\n\t\t\tgl.uniform1i( uniforms.occlusionMap, 0 );\n\t\t\tgl.uniform1i( uniforms.map, 1 );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.setDepthWrite( false );\n\n\t\t\tfor ( var i = 0, l = flares.length; i < l; i ++ ) {\n\n\t\t\t\tsize = 16 / viewport.w;\n\t\t\t\tscale.set( size * invAspect, size );\n\n\t\t\t\t// calc object screen position\n\n\t\t\t\tvar flare = flares[ i ];\n\n\t\t\t\ttempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] );\n\n\t\t\t\ttempPosition.applyMatrix4( camera.matrixWorldInverse );\n\t\t\t\ttempPosition.applyProjection( camera.projectionMatrix );\n\n\t\t\t\t// setup arrays for gl programs\n\n\t\t\t\tscreenPosition.copy( tempPosition );\n\n\t\t\t\t// horizontal and vertical coordinate of the lower left corner of the pixels to copy\n\n\t\t\t\tscreenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8;\n\t\t\t\tscreenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8;\n\n\t\t\t\t// screen cull\n\n\t\t\t\tif ( validArea.containsPoint( screenPositionPixels ) === true ) {\n\n\t\t\t\t\t// save current RGB to temp texture\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, null );\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// render pink quad\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\n\t\t\t\t\tstate.disable( gl.BLEND );\n\t\t\t\t\tstate.enable( gl.DEPTH_TEST );\n\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// copy result to occlusionMap\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// restore graphics\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 1 );\n\t\t\t\t\tstate.disable( gl.DEPTH_TEST );\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// update object positions\n\n\t\t\t\t\tflare.positionScreen.copy( screenPosition );\n\n\t\t\t\t\tif ( flare.customUpdateCallback ) {\n\n\t\t\t\t\t\tflare.customUpdateCallback( flare );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tflare.updateLensFlares();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// render flares\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 2 );\n\t\t\t\t\tstate.enable( gl.BLEND );\n\n\t\t\t\t\tfor ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar sprite = flare.lensFlares[ j ];\n\n\t\t\t\t\t\tif ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) {\n\n\t\t\t\t\t\t\tscreenPosition.x = sprite.x;\n\t\t\t\t\t\t\tscreenPosition.y = sprite.y;\n\t\t\t\t\t\t\tscreenPosition.z = sprite.z;\n\n\t\t\t\t\t\t\tsize = sprite.size * sprite.scale / viewport.w;\n\n\t\t\t\t\t\t\tscale.x = size * invAspect;\n\t\t\t\t\t\t\tscale.y = size;\n\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\t\t\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.rotation, sprite.rotation );\n\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.opacity, sprite.opacity );\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b );\n\n\t\t\t\t\t\t\tstate.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst );\n\t\t\t\t\t\t\trenderer.setTexture2D( sprite.texture, 1 );\n\n\t\t\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\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// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.DEPTH_TEST );\n\t\t\tstate.setDepthWrite( true );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram( shader ) {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\n\t\t\tvar prefix = \"precision \" + renderer.getPrecision() + \" float;\\n\";\n\n\t\t\tgl.shaderSource( fragmentShader, prefix + shader.fragmentShader );\n\t\t\tgl.shaderSource( vertexShader, prefix + shader.vertexShader );\n\n\t\t\tgl.compileShader( fragmentShader );\n\t\t\tgl.compileShader( vertexShader );\n\n\t\t\tgl.attachShader( program, fragmentShader );\n\t\t\tgl.attachShader( program, vertexShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpritePlugin( renderer, sprites ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar program, attributes, uniforms;\n\n\t\tvar texture;\n\n\t\t// decompose matrixWorld\n\n\t\tvar spritePosition = new Vector3();\n\t\tvar spriteRotation = new Quaternion();\n\t\tvar spriteScale = new Vector3();\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 0.5, - 0.5, 0, 0,\n\t\t\t\t 0.5, - 0.5, 1, 0,\n\t\t\t\t 0.5, 0.5, 1, 1,\n\t\t\t\t- 0.5, 0.5, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\tprogram = createProgram();\n\n\t\t\tattributes = {\n\t\t\t\tposition:\t\t\tgl.getAttribLocation ( program, 'position' ),\n\t\t\t\tuv:\t\t\t\t\tgl.getAttribLocation ( program, 'uv' )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\tuvOffset:\t\t\tgl.getUniformLocation( program, 'uvOffset' ),\n\t\t\t\tuvScale:\t\t\tgl.getUniformLocation( program, 'uvScale' ),\n\n\t\t\t\trotation:\t\t\tgl.getUniformLocation( program, 'rotation' ),\n\t\t\t\tscale:\t\t\t\tgl.getUniformLocation( program, 'scale' ),\n\n\t\t\t\tcolor:\t\t\t\tgl.getUniformLocation( program, 'color' ),\n\t\t\t\tmap:\t\t\t\tgl.getUniformLocation( program, 'map' ),\n\t\t\t\topacity:\t\t\tgl.getUniformLocation( program, 'opacity' ),\n\n\t\t\t\tmodelViewMatrix: \tgl.getUniformLocation( program, 'modelViewMatrix' ),\n\t\t\t\tprojectionMatrix:\tgl.getUniformLocation( program, 'projectionMatrix' ),\n\n\t\t\t\tfogType:\t\t\tgl.getUniformLocation( program, 'fogType' ),\n\t\t\t\tfogDensity:\t\t\tgl.getUniformLocation( program, 'fogDensity' ),\n\t\t\t\tfogNear:\t\t\tgl.getUniformLocation( program, 'fogNear' ),\n\t\t\t\tfogFar:\t\t\t\tgl.getUniformLocation( program, 'fogFar' ),\n\t\t\t\tfogColor:\t\t\tgl.getUniformLocation( program, 'fogColor' ),\n\n\t\t\t\talphaTest:\t\t\tgl.getUniformLocation( program, 'alphaTest' )\n\t\t\t};\n\n\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\tcanvas.width = 8;\n\t\t\tcanvas.height = 8;\n\n\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\tcontext.fillStyle = 'white';\n\t\t\tcontext.fillRect( 0, 0, 8, 8 );\n\n\t\t\ttexture = new Texture( canvas );\n\t\t\ttexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( sprites.length === 0 ) return;\n\n\t\t\t// setup gl\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.position );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.BLEND );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tgl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );\n\n\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\tgl.uniform1i( uniforms.map, 0 );\n\n\t\t\tvar oldFogType = 0;\n\t\t\tvar sceneFogType = 0;\n\t\t\tvar fog = scene.fog;\n\n\t\t\tif ( fog ) {\n\n\t\t\t\tgl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );\n\n\t\t\t\tif ( (fog && fog.isFog) ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogNear, fog.near );\n\t\t\t\t\tgl.uniform1f( uniforms.fogFar, fog.far );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 1 );\n\t\t\t\t\toldFogType = 1;\n\t\t\t\t\tsceneFogType = 1;\n\n\t\t\t\t} else if ( (fog && fog.isFogExp2) ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogDensity, fog.density );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 2 );\n\t\t\t\t\toldFogType = 2;\n\t\t\t\t\tsceneFogType = 2;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tgl.uniform1i( uniforms.fogType, 0 );\n\t\t\t\toldFogType = 0;\n\t\t\t\tsceneFogType = 0;\n\n\t\t\t}\n\n\n\t\t\t// update positions and sort\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\n\t\t\t\tsprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld );\n\t\t\t\tsprite.z = - sprite.modelViewMatrix.elements[ 14 ];\n\n\t\t\t}\n\n\t\t\tsprites.sort( painterSortStable );\n\n\t\t\t// render all sprites\n\n\t\t\tvar scale = [];\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\t\t\t\tvar material = sprite.material;\n\n\t\t\t\tif ( material.visible === false ) continue;\n\n\t\t\t\tgl.uniform1f( uniforms.alphaTest, material.alphaTest );\n\t\t\t\tgl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements );\n\n\t\t\t\tsprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale );\n\n\t\t\t\tscale[ 0 ] = spriteScale.x;\n\t\t\t\tscale[ 1 ] = spriteScale.y;\n\n\t\t\t\tvar fogType = 0;\n\n\t\t\t\tif ( scene.fog && material.fog ) {\n\n\t\t\t\t\tfogType = sceneFogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( oldFogType !== fogType ) {\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, fogType );\n\t\t\t\t\toldFogType = fogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.map !== null ) {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, 0, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, 1, 1 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.uniform1f( uniforms.opacity, material.opacity );\n\t\t\t\tgl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );\n\n\t\t\t\tgl.uniform1f( uniforms.rotation, material.rotation );\n\t\t\t\tgl.uniform2fv( uniforms.scale, scale );\n\n\t\t\t\tstate.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );\n\t\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\t\tstate.setDepthWrite( material.depthWrite );\n\n\t\t\t\tif ( material.map ) {\n\n\t\t\t\t\trenderer.setTexture2D( material.map, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setTexture2D( texture, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram() {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\n\t\t\tgl.shaderSource( vertexShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform float rotation;',\n\t\t\t\t'uniform vec2 scale;',\n\t\t\t\t'uniform vec2 uvOffset;',\n\t\t\t\t'uniform vec2 uvScale;',\n\n\t\t\t\t'attribute vec2 position;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vUV = uvOffset + uv * uvScale;',\n\n\t\t\t\t\t'vec2 alignedPosition = position * scale;',\n\n\t\t\t\t\t'vec2 rotatedPosition;',\n\t\t\t\t\t'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',\n\t\t\t\t\t'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',\n\n\t\t\t\t\t'vec4 finalPosition;',\n\n\t\t\t\t\t'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',\n\t\t\t\t\t'finalPosition.xy += rotatedPosition;',\n\t\t\t\t\t'finalPosition = projectionMatrix * finalPosition;',\n\n\t\t\t\t\t'gl_Position = finalPosition;',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.shaderSource( fragmentShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform vec3 color;',\n\t\t\t\t'uniform sampler2D map;',\n\t\t\t\t'uniform float opacity;',\n\n\t\t\t\t'uniform int fogType;',\n\t\t\t\t'uniform vec3 fogColor;',\n\t\t\t\t'uniform float fogDensity;',\n\t\t\t\t'uniform float fogNear;',\n\t\t\t\t'uniform float fogFar;',\n\t\t\t\t'uniform float alphaTest;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vec4 texture = texture2D( map, vUV );',\n\n\t\t\t\t\t'if ( texture.a < alphaTest ) discard;',\n\n\t\t\t\t\t'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',\n\n\t\t\t\t\t'if ( fogType > 0 ) {',\n\n\t\t\t\t\t\t'float depth = gl_FragCoord.z / gl_FragCoord.w;',\n\t\t\t\t\t\t'float fogFactor = 0.0;',\n\n\t\t\t\t\t\t'if ( fogType == 1 ) {',\n\n\t\t\t\t\t\t\t'fogFactor = smoothstep( fogNear, fogFar, depth );',\n\n\t\t\t\t\t\t'} else {',\n\n\t\t\t\t\t\t\t'const float LOG2 = 1.442695;',\n\t\t\t\t\t\t\t'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );',\n\t\t\t\t\t\t\t'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',\n\n\t\t\t\t\t\t'}',\n\n\t\t\t\t\t\t'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );',\n\n\t\t\t\t\t'}',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.compileShader( vertexShader );\n\t\t\tgl.compileShader( fragmentShader );\n\n\t\t\tgl.attachShader( program, vertexShader );\n\t\t\tgl.attachShader( program, fragmentShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\t\treturn a.renderOrder - b.renderOrder;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn b.id - a.id;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Material() {\n\n\t\tObject.defineProperty( this, 'id', { value: MaterialIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.fog = true;\n\t\tthis.lights = true;\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading\n\t\tthis.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = 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\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\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.alphaTest = 0;\n\t\tthis.premultipliedAlpha = false;\n\n\t\tthis.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer\n\n\t\tthis.visible = true;\n\n\t\tthis._needsUpdate = true;\n\n\t}\n\n\tMaterial.prototype = {\n\n\t\tconstructor: Material,\n\n\t\tisMaterial: true,\n\n\t\tget needsUpdate() {\n\n\t\t\treturn this._needsUpdate;\n\n\t\t},\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.update();\n\t\t\tthis._needsUpdate = value;\n\n\t\t},\n\n\t\tsetValues: function ( values ) {\n\n\t\t\tif ( values === undefined ) return;\n\n\t\t\tfor ( var key in values ) {\n\n\t\t\t\tvar newValue = values[ key ];\n\n\t\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.Material: '\" + key + \"' parameter is undefined.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar currentValue = this[ key ];\n\n\t\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.\" + this.type + \": '\" + key + \"' is not a property of this material.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tif ( (currentValue && currentValue.isColor) ) {\n\n\t\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t\t} else if ( (currentValue && currentValue.isVector3) && (newValue && newValue.isVector3) ) {\n\n\t\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t\t} else if ( key === 'overdraw' ) {\n\n\t\t\t\t\t// ensure overdraw is backwards-compatible with legacy boolean type\n\t\t\t\t\tthis[ key ] = Number( newValue );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar isRoot = meta === undefined;\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tmeta = {\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Material',\n\t\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Material serialization\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( (this.color && this.color.isColor) ) data.color = this.color.getHex();\n\n\t\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\t\tif ( (this.emissive && this.emissive.isColor) ) data.emissive = this.emissive.getHex();\n\t\t\tif ( (this.specular && this.specular.isColor) ) data.specular = this.specular.getHex();\n\t\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\n\t\t\tif ( (this.map && this.map.isTexture) ) data.map = this.map.toJSON( meta ).uuid;\n\t\t\tif ( (this.alphaMap && this.alphaMap.isTexture) ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.lightMap && this.lightMap.isTexture) ) data.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.bumpMap && this.bumpMap.isTexture) ) {\n\n\t\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t\t}\n\t\t\tif ( (this.normalMap && this.normalMap.isTexture) ) {\n\n\t\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t\t}\n\t\t\tif ( (this.displacementMap && this.displacementMap.isTexture) ) {\n\n\t\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t\t}\n\t\t\tif ( (this.roughnessMap && this.roughnessMap.isTexture) ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.metalnessMap && this.metalnessMap.isTexture) ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\t\tif ( (this.emissiveMap && this.emissiveMap.isTexture) ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.specularMap && this.specularMap.isTexture) ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\n\t\t\tif ( (this.envMap && this.envMap.isTexture) ) {\n\n\t\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\t\t\t\tdata.reflectivity = this.reflectivity; // Scale behind envMap\n\n\t\t\t}\n\n\t\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\t\tif ( this.shading !== SmoothShading ) data.shading = this.shading;\n\t\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\t\tif ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors;\n\n\t\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\t\tdata.depthFunc = this.depthFunc;\n\t\t\tdata.depthTest = this.depthTest;\n\t\t\tdata.depthWrite = this.depthWrite;\n\n\t\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\t\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\t\tdata.skinning = this.skinning;\n\t\t\tdata.morphTargets = this.morphTargets;\n\n\t\t\t// TODO: Copied from Object3D.toJSON\n\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.fog = source.fog;\n\t\t\tthis.lights = source.lights;\n\n\t\t\tthis.blending = source.blending;\n\t\t\tthis.side = source.side;\n\t\t\tthis.shading = source.shading;\n\t\t\tthis.vertexColors = source.vertexColors;\n\n\t\t\tthis.opacity = source.opacity;\n\t\t\tthis.transparent = source.transparent;\n\n\t\t\tthis.blendSrc = source.blendSrc;\n\t\t\tthis.blendDst = source.blendDst;\n\t\t\tthis.blendEquation = source.blendEquation;\n\t\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\t\tthis.depthFunc = source.depthFunc;\n\t\t\tthis.depthTest = source.depthTest;\n\t\t\tthis.depthWrite = source.depthWrite;\n\n\t\t\tthis.colorWrite = source.colorWrite;\n\n\t\t\tthis.precision = source.precision;\n\n\t\t\tthis.polygonOffset = source.polygonOffset;\n\t\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\t\tthis.alphaTest = source.alphaTest;\n\n\t\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\t\tthis.overdraw = source.overdraw;\n\n\t\t\tthis.visible = source.visible;\n\t\t\tthis.clipShadows = source.clipShadows;\n\t\t\tthis.clipIntersection = source.clipIntersection;\n\n\t\t\tvar srcPlanes = source.clippingPlanes,\n\t\t\t\tdstPlanes = null;\n\n\t\t\tif ( srcPlanes !== null ) {\n\n\t\t\t\tvar n = srcPlanes.length;\n\t\t\t\tdstPlanes = new Array( n );\n\n\t\t\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t\tthis.clippingPlanes = dstPlanes;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdate: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'update' } );\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( Material.prototype, EventDispatcher.prototype );\n\n\tvar count$1 = 0;\n\tfunction MaterialIdCount() { return count$1++; }\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * defines: { \"label\" : \"value\" },\n\t * uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n\t *\n\t * fragmentShader: ,\n\t * vertexShader: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * lights: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction ShaderMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\n\t\tthis.vertexShader = 'void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}';\n\t\tthis.fragmentShader = 'void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}';\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.skinning = false; // set to use skinning attribute streams\n\t\tthis.morphTargets = false; // set to use morph targets\n\t\tthis.morphNormals = false; // set to use morph normals\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'uv2': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tShaderMaterial.prototype = Object.create( Material.prototype );\n\tShaderMaterial.prototype.constructor = ShaderMaterial;\n\n\tShaderMaterial.prototype.isShaderMaterial = true;\n\n\tShaderMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = UniformsUtils.clone( source.uniforms );\n\n\t\tthis.defines = source.defines;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.skinning = source.skinning;\n\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\tthis.extensions = source.extensions;\n\n\t\treturn this;\n\n\t};\n\n\tShaderMaterial.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Material.prototype.toJSON.call( this, meta );\n\n\t\tdata.uniforms = this.uniforms;\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / https://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t *\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t * }\n\t */\n\n\tfunction MeshDepthMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\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.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshDepthMaterial.prototype = Object.create( Material.prototype );\n\tMeshDepthMaterial.prototype.constructor = MeshDepthMaterial;\n\n\tMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\n\tMeshDepthMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\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\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Box3( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );\n\n\t}\n\n\tBox3.prototype = {\n\n\t\tconstructor: Box3,\n\n\t\tisBox3: true,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromArray: function ( array ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tvar x = array[ i ];\n\t\t\t\tvar y = array[ i + 1 ];\n\t\t\t\tvar z = array[ i + 2 ];\n\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\t\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromObject: function () {\n\n\t\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t\t// accounting for both the object's, and children's, world transforms\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function setFromObject( object ) {\n\n\t\t\t\tvar scope = this;\n\n\t\t\t\tobject.updateMatrixWorld( true );\n\n\t\t\t\tthis.makeEmpty();\n\n\t\t\t\tobject.traverse( function ( node ) {\n\n\t\t\t\t\tvar geometry = node.geometry;\n\n\t\t\t\t\tif ( geometry !== undefined ) {\n\n\t\t\t\t\t\tif ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\tv1.copy( vertices[ i ] );\n\t\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\t\t\tvar attribute = geometry.attributes.position;\n\n\t\t\t\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\t\t\t\tvar array, offset, stride;\n\n\t\t\t\t\t\t\t\tif ( (attribute && attribute.isInterleavedBufferAttribute) ) {\n\n\t\t\t\t\t\t\t\t\tarray = attribute.data.array;\n\t\t\t\t\t\t\t\t\toffset = attribute.offset;\n\t\t\t\t\t\t\t\t\tstride = attribute.data.stride;\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tarray = attribute.array;\n\t\t\t\t\t\t\t\t\toffset = 0;\n\t\t\t\t\t\t\t\t\tstride = 3;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tfor ( var i = offset, il = array.length; i < il; i += stride ) {\n\n\t\t\t\t\t\t\t\t\tv1.fromArray( array, i );\n\t\t\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\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} );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\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\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tif ( point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\t\t point.y < this.min.y || point.y > this.max.y ||\n\t\t\t\t\t point.z < this.min.z || point.z > this.max.z ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\tif ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) &&\n\t\t\t\t ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) &&\n\t\t\t\t ( this.min.z <= box.min.z ) && ( box.max.z <= this.max.z ) ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\n\t\t\tif ( box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\t\t box.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\t\t\t box.max.z < this.min.z || box.min.z > this.max.z ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tintersectsSphere: ( function () {\n\n\t\t\tvar closestPoint;\n\n\t\t\treturn function intersectsSphere( sphere ) {\n\n\t\t\t\tif ( closestPoint === undefined ) closestPoint = new Vector3();\n\n\t\t\t\t// Find the point on the AABB closest to the sphere center.\n\t\t\t\tthis.clampPoint( sphere.center, closestPoint );\n\n\t\t\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\t\t\treturn closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\t\tvar min, max;\n\n\t\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t\t} else {\n\n\t\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t\t}\n\n\t\t\treturn ( min <= plane.constant && max >= plane.constant );\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetBoundingSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function getBoundingSphere( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Sphere();\n\n\t\t\t\tthis.getCenter( result.center );\n\n\t\t\t\tresult.radius = this.getSize( v1 ).length() * 0.5;\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\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\t\tif( this.isEmpty() ) this.makeEmpty();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar points = [\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3()\n\t\t\t];\n\n\t\t\treturn function applyMatrix4( matrix ) {\n\n\t\t\t\t// transform of empty box is an empty box.\n\t\t\t\tif( this.isEmpty() ) return this;\n\n\t\t\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t\t\tpoints[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t\t\tpoints[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t\t\tpoints[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t\t\tpoints[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t\t\tpoints[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t\t\tpoints[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t\t\tpoints[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t\t\tpoints[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix );\t// 111\n\n\t\t\t\tthis.setFromPoints( points );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Sphere( center, radius ) {\n\n\t\tthis.center = ( center !== undefined ) ? center : new Vector3();\n\t\tthis.radius = ( radius !== undefined ) ? radius : 0;\n\n\t}\n\n\tSphere.prototype = {\n\n\t\tconstructor: Sphere,\n\n\t\tset: function ( center, radius ) {\n\n\t\t\tthis.center.copy( center );\n\t\t\tthis.radius = radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function () {\n\n\t\t\tvar box = new Box3();\n\n\t\t\treturn function setFromPoints( points, optionalCenter ) {\n\n\t\t\t\tvar center = this.center;\n\n\t\t\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\t\t\tcenter.copy( optionalCenter );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbox.setFromPoints( points ).getCenter( center );\n\n\t\t\t\t}\n\n\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( sphere ) {\n\n\t\t\tthis.center.copy( sphere.center );\n\t\t\tthis.radius = sphere.radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tempty: function () {\n\n\t\t\treturn ( this.radius <= 0 );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar radiusSum = this.radius + sphere.radius;\n\n\t\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsSphere( this );\n\n\t\t},\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We use the following equation to compute the signed distance from\n\t\t\t// the center of the sphere to the plane.\n\t\t\t//\n\t\t\t// distance = q * n - d\n\t\t\t//\n\t\t\t// If this distance is greater than the radius of the sphere,\n\t\t\t// then there is no intersection.\n\n\t\t\treturn Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.copy( point );\n\n\t\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t\tresult.sub( this.center ).normalize();\n\t\t\t\tresult.multiplyScalar( this.radius ).add( this.center );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\tgetBoundingBox: function ( optionalTarget ) {\n\n\t\t\tvar box = optionalTarget || new Box3();\n\n\t\t\tbox.set( this.center, this.center );\n\t\t\tbox.expandByScalar( this.radius );\n\n\t\t\treturn box;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.center.applyMatrix4( matrix );\n\t\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.center.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( sphere ) {\n\n\t\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t * @author tschw\n\t */\n\n\tfunction Matrix3() {\n\n\t\tthis.elements = new Float32Array( [\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 ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix3.prototype = {\n\n\t\tconstructor: Matrix3,\n\n\t\tisMatrix3: true,\n\n\t\tset: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0,\n\t\t\t\t0, 1, 0,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 3 ], me[ 6 ],\n\t\t\t\tme[ 1 ], me[ 4 ], me[ 7 ],\n\t\t\t\tme[ 2 ], me[ 5 ], me[ 8 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix4: function( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToVector3Array: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToVector3Array( array, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = array.length;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i += 3, j += 3 ) {\n\n\t\t\t\t\tv1.fromArray( array, j );\n\t\t\t\t\tv1.applyMatrix3( this );\n\t\t\t\t\tv1.toArray( array, j );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyToBuffer: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBuffer( buffer, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = buffer.length / buffer.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i ++, j ++ ) {\n\n\t\t\t\t\tv1.x = buffer.getX( j );\n\t\t\t\t\tv1.y = buffer.getY( j );\n\t\t\t\t\tv1.z = buffer.getZ( j );\n\n\t\t\t\t\tv1.applyMatrix3( this );\n\n\t\t\t\t\tbuffer.setXYZ( j, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn buffer;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t\t},\n\n\t\tgetInverse: function ( matrix, throwOnDegenerate ) {\n\n\t\t\tif ( (matrix && matrix.isMatrix4) ) {\n\n\t\t\t\tconsole.error( \"THREE.Matrix3.getInverse no longer takes a Matrix4 argument.\" );\n\n\t\t\t}\n\n\t\t\tvar me = matrix.elements,\n\t\t\t\tte = this.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],\n\t\t\t\tn12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],\n\t\t\t\tn13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],\n\n\t\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\t\tte[ 3 ] = t12 * detInv;\n\t\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\t\tte[ 6 ] = t13 * detInv;\n\t\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar tmp, m = this.elements;\n\n\t\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset is deprecated \" +\n\t\t\t\t\t\"- just use .toArray instead.\" );\n\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\n\t\tgetNormalMatrix: function ( matrix4 ) {\n\n\t\t\treturn this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();\n\n\t\t},\n\n\t\ttransposeIntoArray: function ( r ) {\n\n\t\t\tvar m = this.elements;\n\n\t\t\tr[ 0 ] = m[ 0 ];\n\t\t\tr[ 1 ] = m[ 3 ];\n\t\t\tr[ 2 ] = m[ 6 ];\n\t\t\tr[ 3 ] = m[ 1 ];\n\t\t\tr[ 4 ] = m[ 4 ];\n\t\t\tr[ 5 ] = m[ 7 ];\n\t\t\tr[ 6 ] = m[ 2 ];\n\t\t\tr[ 7 ] = m[ 5 ];\n\t\t\tr[ 8 ] = m[ 8 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 9; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Plane( normal, constant ) {\n\n\t\tthis.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );\n\t\tthis.constant = ( constant !== undefined ) ? constant : 0;\n\n\t}\n\n\tPlane.prototype = {\n\n\t\tconstructor: Plane,\n\n\t\tset: function ( normal, constant ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponents: function ( x, y, z, w ) {\n\n\t\t\tthis.normal.set( x, y, z );\n\t\t\tthis.constant = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromNormalAndCoplanarPoint: function ( normal, point ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = - point.dot( this.normal );\t// must be this.normal, not normal, as this.normal is normalized\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCoplanarPoints: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function setFromCoplanarPoints( a, b, c ) {\n\n\t\t\t\tvar normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();\n\n\t\t\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\t\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( plane ) {\n\n\t\t\tthis.normal.copy( plane.normal );\n\t\t\tthis.constant = plane.constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\t\tvar inverseNormalLength = 1.0 / this.normal.length();\n\t\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\t\tthis.constant *= inverseNormalLength;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.constant *= - 1;\n\t\t\tthis.normal.negate();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn this.normal.dot( point ) + this.constant;\n\n\t\t},\n\n\t\tdistanceToSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t\t},\n\n\t\tprojectPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn this.orthoPoint( point, optionalTarget ).sub( point ).negate();\n\n\t\t},\n\n\t\torthoPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar perpendicularMagnitude = this.distanceToPoint( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( perpendicularMagnitude );\n\n\t\t},\n\n\t\tintersectLine: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectLine( line, optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tvar direction = line.delta( v1 );\n\n\t\t\t\tvar denominator = this.normal.dot( direction );\n\n\t\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t\t// line is coplanar, return origin\n\t\t\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\t\t\treturn result.copy( line.start );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\tvar t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\t\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\treturn result.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsLine: function ( line ) {\n\n\t\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\t\tvar startSign = this.distanceToPoint( line.start );\n\t\t\tvar endSign = this.distanceToPoint( line.end );\n\n\t\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsPlane( this );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn sphere.intersectsPlane( this );\n\n\t\t},\n\n\t\tcoplanarPoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar m1 = new Matrix3();\n\n\t\t\treturn function applyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\t\t\tvar referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix );\n\n\t\t\t\t// transform normal based on theory here:\n\t\t\t\t// http://www.songho.ca/opengl/gl_normaltransform.html\n\t\t\t\tvar normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix );\n\t\t\t\tvar normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t// recalculate constant (like in setFromNormalAndCoplanarPoint)\n\t\t\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.constant = this.constant - offset.dot( this.normal );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( plane ) {\n\n\t\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Frustum( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tthis.planes = [\n\n\t\t\t( p0 !== undefined ) ? p0 : new Plane(),\n\t\t\t( p1 !== undefined ) ? p1 : new Plane(),\n\t\t\t( p2 !== undefined ) ? p2 : new Plane(),\n\t\t\t( p3 !== undefined ) ? p3 : new Plane(),\n\t\t\t( p4 !== undefined ) ? p4 : new Plane(),\n\t\t\t( p5 !== undefined ) ? p5 : new Plane()\n\n\t\t];\n\n\t}\n\n\tFrustum.prototype = {\n\n\t\tconstructor: Frustum,\n\n\t\tset: function ( p0, p1, p2, p3, p4, p5 ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tplanes[ 0 ].copy( p0 );\n\t\t\tplanes[ 1 ].copy( p1 );\n\t\t\tplanes[ 2 ].copy( p2 );\n\t\t\tplanes[ 3 ].copy( p3 );\n\t\t\tplanes[ 4 ].copy( p4 );\n\t\t\tplanes[ 5 ].copy( p5 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( frustum ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix: function ( m ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar me = m.elements;\n\t\t\tvar me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\t\tvar me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\t\tvar me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\t\tvar me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tintersectsObject: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsObject( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere )\n\t\t\t\t\t.applyMatrix4( object.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSprite: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsSprite( sprite ) {\n\n\t\t\t\tsphere.center.set( 0, 0, 0 );\n\t\t\t\tsphere.radius = 0.7071067811865476;\n\t\t\t\tsphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar center = sphere.center;\n\t\t\tvar negRadius = - sphere.radius;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tvar distance = planes[ i ].distanceToPoint( center );\n\n\t\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tintersectsBox: function () {\n\n\t\t\tvar p1 = new Vector3(),\n\t\t\t\tp2 = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\tvar planes = this.planes;\n\n\t\t\t\tfor ( var i = 0; i < 6 ; i ++ ) {\n\n\t\t\t\t\tvar plane = planes[ i ];\n\n\t\t\t\t\tp1.x = plane.normal.x > 0 ? box.min.x : box.max.x;\n\t\t\t\t\tp2.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t\t\tp1.y = plane.normal.y > 0 ? box.min.y : box.max.y;\n\t\t\t\t\tp2.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t\t\tp1.z = plane.normal.z > 0 ? box.min.z : box.max.z;\n\t\t\t\t\tp2.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\t\t\tvar d1 = plane.distanceToPoint( p1 );\n\t\t\t\t\tvar d2 = plane.distanceToPoint( p2 );\n\n\t\t\t\t\t// if both outside plane, no intersection\n\n\t\t\t\t\tif ( d1 < 0 && d2 < 0 ) {\n\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t};\n\n\t\t}(),\n\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {\n\n\t\tvar _gl = _renderer.context,\n\t\t_state = _renderer.state,\n\t\t_frustum = new Frustum(),\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_lightShadows = _lights.shadows,\n\n\t\t_shadowMapSize = new Vector2(),\n\t\t_maxShadowMapSize = new Vector2( capabilities.maxTextureSize, capabilities.maxTextureSize ),\n\n\t\t_lookTarget = new Vector3(),\n\t\t_lightPositionWorld = new Vector3(),\n\n\t\t_renderList = [],\n\n\t\t_MorphingFlag = 1,\n\t\t_SkinningFlag = 2,\n\n\t\t_NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1,\n\n\t\t_depthMaterials = new Array( _NumberOfMaterialVariants ),\n\t\t_distanceMaterials = new Array( _NumberOfMaterialVariants ),\n\n\t\t_materialCache = {};\n\n\t\tvar 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\tvar 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\tvar cube2DViewPorts = [\n\t\t\tnew Vector4(), new Vector4(), new Vector4(),\n\t\t\tnew Vector4(), new Vector4(), new Vector4()\n\t\t];\n\n\t\t// init\n\n\t\tvar depthMaterialTemplate = new MeshDepthMaterial();\n\t\tdepthMaterialTemplate.depthPacking = RGBADepthPacking;\n\t\tdepthMaterialTemplate.clipping = true;\n\n\t\tvar distanceShader = ShaderLib[ \"distanceRGBA\" ];\n\t\tvar distanceUniforms = UniformsUtils.clone( distanceShader.uniforms );\n\n\t\tfor ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {\n\n\t\t\tvar useMorphing = ( i & _MorphingFlag ) !== 0;\n\t\t\tvar useSkinning = ( i & _SkinningFlag ) !== 0;\n\n\t\t\tvar depthMaterial = depthMaterialTemplate.clone();\n\t\t\tdepthMaterial.morphTargets = useMorphing;\n\t\t\tdepthMaterial.skinning = useSkinning;\n\n\t\t\t_depthMaterials[ i ] = depthMaterial;\n\n\t\t\tvar distanceMaterial = new ShaderMaterial( {\n\t\t\t\tdefines: {\n\t\t\t\t\t'USE_SHADOWMAP': ''\n\t\t\t\t},\n\t\t\t\tuniforms: distanceUniforms,\n\t\t\t\tvertexShader: distanceShader.vertexShader,\n\t\t\t\tfragmentShader: distanceShader.fragmentShader,\n\t\t\t\tmorphTargets: useMorphing,\n\t\t\t\tskinning: useSkinning,\n\t\t\t\tclipping: true\n\t\t\t} );\n\n\t\t\t_distanceMaterials[ i ] = distanceMaterial;\n\n\t\t}\n\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tthis.enabled = false;\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis.type = PCFShadowMap;\n\n\t\tthis.renderReverseSided = true;\n\t\tthis.renderSingleSided = true;\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\t\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\t\tif ( _lightShadows.length === 0 ) return;\n\n\t\t\t// Set GL state for depth map.\n\t\t\t_state.clearColor( 1, 1, 1, 1 );\n\t\t\t_state.disable( _gl.BLEND );\n\t\t\t_state.setDepthTest( true );\n\t\t\t_state.setScissorTest( false );\n\n\t\t\t// render depth map\n\n\t\t\tvar faceCount, isPointLight;\n\n\t\t\tfor ( var i = 0, il = _lightShadows.length; i < il; i ++ ) {\n\n\t\t\t\tvar light = _lightShadows[ i ];\n\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowCamera = shadow.camera;\n\n\t\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\t\t\t\t_shadowMapSize.min( _maxShadowMapSize );\n\n\t\t\t\tif ( (light && light.isPointLight) ) {\n\n\t\t\t\t\tfaceCount = 6;\n\t\t\t\t\tisPointLight = true;\n\n\t\t\t\t\tvar vpWidth = _shadowMapSize.x;\n\t\t\t\t\tvar vpHeight = _shadowMapSize.y;\n\n\t\t\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t\t\t// following orientation:\n\t\t\t\t\t//\n\t\t\t\t\t// xzXZ\n\t\t\t\t\t// y Y\n\t\t\t\t\t//\n\t\t\t\t\t// X - Positive x direction\n\t\t\t\t\t// x - Negative x direction\n\t\t\t\t\t// Y - Positive y direction\n\t\t\t\t\t// y - Negative y direction\n\t\t\t\t\t// Z - Positive z direction\n\t\t\t\t\t// z - Negative z direction\n\n\t\t\t\t\t// positive X\n\t\t\t\t\tcube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative X\n\t\t\t\t\tcube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Z\n\t\t\t\t\tcube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative Z\n\t\t\t\t\tcube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Y\n\t\t\t\t\tcube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight );\n\t\t\t\t\t// negative Y\n\t\t\t\t\tcube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight );\n\n\t\t\t\t\t_shadowMapSize.x *= 4.0;\n\t\t\t\t\t_shadowMapSize.y *= 2.0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfaceCount = 1;\n\t\t\t\t\tisPointLight = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\t\tvar pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\n\t\t\t\t\tshadowCamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tif ( (shadow && shadow.isSpotLightShadow) ) {\n\n\t\t\t\t\tshadow.update( light );\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowMap = shadow.map;\n\t\t\t\tvar shadowMatrix = shadow.matrix;\n\n\t\t\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tshadowCamera.position.copy( _lightPositionWorld );\n\n\t\t\t\t_renderer.setRenderTarget( shadowMap );\n\t\t\t\t_renderer.clear();\n\n\t\t\t\t// render shadow map for each cube face (if omni-directional) or\n\t\t\t\t// run a single pass if not\n\n\t\t\t\tfor ( var face = 0; face < faceCount; face ++ ) {\n\n\t\t\t\t\tif ( isPointLight ) {\n\n\t\t\t\t\t\t_lookTarget.copy( shadowCamera.position );\n\t\t\t\t\t\t_lookTarget.add( cubeDirections[ face ] );\n\t\t\t\t\t\tshadowCamera.up.copy( cubeUps[ face ] );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t\tvar vpDimensions = cube2DViewPorts[ face ];\n\t\t\t\t\t\t_state.viewport( vpDimensions );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_lookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tshadowCamera.updateMatrixWorld();\n\t\t\t\t\tshadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld );\n\n\t\t\t\t\t// compute shadow matrix\n\n\t\t\t\t\tshadowMatrix.set(\n\t\t\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t\t\t);\n\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t\t\t\t\t// update camera matrices and frustum\n\n\t\t\t\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\t\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\t\t\t// set object matrices & frustum culling\n\n\t\t\t\t\t_renderList.length = 0;\n\n\t\t\t\t\tprojectObject( scene, camera, shadowCamera );\n\n\t\t\t\t\t// render shadow map\n\t\t\t\t\t// render regular objects\n\n\t\t\t\t\tfor ( var j = 0, jl = _renderList.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar object = _renderList[ j ];\n\t\t\t\t\t\tvar geometry = _objects.update( object );\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( (material && material.isMultiMaterial) ) {\n\n\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\tfor ( var k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\t\t\tvar group = groups[ k ];\n\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, 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 {\n\n\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, 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\t// Restore GL state.\n\t\t\tvar clearColor = _renderer.getClearColor(),\n\t\t\tclearAlpha = _renderer.getClearAlpha();\n\t\t\t_renderer.setClearColor( clearColor, clearAlpha );\n\n\t\t\tscope.needsUpdate = false;\n\n\t\t};\n\n\t\tfunction getDepthMaterial( object, material, isPointLight, lightPositionWorld ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tvar result = null;\n\n\t\t\tvar materialVariants = _depthMaterials;\n\t\t\tvar customMaterial = object.customDepthMaterial;\n\n\t\t\tif ( isPointLight ) {\n\n\t\t\t\tmaterialVariants = _distanceMaterials;\n\t\t\t\tcustomMaterial = object.customDistanceMaterial;\n\n\t\t\t}\n\n\t\t\tif ( ! customMaterial ) {\n\n\t\t\t\tvar useMorphing = false;\n\n\t\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;\n\n\t\t\t\t\t} else if ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphTargets && geometry.morphTargets.length > 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar useSkinning = object.isSkinnedMesh && material.skinning;\n\n\t\t\t\tvar variantIndex = 0;\n\n\t\t\t\tif ( useMorphing ) variantIndex |= _MorphingFlag;\n\t\t\t\tif ( useSkinning ) variantIndex |= _SkinningFlag;\n\n\t\t\t\tresult = materialVariants[ variantIndex ];\n\n\t\t\t} else {\n\n\t\t\t\tresult = customMaterial;\n\n\t\t\t}\n\n\t\t\tif ( _renderer.localClippingEnabled &&\n\t\t\t\t material.clipShadows === true &&\n\t\t\t\t\tmaterial.clippingPlanes.length !== 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\tvar keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tvar 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\tvar 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\tresult.visible = material.visible;\n\t\t\tresult.wireframe = material.wireframe;\n\n\t\t\tvar side = material.side;\n\n\t\t\tif ( scope.renderSingleSided && side == DoubleSide ) {\n\n\t\t\t\tside = FrontSide;\n\n\t\t\t}\n\n\t\t\tif ( scope.renderReverseSided ) {\n\n\t\t\t\tif ( side === FrontSide ) side = BackSide;\n\t\t\t\telse if ( side === BackSide ) side = FrontSide;\n\n\t\t\t}\n\n\t\t\tresult.side = side;\n\n\t\t\tresult.clipShadows = material.clipShadows;\n\t\t\tresult.clippingPlanes = material.clippingPlanes;\n\n\t\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\t\tresult.linewidth = material.linewidth;\n\n\t\t\tif ( isPointLight && result.uniforms.lightPos !== undefined ) {\n\n\t\t\t\tresult.uniforms.lightPos.value.copy( lightPositionWorld );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera, shadowCamera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\t\tif ( object.castShadow && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) {\n\n\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\t\t\t_renderList.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, shadowCamera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Ray( origin, direction ) {\n\n\t\tthis.origin = ( origin !== undefined ) ? origin : new Vector3();\n\t\tthis.direction = ( direction !== undefined ) ? direction : new Vector3();\n\n\t}\n\n\tRay.prototype = {\n\n\t\tconstructor: Ray,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\tthis.origin.copy( origin );\n\t\t\tthis.direction.copy( direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( ray ) {\n\n\t\t\tthis.origin.copy( ray.origin );\n\t\t\tthis.direction.copy( ray.direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t\t},\n\n\t\tlookAt: function ( v ) {\n\n\t\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trecast: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function recast( t ) {\n\n\t\t\t\tthis.origin.copy( this.at( t, v1 ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\tresult.subVectors( point, this.origin );\n\t\t\tvar directionDistance = result.dot( this.direction );\n\n\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\treturn result.copy( this.origin );\n\n\t\t\t}\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t\t},\n\n\t\tdistanceSqToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceSqToPoint( point ) {\n\n\t\t\t\tvar directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t\t\t// point behind the ray\n\n\t\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t\t\t}\n\n\t\t\t\tv1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t\t\treturn v1.distanceToSquared( point );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdistanceSqToSegment: function () {\n\n\t\t\tvar segCenter = new Vector3();\n\t\t\tvar segDir = new Vector3();\n\t\t\tvar diff = new Vector3();\n\n\t\t\treturn function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t\t\t// It returns the min distance between the ray and the segment\n\t\t\t\t// defined by v0 and v1\n\t\t\t\t// It can also set two optional targets :\n\t\t\t\t// - The closest point on the ray\n\t\t\t\t// - The closest point on the segment\n\n\t\t\t\tsegCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t\t\tsegDir.copy( v1 ).sub( v0 ).normalize();\n\t\t\t\tdiff.copy( this.origin ).sub( segCenter );\n\n\t\t\t\tvar segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\t\t\tvar a01 = - this.direction.dot( segDir );\n\t\t\t\tvar b0 = diff.dot( this.direction );\n\t\t\t\tvar b1 = - diff.dot( segDir );\n\t\t\t\tvar c = diff.lengthSq();\n\t\t\t\tvar det = Math.abs( 1 - a01 * a01 );\n\t\t\t\tvar s0, s1, sqrDist, extDet;\n\n\t\t\t\tif ( det > 0 ) {\n\n\t\t\t\t\t// The ray and segment are not parallel.\n\n\t\t\t\t\ts0 = a01 * b1 - b0;\n\t\t\t\t\ts1 = a01 * b0 - b1;\n\t\t\t\t\textDet = segExtent * det;\n\n\t\t\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\t\t\tvar invDet = 1 / det;\n\t\t\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\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\t// region 5\n\n\t\t\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t\t\t// region 4\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t// region 3\n\n\t\t\t\t\t\t\ts0 = 0;\n\t\t\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 2\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Ray and segment are parallel.\n\n\t\t\t\t\ts1 = ( a01 > 0 ) ? - segExtent : 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\tif ( optionalPointOnRay ) {\n\n\t\t\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnSegment ) {\n\n\t\t\t\t\toptionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter );\n\n\t\t\t\t}\n\n\t\t\t\treturn sqrDist;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectSphere( sphere, optionalTarget ) {\n\n\t\t\t\tv1.subVectors( sphere.center, this.origin );\n\t\t\t\tvar tca = v1.dot( this.direction );\n\t\t\t\tvar d2 = v1.dot( v1 ) - tca * tca;\n\t\t\t\tvar radius2 = sphere.radius * sphere.radius;\n\n\t\t\t\tif ( d2 > radius2 ) return null;\n\n\t\t\t\tvar thc = Math.sqrt( radius2 - d2 );\n\n\t\t\t\t// t0 = first intersect point - entrance on front of sphere\n\t\t\t\tvar t0 = tca - thc;\n\n\t\t\t\t// t1 = second intersect point - exit point on back of sphere\n\t\t\t\tvar t1 = tca + thc;\n\n\t\t\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\t\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t\t\t// test to see if t0 is behind the ray:\n\t\t\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t\t\t// in order to always return an intersect point that is in front of the ray.\n\t\t\t\tif ( t0 < 0 ) return this.at( t1, optionalTarget );\n\n\t\t\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\t\t\treturn this.at( t0, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) <= sphere.radius;\n\n\t\t},\n\n\t\tdistanceToPlane: function ( plane ) {\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t// line is coplanar, return origin\n\t\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\t\treturn 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t\t// Return if the ray never intersects the plane\n\n\t\t\treturn t >= 0 ? t : null;\n\n\t\t},\n\n\t\tintersectPlane: function ( plane, optionalTarget ) {\n\n\t\t\tvar t = this.distanceToPlane( plane );\n\n\t\t\tif ( t === null ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\treturn this.at( t, optionalTarget );\n\n\t\t},\n\n\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// check if the ray lies on the plane first\n\n\t\t\tvar distToPoint = plane.distanceToPoint( this.origin );\n\n\t\t\tif ( distToPoint === 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tintersectBox: function ( box, optionalTarget ) {\n\n\t\t\tvar tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\t\tvar invdirx = 1 / this.direction.x,\n\t\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\t\tvar origin = this.origin;\n\n\t\t\tif ( invdirx >= 0 ) {\n\n\t\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t\t} else {\n\n\t\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t\t}\n\n\t\t\tif ( invdiry >= 0 ) {\n\n\t\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t\t} else {\n\n\t\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\t\tif ( invdirz >= 0 ) {\n\n\t\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t\t} else {\n\n\t\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t\t//return point closest to the ray (positive side)\n\n\t\t\tif ( tmax < 0 ) return null;\n\n\t\t\treturn this.at( tmin >= 0 ? tmin : tmax, optionalTarget );\n\n\t\t},\n\n\t\tintersectsBox: ( function () {\n\n\t\t\tvar v = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\treturn this.intersectBox( box, v ) !== null;\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectTriangle: function () {\n\n\t\t\t// Compute the offset origin, edges, and normal.\n\t\t\tvar diff = new Vector3();\n\t\t\tvar edge1 = new Vector3();\n\t\t\tvar edge2 = new Vector3();\n\t\t\tvar normal = new Vector3();\n\n\t\t\treturn function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t\t\tedge1.subVectors( b, a );\n\t\t\t\tedge2.subVectors( c, a );\n\t\t\t\tnormal.crossVectors( edge1, edge2 );\n\n\t\t\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\t\t\tvar DdN = this.direction.dot( normal );\n\t\t\t\tvar sign;\n\n\t\t\t\tif ( DdN > 0 ) {\n\n\t\t\t\t\tif ( backfaceCulling ) return null;\n\t\t\t\t\tsign = 1;\n\n\t\t\t\t} else if ( DdN < 0 ) {\n\n\t\t\t\t\tsign = - 1;\n\t\t\t\t\tDdN = - DdN;\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\tdiff.subVectors( this.origin, a );\n\t\t\t\tvar DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) );\n\n\t\t\t\t// b1 < 0, no intersection\n\t\t\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tvar DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) );\n\n\t\t\t\t// b2 < 0, no intersection\n\t\t\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// b1+b2 > 1, no intersection\n\t\t\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Line intersects triangle, check if ray does.\n\t\t\t\tvar QdN = - sign * diff.dot( normal );\n\n\t\t\t\t// t < 0, no intersection\n\t\t\t\tif ( QdN < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Ray intersects triangle.\n\t\t\t\treturn this.at( QdN / DdN, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix4: function ( matrix4 ) {\n\n\t\t\tthis.direction.add( this.origin ).applyMatrix4( matrix4 );\n\t\t\tthis.origin.applyMatrix4( matrix4 );\n\t\t\tthis.direction.sub( this.origin );\n\t\t\tthis.direction.normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( ray ) {\n\n\t\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Euler( x, y, z, order ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._order = order || Euler.DefaultOrder;\n\n\t}\n\n\tEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\n\tEuler.DefaultOrder = 'XYZ';\n\n\tEuler.prototype = {\n\n\t\tconstructor: Euler,\n\n\t\tisEuler: true,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget order () {\n\n\t\t\treturn this._order;\n\n\t\t},\n\n\t\tset order ( value ) {\n\n\t\t\tthis._order = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, order ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._order = order || this._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t\t},\n\n\t\tcopy: function ( euler ) {\n\n\t\t\tthis._x = euler._x;\n\t\t\tthis._y = euler._y;\n\t\t\tthis._z = euler._z;\n\t\t\tthis._order = euler._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m, order, update ) {\n\n\t\t\tvar clamp = _Math.clamp;\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements;\n\t\t\tvar m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\t\tvar m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\t\tvar m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\torder = order || this._order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.99999 ) {\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} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.99999 ) {\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} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.99999 ) {\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} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.99999 ) {\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} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.99999 ) {\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} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.99999 ) {\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} else {\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order );\n\n\t\t\t}\n\n\t\t\tthis._order = order;\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromQuaternion: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function setFromQuaternion( q, order, update ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.makeRotationFromQuaternion( q );\n\n\t\t\t\treturn this.setFromRotationMatrix( matrix, order, update );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromVector3: function ( v, order ) {\n\n\t\t\treturn this.set( v.x, v.y, v.z, order || this._order );\n\n\t\t},\n\n\t\treorder: function () {\n\n\t\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t\tvar q = new Quaternion();\n\n\t\t\treturn function reorder( newOrder ) {\n\n\t\t\t\tq.setFromEuler( this );\n\n\t\t\t\treturn this.setFromQuaternion( q, newOrder );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( euler ) {\n\n\t\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t\t},\n\n\t\tfromArray: function ( array ) {\n\n\t\t\tthis._x = array[ 0 ];\n\t\t\tthis._y = array[ 1 ];\n\t\t\tthis._z = array[ 2 ];\n\t\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._order;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoVector3: function ( optionalResult ) {\n\n\t\t\tif ( optionalResult ) {\n\n\t\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t\t} else {\n\n\t\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t\t}\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Layers() {\n\n\t\tthis.mask = 1;\n\n\t}\n\n\tLayers.prototype = {\n\n\t\tconstructor: Layers,\n\n\t\tset: function ( channel ) {\n\n\t\t\tthis.mask = 1 << channel;\n\n\t\t},\n\n\t\tenable: function ( channel ) {\n\n\t\t\tthis.mask |= 1 << channel;\n\n\t\t},\n\n\t\ttoggle: function ( channel ) {\n\n\t\t\tthis.mask ^= 1 << channel;\n\n\t\t},\n\n\t\tdisable: function ( channel ) {\n\n\t\t\tthis.mask &= ~ ( 1 << channel );\n\n\t\t},\n\n\t\ttest: function ( layers ) {\n\n\t\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author elephantatwork / www.elephantatwork.ch\n\t */\n\n\tfunction Object3D() {\n\n\t\tObject.defineProperty( this, 'id', { value: Object3DIdCount() } );\n\n\t\tthis.uuid = _Math.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.DefaultUp.clone();\n\n\t\tvar position = new Vector3();\n\t\tvar rotation = new Euler();\n\t\tvar quaternion = new Quaternion();\n\t\tvar 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\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\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.DefaultMatrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = false;\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.userData = {};\n\n\t\tthis.onBeforeRender = function(){}; \n\t\tthis.onAfterRender = function(){};\n\n\t}\n\n\tObject3D.DefaultUp = new Vector3( 0, 1, 0 );\n\tObject3D.DefaultMatrixAutoUpdate = true;\n\n\tObject.assign( Object3D.prototype, EventDispatcher.prototype, {\n\n\t\tisObject3D: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tthis.matrix.multiplyMatrices( matrix, this.matrix );\n\n\t\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t\t},\n\n\t\tsetRotationFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t\t},\n\n\t\tsetRotationFromEuler: function ( euler ) {\n\n\t\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t\t},\n\n\t\tsetRotationFromMatrix: function ( m ) {\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t\t},\n\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\t// assumes q is normalized\n\n\t\t\tthis.quaternion.copy( q );\n\n\t\t},\n\n\t\trotateOnAxis: function () {\n\n\t\t\t// rotate object on axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar q1 = new Quaternion();\n\n\t\t\treturn function rotateOnAxis( axis, angle ) {\n\n\t\t\t\tq1.setFromAxisAngle( axis, angle );\n\n\t\t\t\tthis.quaternion.multiply( q1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateOnAxis: function () {\n\n\t\t\t// translate object by distance along axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function translateOnAxis( axis, distance ) {\n\n\t\t\t\tv1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\t\t\tthis.position.add( v1.multiplyScalar( distance ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function translateX( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function translateY( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function translateZ( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlocalToWorld: function ( vector ) {\n\n\t\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t\t},\n\n\t\tworldToLocal: function () {\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function worldToLocal( vector ) {\n\n\t\t\t\treturn vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\t// This routine does not support objects with rotated and/or translated parent(s)\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tm1.lookAt( vector, this.position, this.up );\n\n\t\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tadd: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( object === this ) {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object can't be added as a child of itself.\", object );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( (object && object.isObject3D) ) {\n\n\t\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\t\tobject.parent.remove( object );\n\n\t\t\t\t}\n\n\t\t\t\tobject.parent = this;\n\t\t\t\tobject.dispatchEvent( { type: 'added' } );\n\n\t\t\t\tthis.children.push( object );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object not an instance of THREE.Object3D.\", object );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tremove: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar index = this.children.indexOf( object );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tobject.parent = null;\n\n\t\t\t\tobject.dispatchEvent( { type: 'removed' } );\n\n\t\t\t\tthis.children.splice( index, 1 );\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetObjectById: function ( id ) {\n\n\t\t\treturn this.getObjectByProperty( 'id', id );\n\n\t\t},\n\n\t\tgetObjectByName: function ( name ) {\n\n\t\t\treturn this.getObjectByProperty( 'name', name );\n\n\t\t},\n\n\t\tgetObjectByProperty: function ( name, value ) {\n\n\t\t\tif ( this[ name ] === value ) return this;\n\n\t\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = this.children[ i ];\n\t\t\t\tvar object = child.getObjectByProperty( name, value );\n\n\t\t\t\tif ( object !== undefined ) {\n\n\t\t\t\t\treturn object;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\n\t\t},\n\n\t\tgetWorldPosition: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\treturn result.setFromMatrixPosition( this.matrixWorld );\n\n\t\t},\n\n\t\tgetWorldQuaternion: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar scale = new Vector3();\n\n\t\t\treturn function getWorldQuaternion( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Quaternion();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, result, scale );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldRotation: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldRotation( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Euler();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.setFromQuaternion( quaternion, this.rotation.order, false );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldScale: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldScale( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, result );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldDirection: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.set( 0, 0, 1 ).applyQuaternion( quaternion );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\traycast: function () {},\n\n\t\ttraverse: function ( callback ) {\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverse( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseVisible: function ( callback ) {\n\n\t\t\tif ( this.visible === false ) return;\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseAncestors: function ( callback ) {\n\n\t\t\tvar parent = this.parent;\n\n\t\t\tif ( parent !== null ) {\n\n\t\t\t\tcallback( parent );\n\n\t\t\t\tparent.traverseAncestors( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrix: function () {\n\n\t\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t\t},\n\n\t\tupdateMatrixWorld: function ( force ) {\n\n\t\t\tif ( this.matrixAutoUpdate === true ) this.updateMatrix();\n\n\t\t\tif ( this.matrixWorldNeedsUpdate === true || force === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\t\tforce = true;\n\n\t\t\t}\n\n\t\t\t// update children\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\t// meta is '' when called from JSON.stringify\n\t\t\tvar isRootObject = ( meta === undefined || meta === '' );\n\n\t\t\tvar output = {};\n\n\t\t\t// meta is a hash used to collect geometries, materials.\n\t\t\t// not providing it implies that this is the root object\n\t\t\t// being serialized.\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\t// initialize meta obj\n\t\t\t\tmeta = {\n\t\t\t\t\tgeometries: {},\n\t\t\t\t\tmaterials: {},\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t\toutput.metadata = {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Object',\n\t\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t// standard Object3D serialization\n\n\t\t\tvar object = {};\n\n\t\t\tobject.uuid = this.uuid;\n\t\t\tobject.type = this.type;\n\n\t\t\tif ( this.name !== '' ) object.name = this.name;\n\t\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\t\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\t\tif ( this.visible === false ) object.visible = false;\n\n\t\t\tobject.matrix = this.matrix.toArray();\n\n\t\t\t//\n\n\t\t\tif ( this.geometry !== undefined ) {\n\n\t\t\t\tif ( meta.geometries[ this.geometry.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.geometries[ this.geometry.uuid ] = this.geometry.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.geometry = this.geometry.uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.material !== undefined ) {\n\n\t\t\t\tif ( meta.materials[ this.material.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.materials[ this.material.uuid ] = this.material.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = this.material.uuid;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( this.children.length > 0 ) {\n\n\t\t\t\tobject.children = [];\n\n\t\t\t\tfor ( var i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\tvar geometries = extractFromCache( meta.geometries );\n\t\t\t\tvar materials = extractFromCache( meta.materials );\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\t\tif ( images.length > 0 ) output.images = images;\n\n\t\t\t}\n\n\t\t\toutput.object = object;\n\n\t\t\treturn output;\n\n\t\t\t// extract data from the cache hash\n\t\t\t// remove metadata on each item\n\t\t\t// and return as array\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function ( recursive ) {\n\n\t\t\treturn new this.constructor().copy( this, recursive );\n\n\t\t},\n\n\t\tcopy: function ( source, recursive ) {\n\n\t\t\tif ( recursive === undefined ) recursive = true;\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.up.copy( source.up );\n\n\t\t\tthis.position.copy( source.position );\n\t\t\tthis.quaternion.copy( source.quaternion );\n\t\t\tthis.scale.copy( source.scale );\n\n\t\t\tthis.matrix.copy( source.matrix );\n\t\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\t\tthis.visible = source.visible;\n\n\t\t\tthis.castShadow = source.castShadow;\n\t\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\t\tthis.frustumCulled = source.frustumCulled;\n\t\t\tthis.renderOrder = source.renderOrder;\n\n\t\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\t\tif ( recursive === true ) {\n\n\t\t\t\tfor ( var i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\t\tvar child = source.children[ i ];\n\t\t\t\t\tthis.add( child.clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\tvar count$2 = 0;\n\tfunction Object3DIdCount() { return count$2++; }\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Line3( start, end ) {\n\n\t\tthis.start = ( start !== undefined ) ? start : new Vector3();\n\t\tthis.end = ( end !== undefined ) ? end : new Vector3();\n\n\t}\n\n\tLine3.prototype = {\n\n\t\tconstructor: Line3,\n\n\t\tset: function ( start, end ) {\n\n\t\t\tthis.start.copy( start );\n\t\t\tthis.end.copy( end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( line ) {\n\n\t\t\tthis.start.copy( line.start );\n\t\t\tthis.end.copy( line.end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tdelta: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.subVectors( this.end, this.start );\n\n\t\t},\n\n\t\tdistanceSq: function () {\n\n\t\t\treturn this.start.distanceToSquared( this.end );\n\n\t\t},\n\n\t\tdistance: function () {\n\n\t\t\treturn this.start.distanceTo( this.end );\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tclosestPointToPointParameter: function () {\n\n\t\t\tvar startP = new Vector3();\n\t\t\tvar startEnd = new Vector3();\n\n\t\t\treturn function closestPointToPointParameter( point, clampToLine ) {\n\n\t\t\t\tstartP.subVectors( point, this.start );\n\t\t\t\tstartEnd.subVectors( this.end, this.start );\n\n\t\t\t\tvar startEnd2 = startEnd.dot( startEnd );\n\t\t\t\tvar startEnd_startP = startEnd.dot( startP );\n\n\t\t\t\tvar t = startEnd_startP / startEnd2;\n\n\t\t\t\tif ( clampToLine ) {\n\n\t\t\t\t\tt = _Math.clamp( t, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t\treturn t;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, clampToLine, optionalTarget ) {\n\n\t\t\tvar t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.start.applyMatrix4( matrix );\n\t\t\tthis.end.applyMatrix4( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( line ) {\n\n\t\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Triangle( a, b, c ) {\n\n\t\tthis.a = ( a !== undefined ) ? a : new Vector3();\n\t\tthis.b = ( b !== undefined ) ? b : new Vector3();\n\t\tthis.c = ( c !== undefined ) ? c : new Vector3();\n\n\t}\n\n\tTriangle.normal = function () {\n\n\t\tvar v0 = new Vector3();\n\n\t\treturn function normal( a, b, c, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.subVectors( c, b );\n\t\t\tv0.subVectors( a, b );\n\t\t\tresult.cross( v0 );\n\n\t\t\tvar resultLengthSq = result.lengthSq();\n\t\t\tif ( resultLengthSq > 0 ) {\n\n\t\t\t\treturn result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) );\n\n\t\t\t}\n\n\t\t\treturn result.set( 0, 0, 0 );\n\n\t\t};\n\n\t}();\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tTriangle.barycoordFromPoint = function () {\n\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function barycoordFromPoint( point, a, b, c, optionalTarget ) {\n\n\t\t\tv0.subVectors( c, a );\n\t\t\tv1.subVectors( b, a );\n\t\t\tv2.subVectors( point, a );\n\n\t\t\tvar dot00 = v0.dot( v0 );\n\t\t\tvar dot01 = v0.dot( v1 );\n\t\t\tvar dot02 = v0.dot( v2 );\n\t\t\tvar dot11 = v1.dot( v1 );\n\t\t\tvar dot12 = v1.dot( v2 );\n\n\t\t\tvar denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t// collinear or singular triangle\n\t\t\tif ( denom === 0 ) {\n\n\t\t\t\t// arbitrary location outside of triangle?\n\t\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\t\treturn result.set( - 2, - 1, - 1 );\n\n\t\t\t}\n\n\t\t\tvar invDenom = 1 / denom;\n\t\t\tvar u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\t\tvar v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t\t// barycentric coordinates must always sum to 1\n\t\t\treturn result.set( 1 - u - v, v, u );\n\n\t\t};\n\n\t}();\n\n\tTriangle.containsPoint = function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function containsPoint( point, a, b, c ) {\n\n\t\t\tvar result = Triangle.barycoordFromPoint( point, a, b, c, v1 );\n\n\t\t\treturn ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 );\n\n\t\t};\n\n\t}();\n\n\tTriangle.prototype = {\n\n\t\tconstructor: Triangle,\n\n\t\tset: function ( a, b, c ) {\n\n\t\t\tthis.a.copy( a );\n\t\t\tthis.b.copy( b );\n\t\t\tthis.c.copy( c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPointsAndIndices: function ( points, i0, i1, i2 ) {\n\n\t\t\tthis.a.copy( points[ i0 ] );\n\t\t\tthis.b.copy( points[ i1 ] );\n\t\t\tthis.c.copy( points[ i2 ] );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( triangle ) {\n\n\t\t\tthis.a.copy( triangle.a );\n\t\t\tthis.b.copy( triangle.b );\n\t\t\tthis.c.copy( triangle.c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tarea: function () {\n\n\t\t\tvar v0 = new Vector3();\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function area() {\n\n\t\t\t\tv0.subVectors( this.c, this.b );\n\t\t\t\tv1.subVectors( this.a, this.b );\n\n\t\t\t\treturn v0.cross( v1 ).length() * 0.5;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmidpoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t\t},\n\n\t\tnormal: function ( optionalTarget ) {\n\n\t\t\treturn Triangle.normal( this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tplane: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Plane();\n\n\t\t\treturn result.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t\t},\n\n\t\tbarycoordFromPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t\t},\n\n\t\tclosestPointToPoint: function () {\n\n\t\t\tvar plane, edgeList, projectedPoint, closestPoint;\n\n\t\t\treturn function closestPointToPoint( point, optionalTarget ) {\n\n\t\t\t\tif ( plane === undefined ) {\n\n\t\t\t\t\tplane = new Plane();\n\t\t\t\t\tedgeList = [ new Line3(), new Line3(), new Line3() ];\n\t\t\t\t\tprojectedPoint = new Vector3();\n\t\t\t\t\tclosestPoint = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\t\tvar minDistance = Infinity;\n\n\t\t\t\t// project the point onto the plane of the triangle\n\n\t\t\t\tplane.setFromCoplanarPoints( this.a, this.b, this.c );\n\t\t\t\tplane.projectPoint( point, projectedPoint );\n\n\t\t\t\t// check if the projection lies within the triangle\n\n\t\t\t\tif( this.containsPoint( projectedPoint ) === true ) {\n\n\t\t\t\t\t// if so, this is the closest point\n\n\t\t\t\t\tresult.copy( projectedPoint );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// if not, the point falls outside the triangle. the result is the closest point to the triangle's edges or vertices\n\n\t\t\t\t\tedgeList[ 0 ].set( this.a, this.b );\n\t\t\t\t\tedgeList[ 1 ].set( this.b, this.c );\n\t\t\t\t\tedgeList[ 2 ].set( this.c, this.a );\n\n\t\t\t\t\tfor( var i = 0; i < edgeList.length; i ++ ) {\n\n\t\t\t\t\t\tedgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint );\n\n\t\t\t\t\t\tvar distance = projectedPoint.distanceToSquared( closestPoint );\n\n\t\t\t\t\t\tif( distance < minDistance ) {\n\n\t\t\t\t\t\t\tminDistance = distance;\n\n\t\t\t\t\t\t\tresult.copy( closestPoint );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( triangle ) {\n\n\t\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Face3( a, b, c, normal, color, materialIndex ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t\tthis.normal = (normal && normal.isVector3) ? normal : new Vector3();\n\t\tthis.vertexNormals = Array.isArray( normal ) ? normal : [];\n\n\t\tthis.color = (color && color.isColor) ? color : new Color();\n\t\tthis.vertexColors = Array.isArray( color ) ? color : [];\n\n\t\tthis.materialIndex = materialIndex !== undefined ? materialIndex : 0;\n\n\t}\n\n\tFace3.prototype = {\n\n\t\tconstructor: Face3,\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.a = source.a;\n\t\t\tthis.b = source.b;\n\t\t\tthis.c = source.c;\n\n\t\t\tthis.normal.copy( source.normal );\n\t\t\tthis.color.copy( source.color );\n\n\t\t\tthis.materialIndex = source.materialIndex;\n\n\t\t\tfor ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexNormals[ i ] = source.vertexNormals[ i ].clone();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexColors[ i ] = source.vertexColors[ i ].clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * shading: THREE.SmoothShading,\n\t * depthTest: ,\n\t * depthWrite: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: \n\t * }\n\t */\n\n\tfunction MeshBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\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.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.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshBasicMaterial.prototype = Object.create( Material.prototype );\n\tMeshBasicMaterial.prototype.constructor = MeshBasicMaterial;\n\n\tMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\n\tMeshBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\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.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferAttribute( array, itemSize, normalized ) {\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.uuid = _Math.generateUUID();\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 === true;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t}\n\n\tBufferAttribute.prototype = {\n\n\t\tconstructor: BufferAttribute,\n\n\t\tisBufferAttribute: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.itemSize : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.itemSize = source.itemSize;\n\t\t\tthis.count = source.count;\n\t\t\tthis.normalized = source.normalized;\n\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.itemSize;\n\t\t\tindex2 *= attribute.itemSize;\n\n\t\t\tfor ( var i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyArray: function ( array ) {\n\n\t\t\tthis.array.set( array );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyColorsArray: function ( colors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\t\tvar color = colors[ i ];\n\n\t\t\t\tif ( color === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\t\tcolor = new Color();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = color.r;\n\t\t\t\tarray[ offset ++ ] = color.g;\n\t\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyIndicesArray: function ( indices ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tvar index = indices[ i ];\n\n\t\t\t\tarray[ offset ++ ] = index.a;\n\t\t\t\tarray[ offset ++ ] = index.b;\n\t\t\t\tarray[ offset ++ ] = index.c;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector2sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector3sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector4sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize ];\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\t\t\tthis.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Int8Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Int8Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint8Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint8Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint8ClampedAttribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint8ClampedArray( array ), itemSize );\n\n\t}\n\n\tfunction Int16Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Int16Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint16Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint16Array( array ), itemSize );\n\n\t}\n\n\tfunction Int32Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Int32Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint32Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint32Array( array ), itemSize );\n\n\t}\n\n\tfunction Float32Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Float32Array( array ), itemSize );\n\n\t}\n\n\tfunction Float64Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Float64Array( array ), itemSize );\n\n\t}\n\n\t// Deprecated\n\n\tfunction DynamicBufferAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' );\n\t\treturn new BufferAttribute( array, itemSize ).setDynamic( true );\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author kile / http://kile.stravaganza.org/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Geometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Geometry';\n\n\t\tthis.vertices = [];\n\t\tthis.colors = [];\n\t\tthis.faces = [];\n\t\tthis.faceVertexUvs = [ [] ];\n\n\t\tthis.morphTargets = [];\n\t\tthis.morphNormals = [];\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\tthis.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.elementsNeedUpdate = false;\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.lineDistancesNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tObject.assign( Geometry.prototype, EventDispatcher.prototype, {\n\n\t\tisGeometry: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tfor ( var i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertex.applyMatrix4( matrix );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\t\t\t\tface.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tface.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\tthis.verticesNeedUpdate = true;\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfromBufferGeometry: function ( geometry ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar indices = geometry.index !== null ? geometry.index.array : undefined;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tvar positions = attributes.position.array;\n\t\t\tvar normals = attributes.normal !== undefined ? attributes.normal.array : undefined;\n\t\t\tvar colors = attributes.color !== undefined ? attributes.color.array : undefined;\n\t\t\tvar uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;\n\t\t\tvar uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;\n\n\t\t\tif ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = [];\n\n\t\t\tvar tempNormals = [];\n\t\t\tvar tempUVs = [];\n\t\t\tvar tempUVs2 = [];\n\n\t\t\tfor ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {\n\n\t\t\t\tscope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) );\n\n\t\t\t\tif ( normals !== undefined ) {\n\n\t\t\t\t\ttempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( colors !== undefined ) {\n\n\t\t\t\t\tscope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\ttempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\ttempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction addFace( a, b, c, materialIndex ) {\n\n\t\t\t\tvar vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : [];\n\t\t\t\tvar vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : [];\n\n\t\t\t\tvar face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );\n\n\t\t\t\tscope.faces.push( face );\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( indices !== undefined ) {\n\n\t\t\t\tvar groups = geometry.groups;\n\n\t\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\t\tfor ( var i = 0; i < groups.length; i ++ ) {\n\n\t\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\taddFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t\t\taddFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( var i = 0; i < positions.length / 3; i += 3 ) {\n\n\t\t\t\t\taddFace( i, i + 1, i + 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t\tvar center = this.boundingSphere.center;\n\t\t\tvar radius = this.boundingSphere.radius;\n\n\t\t\tvar s = radius === 0 ? 1 : 1.0 / radius;\n\n\t\t\tvar matrix = new Matrix4();\n\t\t\tmatrix.set(\n\t\t\t\ts, 0, 0, - s * center.x,\n\t\t\t\t0, s, 0, - s * center.y,\n\t\t\t\t0, 0, s, - s * center.z,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\tthis.applyMatrix( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\tfor ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tvar face = this.faces[ f ];\n\n\t\t\t\tvar vA = this.vertices[ face.a ];\n\t\t\t\tvar vB = this.vertices[ face.b ];\n\t\t\t\tvar vC = this.vertices[ face.c ];\n\n\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\tcb.cross( ab );\n\n\t\t\t\tcb.normalize();\n\n\t\t\t\tface.normal.copy( cb );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeVertexNormals: function ( areaWeighted ) {\n\n\t\t\tif ( areaWeighted === undefined ) areaWeighted = true;\n\n\t\t\tvar v, vl, f, fl, face, vertices;\n\n\t\t\tvertices = new Array( this.vertices.length );\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ] = new Vector3();\n\n\t\t\t}\n\n\t\t\tif ( areaWeighted ) {\n\n\t\t\t\t// vertex normals weighted by triangle areas\n\t\t\t\t// http://www.iquilezles.org/www/articles/normals/normals.htm\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvA = this.vertices[ face.a ];\n\t\t\t\t\tvB = this.vertices[ face.b ];\n\t\t\t\t\tvC = this.vertices[ face.c ];\n\n\t\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tvertices[ face.a ].add( cb );\n\t\t\t\t\tvertices[ face.b ].add( cb );\n\t\t\t\t\tvertices[ face.c ].add( cb );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.computeFaceNormals();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvertices[ face.a ].add( face.normal );\n\t\t\t\t\tvertices[ face.b ].add( face.normal );\n\t\t\t\t\tvertices[ face.c ].add( face.normal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ].normalize();\n\n\t\t\t}\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( vertices[ face.a ] );\n\t\t\t\t\tvertexNormals[ 1 ].copy( vertices[ face.b ] );\n\t\t\t\t\tvertexNormals[ 2 ].copy( vertices[ face.c ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = vertices[ face.a ].clone();\n\t\t\t\t\tvertexNormals[ 1 ] = vertices[ face.b ].clone();\n\t\t\t\t\tvertexNormals[ 2 ] = vertices[ face.c ].clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeFlatVertexNormals: function () {\n\n\t\t\tvar f, fl, face;\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 1 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 2 ].copy( face.normal );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 1 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 2 ] = face.normal.clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeMorphNormals: function () {\n\n\t\t\tvar i, il, f, fl, face;\n\n\t\t\t// save original normals\n\t\t\t// - create temp variables on first access\n\t\t\t// otherwise just copy (for faster repeated calls)\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tif ( ! face.__originalFaceNormal ) {\n\n\t\t\t\t\tface.__originalFaceNormal = face.normal.clone();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface.__originalFaceNormal.copy( face.normal );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];\n\n\t\t\t\tfor ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\t\tif ( ! face.__originalVertexNormals[ i ] ) {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// use temp geometry to compute face and vertex normals for each morph\n\n\t\t\tvar tmpGeo = new Geometry();\n\t\t\ttmpGeo.faces = this.faces;\n\n\t\t\tfor ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\t// create on first access\n\n\t\t\t\tif ( ! this.morphNormals[ i ] ) {\n\n\t\t\t\t\tthis.morphNormals[ i ] = {};\n\t\t\t\t\tthis.morphNormals[ i ].faceNormals = [];\n\t\t\t\t\tthis.morphNormals[ i ].vertexNormals = [];\n\n\t\t\t\t\tvar dstNormalsFace = this.morphNormals[ i ].faceNormals;\n\t\t\t\t\tvar dstNormalsVertex = this.morphNormals[ i ].vertexNormals;\n\n\t\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tfaceNormal = new Vector3();\n\t\t\t\t\t\tvertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };\n\n\t\t\t\t\t\tdstNormalsFace.push( faceNormal );\n\t\t\t\t\t\tdstNormalsVertex.push( vertexNormals );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar morphNormals = this.morphNormals[ i ];\n\n\t\t\t\t// set vertices to morph target\n\n\t\t\t\ttmpGeo.vertices = this.morphTargets[ i ].vertices;\n\n\t\t\t\t// compute morph normals\n\n\t\t\t\ttmpGeo.computeFaceNormals();\n\t\t\t\ttmpGeo.computeVertexNormals();\n\n\t\t\t\t// store morph normals\n\n\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tfaceNormal = morphNormals.faceNormals[ f ];\n\t\t\t\t\tvertexNormals = morphNormals.vertexNormals[ f ];\n\n\t\t\t\t\tfaceNormal.copy( face.normal );\n\n\t\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\n\t\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\n\t\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore original normals\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tface.normal = face.__originalFaceNormal;\n\t\t\t\tface.vertexNormals = face.__originalVertexNormals;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeTangents: function () {\n\n\t\t\tconsole.warn( 'THREE.Geometry: .computeTangents() has been removed.' );\n\n\t\t},\n\n\t\tcomputeLineDistances: function () {\n\n\t\t\tvar d = 0;\n\t\t\tvar vertices = this.vertices;\n\n\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tif ( i > 0 ) {\n\n\t\t\t\t\td += vertices[ i ].distanceTo( vertices[ i - 1 ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.lineDistances[ i ] = d;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tthis.boundingBox.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tmerge: function ( geometry, matrix, materialIndexOffset ) {\n\n\t\t\tif ( (geometry && geometry.isGeometry) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar normalMatrix,\n\t\t\tvertexOffset = this.vertices.length,\n\t\t\tvertices1 = this.vertices,\n\t\t\tvertices2 = geometry.vertices,\n\t\t\tfaces1 = this.faces,\n\t\t\tfaces2 = geometry.faces,\n\t\t\tuvs1 = this.faceVertexUvs[ 0 ],\n\t\t\tuvs2 = geometry.faceVertexUvs[ 0 ],\n\t\t\tcolors1 = this.colors,\n\t\t\tcolors2 = geometry.colors;\n\n\t\t\tif ( materialIndexOffset === undefined ) materialIndexOffset = 0;\n\n\t\t\tif ( matrix !== undefined ) {\n\n\t\t\t\tnormalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t}\n\n\t\t\t// vertices\n\n\t\t\tfor ( var i = 0, il = vertices2.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = vertices2[ i ];\n\n\t\t\t\tvar vertexCopy = vertex.clone();\n\n\t\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\n\n\t\t\t\tvertices1.push( vertexCopy );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tfor ( var i = 0, il = colors2.length; i < il; i ++ ) {\n\n\t\t\t\tcolors1.push( colors2[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tfor ( i = 0, il = faces2.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = faces2[ i ], faceCopy, normal, color,\n\t\t\t\tfaceVertexNormals = face.vertexNormals,\n\t\t\t\tfaceVertexColors = face.vertexColors;\n\n\t\t\t\tfaceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );\n\t\t\t\tfaceCopy.normal.copy( face.normal );\n\n\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\tfaceCopy.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tnormal = faceVertexNormals[ j ].clone();\n\n\t\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCopy.vertexNormals.push( normal );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.color.copy( face.color );\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {\n\n\t\t\t\t\tcolor = faceVertexColors[ j ];\n\t\t\t\t\tfaceCopy.vertexColors.push( color.clone() );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\n\n\t\t\t\tfaces1.push( faceCopy );\n\n\t\t\t}\n\n\t\t\t// uvs\n\n\t\t\tfor ( i = 0, il = uvs2.length; i < il; i ++ ) {\n\n\t\t\t\tvar uv = uvs2[ i ], uvCopy = [];\n\n\t\t\t\tif ( uv === undefined ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = uv.length; j < jl; j ++ ) {\n\n\t\t\t\t\tuvCopy.push( uv[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tuvs1.push( uvCopy );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmergeMesh: function ( mesh ) {\n\n\t\t\tif ( (mesh && mesh.isMesh) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tmesh.matrixAutoUpdate && mesh.updateMatrix();\n\n\t\t\tthis.merge( mesh.geometry, mesh.matrix );\n\n\t\t},\n\n\t\t/*\n\t\t * Checks for duplicate vertices with hashmap.\n\t\t * Duplicated vertices are removed\n\t\t * and faces' vertices are updated.\n\t\t */\n\n\t\tmergeVertices: function () {\n\n\t\t\tvar verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n\t\t\tvar unique = [], changes = [];\n\n\t\t\tvar v, key;\n\t\t\tvar precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n\t\t\tvar precision = Math.pow( 10, precisionPoints );\n\t\t\tvar i, il, face;\n\t\t\tvar indices, j, jl;\n\n\t\t\tfor ( i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tv = this.vertices[ i ];\n\t\t\t\tkey = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );\n\n\t\t\t\tif ( verticesMap[ key ] === undefined ) {\n\n\t\t\t\t\tverticesMap[ key ] = i;\n\t\t\t\t\tunique.push( this.vertices[ i ] );\n\t\t\t\t\tchanges[ i ] = unique.length - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\n\t\t\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// if faces are completely degenerate after merging vertices, we\n\t\t\t// have to remove them from the geometry.\n\t\t\tvar faceIndicesToRemove = [];\n\n\t\t\tfor ( i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tface = this.faces[ i ];\n\n\t\t\t\tface.a = changes[ face.a ];\n\t\t\t\tface.b = changes[ face.b ];\n\t\t\t\tface.c = changes[ face.c ];\n\n\t\t\t\tindices = [ face.a, face.b, face.c ];\n\n\t\t\t\tvar dupIndex = - 1;\n\n\t\t\t\t// if any duplicate vertices are found in a Face3\n\t\t\t\t// we have to remove the face as nothing can be saved\n\t\t\t\tfor ( var n = 0; n < 3; n ++ ) {\n\n\t\t\t\t\tif ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {\n\n\t\t\t\t\t\tdupIndex = n;\n\t\t\t\t\t\tfaceIndicesToRemove.push( i );\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\tfor ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\n\n\t\t\t\tvar idx = faceIndicesToRemove[ i ];\n\n\t\t\t\tthis.faces.splice( idx, 1 );\n\n\t\t\t\tfor ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ j ].splice( idx, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Use unique set of vertices\n\n\t\t\tvar diff = this.vertices.length - unique.length;\n\t\t\tthis.vertices = unique;\n\t\t\treturn diff;\n\n\t\t},\n\n\t\tsortFacesByMaterialIndex: function () {\n\n\t\t\tvar faces = this.faces;\n\t\t\tvar length = faces.length;\n\n\t\t\t// tag faces\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tfaces[ i ]._id = i;\n\n\t\t\t}\n\n\t\t\t// sort faces\n\n\t\t\tfunction materialIndexSort( a, b ) {\n\n\t\t\t\treturn a.materialIndex - b.materialIndex;\n\n\t\t\t}\n\n\t\t\tfaces.sort( materialIndexSort );\n\n\t\t\t// sort uvs\n\n\t\t\tvar uvs1 = this.faceVertexUvs[ 0 ];\n\t\t\tvar uvs2 = this.faceVertexUvs[ 1 ];\n\n\t\t\tvar newUvs1, newUvs2;\n\n\t\t\tif ( uvs1 && uvs1.length === length ) newUvs1 = [];\n\t\t\tif ( uvs2 && uvs2.length === length ) newUvs2 = [];\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tvar id = faces[ i ]._id;\n\n\t\t\t\tif ( newUvs1 ) newUvs1.push( uvs1[ id ] );\n\t\t\t\tif ( newUvs2 ) newUvs2.push( uvs2[ id ] );\n\n\t\t\t}\n\n\t\t\tif ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;\n\t\t\tif ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Geometry',\n\t\t\t\t\tgenerator: 'Geometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Geometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tvar vertices = [];\n\n\t\t\tfor ( var i = 0; i < this.vertices.length; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t\tvar faces = [];\n\t\t\tvar normals = [];\n\t\t\tvar normalsHash = {};\n\t\t\tvar colors = [];\n\t\t\tvar colorsHash = {};\n\t\t\tvar uvs = [];\n\t\t\tvar uvsHash = {};\n\n\t\t\tfor ( var i = 0; i < this.faces.length; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\n\t\t\t\tvar hasMaterial = true;\n\t\t\t\tvar hasFaceUv = false; // deprecated\n\t\t\t\tvar hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;\n\t\t\t\tvar hasFaceNormal = face.normal.length() > 0;\n\t\t\t\tvar hasFaceVertexNormal = face.vertexNormals.length > 0;\n\t\t\t\tvar hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;\n\t\t\t\tvar hasFaceVertexColor = face.vertexColors.length > 0;\n\n\t\t\t\tvar faceType = 0;\n\n\t\t\t\tfaceType = setBit( faceType, 0, 0 ); // isQuad\n\t\t\t\tfaceType = setBit( faceType, 1, hasMaterial );\n\t\t\t\tfaceType = setBit( faceType, 2, hasFaceUv );\n\t\t\t\tfaceType = setBit( faceType, 3, hasFaceVertexUv );\n\t\t\t\tfaceType = setBit( faceType, 4, hasFaceNormal );\n\t\t\t\tfaceType = setBit( faceType, 5, hasFaceVertexNormal );\n\t\t\t\tfaceType = setBit( faceType, 6, hasFaceColor );\n\t\t\t\tfaceType = setBit( faceType, 7, hasFaceVertexColor );\n\n\t\t\t\tfaces.push( faceType );\n\t\t\t\tfaces.push( face.a, face.b, face.c );\n\t\t\t\tfaces.push( face.materialIndex );\n\n\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\tvar faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 0 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 1 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\tfaces.push( getNormalIndex( face.normal ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 0 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 1 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\tfaces.push( getColorIndex( face.color ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 0 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 1 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction setBit( value, position, enabled ) {\n\n\t\t\t\treturn enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );\n\n\t\t\t}\n\n\t\t\tfunction getNormalIndex( normal ) {\n\n\t\t\t\tvar hash = normal.x.toString() + normal.y.toString() + normal.z.toString();\n\n\t\t\t\tif ( normalsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tnormalsHash[ hash ] = normals.length / 3;\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getColorIndex( color ) {\n\n\t\t\t\tvar hash = color.r.toString() + color.g.toString() + color.b.toString();\n\n\t\t\t\tif ( colorsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tcolorsHash[ hash ] = colors.length;\n\t\t\t\tcolors.push( color.getHex() );\n\n\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getUvIndex( uv ) {\n\n\t\t\t\tvar hash = uv.x.toString() + uv.y.toString();\n\n\t\t\t\tif ( uvsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tuvsHash[ hash ] = uvs.length / 2;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tdata.data = {};\n\n\t\t\tdata.data.vertices = vertices;\n\t\t\tdata.data.normals = normals;\n\t\t\tif ( colors.length > 0 ) data.data.colors = colors;\n\t\t\tif ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility\n\t\t\tdata.data.faces = faces;\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new Geometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.vertices = [];\n\t\t\tthis.faces = [];\n\t\t\tthis.faceVertexUvs = [ [] ];\n\t\t\tthis.colors = [];\n\n\t\t\tvar vertices = source.vertices;\n\n\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertices.push( vertices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tvar colors = source.colors;\n\n\t\t\tfor ( var i = 0, il = colors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.colors.push( colors[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tvar faces = source.faces;\n\n\t\t\tfor ( var i = 0, il = faces.length; i < il; i ++ ) {\n\n\t\t\t\tthis.faces.push( faces[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\t\t\tvar faceVertexUvs = source.faceVertexUvs[ i ];\n\n\t\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar uvs = faceVertexUvs[ j ], uvsCopy = [];\n\n\t\t\t\t\tfor ( var k = 0, kl = uvs.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tvar uv = uvs[ k ];\n\n\t\t\t\t\t\tuvsCopy.push( uv.clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\tvar count$3 = 0;\n\tfunction GeometryIdCount() { return count$3++; }\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectGeometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'DirectGeometry';\n\n\t\tthis.indices = [];\n\t\tthis.vertices = [];\n\t\tthis.normals = [];\n\t\tthis.colors = [];\n\t\tthis.uvs = [];\n\t\tthis.uvs2 = [];\n\n\t\tthis.groups = [];\n\n\t\tthis.morphTargets = {};\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\t// this.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tObject.assign( DirectGeometry.prototype, EventDispatcher.prototype, {\n\n\t\tcomputeBoundingBox: Geometry.prototype.computeBoundingBox,\n\t\tcomputeBoundingSphere: Geometry.prototype.computeBoundingSphere,\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\tconsole.warn( 'THREE.DirectGeometry: computeFaceNormals() is not a method of this type of geometry.' );\n\n\t\t},\n\n\t\tcomputeVertexNormals: function () {\n\n\t\t\tconsole.warn( 'THREE.DirectGeometry: computeVertexNormals() is not a method of this type of geometry.' );\n\n\t\t},\n\n\t\tcomputeGroups: function ( geometry ) {\n\n\t\t\tvar group;\n\t\t\tvar groups = [];\n\t\t\tvar materialIndex;\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t// materials\n\n\t\t\t\tif ( face.materialIndex !== materialIndex ) {\n\n\t\t\t\t\tmaterialIndex = face.materialIndex;\n\n\t\t\t\t\tif ( group !== undefined ) {\n\n\t\t\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\t\t\tgroups.push( group );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgroup = {\n\t\t\t\t\t\tstart: i * 3,\n\t\t\t\t\t\tmaterialIndex: materialIndex\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( group !== undefined ) {\n\n\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\tgroups.push( group );\n\n\t\t\t}\n\n\t\t\tthis.groups = groups;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tvar faces = geometry.faces;\n\t\t\tvar vertices = geometry.vertices;\n\t\t\tvar faceVertexUvs = geometry.faceVertexUvs;\n\n\t\t\tvar hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;\n\t\t\tvar hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;\n\n\t\t\t// morphs\n\n\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\tvar morphTargetsLength = morphTargets.length;\n\n\t\t\tvar morphTargetsPosition;\n\n\t\t\tif ( morphTargetsLength > 0 ) {\n\n\t\t\t\tmorphTargetsPosition = [];\n\n\t\t\t\tfor ( var i = 0; i < morphTargetsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsPosition[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.position = morphTargetsPosition;\n\n\t\t\t}\n\n\t\t\tvar morphNormals = geometry.morphNormals;\n\t\t\tvar morphNormalsLength = morphNormals.length;\n\n\t\t\tvar morphTargetsNormal;\n\n\t\t\tif ( morphNormalsLength > 0 ) {\n\n\t\t\t\tmorphTargetsNormal = [];\n\n\t\t\t\tfor ( var i = 0; i < morphNormalsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsNormal[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.normal = morphTargetsNormal;\n\n\t\t\t}\n\n\t\t\t// skins\n\n\t\t\tvar skinIndices = geometry.skinIndices;\n\t\t\tvar skinWeights = geometry.skinWeights;\n\n\t\t\tvar hasSkinIndices = skinIndices.length === vertices.length;\n\t\t\tvar hasSkinWeights = skinWeights.length === vertices.length;\n\n\t\t\t//\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tthis.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tthis.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar normal = face.normal;\n\n\t\t\t\t\tthis.normals.push( normal, normal, normal );\n\n\t\t\t\t}\n\n\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\tif ( vertexColors.length === 3 ) {\n\n\t\t\t\t\tthis.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar color = face.color;\n\n\t\t\t\t\tthis.colors.push( color, color, color );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );\n\n\t\t\t\t\t\tthis.uvs.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv2 === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 1 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );\n\n\t\t\t\t\t\tthis.uvs2.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// morphs\n\n\t\t\t\tfor ( var j = 0; j < morphTargetsLength; j ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ j ].vertices;\n\n\t\t\t\t\tmorphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0; j < morphNormalsLength; j ++ ) {\n\n\t\t\t\t\tvar morphNormal = morphNormals[ j ].vertexNormals[ i ];\n\n\t\t\t\t\tmorphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );\n\n\t\t\t\t}\n\n\t\t\t\t// skins\n\n\t\t\t\tif ( hasSkinIndices ) {\n\n\t\t\t\t\tthis.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasSkinWeights ) {\n\n\t\t\t\t\tthis.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeGroups( geometry );\n\n\t\t\tthis.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.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\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}\n\n\tObject.assign( BufferGeometry.prototype, EventDispatcher.prototype, {\n\n\t\tisBufferGeometry: true,\n\n\t\tgetIndex: function () {\n\n\t\t\treturn this.index;\n\n\t\t},\n\n\t\tsetIndex: function ( index ) {\n\n\t\t\tthis.index = index;\n\n\t\t},\n\n\t\taddAttribute: function ( name, attribute ) {\n\n\t\t\tif ( (attribute && attribute.isBufferAttribute) === false && (attribute && attribute.isInterleavedBufferAttribute) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\n\n\t\t\t\tthis.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( name === 'index' ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\n\t\t\t\tthis.setIndex( attribute );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.attributes[ name ] = attribute;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetAttribute: function ( name ) {\n\n\t\t\treturn this.attributes[ name ];\n\n\t\t},\n\n\t\tremoveAttribute: function ( name ) {\n\n\t\t\tdelete this.attributes[ name ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddGroup: function ( start, count, materialIndex ) {\n\n\t\t\tthis.groups.push( {\n\n\t\t\t\tstart: start,\n\t\t\t\tcount: count,\n\t\t\t\tmaterialIndex: materialIndex !== undefined ? materialIndex : 0\n\n\t\t\t} );\n\n\t\t},\n\n\t\tclearGroups: function () {\n\n\t\t\tthis.groups = [];\n\n\t\t},\n\n\t\tsetDrawRange: function ( start, count ) {\n\n\t\t\tthis.drawRange.start = start;\n\t\t\tthis.drawRange.count = count;\n\n\t\t},\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tmatrix.applyToVector3Array( position.array );\n\t\t\t\tposition.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tvar normal = this.attributes.normal;\n\n\t\t\tif ( normal !== undefined ) {\n\n\t\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t\tnormalMatrix.applyToVector3Array( normal.array );\n\t\t\t\tnormal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\t// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( (object && object.isPoints) || (object && object.isLine) ) {\n\n\t\t\t\tvar positions = new Float32Attribute( geometry.vertices.length * 3, 3 );\n\t\t\t\tvar colors = new Float32Attribute( geometry.colors.length * 3, 3 );\n\n\t\t\t\tthis.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\n\t\t\t\tthis.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\n\n\t\t\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\n\n\t\t\t\t\tvar lineDistances = new Float32Attribute( geometry.lineDistances.length, 1 );\n\n\t\t\t\t\tthis.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( (object && object.isMesh) ) {\n\n\t\t\t\tif ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\tthis.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateFromObject: function ( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( (object && object.isMesh) ) {\n\n\t\t\t\tvar direct = geometry.__directGeometry;\n\n\t\t\t\tif ( geometry.elementsNeedUpdate === true ) {\n\n\t\t\t\t\tdirect = undefined;\n\t\t\t\t\tgeometry.elementsNeedUpdate = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( direct === undefined ) {\n\n\t\t\t\t\treturn this.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t\tdirect.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\t\tdirect.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\t\tdirect.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\t\tdirect.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\t\tdirect.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t\tgeometry = direct;\n\n\t\t\t}\n\n\t\t\tvar attribute;\n\n\t\t\tif ( geometry.verticesNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.position;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.vertices );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.normalsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.normal;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.normals );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.colorsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.color;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyColorsArray( geometry.colors );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvsNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.uv;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector2sArray( geometry.uvs );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.lineDistancesNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.lineDistance;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyArray( geometry.lineDistances );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.lineDistancesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.groupsNeedUpdate ) {\n\n\t\t\t\tgeometry.computeGroups( object.geometry );\n\t\t\t\tthis.groups = geometry.groups;\n\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tgeometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );\n\n\t\t\treturn this.fromDirectGeometry( geometry.__directGeometry );\n\n\t\t},\n\n\t\tfromDirectGeometry: function ( geometry ) {\n\n\t\t\tvar positions = new Float32Array( geometry.vertices.length * 3 );\n\t\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );\n\n\t\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\t\tvar normals = new Float32Array( geometry.normals.length * 3 );\n\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\t\tvar colors = new Float32Array( geometry.colors.length * 3 );\n\t\t\t\tthis.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs.length > 0 ) {\n\n\t\t\t\tvar uvs = new Float32Array( geometry.uvs.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs2.length > 0 ) {\n\n\t\t\t\tvar uvs2 = new Float32Array( geometry.uvs2.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.indices.length > 0 ) {\n\n\t\t\t\tvar TypeArray = geometry.vertices.length > 65535 ? Uint32Array : Uint16Array;\n\t\t\t\tvar indices = new TypeArray( geometry.indices.length * 3 );\n\t\t\t\tthis.setIndex( new BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) );\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tthis.groups = geometry.groups;\n\n\t\t\t// morphs\n\n\t\t\tfor ( var name in geometry.morphTargets ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphTargets = geometry.morphTargets[ name ];\n\n\t\t\t\tfor ( var i = 0, l = morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ i ];\n\n\t\t\t\t\tvar attribute = new Float32Attribute( morphTarget.length * 3, 3 );\n\n\t\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// skinning\n\n\t\t\tif ( geometry.skinIndices.length > 0 ) {\n\n\t\t\t\tvar skinIndices = new Float32Attribute( geometry.skinIndices.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.skinWeights.length > 0 ) {\n\n\t\t\t\tvar skinWeights = new Float32Attribute( geometry.skinWeights.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tvar positions = this.attributes.position.array;\n\n\t\t\tif ( positions !== undefined ) {\n\n\t\t\t\tthis.boundingBox.setFromArray( positions );\n\n\t\t\t} else {\n\n\t\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t\t}\n\n\t\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\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\t}\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tvar box = new Box3();\n\t\t\tvar vector = new Vector3();\n\n\t\t\treturn function computeBoundingSphere() {\n\n\t\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t\t}\n\n\t\t\t\tvar positions = this.attributes.position;\n\n\t\t\t\tif ( positions ) {\n\n\t\t\t\t\tvar array = positions.array;\n\t\t\t\t\tvar center = this.boundingSphere.center;\n\n\t\t\t\t\tbox.setFromArray( array );\n\t\t\t\t\tbox.getCenter( center );\n\n\t\t\t\t\t// hoping to find a boundingSphere with a radius smaller than the\n\t\t\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\t\tfor ( var i = 0, il = array.length; i < il; i += 3 ) {\n\n\t\t\t\t\t\tvector.fromArray( array, i );\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\t// backwards compatibility\n\n\t\t},\n\n\t\tcomputeVertexNormals: function () {\n\n\t\t\tvar index = this.index;\n\t\t\tvar attributes = this.attributes;\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( attributes.position ) {\n\n\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\tif ( attributes.normal === undefined ) {\n\n\t\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// reset existing normals to zero\n\n\t\t\t\t\tvar array = attributes.normal.array;\n\n\t\t\t\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tarray[ i ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar normals = attributes.normal.array;\n\n\t\t\t\tvar vA, vB, vC,\n\n\t\t\t\tpA = new Vector3(),\n\t\t\t\tpB = new Vector3(),\n\t\t\t\tpC = new Vector3(),\n\n\t\t\t\tcb = new Vector3(),\n\t\t\t\tab = new Vector3();\n\n\t\t\t\t// indexed elements\n\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\t\tthis.addGroup( 0, indices.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var j = 0, jl = groups.length; j < jl; ++ j ) {\n\n\t\t\t\t\t\tvar group = groups[ j ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\t\tvA = indices[ i + 0 ] * 3;\n\t\t\t\t\t\t\tvB = indices[ i + 1 ] * 3;\n\t\t\t\t\t\t\tvC = indices[ i + 2 ] * 3;\n\n\t\t\t\t\t\t\tpA.fromArray( positions, vA );\n\t\t\t\t\t\t\tpB.fromArray( positions, vB );\n\t\t\t\t\t\t\tpC.fromArray( positions, vC );\n\n\t\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\t\tnormals[ vA ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vA + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vA + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vB ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vB + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vB + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vC ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vC + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vC + 2 ] += cb.z;\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\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\t\tfor ( var i = 0, il = positions.length; i < il; i += 9 ) {\n\n\t\t\t\t\t\tpA.fromArray( positions, i );\n\t\t\t\t\t\tpB.fromArray( positions, i + 3 );\n\t\t\t\t\t\tpC.fromArray( positions, i + 6 );\n\n\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\tnormals[ i ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 1 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 2 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 3 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 4 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 5 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 6 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 7 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 8 ] = cb.z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.normalizeNormals();\n\n\t\t\t\tattributes.normal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tmerge: function ( geometry, offset ) {\n\n\t\t\tif ( (geometry && geometry.isBufferGeometry) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\t\tvar attribute1 = attributes[ key ];\n\t\t\t\tvar attributeArray1 = attribute1.array;\n\n\t\t\t\tvar attribute2 = geometry.attributes[ key ];\n\t\t\t\tvar attributeArray2 = attribute2.array;\n\n\t\t\t\tvar attributeSize = attribute2.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) {\n\n\t\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalizeNormals: function () {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\n\t\t\tvar x, y, z, n;\n\n\t\t\tfor ( var i = 0, il = normals.length; i < il; i += 3 ) {\n\n\t\t\t\tx = normals[ i ];\n\t\t\t\ty = normals[ i + 1 ];\n\t\t\t\tz = normals[ i + 2 ];\n\n\t\t\t\tn = 1.0 / Math.sqrt( x * x + y * y + z * z );\n\n\t\t\t\tnormals[ i ] *= n;\n\t\t\t\tnormals[ i + 1 ] *= n;\n\t\t\t\tnormals[ i + 2 ] *= n;\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoNonIndexed: function () {\n\n\t\t\tif ( this.index === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar geometry2 = new BufferGeometry();\n\n\t\t\tvar indices = this.index.array;\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\n\t\t\t\tvar array = attribute.array;\n\t\t\t\tvar itemSize = attribute.itemSize;\n\n\t\t\t\tvar array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\t\tvar index = 0, index2 = 0;\n\n\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t\tfor ( var j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) );\n\n\t\t\t}\n\n\t\t\treturn geometry2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard BufferGeometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tdata.data = { attributes: {} };\n\n\t\t\tvar index = this.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar array = Array.prototype.slice.call( index.array );\n\n\t\t\t\tdata.data.index = {\n\t\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\t\tarray: array\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\n\t\t\t\tvar array = Array.prototype.slice.call( attribute.array );\n\n\t\t\t\tdata.data.attributes[ key ] = {\n\t\t\t\t\titemSize: attribute.itemSize,\n\t\t\t\t\ttype: attribute.array.constructor.name,\n\t\t\t\t\tarray: array,\n\t\t\t\t\tnormalized: attribute.normalized\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = this.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tdata.data.boundingSphere = {\n\t\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\t\tradius: boundingSphere.radius\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new BufferGeometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar index = source.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tthis.setIndex( index.clone() );\n\n\t\t\t}\n\n\t\t\tvar attributes = source.attributes;\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\t\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t\t}\n\n\t\t\tvar groups = source.groups;\n\n\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\tvar group = groups[ i ];\n\t\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\tBufferGeometry.MaxIndex = 65535;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author jonobr1 / http://jonobr1.com/\n\t */\n\n\tfunction Mesh( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t\tthis.drawMode = TrianglesDrawMode;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tMesh.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Mesh,\n\n\t\tisMesh: true,\n\n\t\tsetDrawMode: function ( value ) {\n\n\t\t\tthis.drawMode = value;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.drawMode = source.drawMode;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateMorphTargets: function () {\n\n\t\t\tvar morphTargets = this.geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( var m = 0, ml = morphTargets.length; m < ml; m ++ ) {\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ morphTargets[ m ].name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\tvar vA = new Vector3();\n\t\t\tvar vB = new Vector3();\n\t\t\tvar vC = new Vector3();\n\n\t\t\tvar tempA = new Vector3();\n\t\t\tvar tempB = new Vector3();\n\t\t\tvar tempC = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tvar barycoord = new Vector3();\n\n\t\t\tvar intersectionPoint = new Vector3();\n\t\t\tvar intersectionPointWorld = new Vector3();\n\n\t\t\tfunction uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) {\n\n\t\t\t\tTriangle.barycoordFromPoint( point, p1, p2, p3, barycoord );\n\n\t\t\t\tuv1.multiplyScalar( barycoord.x );\n\t\t\t\tuv2.multiplyScalar( barycoord.y );\n\t\t\t\tuv3.multiplyScalar( barycoord.z );\n\n\t\t\t\tuv1.add( uv2 ).add( uv3 );\n\n\t\t\t\treturn uv1.clone();\n\n\t\t\t}\n\n\t\t\tfunction checkIntersection( object, raycaster, ray, pA, pB, pC, point ) {\n\n\t\t\t\tvar intersect;\n\t\t\t\tvar material = object.material;\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t\t\t\t}\n\n\t\t\t\tif ( intersect === null ) return null;\n\n\t\t\t\tintersectionPointWorld.copy( point );\n\t\t\t\tintersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\t\t\t\treturn {\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\tpoint: intersectionPointWorld.clone(),\n\t\t\t\t\tobject: object\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tfunction checkBufferGeometryIntersection( object, raycaster, ray, positions, uvs, a, b, c ) {\n\n\t\t\t\tvA.fromArray( positions, a * 3 );\n\t\t\t\tvB.fromArray( positions, b * 3 );\n\t\t\t\tvC.fromArray( positions, c * 3 );\n\n\t\t\t\tvar intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint );\n\n\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\t\tuvA.fromArray( uvs, a * 2 );\n\t\t\t\t\t\tuvB.fromArray( uvs, b * 2 );\n\t\t\t\t\t\tuvC.fromArray( uvs, c * 2 );\n\n\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tintersection.face = new Face3( a, b, c, Triangle.normal( vA, vB, vC ) );\n\t\t\t\t\tintersection.faceIndex = a;\n\n\t\t\t\t}\n\n\t\t\t\treturn intersection;\n\n\t\t\t}\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar material = this.material;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\tif ( material === undefined ) return;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\t// Check boundingBox before continuing\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tif ( ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t\t\t}\n\n\t\t\t\tvar uvs, intersection;\n\n\t\t\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\tvar a, b, c;\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( attributes.uv !== undefined ) {\n\n\t\t\t\t\t\tuvs = attributes.uv.array;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = indices[ i ];\n\t\t\t\t\t\t\tb = indices[ i + 1 ];\n\t\t\t\t\t\t\tc = indices[ i + 2 ];\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\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\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length; i < l; i += 9 ) {\n\n\t\t\t\t\t\t\ta = i / 3;\n\t\t\t\t\t\t\tb = a + 1;\n\t\t\t\t\t\t\tc = a + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.index = a; // triangle number in positions buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\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 if ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\tvar fvA, fvB, fvC;\n\t\t\t\t\tvar isFaceMaterial = (material && material.isMultiMaterial);\n\t\t\t\t\tvar materials = isFaceMaterial === true ? material.materials : null;\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar faceVertexUvs = geometry.faceVertexUvs[ 0 ];\n\t\t\t\t\tif ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;\n\n\t\t\t\t\tfor ( var f = 0, fl = faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tvar face = faces[ f ];\n\t\t\t\t\t\tvar faceMaterial = isFaceMaterial === true ? materials[ face.materialIndex ] : material;\n\n\t\t\t\t\t\tif ( faceMaterial === undefined ) continue;\n\n\t\t\t\t\t\tfvA = vertices[ face.a ];\n\t\t\t\t\t\tfvB = vertices[ face.b ];\n\t\t\t\t\t\tfvC = vertices[ face.c ];\n\n\t\t\t\t\t\tif ( faceMaterial.morphTargets === true ) {\n\n\t\t\t\t\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\t\t\t\t\tvar morphInfluences = this.morphTargetInfluences;\n\n\t\t\t\t\t\t\tvA.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvB.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvC.set( 0, 0, 0 );\n\n\t\t\t\t\t\t\tfor ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {\n\n\t\t\t\t\t\t\t\tvar influence = morphInfluences[ t ];\n\n\t\t\t\t\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t\t\t\t\tvar targets = morphTargets[ t ].vertices;\n\n\t\t\t\t\t\t\t\tvA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence );\n\t\t\t\t\t\t\t\tvB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence );\n\t\t\t\t\t\t\t\tvC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvA.add( fvA );\n\t\t\t\t\t\t\tvB.add( fvB );\n\t\t\t\t\t\t\tvC.add( fvC );\n\n\t\t\t\t\t\t\tfvA = vA;\n\t\t\t\t\t\t\tfvB = vB;\n\t\t\t\t\t\t\tfvC = vC;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tintersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\t\t\t\tvar uvs_f = uvs[ f ];\n\t\t\t\t\t\t\t\tuvA.copy( uvs_f[ 0 ] );\n\t\t\t\t\t\t\t\tuvB.copy( uvs_f[ 1 ] );\n\t\t\t\t\t\t\t\tuvC.copy( uvs_f[ 2 ] );\n\n\t\t\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tintersection.face = face;\n\t\t\t\t\t\t\tintersection.faceIndex = f;\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};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'BoxBufferGeometry';\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\tvar scope = this;\n\n\t\t// segments\n\t\twidthSegments = Math.floor( widthSegments ) || 1;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\t\tdepthSegments = Math.floor( depthSegments ) || 1;\n\n\t\t// these are used to calculate buffer length\n\t\tvar vertexCount = calculateVertexCount( widthSegments, heightSegments, depthSegments );\n\t\tvar indexCount = calculateIndexCount( widthSegments, heightSegments, depthSegments );\n\n\t\t// buffers\n\t\tvar indices = new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount );\n\t\tvar vertices = new Float32Array( vertexCount * 3 );\n\t\tvar normals = new Float32Array( vertexCount * 3 );\n\t\tvar uvs = new Float32Array( vertexCount * 2 );\n\n\t\t// offset variables\n\t\tvar vertexBufferOffset = 0;\n\t\tvar uvBufferOffset = 0;\n\t\tvar indexBufferOffset = 0;\n\t\tvar numberOfVertices = 0;\n\n\t\t// group variables\n\t\tvar groupStart = 0;\n\n\t\t// build each side of the box geometry\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\t\tthis.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t\t// helper functions\n\n\t\tfunction calculateVertexCount( w, h, d ) {\n\n\t\t\tvar vertices = 0;\n\n\t\t\t// calculate the amount of vertices for each side (plane)\n\t\t\tvertices += (w + 1) * (h + 1) * 2; // xy\n\t\t\tvertices += (w + 1) * (d + 1) * 2; // xz\n\t\t\tvertices += (d + 1) * (h + 1) * 2; // zy\n\n\t\t\treturn vertices;\n\n\t\t}\n\n\t\tfunction calculateIndexCount( w, h, d ) {\n\n\t\t\tvar index = 0;\n\n\t\t\t// calculate the amount of squares for each side\n\t\t\tindex += w * h * 2; // xy\n\t\t\tindex += w * d * 2; // xz\n\t\t\tindex += d * h * 2; // zy\n\n\t\t\treturn index * 6; // two triangles per square => six vertices per square\n\n\t\t}\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tvar segmentWidth\t= width / gridX;\n\t\t\tvar segmentHeight = height / gridY;\n\n\t\t\tvar widthHalf = width / 2;\n\t\t\tvar heightHalf = height / 2;\n\t\t\tvar depthHalf = depth / 2;\n\n\t\t\tvar gridX1 = gridX + 1;\n\t\t\tvar gridY1 = gridY + 1;\n\n\t\t\tvar vertexCounter = 0;\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( var iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tvar y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( var ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tvar x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\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\t\t\t\t\tvertices[ vertexBufferOffset ] = vector.x;\n\t\t\t\t\tvertices[ vertexBufferOffset + 1 ] = vector.y;\n\t\t\t\t\tvertices[ vertexBufferOffset + 2 ] = vector.z;\n\n\t\t\t\t\t// set values to correct vector component\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\t\t\t\t\tnormals[ vertexBufferOffset ] = vector.x;\n\t\t\t\t\tnormals[ vertexBufferOffset + 1 ] = vector.y;\n\t\t\t\t\tnormals[ vertexBufferOffset + 2 ] = vector.z;\n\n\t\t\t\t\t// uvs\n\t\t\t\t\tuvs[ uvBufferOffset ] = ix / gridX;\n\t\t\t\t\tuvs[ uvBufferOffset + 1 ] = 1 - ( iy / gridY );\n\n\t\t\t\t\t// update offsets and counters\n\t\t\t\t\tvertexBufferOffset += 3;\n\t\t\t\t\tuvBufferOffset += 2;\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\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 ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\t// indices\n\t\t\t\t\tvar a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tvar b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// face one\n\t\t\t\t\tindices[ indexBufferOffset ] = a;\n\t\t\t\t\tindices[ indexBufferOffset + 1 ] = b;\n\t\t\t\t\tindices[ indexBufferOffset + 2 ] = d;\n\n\t\t\t\t\t// face two\n\t\t\t\t\tindices[ indexBufferOffset + 3 ] = b;\n\t\t\t\t\tindices[ indexBufferOffset + 4 ] = c;\n\t\t\t\t\tindices[ indexBufferOffset + 5 ] = d;\n\n\t\t\t\t\t// update offsets and counters\n\t\t\t\t\tindexBufferOffset += 6;\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\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tBoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tBoxBufferGeometry.prototype.constructor = BoxBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PlaneBufferGeometry';\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\tvar width_half = width / 2;\n\t\tvar height_half = height / 2;\n\n\t\tvar gridX = Math.floor( widthSegments ) || 1;\n\t\tvar gridY = Math.floor( heightSegments ) || 1;\n\n\t\tvar gridX1 = gridX + 1;\n\t\tvar gridY1 = gridY + 1;\n\n\t\tvar segment_width = width / gridX;\n\t\tvar segment_height = height / gridY;\n\n\t\tvar vertices = new Float32Array( gridX1 * gridY1 * 3 );\n\t\tvar normals = new Float32Array( gridX1 * gridY1 * 3 );\n\t\tvar uvs = new Float32Array( gridX1 * gridY1 * 2 );\n\n\t\tvar offset = 0;\n\t\tvar offset2 = 0;\n\n\t\tfor ( var iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tvar y = iy * segment_height - height_half;\n\n\t\t\tfor ( var ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tvar x = ix * segment_width - width_half;\n\n\t\t\t\tvertices[ offset ] = x;\n\t\t\t\tvertices[ offset + 1 ] = - y;\n\n\t\t\t\tnormals[ offset + 2 ] = 1;\n\n\t\t\t\tuvs[ offset2 ] = ix / gridX;\n\t\t\t\tuvs[ offset2 + 1 ] = 1 - ( iy / gridY );\n\n\t\t\t\toffset += 3;\n\t\t\t\toffset2 += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\toffset = 0;\n\n\t\tvar indices = new ( ( vertices.length / 3 ) > 65535 ? Uint32Array : Uint16Array )( gridX * gridY * 6 );\n\n\t\tfor ( var iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( var ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tvar a = ix + gridX1 * iy;\n\t\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices[ offset ] = a;\n\t\t\t\tindices[ offset + 1 ] = b;\n\t\t\t\tindices[ offset + 2 ] = d;\n\n\t\t\t\tindices[ offset + 3 ] = b;\n\t\t\t\tindices[ offset + 4 ] = c;\n\t\t\t\tindices[ offset + 5 ] = d;\n\n\t\t\t\toffset += 6;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tPlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction Camera() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t}\n\n\tCamera.prototype = Object.create( Object3D.prototype );\n\tCamera.prototype.constructor = Camera;\n\n\tCamera.prototype.isCamera = true;\n\n\tCamera.prototype.getWorldDirection = function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\treturn result.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.lookAt = function () {\n\n\t\t// This routine does not support cameras with rotated and/or translated parent(s)\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function lookAt( vector ) {\n\n\t\t\tm1.lookAt( this.position, vector, this.up );\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.clone = function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t};\n\n\tCamera.prototype.copy = function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author greggman / http://games.greggman.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author tschw\n\t */\n\n\tfunction PerspectiveCamera( fov, aspect, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov !== undefined ? fov : 50;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near !== undefined ? near : 0.1;\n\t\tthis.far = far !== undefined ? far : 2000;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect !== undefined ? aspect : 1;\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\tPerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: PerspectiveCamera,\n\n\t\tisPerspectiveCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.fov = source.fov;\n\t\t\tthis.zoom = source.zoom;\n\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\t\t\tthis.focus = source.focus;\n\n\t\t\tthis.aspect = source.aspect;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\tthis.filmGauge = source.filmGauge;\n\t\t\tthis.filmOffset = source.filmOffset;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t\t *\n\t\t * The default film gauge is 35, so that the focal length can be specified for\n\t\t * a 35mm (full frame) camera.\n\t\t *\n\t\t * Values for focal length and film gauge must have the same unit.\n\t\t */\n\t\tsetFocalLength: function ( focalLength ) {\n\n\t\t\t// see http://www.bobatkins.com/photography/technical/field_of_view.html\n\t\t\tvar vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\t\tthis.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\t/**\n\t\t * Calculates the focal length from the current .fov and .filmGauge.\n\t\t */\n\t\tgetFocalLength: function () {\n\n\t\t\tvar vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov );\n\n\t\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t\t},\n\n\t\tgetEffectiveFOV: function () {\n\n\t\t\treturn _Math.RAD2DEG * 2 * Math.atan(\n\t\t\t\t\tMath.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t\t},\n\n\t\tgetFilmWidth: function () {\n\n\t\t\t// film not completely covered in portrait format (aspect < 1)\n\t\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t\t},\n\n\t\tgetFilmHeight: function () {\n\n\t\t\t// film not completely covered in landscape format (aspect > 1)\n\t\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t\t},\n\n\t\t/**\n\t\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t\t * multi-monitor/multi-machine setups.\n\t\t *\n\t\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t\t * the monitors are in grid like this\n\t\t *\n\t\t * +---+---+---+\n\t\t * | A | B | C |\n\t\t * +---+---+---+\n\t\t * | D | E | F |\n\t\t * +---+---+---+\n\t\t *\n\t\t * then for each monitor you would call it like this\n\t\t *\n\t\t * var w = 1920;\n\t\t * var h = 1080;\n\t\t * var fullWidth = w * 3;\n\t\t * var fullHeight = h * 2;\n\t\t *\n\t\t * --A--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t\t * --B--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t\t * --C--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t\t * --D--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t\t * --E--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t\t * --F--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t\t *\n\t\t * Note there is no reason monitors have to be the same size or in a grid.\n\t\t */\n\t\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar near = this.near,\n\t\t\t\ttop = near * Math.tan(\n\t\t\t\t\t\t_Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,\n\t\t\t\theight = 2 * top,\n\t\t\t\twidth = this.aspect * height,\n\t\t\t\tleft = - 0.5 * width,\n\t\t\t\tview = this.view;\n\n\t\t\tif ( view !== null ) {\n\n\t\t\t\tvar fullWidth = view.fullWidth,\n\t\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\t\twidth *= view.width / fullWidth;\n\t\t\t\theight *= view.height / fullHeight;\n\n\t\t\t}\n\n\t\t\tvar skew = this.filmOffset;\n\t\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\t\tthis.projectionMatrix.makeFrustum(\n\t\t\t\t\tleft, left + width, top - height, top, near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.fov = this.fov;\n\t\t\tdata.object.zoom = this.zoom;\n\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\t\t\tdata.object.focus = this.focus;\n\n\t\t\tdata.object.aspect = this.aspect;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\tdata.object.filmGauge = this.filmGauge;\n\t\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author arose / http://github.com/arose\n\t */\n\n\tfunction OrthographicCamera( left, right, top, bottom, near, far ) {\n\n\t\tCamera.call( this );\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 !== undefined ) ? near : 0.1;\n\t\tthis.far = ( far !== undefined ) ? far : 2000;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tOrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: OrthographicCamera,\n\n\t\tisOrthographicCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.left = source.left;\n\t\t\tthis.right = source.right;\n\t\t\tthis.top = source.top;\n\t\t\tthis.bottom = source.bottom;\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\n\t\t\tthis.zoom = source.zoom;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetViewOffset: function( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\t\tvar dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\t\tvar cx = ( this.right + this.left ) / 2;\n\t\t\tvar cy = ( this.top + this.bottom ) / 2;\n\n\t\t\tvar left = cx - dx;\n\t\t\tvar right = cx + dx;\n\t\t\tvar top = cy + dy;\n\t\t\tvar bottom = cy - dy;\n\n\t\t\tif ( this.view !== null ) {\n\n\t\t\t\tvar zoomW = this.zoom / ( this.view.width / this.view.fullWidth );\n\t\t\t\tvar zoomH = this.zoom / ( this.view.height / this.view.fullHeight );\n\t\t\t\tvar scaleW = ( this.right - this.left ) / this.view.width;\n\t\t\t\tvar scaleH = ( this.top - this.bottom ) / this.view.height;\n\n\t\t\t\tleft += scaleW * ( this.view.offsetX / zoomW );\n\t\t\t\tright = left + scaleW * ( this.view.width / zoomW );\n\t\t\t\ttop -= scaleH * ( this.view.offsetY / zoomH );\n\t\t\t\tbottom = top - scaleH * ( this.view.height / zoomH );\n\n\t\t\t}\n\n\t\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.zoom = this.zoom;\n\t\t\tdata.object.left = this.left;\n\t\t\tdata.object.right = this.right;\n\t\t\tdata.object.top = this.top;\n\t\t\tdata.object.bottom = this.bottom;\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLIndexedBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tvar type, size;\n\n\t\tfunction setIndex( index ) {\n\n\t\t\tif ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\t\ttype = gl.UNSIGNED_INT;\n\t\t\t\tsize = 4;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\t\t\t\tsize = 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawElements( mode, count, type, start * size );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry, start, count ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\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\textension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tsetMode: setMode,\n\t\t\tsetIndex: setIndex,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawArrays( mode, start, count );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\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\tvar position = geometry.attributes.position;\n\n\t\t\tvar count = 0;\n\n\t\t\tif ( (position && position.isInterleavedBufferAttribute) ) {\n\n\t\t\t\tcount = position.data.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t} else {\n\n\t\t\t\tcount = position.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t}\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\t\t\tsetMode: setMode,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLLights() {\n\n\t\tvar lights = {};\n\n\t\treturn {\n\n\t\t\tget: function ( light ) {\n\n\t\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\t\treturn lights[ light.id ];\n\n\t\t\t\t}\n\n\t\t\t\tvar uniforms;\n\n\t\t\t\tswitch ( light.type ) {\n\n\t\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\t\treturn uniforms;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction addLineNumbers( string ) {\n\n\t\tvar lines = string.split( '\\n' );\n\n\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t\t}\n\n\t\treturn lines.join( '\\n' );\n\n\t}\n\n\tfunction WebGLShader( gl, type, string ) {\n\n\t\tvar shader = gl.createShader( type );\n\n\t\tgl.shaderSource( shader, string );\n\t\tgl.compileShader( shader );\n\n\t\tif ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {\n\n\t\t\tconsole.error( 'THREE.WebGLShader: Shader couldn\\'t compile.' );\n\n\t\t}\n\n\t\tif ( gl.getShaderInfoLog( shader ) !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );\n\n\t\t}\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\treturn shader;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar programIdCount = 0;\n\n\tfunction getEncodingComponents( encoding ) {\n\n\t\tswitch ( encoding ) {\n\n\t\t\tcase LinearEncoding:\n\t\t\t\treturn [ 'Linear','( value )' ];\n\t\t\tcase sRGBEncoding:\n\t\t\t\treturn [ 'sRGB','( value )' ];\n\t\t\tcase RGBEEncoding:\n\t\t\t\treturn [ 'RGBE','( value )' ];\n\t\t\tcase RGBM7Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 7.0 )' ];\n\t\t\tcase RGBM16Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 16.0 )' ];\n\t\t\tcase RGBDEncoding:\n\t\t\t\treturn [ 'RGBD','( value, 256.0 )' ];\n\t\t\tcase GammaEncoding:\n\t\t\t\treturn [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ];\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported encoding: ' + encoding );\n\n\t\t}\n\n\t}\n\n\tfunction getTexelDecodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return \" + components[ 0 ] + \"ToLinear\" + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return LinearTo\" + components[ 0 ] + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\t\tvar toneMappingName;\n\n\t\tswitch ( toneMapping ) {\n\n\t\t\tcase LinearToneMapping:\n\t\t\t\ttoneMappingName = \"Linear\";\n\t\t\t\tbreak;\n\n\t\t\tcase ReinhardToneMapping:\n\t\t\t\ttoneMappingName = \"Reinhard\";\n\t\t\t\tbreak;\n\n\t\t\tcase Uncharted2ToneMapping:\n\t\t\t\ttoneMappingName = \"Uncharted2\";\n\t\t\t\tbreak;\n\n\t\t\tcase CineonToneMapping:\n\t\t\t\ttoneMappingName = \"OptimizedCineon\";\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported toneMapping: ' + toneMapping );\n\n\t\t}\n\n\t\treturn \"vec3 \" + functionName + \"( vec3 color ) { return \" + toneMappingName + \"ToneMapping( color ); }\";\n\n\t}\n\n\tfunction generateExtensions( extensions, parameters, rendererExtensions ) {\n\n\t\textensions = extensions || {};\n\n\t\tvar chunks = [\n\t\t\t( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t\t( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t\t( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t\t( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '',\n\t\t];\n\n\t\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tfunction generateDefines( defines ) {\n\n\t\tvar chunks = [];\n\n\t\tfor ( var name in defines ) {\n\n\t\t\tvar value = defines[ name ];\n\n\t\t\tif ( value === false ) continue;\n\n\t\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t\t}\n\n\t\treturn chunks.join( '\\n' );\n\n\t}\n\n\tfunction fetchAttributeLocations( gl, program, identifiers ) {\n\n\t\tvar attributes = {};\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\t\tfor ( var i = 0; i < n; i ++ ) {\n\n\t\t\tvar info = gl.getActiveAttrib( program, i );\n\t\t\tvar name = info.name;\n\n\t\t\t// console.log(\"THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:\", name, i );\n\n\t\t\tattributes[ name ] = gl.getAttribLocation( program, name );\n\n\t\t}\n\n\t\treturn attributes;\n\n\t}\n\n\tfunction filterEmptyLine( string ) {\n\n\t\treturn string !== '';\n\n\t}\n\n\tfunction replaceLightNums( string, parameters ) {\n\n\t\treturn string\n\t\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );\n\n\t}\n\n\tfunction parseIncludes( string ) {\n\n\t\tvar pattern = /#include +<([\\w\\d.]+)>/g;\n\n\t\tfunction replace( match, include ) {\n\n\t\t\tvar replace = ShaderChunk[ include ];\n\n\t\t\tif ( replace === undefined ) {\n\n\t\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t\t}\n\n\t\t\treturn parseIncludes( replace );\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction unrollLoops( string ) {\n\n\t\tvar pattern = /for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\n\n\t\tfunction replace( match, start, end, snippet ) {\n\n\t\t\tvar unroll = '';\n\n\t\t\tfor ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\t\t\tunroll += snippet.replace( /\\[ i \\]/g, '[ ' + i + ' ]' );\n\n\t\t\t}\n\n\t\t\treturn unroll;\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction WebGLProgram( renderer, code, material, parameters ) {\n\n\t\tvar gl = renderer.context;\n\n\t\tvar extensions = material.extensions;\n\t\tvar defines = material.defines;\n\n\t\tvar vertexShader = material.__webglShader.vertexShader;\n\t\tvar fragmentShader = material.__webglShader.fragmentShader;\n\n\t\tvar shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\t\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t\t}\n\n\t\tvar envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\tvar envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\t\tvar envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\n\t\tif ( parameters.envMap ) {\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeReflectionMapping:\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EquirectangularReflectionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SphericalReflectionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_SPHERE';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.combine ) {\n\n\t\t\t\tcase MultiplyOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MixOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AddOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;\n\n\t\t// console.log( 'building new program ' );\n\n\t\t//\n\n\t\tvar customExtensions = generateExtensions( extensions, parameters, renderer.extensions );\n\n\t\tvar customDefines = generateDefines( defines );\n\n\t\t//\n\n\t\tvar program = gl.createProgram();\n\n\t\tvar prefixVertex, prefixFragment;\n\n\t\tif ( material.isRawShaderMaterial ) {\n\n\t\t\tprefixVertex = [\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t} else {\n\n\t\t\tprefixVertex = [\n\n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t'attribute vec3 position;',\n\t\t\t\t'attribute vec3 normal;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'#ifdef USE_COLOR',\n\n\t\t\t\t'\tattribute vec3 color;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_MORPHTARGETS',\n\n\t\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t\t'\t#else',\n\n\t\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t\t'\t#endif',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\t\t\t\t'#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection),\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.premultipliedAlpha ? \"#define PREMULTIPLIED_ALPHA\" : '',\n\n\t\t\t\tparameters.physicallyCorrectLights ? \"#define PHYSICALLY_CORRECT_LIGHTS\" : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\tparameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? \"#define TONE_MAPPING\" : '',\n\t\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\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( \"toneMapping\", parameters.toneMapping ) : '',\n\n\t\t\t\t( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\t\tparameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',\n\t\t\t\tparameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',\n\t\t\t\tparameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',\n\t\t\t\tparameters.outputEncoding ? getTexelEncodingFunction( \"linearToOutputTexel\", parameters.outputEncoding ) : '',\n\n\t\t\t\tparameters.depthPacking ? \"#define DEPTH_PACKING \" + material.depthPacking : '',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t}\n\n\t\tvertexShader = parseIncludes( vertexShader, parameters );\n\t\tvertexShader = replaceLightNums( vertexShader, parameters );\n\n\t\tfragmentShader = parseIncludes( fragmentShader, parameters );\n\t\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\n\t\tif ( ! material.isShaderMaterial ) {\n\n\t\t\tvertexShader = unrollLoops( vertexShader );\n\t\t\tfragmentShader = unrollLoops( fragmentShader );\n\n\t\t}\n\n\t\tvar vertexGlsl = prefixVertex + vertexShader;\n\t\tvar fragmentGlsl = prefixFragment + fragmentShader;\n\n\t\t// console.log( '*VERTEX*', vertexGlsl );\n\t\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\t\tvar glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\t\tvar glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\t\tgl.attachShader( program, glVertexShader );\n\t\tgl.attachShader( program, glFragmentShader );\n\n\t\t// Force a particular attribute to index 0.\n\n\t\tif ( material.index0AttributeName !== undefined ) {\n\n\t\t\tgl.bindAttribLocation( program, 0, material.index0AttributeName );\n\n\t\t} else if ( parameters.morphTargets === true ) {\n\n\t\t\t// programs with morphTargets displace position out of attribute 0\n\t\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t\t}\n\n\t\tgl.linkProgram( program );\n\n\t\tvar programLog = gl.getProgramInfoLog( program );\n\t\tvar vertexLog = gl.getShaderInfoLog( glVertexShader );\n\t\tvar fragmentLog = gl.getShaderInfoLog( glFragmentShader );\n\n\t\tvar runnable = true;\n\t\tvar haveDiagnostics = true;\n\n\t\t// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );\n\t\t// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );\n\n\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\trunnable = false;\n\n\t\t\tconsole.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog );\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\t\t\t\tmaterial: material,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t// clean up\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\t// set up caching for uniform locations\n\n\t\tvar cachedUniforms;\n\n\t\tthis.getUniforms = function() {\n\n\t\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t\tcachedUniforms =\n\t\t\t\t\t\tnew WebGLUniforms( gl, program, renderer );\n\n\t\t\t}\n\n\t\t\treturn cachedUniforms;\n\n\t\t};\n\n\t\t// set up caching for attribute locations\n\n\t\tvar cachedAttributes;\n\n\t\tthis.getAttributes = function() {\n\n\t\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t\t}\n\n\t\t\treturn cachedAttributes;\n\n\t\t};\n\n\t\t// free resource\n\n\t\tthis.destroy = function() {\n\n\t\t\tgl.deleteProgram( program );\n\t\t\tthis.program = undefined;\n\n\t\t};\n\n\t\t// DEPRECATED\n\n\t\tObject.defineProperties( this, {\n\n\t\t\tuniforms: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );\n\t\t\t\t\treturn this.getUniforms();\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tattributes: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );\n\t\t\t\t\treturn this.getAttributes();\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t} );\n\n\n\t\t//\n\n\t\tthis.id = programIdCount ++;\n\t\tthis.code = code;\n\t\tthis.usedTimes = 1;\n\t\tthis.program = program;\n\t\tthis.vertexShader = glVertexShader;\n\t\tthis.fragmentShader = glFragmentShader;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLPrograms( renderer, capabilities ) {\n\n\t\tvar programs = [];\n\n\t\tvar shaderIDs = {\n\t\t\tMeshDepthMaterial: 'depth',\n\t\t\tMeshNormalMaterial: 'normal',\n\t\t\tMeshBasicMaterial: 'basic',\n\t\t\tMeshLambertMaterial: 'lambert',\n\t\t\tMeshPhongMaterial: 'phong',\n\t\t\tMeshStandardMaterial: 'physical',\n\t\t\tMeshPhysicalMaterial: 'physical',\n\t\t\tLineBasicMaterial: 'basic',\n\t\t\tLineDashedMaterial: 'dashed',\n\t\t\tPointsMaterial: 'points'\n\t\t};\n\n\t\tvar parameterNames = [\n\t\t\t\"precision\", \"supportsVertexTextures\", \"map\", \"mapEncoding\", \"envMap\", \"envMapMode\", \"envMapEncoding\",\n\t\t\t\"lightMap\", \"aoMap\", \"emissiveMap\", \"emissiveMapEncoding\", \"bumpMap\", \"normalMap\", \"displacementMap\", \"specularMap\",\n\t\t\t\"roughnessMap\", \"metalnessMap\",\n\t\t\t\"alphaMap\", \"combine\", \"vertexColors\", \"fog\", \"useFog\", \"fogExp\",\n\t\t\t\"flatShading\", \"sizeAttenuation\", \"logarithmicDepthBuffer\", \"skinning\",\n\t\t\t\"maxBones\", \"useVertexTexture\", \"morphTargets\", \"morphNormals\",\n\t\t\t\"maxMorphTargets\", \"maxMorphNormals\", \"premultipliedAlpha\",\n\t\t\t\"numDirLights\", \"numPointLights\", \"numSpotLights\", \"numHemiLights\",\n\t\t\t\"shadowMapEnabled\", \"shadowMapType\", \"toneMapping\", 'physicallyCorrectLights',\n\t\t\t\"alphaTest\", \"doubleSided\", \"flipSided\", \"numClippingPlanes\", \"numClipIntersection\", \"depthPacking\"\n\t\t];\n\n\n\t\tfunction allocateBones( object ) {\n\n\t\t\tif ( capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture ) {\n\n\t\t\t\treturn 1024;\n\n\t\t\t} else {\n\n\t\t\t\t// default for when object is not specified\n\t\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t\t//\n\t\t\t\t// - leave some extra space for other uniforms\n\t\t\t\t// - limit here is ANGLE's 254 max uniform vectors\n\t\t\t\t// (up to 54 should be safe)\n\n\t\t\t\tvar nVertexUniforms = capabilities.maxVertexUniforms;\n\t\t\t\tvar nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\t\tvar maxBones = nVertexMatrices;\n\n\t\t\t\tif ( object !== undefined && (object && object.isSkinnedMesh) ) {\n\n\t\t\t\t\tmaxBones = Math.min( object.skeleton.bones.length, maxBones );\n\n\t\t\t\t\tif ( maxBones < object.skeleton.bones.length ) {\n\n\t\t\t\t\t\tconsole.warn( 'WebGLRenderer: too many bones - ' + object.skeleton.bones.length + ', this GPU supports just ' + maxBones + ' (try OpenGL instead of ANGLE)' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn maxBones;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getTextureEncodingFromMap( map, gammaOverrideLinear ) {\n\n\t\t\tvar encoding;\n\n\t\t\tif ( ! map ) {\n\n\t\t\t\tencoding = LinearEncoding;\n\n\t\t\t} else if ( (map && map.isTexture) ) {\n\n\t\t\t\tencoding = map.encoding;\n\n\t\t\t} else if ( (map && map.isWebGLRenderTarget) ) {\n\n\t\t\t\tconsole.warn( \"THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\tencoding = map.texture.encoding;\n\n\t\t\t}\n\n\t\t\t// add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.\n\t\t\tif ( encoding === LinearEncoding && gammaOverrideLinear ) {\n\n\t\t\t\tencoding = GammaEncoding;\n\n\t\t\t}\n\n\t\t\treturn encoding;\n\n\t\t}\n\n\t\tthis.getParameters = function ( material, lights, fog, nClipPlanes, nClipIntersection, object ) {\n\n\t\t\tvar shaderID = shaderIDs[ material.type ];\n\n\t\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t\t// (not to blow over maxLights budget)\n\n\t\t\tvar maxBones = allocateBones( object );\n\t\t\tvar precision = renderer.getPrecision();\n\n\t\t\tif ( material.precision !== null ) {\n\n\t\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar currentRenderTarget = renderer.getCurrentRenderTarget();\n\n\t\t\tvar parameters = {\n\n\t\t\t\tshaderID: shaderID,\n\n\t\t\t\tprecision: precision,\n\t\t\t\tsupportsVertexTextures: capabilities.vertexTextures,\n\t\t\t\toutputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ),\n\t\t\t\tmap: !! material.map,\n\t\t\t\tmapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),\n\t\t\t\tenvMap: !! material.envMap,\n\t\t\t\tenvMapMode: material.envMap && material.envMap.mapping,\n\t\t\t\tenvMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),\n\t\t\t\tenvMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\t\tlightMap: !! material.lightMap,\n\t\t\t\taoMap: !! material.aoMap,\n\t\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\t\temissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),\n\t\t\t\tbumpMap: !! material.bumpMap,\n\t\t\t\tnormalMap: !! material.normalMap,\n\t\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\t\tspecularMap: !! material.specularMap,\n\t\t\t\talphaMap: !! material.alphaMap,\n\n\t\t\t\tcombine: material.combine,\n\n\t\t\t\tvertexColors: material.vertexColors,\n\n\t\t\t\tfog: !! fog,\n\t\t\t\tuseFog: material.fog,\n\t\t\t\tfogExp: (fog && fog.isFogExp2),\n\n\t\t\t\tflatShading: material.shading === FlatShading,\n\n\t\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\t\tlogarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,\n\n\t\t\t\tskinning: material.skinning,\n\t\t\t\tmaxBones: maxBones,\n\t\t\t\tuseVertexTexture: capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture,\n\n\t\t\t\tmorphTargets: material.morphTargets,\n\t\t\t\tmorphNormals: material.morphNormals,\n\t\t\t\tmaxMorphTargets: renderer.maxMorphTargets,\n\t\t\t\tmaxMorphNormals: renderer.maxMorphNormals,\n\n\t\t\t\tnumDirLights: lights.directional.length,\n\t\t\t\tnumPointLights: lights.point.length,\n\t\t\t\tnumSpotLights: lights.spot.length,\n\t\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\t\tnumClippingPlanes: nClipPlanes,\n\t\t\t\tnumClipIntersection: nClipIntersection,\n\n\t\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0,\n\t\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\t\ttoneMapping: renderer.toneMapping,\n\t\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\t\talphaTest: material.alphaTest,\n\t\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\t\tflipSided: material.side === BackSide,\n\n\t\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false\n\n\t\t\t};\n\n\t\t\treturn parameters;\n\n\t\t};\n\n\t\tthis.getProgramCode = function ( material, parameters ) {\n\n\t\t\tvar array = [];\n\n\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\tarray.push( parameters.shaderID );\n\n\t\t\t} else {\n\n\t\t\t\tarray.push( material.fragmentShader );\n\t\t\t\tarray.push( material.vertexShader );\n\n\t\t\t}\n\n\t\t\tif ( material.defines !== undefined ) {\n\n\t\t\t\tfor ( var name in material.defines ) {\n\n\t\t\t\t\tarray.push( name );\n\t\t\t\t\tarray.push( material.defines[ name ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < parameterNames.length; i ++ ) {\n\n\t\t\t\tarray.push( parameters[ parameterNames[ i ] ] );\n\n\t\t\t}\n\n\t\t\treturn array.join();\n\n\t\t};\n\n\t\tthis.acquireProgram = function ( material, parameters, code ) {\n\n\t\t\tvar program;\n\n\t\t\t// Check if code has been already compiled\n\t\t\tfor ( var p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\t\tvar programInfo = programs[ p ];\n\n\t\t\t\tif ( programInfo.code === code ) {\n\n\t\t\t\t\tprogram = programInfo;\n\t\t\t\t\t++ program.usedTimes;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tprogram = new WebGLProgram( renderer, code, material, parameters );\n\t\t\t\tprograms.push( program );\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t};\n\n\t\tthis.releaseProgram = function( program ) {\n\n\t\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t\t// Remove from unordered set\n\t\t\t\tvar i = programs.indexOf( program );\n\t\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\t\tprograms.pop();\n\n\t\t\t\t// Free WebGL resources\n\t\t\t\tprogram.destroy();\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tthis.programs = programs;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLGeometries( gl, properties, info ) {\n\n\t\tvar geometries = {};\n\n\t\tfunction onGeometryDispose( event ) {\n\n\t\t\tvar geometry = event.target;\n\t\t\tvar buffergeometry = geometries[ geometry.id ];\n\n\t\t\tif ( buffergeometry.index !== null ) {\n\n\t\t\t\tdeleteAttribute( buffergeometry.index );\n\n\t\t\t}\n\n\t\t\tdeleteAttributes( buffergeometry.attributes );\n\n\t\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\t\tdelete geometries[ geometry.id ];\n\n\t\t\t// TODO\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe ) {\n\n\t\t\t\tdeleteAttribute( property.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( geometry );\n\n\t\t\tvar bufferproperty = properties.get( buffergeometry );\n\n\t\t\tif ( bufferproperty.wireframe ) {\n\n\t\t\t\tdeleteAttribute( bufferproperty.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( buffergeometry );\n\n\t\t\t//\n\n\t\t\tinfo.memory.geometries --;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction deleteAttribute( attribute ) {\n\n\t\t\tvar buffer = getAttributeBuffer( attribute );\n\n\t\t\tif ( buffer !== undefined ) {\n\n\t\t\t\tgl.deleteBuffer( buffer );\n\t\t\t\tremoveAttributeBuffer( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction deleteAttributes( attributes ) {\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tdeleteAttribute( attributes[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction removeAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tproperties.delete( attribute.data );\n\n\t\t\t} else {\n\n\t\t\t\tproperties.delete( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometries[ geometry.id ] !== undefined ) {\n\n\t\t\t\t\treturn geometries[ geometry.id ];\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\t\t\tvar buffergeometry;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tbuffergeometry = geometry;\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tif ( geometry._bufferGeometry === undefined ) {\n\n\t\t\t\t\t\tgeometry._bufferGeometry = new BufferGeometry().setFromObject( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbuffergeometry = geometry._bufferGeometry;\n\n\t\t\t\t}\n\n\t\t\t\tgeometries[ geometry.id ] = buffergeometry;\n\n\t\t\t\tinfo.memory.geometries ++;\n\n\t\t\t\treturn buffergeometry;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLObjects( gl, properties, info ) {\n\n\t\tvar geometries = new WebGLGeometries( gl, properties, info );\n\n\t\t//\n\n\t\tfunction update( object ) {\n\n\t\t\t// TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter.\n\n\t\t\tvar geometry = geometries.get( object );\n\n\t\t\tif ( object.geometry.isGeometry ) {\n\n\t\t\t\tgeometry.updateFromObject( object );\n\n\t\t\t}\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tupdateAttribute( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tupdateAttribute( attributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\tfor ( var name in morphAttributes ) {\n\n\t\t\t\tvar array = morphAttributes[ name ];\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\t\tupdateAttribute( array[ i ], gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction updateAttribute( attribute, bufferType ) {\n\n\t\t\tvar data = ( attribute.isInterleavedBufferAttribute ) ? attribute.data : attribute;\n\n\t\t\tvar attributeProperties = properties.get( data );\n\n\t\t\tif ( attributeProperties.__webglBuffer === undefined ) {\n\n\t\t\t\tcreateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t} else if ( attributeProperties.version !== data.version ) {\n\n\t\t\t\tupdateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tattributeProperties.__webglBuffer = gl.createBuffer();\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tvar usage = data.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;\n\n\t\t\tgl.bufferData( bufferType, data.array, usage );\n\n\t\t\tattributeProperties.version = data.version;\n\n\t\t}\n\n\t\tfunction updateBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tif ( data.dynamic === false ) {\n\n\t\t\t\tgl.bufferData( bufferType, data.array, gl.STATIC_DRAW );\n\n\t\t\t} else if ( data.updateRange.count === - 1 ) {\n\n\t\t\t\t// Not using update ranges\n\n\t\t\t\tgl.bufferSubData( bufferType, 0, data.array );\n\n\t\t\t} else if ( data.updateRange.count === 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, data.updateRange.offset * data.array.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t data.array.subarray( data.updateRange.offset, data.updateRange.offset + data.updateRange.count ) );\n\n\t\t\t\tdata.updateRange.count = 0; // reset range\n\n\t\t\t}\n\n\t\t\tattributeProperties.version = data.version;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction getWireframeAttribute( geometry ) {\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe !== undefined ) {\n\n\t\t\t\treturn property.wireframe;\n\n\t\t\t}\n\n\t\t\tvar indices = [];\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\t\t\tvar position = attributes.position;\n\n\t\t\t// console.time( 'wireframe' );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar edges = {};\n\t\t\t\tvar array = index.array;\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = array[ i + 0 ];\n\t\t\t\t\tvar b = array[ i + 1 ];\n\t\t\t\t\tvar c = array[ i + 2 ];\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar array = attributes.position.array;\n\n\t\t\t\tfor ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = i + 0;\n\t\t\t\t\tvar b = i + 1;\n\t\t\t\t\tvar c = i + 2;\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// console.timeEnd( 'wireframe' );\n\n\t\t\tvar TypeArray = position.count > 65535 ? Uint32Array : Uint16Array;\n\t\t\tvar attribute = new BufferAttribute( new TypeArray( indices ), 1 );\n\n\t\t\tupdateAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\tproperty.wireframe = attribute;\n\n\t\t\treturn attribute;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tgetAttributeBuffer: getAttributeBuffer,\n\t\t\tgetWireframeAttribute: getWireframeAttribute,\n\n\t\t\tupdate: update\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, info ) {\n\n\t\tvar _infoMemory = info.memory;\n\t\tvar _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext );\n\n\t\t//\n\n\t\tfunction clampToMaxSize( image, maxSize ) {\n\n\t\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\t\t// Warning: Scaling through the canvas will only work with images that use\n\t\t\t\t// premultiplied alpha.\n\n\t\t\t\tvar scale = maxSize / Math.max( image.width, image.height );\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = Math.floor( image.width * scale );\n\t\t\t\tcanvas.height = Math.floor( image.height * scale );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction isPowerOfTwo( image ) {\n\n\t\t\treturn _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height );\n\n\t\t}\n\n\t\tfunction makePowerOfTwo( image ) {\n\n\t\t\tif ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) {\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = _Math.nearestPowerOfTwo( image.width );\n\t\t\t\tcanvas.height = _Math.nearestPowerOfTwo( image.height );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) return true;\n\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) return true;\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// Fallback filters for non-power-of-2 textures\n\n\t\tfunction filterFallback( f ) {\n\n\t\t\tif ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) {\n\n\t\t\t\treturn _gl.NEAREST;\n\n\t\t\t}\n\n\t\t\treturn _gl.LINEAR;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction onTextureDispose( event ) {\n\n\t\t\tvar texture = event.target;\n\n\t\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\t\tdeallocateTexture( texture );\n\n\t\t\t_infoMemory.textures --;\n\n\n\t\t}\n\n\t\tfunction onRenderTargetDispose( event ) {\n\n\t\t\tvar renderTarget = event.target;\n\n\t\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\tdeallocateRenderTarget( renderTarget );\n\n\t\t\t_infoMemory.textures --;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction deallocateTexture( texture ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image && textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__image__webglTextureCube );\n\n\t\t\t} else {\n\n\t\t\t\t// 2D texture\n\n\t\t\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\t// remove all webgl properties\n\t\t\tproperties.delete( texture );\n\n\t\t}\n\n\t\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\tif ( ! renderTarget ) return;\n\n\t\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\t}\n\n\t\t\tif ( (renderTarget && renderTarget.isWebGLRenderTargetCube) ) {\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\n\t\t\t}\n\n\t\t\tproperties.delete( renderTarget.texture );\n\t\t\tproperties.delete( renderTarget );\n\n\t\t}\n\n\t\t//\n\n\n\n\t\tfunction setTexture2D( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\tvar image = texture.image;\n\n\t\t\t\tif ( image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture );\n\n\t\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureCube( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image.length === 6 ) {\n\n\t\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\t\tif ( ! textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\ttextureProperties.__image__webglTextureCube = _gl.createTexture();\n\n\t\t\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\n\t\t\t\t\tvar isCompressed = (texture && texture.isCompressedTexture);\n\t\t\t\t\tvar isDataTexture = (texture.image[ 0 ] && texture.image[ 0 ].isDataTexture);\n\n\t\t\t\t\tvar cubeImage = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar image = cubeImage[ 0 ],\n\t\t\t\t\tisPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage );\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed ) {\n\n\t\t\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar mipmap, mipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\t\t\tfor ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\t\tmipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()\" );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\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\tif ( texture.generateMipmaps && isPowerOfTwoImage ) {\n\n\t\t\t\t\t\t_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setTextureCubeDynamic( texture, slot ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureParameters( textureType, texture, isPowerOfTwoImage ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( isPowerOfTwoImage ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) );\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\n\n\t\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );\n\n\t\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\textension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension ) {\n\n\t\t\t\tif ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;\n\t\t\t\tif ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return;\n\n\t\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\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\n\t\t\tvar image = clampToMaxSize( texture.image, capabilities.maxTextureSize );\n\n\t\t\tif ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) {\n\n\t\t\t\timage = makePowerOfTwo( image );\n\n\t\t\t}\n\n\t\t\tvar isPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage );\n\n\t\t\tvar mipmap, mipmaps = texture.mipmaps;\n\n\t\t\tif ( (texture && texture.isDepthTexture) ) {\n\n\t\t\t\t// populate depth texture with dummy data\n\n\t\t\t\tvar internalFormat = _gl.DEPTH_COMPONENT;\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tif ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0');\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t} else if ( _isWebGL2 ) {\n\n\t\t\t\t\t// WebGL 2.0 requires signed internalformat for glTexImage2D\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t\t}\n\n\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.format === DepthStencilFormat ) {\n\n\t\t\t\t\tinternalFormat = _gl.DEPTH_STENCIL;\n\n\t\t\t\t}\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t} else if ( (texture && 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 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( (texture && texture.isCompressedTexture) ) {\n\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\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}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\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 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );\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\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\n\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\t// Render targets\n\n\t\t// Setup storage for target texture and bind it to correct framebuffer\n\t\tfunction setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {\n\n\t\t\tvar glFormat = paramThreeToGL( renderTarget.texture.format );\n\t\t\tvar glType = paramThreeToGL( renderTarget.texture.type );\n\t\t\tstate.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\t\tfunction setupRenderBufferStorage( renderbuffer, renderTarget ) {\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else {\n\n\t\t\t\t// FIXME: We don't support !depth !stencil\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t}\n\n\t\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\t\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\t\tvar isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) );\n\t\t\tif ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!');\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( !( (renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture) ) ) {\n\n\t\t\t\tthrow new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture');\n\n\t\t\t}\n\n\t\t\t// upload an empty depth texture with framebuffer size\n\t\t\tif ( !properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\t\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\t\t\t}\n\n\t\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\t\tvar webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\n\t\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error('Unknown depthTexture format')\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup GL resources for a non-texture depth buffer\n\t\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\tvar isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) );\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\tif ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets');\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Set up GL resources for the render target\n\t\tfunction setupRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t_infoMemory.textures ++;\n\n\t\t\tvar isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) );\n\t\t\tvar isTargetPowerOfTwo = isPowerOfTwo( renderTarget );\n\n\t\t\t// Setup framebuffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _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\t// Setup color buffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, null );\n\n\t\t\t}\n\n\t\t\t// Setup depth and stencil buffers\n\n\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\t\tvar texture = renderTarget.texture;\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) &&\n\t\t\t\t\ttexture.minFilter !== NearestFilter &&\n\t\t\t\t\ttexture.minFilter !== LinearFilter ) {\n\n\t\t\t\tvar target = (renderTarget && renderTarget.isWebGLRenderTargetCube) ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\t\t\t\tvar webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\t_gl.generateMipmap( target );\n\t\t\t\tstate.bindTexture( target, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setTexture2D = setTexture2D;\n\t\tthis.setTextureCube = setTextureCube;\n\t\tthis.setTextureCubeDynamic = setTextureCubeDynamic;\n\t\tthis.setupRenderTarget = setupRenderTarget;\n\t\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\n\t}\n\n\t/**\n\t * @author fordacious / fordacious.github.io\n\t */\n\n\tfunction WebGLProperties() {\n\n\t\tvar properties = {};\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar uuid = object.uuid;\n\t\t\t\tvar map = properties[ uuid ];\n\n\t\t\t\tif ( map === undefined ) {\n\n\t\t\t\t\tmap = {};\n\t\t\t\t\tproperties[ uuid ] = map;\n\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\n\t\t\t},\n\n\t\t\tdelete: function ( object ) {\n\n\t\t\t\tdelete properties[ object.uuid ];\n\n\t\t\t},\n\n\t\t\tclear: function () {\n\n\t\t\t\tproperties = {};\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLState( gl, extensions, paramThreeToGL ) {\n\n\t\tfunction ColorBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar color = new Vector4();\n\t\t\tvar currentColorMask = null;\n\t\t\tvar currentColorClear = new Vector4();\n\n\t\t\treturn {\n\n\t\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( r, g, b, a ) {\n\n\t\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentColorMask = null;\n\t\t\t\t\tcurrentColorClear.set( 0, 0, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction DepthBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentDepthMask = null;\n\t\t\tvar currentDepthFunc = null;\n\t\t\tvar currentDepthClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\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\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentDepthMask = null;\n\t\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction StencilBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentStencilMask = null;\n\t\t\tvar currentStencilFunc = null;\n\t\t\tvar currentStencilRef = null;\n\t\t\tvar currentStencilFuncMask = null;\n\t\t\tvar currentStencilFail = null;\n\t\t\tvar currentStencilZFail = null;\n\t\t\tvar currentStencilZPass = null;\n\t\t\tvar currentStencilClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( stencilTest ) {\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\tsetMask: function ( stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t\t currentStencilRef \t!== stencilRef \t||\n\t\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\t\tif ( currentStencilFail\t !== stencilFail \t||\n\t\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentStencilMask = null;\n\t\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\t\tcurrentStencilRef = null;\n\t\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\t\tcurrentStencilFail = null;\n\t\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t//\n\n\t\tvar colorBuffer = new ColorBuffer();\n\t\tvar depthBuffer = new DepthBuffer();\n\t\tvar stencilBuffer = new StencilBuffer();\n\n\t\tvar maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar newAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar enabledAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar attributeDivisors = new Uint8Array( maxVertexAttributes );\n\n\t\tvar capabilities = {};\n\n\t\tvar compressedTextureFormats = null;\n\n\t\tvar currentBlending = null;\n\t\tvar currentBlendEquation = null;\n\t\tvar currentBlendSrc = null;\n\t\tvar currentBlendDst = null;\n\t\tvar currentBlendEquationAlpha = null;\n\t\tvar currentBlendSrcAlpha = null;\n\t\tvar currentBlendDstAlpha = null;\n\t\tvar currentPremultipledAlpha = false;\n\n\t\tvar currentFlipSided = null;\n\t\tvar currentCullFace = null;\n\n\t\tvar currentLineWidth = null;\n\n\t\tvar currentPolygonOffsetFactor = null;\n\t\tvar currentPolygonOffsetUnits = null;\n\n\t\tvar currentScissorTest = null;\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\n\t\tvar currentTextureSlot = null;\n\t\tvar currentBoundTextures = {};\n\n\t\tvar currentScissor = new Vector4();\n\t\tvar currentViewport = new Vector4();\n\n\t\tfunction createTexture( type, target, count ) {\n\n\t\t\tvar data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\t\tvar texture = gl.createTexture();\n\n\t\t\tgl.bindTexture( type, texture );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\t\tfor ( var i = 0; i < count; i ++ ) {\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\treturn texture;\n\n\t\t}\n\n\t\tvar emptyTextures = {};\n\t\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\t\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\n\t\t//\n\n\t\tfunction init() {\n\n\t\t\tclearColor( 0, 0, 0, 1 );\n\t\t\tclearDepth( 1 );\n\t\t\tclearStencil( 0 );\n\n\t\t\tenable( gl.DEPTH_TEST );\n\t\t\tsetDepthFunc( LessEqualDepth );\n\n\t\t\tsetFlipSided( false );\n\t\t\tsetCullFace( CullFaceBack );\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tenable( gl.BLEND );\n\t\t\tsetBlending( NormalBlending );\n\n\t\t}\n\n\t\tfunction initAttributes() {\n\n\t\t\tfor ( var i = 0, l = newAttributes.length; i < l; i ++ ) {\n\n\t\t\t\tnewAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttribute( attribute ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== 0 ) {\n\n\t\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, 0 );\n\t\t\t\tattributeDivisors[ attribute ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute, extension ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, meshPerAttribute );\n\t\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disableUnusedAttributes() {\n\n\t\t\tfor ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== true ) {\n\n\t\t\t\tgl.enable( id );\n\t\t\t\tcapabilities[ id ] = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== false ) {\n\n\t\t\t\tgl.disable( id );\n\t\t\t\tcapabilities[ id ] = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getCompressedTextureFormats() {\n\n\t\t\tif ( compressedTextureFormats === null ) {\n\n\t\t\t\tcompressedTextureFormats = [];\n\n\t\t\t\tif ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_s3tc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_etc1' ) ) {\n\n\t\t\t\t\tvar formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS );\n\n\t\t\t\t\tfor ( var i = 0; i < formats.length; i ++ ) {\n\n\t\t\t\t\t\tcompressedTextureFormats.push( formats[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn compressedTextureFormats;\n\n\t\t}\n\n\t\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\t\tif ( blending !== NoBlending ) {\n\n\t\t\t\tenable( gl.BLEND );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.BLEND );\n\n\t\t\t}\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( blending === AdditiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === SubtractiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === MultiplyBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\tif ( blending === CustomBlending ) {\n\n\t\t\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\t\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\t\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\t\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\t\t\tgl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) );\n\n\t\t\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t\t\t}\n\n\t\t\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\t\t\tgl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) );\n\n\t\t\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\t\t\tcurrentBlendDst = blendDst;\n\t\t\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tcurrentBlendEquation = null;\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendEquationAlpha = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Deprecate\n\n\t\tfunction setColorWrite( colorWrite ) {\n\n\t\t\tcolorBuffer.setMask( colorWrite );\n\n\t\t}\n\n\t\tfunction setDepthTest( depthTest ) {\n\n\t\t\tdepthBuffer.setTest( depthTest );\n\n\t\t}\n\n\t\tfunction setDepthWrite( depthWrite ) {\n\n\t\t\tdepthBuffer.setMask( depthWrite );\n\n\t\t}\n\n\t\tfunction setDepthFunc( depthFunc ) {\n\n\t\t\tdepthBuffer.setFunc( depthFunc );\n\n\t\t}\n\n\t\tfunction setStencilTest( stencilTest ) {\n\n\t\t\tstencilBuffer.setTest( stencilTest );\n\n\t\t}\n\n\t\tfunction setStencilWrite( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( stencilWrite );\n\n\t\t}\n\n\t\tfunction setStencilFunc( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\tstencilBuffer.setFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t}\n\n\t\tfunction setStencilOp( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\tstencilBuffer.setOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction setFlipSided( flipSided ) {\n\n\t\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\t\tif ( flipSided ) {\n\n\t\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t\t}\n\n\t\t\t\tcurrentFlipSided = flipSided;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setCullFace( cullFace ) {\n\n\t\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\t\tenable( gl.CULL_FACE );\n\n\t\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.CULL_FACE );\n\n\t\t\t}\n\n\t\t\tcurrentCullFace = cullFace;\n\n\t\t}\n\n\t\tfunction setLineWidth( width ) {\n\n\t\t\tif ( width !== currentLineWidth ) {\n\n\t\t\t\tgl.lineWidth( width );\n\n\t\t\t\tcurrentLineWidth = width;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\t\tif ( polygonOffset ) {\n\n\t\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getScissorTest() {\n\n\t\t\treturn currentScissorTest;\n\n\t\t}\n\n\t\tfunction setScissorTest( scissorTest ) {\n\n\t\t\tcurrentScissorTest = scissorTest;\n\n\t\t\tif ( scissorTest ) {\n\n\t\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// texture\n\n\t\tfunction activeTexture( webglSlot ) {\n\n\t\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\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}\n\n\t\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\tactiveTexture();\n\n\t\t\t}\n\n\t\t\tvar boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\t\tif ( boundTexture === undefined ) {\n\n\t\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t\t}\n\n\t\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\t\tboundTexture.type = webglType;\n\t\t\t\tboundTexture.texture = webglTexture;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction compressedTexImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction texImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Deprecate\n\n\t\tfunction clearColor( r, g, b, a ) {\n\n\t\t\tcolorBuffer.setClear( r, g, b, a );\n\n\t\t}\n\n\t\tfunction clearDepth( depth ) {\n\n\t\t\tdepthBuffer.setClear( depth );\n\n\t\t}\n\n\t\tfunction clearStencil( stencil ) {\n\n\t\t\tstencilBuffer.setClear( stencil );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction scissor( scissor ) {\n\n\t\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\t\tcurrentScissor.copy( scissor );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction viewport( viewport ) {\n\n\t\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\t\tcurrentViewport.copy( viewport );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction reset() {\n\n\t\t\tfor ( var i = 0; i < enabledAttributes.length; i ++ ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] === 1 ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcapabilities = {};\n\n\t\t\tcompressedTextureFormats = null;\n\n\t\t\tcurrentTextureSlot = null;\n\t\t\tcurrentBoundTextures = {};\n\n\t\t\tcurrentBlending = null;\n\n\t\t\tcurrentFlipSided = null;\n\t\t\tcurrentCullFace = null;\n\n\t\t\tcolorBuffer.reset();\n\t\t\tdepthBuffer.reset();\n\t\t\tstencilBuffer.reset();\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tbuffers: {\n\t\t\t\tcolor: colorBuffer,\n\t\t\t\tdepth: depthBuffer,\n\t\t\t\tstencil: stencilBuffer\n\t\t\t},\n\n\t\t\tinit: init,\n\t\t\tinitAttributes: initAttributes,\n\t\t\tenableAttribute: enableAttribute,\n\t\t\tenableAttributeAndDivisor: enableAttributeAndDivisor,\n\t\t\tdisableUnusedAttributes: disableUnusedAttributes,\n\t\t\tenable: enable,\n\t\t\tdisable: disable,\n\t\t\tgetCompressedTextureFormats: getCompressedTextureFormats,\n\n\t\t\tsetBlending: setBlending,\n\n\t\t\tsetColorWrite: setColorWrite,\n\t\t\tsetDepthTest: setDepthTest,\n\t\t\tsetDepthWrite: setDepthWrite,\n\t\t\tsetDepthFunc: setDepthFunc,\n\t\t\tsetStencilTest: setStencilTest,\n\t\t\tsetStencilWrite: setStencilWrite,\n\t\t\tsetStencilFunc: setStencilFunc,\n\t\t\tsetStencilOp: setStencilOp,\n\n\t\t\tsetFlipSided: setFlipSided,\n\t\t\tsetCullFace: setCullFace,\n\n\t\t\tsetLineWidth: setLineWidth,\n\t\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\t\tgetScissorTest: getScissorTest,\n\t\t\tsetScissorTest: setScissorTest,\n\n\t\t\tactiveTexture: activeTexture,\n\t\t\tbindTexture: bindTexture,\n\t\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\t\ttexImage2D: texImage2D,\n\n\t\t\tclearColor: clearColor,\n\t\t\tclearDepth: clearDepth,\n\t\t\tclearStencil: clearStencil,\n\n\t\t\tscissor: scissor,\n\t\t\tviewport: viewport,\n\n\t\t\treset: reset\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\t\tvar maxAnisotropy;\n\n\t\tfunction getMaxAnisotropy() {\n\n\t\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\t\tvar extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t\t} else {\n\n\t\t\t\tmaxAnisotropy = 0;\n\n\t\t\t}\n\n\t\t\treturn maxAnisotropy;\n\n\t\t}\n\n\t\tfunction getMaxPrecision( precision ) {\n\n\t\t\tif ( precision === 'highp' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'highp';\n\n\t\t\t\t}\n\n\t\t\t\tprecision = 'mediump';\n\n\t\t\t}\n\n\t\t\tif ( precision === 'mediump' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'mediump';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn 'lowp';\n\n\t\t}\n\n\t\tvar precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\t\tvar maxPrecision = getMaxPrecision( precision );\n\n\t\tif ( maxPrecision !== precision ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\t\tprecision = maxPrecision;\n\n\t\t}\n\n\t\tvar logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' );\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\t\tvar maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\t\tvar maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\t\tvar maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\t\tvar maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\t\tvar vertexTextures = maxVertexTextures > 0;\n\t\tvar floatFragmentTextures = !! extensions.get( 'OES_texture_float' );\n\t\tvar floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\t\treturn {\n\n\t\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\t\tprecision: precision,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tmaxTextures: maxTextures,\n\t\t\tmaxVertexTextures: maxVertexTextures,\n\t\t\tmaxTextureSize: maxTextureSize,\n\t\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\t\tmaxAttributes: maxAttributes,\n\t\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\t\tmaxVaryings: maxVaryings,\n\t\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\t\tvertexTextures: vertexTextures,\n\t\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\t\tfloatVertexTextures: floatVertexTextures\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLExtensions( gl ) {\n\n\t\tvar extensions = {};\n\n\t\treturn {\n\n\t\t\tget: function ( name ) {\n\n\t\t\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\t\t\treturn extensions[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tvar extension;\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_etc1':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_etc1' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\textension = gl.getExtension( name );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t\t}\n\n\t\t\t\textensions[ name ] = extension;\n\n\t\t\t\treturn extension;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction WebGLClipping() {\n\n\t\tvar scope = this,\n\n\t\t\tglobalState = null,\n\t\t\tnumGlobalPlanes = 0,\n\t\t\tlocalClippingEnabled = false,\n\t\t\trenderingShadows = false,\n\n\t\t\tplane = new Plane(),\n\t\t\tviewNormalMatrix = new Matrix3(),\n\n\t\t\tuniform = { value: null, needsUpdate: false };\n\n\t\tthis.uniform = uniform;\n\t\tthis.numPlanes = 0;\n\t\tthis.numIntersection = 0;\n\n\t\tthis.init = function( planes, enableLocalClipping, camera ) {\n\n\t\t\tvar enabled =\n\t\t\t\tplanes.length !== 0 ||\n\t\t\t\tenableLocalClipping ||\n\t\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t\t// run another frame in order to reset the state:\n\t\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\t\tlocalClippingEnabled;\n\n\t\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\t\tnumGlobalPlanes = planes.length;\n\n\t\t\treturn enabled;\n\n\t\t};\n\n\t\tthis.beginShadows = function() {\n\n\t\t\trenderingShadows = true;\n\t\t\tprojectPlanes( null );\n\n\t\t};\n\n\t\tthis.endShadows = function() {\n\n\t\t\trenderingShadows = false;\n\t\t\tresetGlobalState();\n\n\t\t};\n\n\t\tthis.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) {\n\n\t\t\tif ( ! localClippingEnabled ||\n\t\t\t\t\tplanes === null || planes.length === 0 ||\n\t\t\t\t\trenderingShadows && ! clipShadows ) {\n\t\t\t\t// there's no local clipping\n\n\t\t\t\tif ( renderingShadows ) {\n\t\t\t\t\t// there's no global clipping\n\n\t\t\t\t\tprojectPlanes( null );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tresetGlobalState();\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\t\tlGlobal = nGlobal * 4,\n\n\t\t\t\t\tdstArray = cache.clippingState || null;\n\n\t\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, fromCache );\n\n\t\t\t\tfor ( var i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcache.clippingState = dstArray;\n\t\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\t\tthis.numPlanes += nGlobal;\n\n\t\t\t}\n\n\n\t\t};\n\n\t\tfunction resetGlobalState() {\n\n\t\t\tif ( uniform.value !== globalState ) {\n\n\t\t\t\tuniform.value = globalState;\n\t\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = numGlobalPlanes;\n\t\t\tscope.numIntersection = 0;\n\n\t\t}\n\n\t\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\t\tvar nPlanes = planes !== null ? planes.length : 0,\n\t\t\t\tdstArray = null;\n\n\t\t\tif ( nPlanes !== 0 ) {\n\n\t\t\t\tdstArray = uniform.value;\n\n\t\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\t\tvar flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0, i4 = dstOffset;\n\t\t\t\t\t\t\t\t\t\ti !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\t\tplane.copy( planes[ i ] ).\n\t\t\t\t\t\t\t\tapplyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tuniform.value = dstArray;\n\t\t\t\tuniform.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = nPlanes;\n\t\t\t\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t * @author tschw\n\t */\n\n\tfunction WebGLRenderer( parameters ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer', REVISION );\n\n\t\tparameters = parameters || {};\n\n\t\tvar _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),\n\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;\n\n\t\tvar lights = [];\n\n\t\tvar opaqueObjects = [];\n\t\tvar opaqueObjectsLastIndex = - 1;\n\t\tvar transparentObjects = [];\n\t\tvar transparentObjectsLastIndex = - 1;\n\n\t\tvar morphInfluences = new Float32Array( 8 );\n\n\t\tvar sprites = [];\n\t\tvar lensFlares = [];\n\n\t\t// public properties\n\n\t\tthis.domElement = _canvas;\n\t\tthis.context = null;\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.gammaFactor = 2.0;\t// for backwards compatibility\n\t\tthis.gammaInput = false;\n\t\tthis.gammaOutput = false;\n\n\t\t// physical lights\n\n\t\tthis.physicallyCorrectLights = false;\n\n\t\t// tone mapping\n\n\t\tthis.toneMapping = LinearToneMapping;\n\t\tthis.toneMappingExposure = 1.0;\n\t\tthis.toneMappingWhitePoint = 1.0;\n\n\t\t// morphs\n\n\t\tthis.maxMorphTargets = 8;\n\t\tthis.maxMorphNormals = 4;\n\n\t\t// internal properties\n\n\t\tvar _this = this,\n\n\t\t// internal state cache\n\n\t\t_currentProgram = null,\n\t\t_currentRenderTarget = null,\n\t\t_currentFramebuffer = null,\n\t\t_currentMaterialId = - 1,\n\t\t_currentGeometryProgram = '',\n\t\t_currentCamera = null,\n\n\t\t_currentScissor = new Vector4(),\n\t\t_currentScissorTest = null,\n\n\t\t_currentViewport = new Vector4(),\n\n\t\t//\n\n\t\t_usedTextureUnits = 0,\n\n\t\t//\n\n\t\t_clearColor = new Color( 0x000000 ),\n\t\t_clearAlpha = 0,\n\n\t\t_width = _canvas.width,\n\t\t_height = _canvas.height,\n\n\t\t_pixelRatio = 1,\n\n\t\t_scissor = new Vector4( 0, 0, _width, _height ),\n\t\t_scissorTest = false,\n\n\t\t_viewport = new Vector4( 0, 0, _width, _height ),\n\n\t\t// frustum\n\n\t\t_frustum = new Frustum(),\n\n\t\t// clipping\n\n\t\t_clipping = new WebGLClipping(),\n\t\t_clippingEnabled = false,\n\t\t_localClippingEnabled = false,\n\n\t\t_sphere = new Sphere(),\n\n\t\t// camera matrices cache\n\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_vector3 = new Vector3(),\n\n\t\t// light arrays cache\n\n\t\t_lights = {\n\n\t\t\thash: '',\n\n\t\t\tambient: [ 0, 0, 0 ],\n\t\t\tdirectional: [],\n\t\t\tdirectionalShadowMap: [],\n\t\t\tdirectionalShadowMatrix: [],\n\t\t\tspot: [],\n\t\t\tspotShadowMap: [],\n\t\t\tspotShadowMatrix: [],\n\t\t\tpoint: [],\n\t\t\tpointShadowMap: [],\n\t\t\tpointShadowMatrix: [],\n\t\t\themi: [],\n\n\t\t\tshadows: []\n\n\t\t},\n\n\t\t// info\n\n\t\t_infoRender = {\n\n\t\t\tcalls: 0,\n\t\t\tvertices: 0,\n\t\t\tfaces: 0,\n\t\t\tpoints: 0\n\n\t\t};\n\n\t\tthis.info = {\n\n\t\t\trender: _infoRender,\n\t\t\tmemory: {\n\n\t\t\t\tgeometries: 0,\n\t\t\t\ttextures: 0\n\n\t\t\t},\n\t\t\tprograms: null\n\n\t\t};\n\n\n\t\t// initialize\n\n\t\tvar _gl;\n\n\t\ttry {\n\n\t\t\tvar attributes = {\n\t\t\t\talpha: _alpha,\n\t\t\t\tdepth: _depth,\n\t\t\t\tstencil: _stencil,\n\t\t\t\tantialias: _antialias,\n\t\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer\n\t\t\t};\n\n\t\t\t_gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( _canvas.getContext( 'webgl' ) !== null ) {\n\n\t\t\t\t\tthrow 'Error creating WebGL context with your selected attributes.';\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow 'Error creating WebGL context.';\n\n\t\t\t\t}\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\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: ' + error );\n\n\t\t}\n\n\t\tvar extensions = new WebGLExtensions( _gl );\n\n\t\textensions.get( 'WEBGL_depth_texture' );\n\t\textensions.get( 'OES_texture_float' );\n\t\textensions.get( 'OES_texture_float_linear' );\n\t\textensions.get( 'OES_texture_half_float' );\n\t\textensions.get( 'OES_texture_half_float_linear' );\n\t\textensions.get( 'OES_standard_derivatives' );\n\t\textensions.get( 'ANGLE_instanced_arrays' );\n\n\t\tif ( extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\tBufferGeometry.MaxIndex = 4294967296;\n\n\t\t}\n\n\t\tvar capabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\tvar state = new WebGLState( _gl, extensions, paramThreeToGL );\n\t\tvar properties = new WebGLProperties();\n\t\tvar textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, this.info );\n\t\tvar objects = new WebGLObjects( _gl, properties, this.info );\n\t\tvar programCache = new WebGLPrograms( this, capabilities );\n\t\tvar lightCache = new WebGLLights();\n\n\t\tthis.info.programs = programCache.programs;\n\n\t\tvar bufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender );\n\t\tvar indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );\n\n\t\t//\n\n\t\tvar backgroundCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\t\tvar backgroundCamera2 = new PerspectiveCamera();\n\t\tvar backgroundPlaneMesh = new Mesh(\n\t\t\tnew PlaneBufferGeometry( 2, 2 ),\n\t\t\tnew MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } )\n\t\t);\n\t\tvar backgroundBoxShader = ShaderLib[ 'cube' ];\n\t\tvar backgroundBoxMesh = new Mesh(\n\t\t\tnew BoxBufferGeometry( 5, 5, 5 ),\n\t\t\tnew ShaderMaterial( {\n\t\t\t\tuniforms: backgroundBoxShader.uniforms,\n\t\t\t\tvertexShader: backgroundBoxShader.vertexShader,\n\t\t\t\tfragmentShader: backgroundBoxShader.fragmentShader,\n\t\t\t\tside: BackSide,\n\t\t\t\tdepthTest: false,\n\t\t\t\tdepthWrite: false,\n\t\t\t\tfog: false\n\t\t\t} )\n\t\t);\n\n\t\t//\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\tfunction glClearColor( r, g, b, a ) {\n\n\t\t\tif ( _premultipliedAlpha === true ) {\n\n\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t}\n\n\t\t\tstate.clearColor( r, g, b, a );\n\n\t\t}\n\n\t\tfunction setDefaultGLState() {\n\n\t\t\tstate.init();\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );\n\n\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t}\n\n\t\tfunction resetGLState() {\n\n\t\t\t_currentProgram = null;\n\t\t\t_currentCamera = null;\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\n\t\t\tstate.reset();\n\n\t\t}\n\n\t\tsetDefaultGLState();\n\n\t\tthis.context = _gl;\n\t\tthis.capabilities = capabilities;\n\t\tthis.extensions = extensions;\n\t\tthis.properties = properties;\n\t\tthis.state = state;\n\n\t\t// shadow map\n\n\t\tvar shadowMap = new WebGLShadowMap( this, _lights, objects, capabilities );\n\n\t\tthis.shadowMap = shadowMap;\n\n\n\t\t// Plugins\n\n\t\tvar spritePlugin = new SpritePlugin( this, sprites );\n\t\tvar lensFlarePlugin = new LensFlarePlugin( this, lensFlares );\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\textensions.get( 'WEBGL_lose_context' ).loseContext();\n\n\t\t};\n\n\t\tthis.getMaxAnisotropy = function () {\n\n\t\t\treturn capabilities.getMaxAnisotropy();\n\n\t\t};\n\n\t\tthis.getPrecision = function () {\n\n\t\t\treturn capabilities.precision;\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( _viewport.z, _viewport.w, false );\n\n\t\t};\n\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_canvas.width = width * _pixelRatio;\n\t\t\t_canvas.height = height * _pixelRatio;\n\n\t\t\tif ( updateStyle !== false ) {\n\n\t\t\t\t_canvas.style.width = width + 'px';\n\t\t\t\t_canvas.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.setViewport = function ( x, y, width, height ) {\n\n\t\t\tstate.viewport( _viewport.set( x, y, width, height ) );\n\n\t\t};\n\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tstate.scissor( _scissor.set( x, y, width, height ) );\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\t// Clearing\n\n\t\tthis.getClearColor = function () {\n\n\t\t\treturn _clearColor;\n\n\t\t};\n\n\t\tthis.setClearColor = function ( color, alpha ) {\n\n\t\t\t_clearColor.set( color );\n\n\t\t\t_clearAlpha = alpha !== undefined ? alpha : 1;\n\n\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t};\n\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn _clearAlpha;\n\n\t\t};\n\n\t\tthis.setClearAlpha = function ( alpha ) {\n\n\t\t\t_clearAlpha = alpha;\n\n\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t};\n\n\t\tthis.clear = function ( color, depth, stencil ) {\n\n\t\t\tvar bits = 0;\n\n\t\t\tif ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;\n\t\t\tif ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\t\tif ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;\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\tthis.clearTarget = function ( renderTarget, color, depth, stencil ) {\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\t\t\tthis.clear( color, depth, stencil );\n\n\t\t};\n\n\t\t// Reset\n\n\t\tthis.resetGLState = resetGLState;\n\n\t\tthis.dispose = function() {\n\n\t\t\ttransparentObjects = [];\n\t\t\ttransparentObjectsLastIndex = -1;\n\t\t\topaqueObjects = [];\n\t\t\topaqueObjectsLastIndex = -1;\n\n\t\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\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\tresetGLState();\n\t\t\tsetDefaultGLState();\n\n\t\t\tproperties.clear();\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tvar 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\treleaseMaterialProgramReference( material );\n\n\t\t\tproperties.delete( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReference( material ) {\n\n\t\t\tvar programInfo = properties.get( material ).program;\n\n\t\t\tmaterial.program = undefined;\n\n\t\t\tif ( programInfo !== undefined ) {\n\n\t\t\t\tprogramCache.releaseProgram( programInfo );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferImmediate = function ( object, program, material ) {\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar buffers = properties.get( object );\n\n\t\t\tif ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();\n\t\t\tif ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();\n\t\t\tif ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();\n\t\t\tif ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( object.hasPositions ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.position );\n\t\t\t\t_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasNormals ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal );\n\n\t\t\t\tif ( ! material.isMeshPhongMaterial &&\n\t\t\t\t ! material.isMeshStandardMaterial &&\n\t\t\t\t material.shading === FlatShading ) {\n\n\t\t\t\t\tfor ( var i = 0, l = object.count * 3; i < l; i += 9 ) {\n\n\t\t\t\t\t\tvar array = object.normalArray;\n\n\t\t\t\t\t\tvar nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3;\n\t\t\t\t\t\tvar ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3;\n\t\t\t\t\t\tvar nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3;\n\n\t\t\t\t\t\tarray[ i + 0 ] = nx;\n\t\t\t\t\t\tarray[ i + 1 ] = ny;\n\t\t\t\t\t\tarray[ i + 2 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 3 ] = nx;\n\t\t\t\t\t\tarray[ i + 4 ] = ny;\n\t\t\t\t\t\tarray[ i + 5 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 6 ] = nx;\n\t\t\t\t\t\tarray[ i + 7 ] = ny;\n\t\t\t\t\t\tarray[ i + 8 ] = nz;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.normal );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasUvs && material.map ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.uv );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasColors && material.vertexColors !== NoColors ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.color );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t_gl.drawArrays( _gl.TRIANGLES, 0, object.count );\n\n\t\t\tobject.count = 0;\n\n\t\t};\n\n\t\tthis.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {\n\n\t\t\tsetMaterial( material );\n\n\t\t\tvar program = setProgram( camera, fog, material, object );\n\n\t\t\tvar updateBuffers = false;\n\t\t\tvar geometryProgram = geometry.id + '_' + program.id + '_' + material.wireframe;\n\n\t\t\tif ( geometryProgram !== _currentGeometryProgram ) {\n\n\t\t\t\t_currentGeometryProgram = geometryProgram;\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphTargetInfluences = object.morphTargetInfluences;\n\n\t\t\tif ( morphTargetInfluences !== undefined ) {\n\n\t\t\t\tvar activeInfluences = [];\n\n\t\t\t\tfor ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = morphTargetInfluences[ i ];\n\t\t\t\t\tactiveInfluences.push( [ influence, i ] );\n\n\t\t\t\t}\n\n\t\t\t\tactiveInfluences.sort( absNumericalSort );\n\n\t\t\t\tif ( activeInfluences.length > 8 ) {\n\n\t\t\t\t\tactiveInfluences.length = 8;\n\n\t\t\t\t}\n\n\t\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\t\tfor ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = activeInfluences[ i ];\n\t\t\t\t\tmorphInfluences[ i ] = influence[ 0 ];\n\n\t\t\t\t\tif ( influence[ 0 ] !== 0 ) {\n\n\t\t\t\t\t\tvar index = influence[ 1 ];\n\n\t\t\t\t\t\tif ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] );\n\t\t\t\t\t\tif ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i );\n\t\t\t\t\t\tif ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) {\n\n\t\t\t\t\tmorphInfluences[ i ] = 0.0;\n\n\t\t\t\t}\n\n\t\t\t\tprogram.getUniforms().setValue(\n\t\t\t\t\t\t_gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar position = geometry.attributes.position;\n\t\t\tvar rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = objects.getWireframeAttribute( geometry );\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\tvar renderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( index );\n\n\t\t\t} else {\n\n\t\t\t\trenderer = bufferRenderer;\n\n\t\t\t}\n\n\t\t\tif ( updateBuffers ) {\n\n\t\t\t\tsetupVertexAttributes( material, program, geometry );\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, objects.getAttributeBuffer( index ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar dataCount = 0;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdataCount = index.count;\n\n\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\tdataCount = position.count;\n\n\t\t\t}\n\n\t\t\tvar rangeStart = geometry.drawRange.start * rangeFactor;\n\t\t\tvar rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\t\tvar groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\t\tvar groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\t\tvar drawStart = Math.max( rangeStart, groupStart );\n\t\t\tvar drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\t\tvar drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\t\tif ( drawCount === 0 ) return;\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\tswitch ( object.drawMode ) {\n\n\t\t\t\t\t\tcase TrianglesDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleStripDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_STRIP );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleFanDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_FAN );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tvar 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 {\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}\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tif ( geometry.maxInstancedCount > 0 ) {\n\n\t\t\t\t\trenderer.renderInstances( geometry, drawStart, drawCount );\n\n\t\t\t\t}\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\tfunction setupVertexAttributes( material, program, geometry, startIndex ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( startIndex === undefined ) startIndex = 0;\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar geometryAttributes = geometry.attributes;\n\n\t\t\tvar programAttributes = program.getAttributes();\n\n\t\t\tvar materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\t\tfor ( var name in programAttributes ) {\n\n\t\t\t\tvar programAttribute = programAttributes[ name ];\n\n\t\t\t\tif ( programAttribute >= 0 ) {\n\n\t\t\t\t\tvar geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\t\tvar type = _gl.FLOAT;\n\t\t\t\t\t\tvar array = geometryAttribute.array;\n\t\t\t\t\t\tvar normalized = geometryAttribute.normalized;\n\n\t\t\t\t\t\tif ( array instanceof Float32Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.FLOAT;\n\n\t\t\t\t\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\t\t\t\t\tconsole.warn( \"Unsupported data buffer format: Float64Array\" );\n\n\t\t\t\t\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.UNSIGNED_SHORT;\n\n\t\t\t\t\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.SHORT;\n\n\t\t\t\t\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.UNSIGNED_INT;\n\n\t\t\t\t\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.INT;\n\n\t\t\t\t\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.BYTE;\n\n\t\t\t\t\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.UNSIGNED_BYTE;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar size = geometryAttribute.itemSize;\n\t\t\t\t\t\tvar buffer = objects.getAttributeBuffer( geometryAttribute );\n\n\t\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\t\tvar data = geometryAttribute.data;\n\t\t\t\t\t\t\tvar stride = data.stride;\n\t\t\t\t\t\t\tvar offset = geometryAttribute.offset;\n\n\t\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * data.array.BYTES_PER_ELEMENT, ( startIndex * stride + offset ) * data.array.BYTES_PER_ELEMENT );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * geometryAttribute.array.BYTES_PER_ELEMENT );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\t\tvar value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib2fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib3fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib4fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib1fv( programAttribute, value );\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\tstate.disableUnusedAttributes();\n\n\t\t}\n\n\t\t// Sorting\n\n\t\tfunction absNumericalSort( a, b ) {\n\n\t\t\treturn Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] );\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} else if ( a.material.program && b.material.program && a.material.program !== b.material.program ) {\n\n\t\t\t\treturn a.material.program.id - b.material.program.id;\n\n\t\t\t} else if ( a.material.id !== b.material.id ) {\n\n\t\t\t\treturn a.material.id - b.material.id;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn a.z - b.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction reversePainterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Rendering\n\n\t\tthis.render = function ( scene, camera, renderTarget, forceClear ) {\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\t// reset caching for this frame\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\t\t\t_currentCamera = null;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\tlights.length = 0;\n\n\t\t\topaqueObjectsLastIndex = - 1;\n\t\t\ttransparentObjectsLastIndex = - 1;\n\n\t\t\tsprites.length = 0;\n\t\t\tlensFlares.length = 0;\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\t\tprojectObject( scene, camera );\n\n\t\t\topaqueObjects.length = opaqueObjectsLastIndex + 1;\n\t\t\ttransparentObjects.length = transparentObjectsLastIndex + 1;\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\topaqueObjects.sort( painterSortStable );\n\t\t\t\ttransparentObjects.sort( reversePainterSortStable );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _clippingEnabled ) _clipping.beginShadows();\n\n\t\t\tsetupShadows( lights );\n\n\t\t\tshadowMap.render( scene, camera );\n\n\t\t\tsetupLights( lights, camera );\n\n\t\t\tif ( _clippingEnabled ) _clipping.endShadows();\n\n\t\t\t//\n\n\t\t\t_infoRender.calls = 0;\n\t\t\t_infoRender.vertices = 0;\n\t\t\t_infoRender.faces = 0;\n\t\t\t_infoRender.points = 0;\n\n\t\t\tif ( renderTarget === undefined ) {\n\n\t\t\t\trenderTarget = null;\n\n\t\t\t}\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\n\t\t\t//\n\n\t\t\tvar background = scene.background;\n\n\t\t\tif ( background === null ) {\n\n\t\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t\t} else if ( background && background.isColor ) {\n\n\t\t\t\tglClearColor( background.r, background.g, background.b, 1 );\n\t\t\t\tforceClear = true;\n\n\t\t\t}\n\n\t\t\tif ( this.autoClear || forceClear ) {\n\n\t\t\t\tthis.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil );\n\n\t\t\t}\n\n\t\t\tif ( background && background.isCubeTexture ) {\n\n\t\t\t\tbackgroundCamera2.projectionMatrix.copy( camera.projectionMatrix );\n\n\t\t\t\tbackgroundCamera2.matrixWorld.extractRotation( camera.matrixWorld );\n\t\t\t\tbackgroundCamera2.matrixWorldInverse.getInverse( backgroundCamera2.matrixWorld );\n\n\t\t\t\tbackgroundBoxMesh.material.uniforms[ \"tCube\" ].value = background;\n\t\t\t\tbackgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundCamera2.matrixWorldInverse, backgroundBoxMesh.matrixWorld );\n\n\t\t\t\tobjects.update( backgroundBoxMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundCamera2, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null );\n\n\t\t\t} else if ( background && background.isTexture ) {\n\n\t\t\t\tbackgroundPlaneMesh.material.map = background;\n\n\t\t\t\tobjects.update( backgroundPlaneMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.overrideMaterial ) {\n\n\t\t\t\tvar overrideMaterial = scene.overrideMaterial;\n\n\t\t\t\trenderObjects( opaqueObjects, scene, camera, overrideMaterial );\n\t\t\t\trenderObjects( transparentObjects, scene, camera, overrideMaterial );\n\n\t\t\t} else {\n\n\t\t\t\t// opaque pass (front-to-back order)\n\n\t\t\t\tstate.setBlending( NoBlending );\n\t\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\t\t// transparent pass (back-to-front order)\n\n\t\t\t\trenderObjects( transparentObjects, scene, camera );\n\n\t\t\t}\n\n\t\t\t// custom render plugins (post pass)\n\n\t\t\tspritePlugin.render( scene, camera );\n\t\t\tlensFlarePlugin.render( scene, camera, _currentViewport );\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\ttextures.updateRenderTargetMipmap( renderTarget );\n\n\t\t\t}\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.setDepthTest( true );\n\t\t\tstate.setDepthWrite( true );\n\t\t\tstate.setColorWrite( true );\n\n\t\t\t// _gl.finish();\n\n\t\t};\n\n\t\tfunction pushRenderItem( object, geometry, material, z, group ) {\n\n\t\t\tvar array, index;\n\n\t\t\t// allocate the next position in the appropriate array\n\n\t\t\tif ( material.transparent ) {\n\n\t\t\t\tarray = transparentObjects;\n\t\t\t\tindex = ++ transparentObjectsLastIndex;\n\n\t\t\t} else {\n\n\t\t\t\tarray = opaqueObjects;\n\t\t\t\tindex = ++ opaqueObjectsLastIndex;\n\n\t\t\t}\n\n\t\t\t// recycle existing render item or grow the array\n\n\t\t\tvar renderItem = array[ index ];\n\n\t\t\tif ( renderItem !== undefined ) {\n\n\t\t\t\trenderItem.id = object.id;\n\t\t\t\trenderItem.object = object;\n\t\t\t\trenderItem.geometry = geometry;\n\t\t\t\trenderItem.material = material;\n\t\t\t\trenderItem.z = _vector3.z;\n\t\t\t\trenderItem.group = group;\n\n\t\t\t} else {\n\n\t\t\t\trenderItem = {\n\t\t\t\t\tid: object.id,\n\t\t\t\t\tobject: object,\n\t\t\t\t\tgeometry: geometry,\n\t\t\t\t\tmaterial: material,\n\t\t\t\t\tz: _vector3.z,\n\t\t\t\t\tgroup: group\n\t\t\t\t};\n\n\t\t\t\t// assert( index === array.length );\n\t\t\t\tarray.push( renderItem );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Duplicated code (Frustum)\n\n\t\tfunction isObjectViewable( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t_sphere.copy( geometry.boundingSphere ).\n\t\t\t\tapplyMatrix4( object.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSpriteViewable( sprite ) {\n\n\t\t\t_sphere.center.set( 0, 0, 0 );\n\t\t\t_sphere.radius = 0.7071067811865476;\n\t\t\t_sphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSphereViewable( sphere ) {\n\n\t\t\tif ( ! _frustum.intersectsSphere( sphere ) ) return false;\n\n\t\t\tvar numPlanes = _clipping.numPlanes;\n\n\t\t\tif ( numPlanes === 0 ) return true;\n\n\t\t\tvar planes = _this.clippingPlanes,\n\n\t\t\t\tcenter = sphere.center,\n\t\t\t\tnegRad = - sphere.radius,\n\t\t\t\ti = 0;\n\n\t\t\tdo {\n\n\t\t\t\t// out when deeper than radius in the negative halfspace\n\t\t\t\tif ( planes[ i ].distanceToPoint( center ) < negRad ) return false;\n\n\t\t\t} while ( ++ i !== numPlanes );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isLight ) {\n\n\t\t\t\t\tlights.push( object );\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( object.frustumCulled === false || isSpriteViewable( object ) === true ) {\n\n\t\t\t\t\t\tsprites.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isLensFlare ) {\n\n\t\t\t\t\tlensFlares.push( object );\n\n\t\t\t\t} else if ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t_vector3.applyProjection( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpushRenderItem( object, null, object.material, _vector3.z, null );\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( object.frustumCulled === false || isObjectViewable( object ) === true ) {\n\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t\t\t_vector3.applyProjection( _projScreenMatrix );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar geometry = objects.update( object );\n\n\t\t\t\t\t\t\tif ( material.isMultiMaterial ) {\n\n\t\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tvar group = groups[ i ];\n\t\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, groupMaterial, _vector3.z, group );\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} else {\n\n\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, material, _vector3.z, null );\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\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera, overrideMaterial ) {\n\n\t\t\tfor ( var i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tvar renderItem = renderList[ i ];\n\n\t\t\t\tvar object = renderItem.object;\n\t\t\t\tvar geometry = renderItem.geometry;\n\t\t\t\tvar material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;\n\t\t\t\tvar group = renderItem.group;\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\t\tif ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tsetMaterial( material );\n\n\t\t\t\t\tvar program = setProgram( camera, scene.fog, material, object );\n\n\t\t\t\t\t_currentGeometryProgram = '';\n\n\t\t\t\t\tobject.render( function ( object ) {\n\n\t\t\t\t\t\t_this.renderBufferImmediate( object, program, material );\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );\n\n\t\t\t\t}\n\n\t\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction initMaterial( material, fog, object ) {\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tvar parameters = programCache.getParameters(\n\t\t\t\t\tmaterial, _lights, fog, _clipping.numPlanes, _clipping.numIntersection, object );\n\n\t\t\tvar code = programCache.getProgramCode( material, parameters );\n\n\t\t\tvar program = materialProperties.program;\n\t\t\tvar programChange = true;\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\t// new material\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t} else if ( program.code !== code ) {\n\n\t\t\t\t// changed glsl or parameters\n\t\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\t} else if ( parameters.shaderID !== undefined ) {\n\n\t\t\t\t// same glsl and uniform list\n\t\t\t\treturn;\n\n\t\t\t} else {\n\n\t\t\t\t// only rebuild uniform list\n\t\t\t\tprogramChange = false;\n\n\t\t\t}\n\n\t\t\tif ( programChange ) {\n\n\t\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\t\tvar shader = ShaderLib[ parameters.shaderID ];\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\t\t\tfragmentShader: shader.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: material.uniforms,\n\t\t\t\t\t\tvertexShader: material.vertexShader,\n\t\t\t\t\t\tfragmentShader: material.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.__webglShader = materialProperties.__webglShader;\n\n\t\t\t\tprogram = programCache.acquireProgram( material, parameters, code );\n\n\t\t\t\tmaterialProperties.program = program;\n\t\t\t\tmaterial.program = program;\n\n\t\t\t}\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\tmaterial.numSupportedMorphTargets = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphTargets; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphTarget' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphTargets ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.morphNormals ) {\n\n\t\t\t\tmaterial.numSupportedMorphNormals = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphNormals; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphNormal' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphNormals ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( ! material.isShaderMaterial &&\n\t\t\t ! material.isRawShaderMaterial ||\n\t\t\t material.clipping === true ) {\n\n\t\t\t\tmaterialProperties.numClippingPlanes = _clipping.numPlanes;\n\t\t\t\tmaterialProperties.numIntersection = _clipping.numIntersection;\n\t\t\t\tuniforms.clippingPlanes = _clipping.uniform;\n\n\t\t\t}\n\n\t\t\tmaterialProperties.fog = fog;\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.lightsHash = _lights.hash;\n\n\t\t\tif ( material.lights ) {\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.ambient;\n\t\t\t\tuniforms.directionalLights.value = _lights.directional;\n\t\t\t\tuniforms.spotLights.value = _lights.spot;\n\t\t\t\tuniforms.pointLights.value = _lights.point;\n\t\t\t\tuniforms.hemisphereLights.value = _lights.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = _lights.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = _lights.spotShadowMap;\n\t\t\t\tuniforms.spotShadowMatrix.value = _lights.spotShadowMatrix;\n\t\t\t\tuniforms.pointShadowMap.value = _lights.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = _lights.pointShadowMatrix;\n\n\t\t\t}\n\n\t\t\tvar progUniforms = materialProperties.program.getUniforms(),\n\t\t\t\tuniformsList =\n\t\t\t\t\t\tWebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t\t}\n\n\t\tfunction setMaterial( material ) {\n\n\t\t\tmaterial.side === DoubleSide\n\t\t\t\t? state.disable( _gl.CULL_FACE )\n\t\t\t\t: state.enable( _gl.CULL_FACE );\n\n\t\t\tstate.setFlipSided( material.side === BackSide );\n\n\t\t\tmaterial.transparent === true\n\t\t\t\t? state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )\n\t\t\t\t: state.setBlending( NoBlending );\n\n\t\t\tstate.setDepthFunc( material.depthFunc );\n\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\tstate.setDepthWrite( material.depthWrite );\n\t\t\tstate.setColorWrite( material.colorWrite );\n\t\t\tstate.setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\t}\n\n\t\tfunction setProgram( camera, fog, material, object ) {\n\n\t\t\t_usedTextureUnits = 0;\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tif ( _clippingEnabled ) {\n\n\t\t\t\tif ( _localClippingEnabled || camera !== _currentCamera ) {\n\n\t\t\t\t\tvar useCache =\n\t\t\t\t\t\t\tcamera === _currentCamera &&\n\t\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\t_clipping.setState(\n\t\t\t\t\t\t\tmaterial.clippingPlanes, material.clipIntersection, material.clipShadows,\n\t\t\t\t\t\t\tcamera, materialProperties, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate === false ) {\n\n\t\t\t\tif ( materialProperties.program === undefined ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.lights && materialProperties.lightsHash !== _lights.hash ) {\n\n\t\t\t\t\tmaterial.needsUpdate = 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\t materialProperties.numIntersection !== _clipping.numIntersection ) ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate ) {\n\n\t\t\t\tinitMaterial( material, fog, object );\n\t\t\t\tmaterial.needsUpdate = false;\n\n\t\t\t}\n\n\t\t\tvar refreshProgram = false;\n\t\t\tvar refreshMaterial = false;\n\t\t\tvar refreshLights = false;\n\n\t\t\tvar program = materialProperties.program,\n\t\t\t\tp_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( program.id !== _currentProgram ) {\n\n\t\t\t\t_gl.useProgram( program.program );\n\t\t\t\t_currentProgram = program.id;\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 || camera !== _currentCamera ) {\n\n\t\t\t\tp_uniforms.set( _gl, camera, 'projectionMatrix' );\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\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( camera !== _currentCamera ) {\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\t// load material specific uniforms\n\t\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\t material.isMeshPhongMaterial ||\n\t\t\t\t material.isMeshStandardMaterial ||\n\t\t\t\t material.envMap ) {\n\n\t\t\t\t\tvar uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t material.isMeshLambertMaterial ||\n\t\t\t\t material.isMeshBasicMaterial ||\n\t\t\t\t material.isMeshStandardMaterial ||\n\t\t\t\t material.isShaderMaterial ||\n\t\t\t\t material.skinning ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingExposure' );\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingWhitePoint' );\n\n\t\t\t}\n\n\t\t\t// skinning uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone texture must go before other textures\n\t\t\t// not sure why, but otherwise weird things happen\n\n\t\t\tif ( material.skinning ) {\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\tvar skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( capabilities.floatVertexTextures && skeleton.useVertexTexture ) {\n\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTexture' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureWidth' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureHeight' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tif ( material.lights ) {\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 ) {\n\n\t\t\t\t\trefreshUniformsFog( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshBasicMaterial ||\n\t\t\t\t material.isMeshLambertMaterial ||\n\t\t\t\t material.isMeshPhongMaterial ||\n\t\t\t\t material.isMeshStandardMaterial ||\n\t\t\t\t material.isMeshDepthMaterial ) {\n\n\t\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh single material specific uniforms\n\n\t\t\t\tif ( material.isLineBasicMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isLineDashedMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\t\t\t\t\trefreshUniformsDash( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\t\t\trefreshUniformsPoints( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\t\t\trefreshUniformsLambert( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhong( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhysical( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\t\t\trefreshUniformsStandard( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\t\t\tm_uniforms.displacementMap.value = material.displacementMap;\n\t\t\t\t\t\tm_uniforms.displacementScale.value = material.displacementScale;\n\t\t\t\t\t\tm_uniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\t\t\tm_uniforms.opacity.value = material.opacity;\n\n\t\t\t\t}\n\n\t\t\t\tWebGLUniforms.upload(\n\t\t\t\t\t\t_gl, materialProperties.uniformsList, m_uniforms, _this );\n\n\t\t\t}\n\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.set( _gl, object, 'modelViewMatrix' );\n\t\t\tp_uniforms.set( _gl, object, 'normalMatrix' );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// Uniforms (refresh uniforms objects)\n\n\t\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t\tuniforms.diffuse.value = material.color;\n\n\t\t\tif ( material.emissive ) {\n\n\t\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t\t}\n\n\t\t\tuniforms.map.value = material.map;\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\tif ( material.aoMap ) {\n\n\t\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\t}\n\n\t\t\t// uv repeat and offset setting priorities\n\t\t\t// 1. color map\n\t\t\t// 2. specular map\n\t\t\t// 3. normal map\n\t\t\t// 4. bump map\n\t\t\t// 5. alpha map\n\t\t\t// 6. emissive map\n\n\t\t\tvar uvScaleMap;\n\n\t\t\tif ( material.map ) {\n\n\t\t\t\tuvScaleMap = material.map;\n\n\t\t\t} else if ( material.specularMap ) {\n\n\t\t\t\tuvScaleMap = material.specularMap;\n\n\t\t\t} else if ( material.displacementMap ) {\n\n\t\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t\t} else if ( material.normalMap ) {\n\n\t\t\t\tuvScaleMap = material.normalMap;\n\n\t\t\t} else if ( material.bumpMap ) {\n\n\t\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t\t} else if ( material.roughnessMap ) {\n\n\t\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t\t} else if ( material.metalnessMap ) {\n\n\t\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t\t} else if ( material.alphaMap ) {\n\n\t\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t\t} else if ( material.emissiveMap ) {\n\n\t\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t\t// backwards compatibility\n\t\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t\t}\n\n\t\t\t\tvar offset = uvScaleMap.offset;\n\t\t\t\tvar repeat = uvScaleMap.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t\tuniforms.envMap.value = material.envMap;\n\n\t\t\t// don't flip CubeTexture envMaps, flip everything else:\n\t\t\t// WebGLRenderTargetCube will be flipped for backwards compatibility\n\t\t\t// WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture\n\t\t\t// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future\n\t\t\tuniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t}\n\n\t\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\t\tuniforms.dashSize.value = material.dashSize;\n\t\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\t\tuniforms.scale.value = material.scale;\n\n\t\t}\n\n\t\tfunction refreshUniformsPoints( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\t\t\tuniforms.size.value = material.size * _pixelRatio;\n\t\t\tuniforms.scale.value = _height * 0.5;\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\tif ( material.map !== null ) {\n\n\t\t\t\tvar offset = material.map.offset;\n\t\t\t\tvar repeat = material.map.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsFog( uniforms, fog ) {\n\n\t\t\tuniforms.fogColor.value = fog.color;\n\n\t\t\tif ( fog.isFog ) {\n\n\t\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\t\tuniforms.specular.value = material.specular;\n\t\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\t\tuniforms.roughness.value = material.roughness;\n\t\t\tuniforms.metalness.value = material.metalness;\n\n\t\t\tif ( material.roughnessMap ) {\n\n\t\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.metalnessMap ) {\n\n\t\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t\tif ( material.envMap ) {\n\n\t\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhysical( uniforms, material ) {\n\n\t\t\tuniforms.clearCoat.value = material.clearCoat;\n\t\t\tuniforms.clearCoatRoughness.value = material.clearCoatRoughness;\n\n\t\t\trefreshUniformsStandard( uniforms, material );\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\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\t// Lighting\n\n\t\tfunction setupShadows( lights ) {\n\n\t\t\tvar lightShadowsLength = 0;\n\n\t\t\tfor ( var i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\t\tvar light = lights[ i ];\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t_lights.shadows[ lightShadowsLength ++ ] = light;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.shadows.length = lightShadowsLength;\n\n\t\t}\n\n\t\tfunction setupLights( lights, camera ) {\n\n\t\t\tvar l, ll, light,\n\t\t\tr = 0, g = 0, b = 0,\n\t\t\tcolor,\n\t\t\tintensity,\n\t\t\tdistance,\n\t\t\tshadowMap,\n\n\t\t\tviewMatrix = camera.matrixWorldInverse,\n\n\t\t\tdirectionalLength = 0,\n\t\t\tpointLength = 0,\n\t\t\tspotLength = 0,\n\t\t\themiLength = 0;\n\n\t\t\tfor ( l = 0, ll = lights.length; l < ll; l ++ ) {\n\n\t\t\t\tlight = lights[ l ];\n\n\t\t\t\tcolor = light.color;\n\t\t\t\tintensity = light.intensity;\n\t\t\t\tdistance = light.distance;\n\n\t\t\t\tshadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\t\tr += color.r * intensity;\n\t\t\t\t\tg += color.g * intensity;\n\t\t\t\t\tb += color.b * intensity;\n\n\t\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\t_lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.directional[ directionalLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\t_lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.spot[ spotLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.pointShadowMap[ pointLength ] = shadowMap;\n\n\t\t\t\t\tif ( _lights.pointShadowMatrix[ pointLength ] === undefined ) {\n\n\t\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ] = new Matrix4();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// for point lights we set the shadow matrix to be a translation-only matrix\n\t\t\t\t\t// equal to inverse of the light's position\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.matrixWorld ).negate();\n\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ].identity().setPosition( _vector3 );\n\n\t\t\t\t\t_lights.point[ pointLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\t\t_lights.hemi[ hemiLength ++ ] = uniforms;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.ambient[ 0 ] = r;\n\t\t\t_lights.ambient[ 1 ] = g;\n\t\t\t_lights.ambient[ 2 ] = b;\n\n\t\t\t_lights.directional.length = directionalLength;\n\t\t\t_lights.spot.length = spotLength;\n\t\t\t_lights.point.length = pointLength;\n\t\t\t_lights.hemi.length = hemiLength;\n\n\t\t\t_lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + hemiLength + ',' + _lights.shadows.length;\n\n\t\t}\n\n\t\t// GL state setting\n\n\t\tthis.setFaceCulling = function ( cullFace, frontFaceDirection ) {\n\n\t\t\tstate.setCullFace( cullFace );\n\t\t\tstate.setFlipSided( frontFaceDirection === FrontFaceDirectionCW );\n\n\t\t};\n\n\t\t// Textures\n\n\t\tfunction allocTextureUnit() {\n\n\t\t\tvar textureUnit = _usedTextureUnits;\n\n\t\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\t\tconsole.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t\t}\n\n\t\t\t_usedTextureUnits += 1;\n\n\t\t\treturn textureUnit;\n\n\t\t}\n\n\t\tthis.allocTextureUnit = allocTextureUnit;\n\n\t\t// this.setTexture2D = setTexture2D;\n\t\tthis.setTexture2D = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\t// backwards compatibility: peel texture.texture\n\t\t\treturn function setTexture2D( texture, slot ) {\n\n\t\t\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTexture = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTexture( texture, slot ) {\n\n\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.\" );\n\t\t\t\t\twarned = true;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTextureCube = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTextureCube( texture, slot ) {\n\n\t\t\t\t// backwards compatibility: peel texture.texture\n\t\t\t\tif ( texture && texture.isWebGLRenderTargetCube ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\t// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture\n\t\t\t\t// TODO: unify these code paths\n\t\t\t\tif ( ( texture && texture.isCubeTexture ) ||\n\t\t\t\t\t ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {\n\n\t\t\t\t\t// CompressedTexture can have Array in image :/\n\n\t\t\t\t\t// this function alone should take care of cube textures\n\t\t\t\t\ttextures.setTextureCube( texture, slot );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assumed: texture property of THREE.WebGLRenderTargetCube\n\n\t\t\t\t\ttextures.setTextureCubeDynamic( texture, slot );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.getCurrentRenderTarget = function() {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTarget = function ( renderTarget ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\n\t\t\tif ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t}\n\n\t\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\t\tvar framebuffer;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer;\n\n\t\t\t\t}\n\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = null;\n\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );\n\n\t\t\t}\n\n\t\t\tif ( _currentFramebuffer !== framebuffer ) {\n\n\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t\t_currentFramebuffer = framebuffer;\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tstate.viewport( _currentViewport );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) {\n\n\t\t\tif ( ( renderTarget && renderTarget.isWebGLRenderTarget ) === false ) {\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\tvar framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tvar restore = false;\n\n\t\t\t\tif ( framebuffer !== _currentFramebuffer ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\trestore = true;\n\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar texture = renderTarget.texture;\n\t\t\t\t\tvar textureFormat = texture.format;\n\t\t\t\t\tvar textureType = texture.type;\n\n\t\t\t\t\tif ( textureFormat !== RGBAFormat && paramThreeToGL( 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\tif ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t ! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t ! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) {\n\n\t\t\t\t\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\tif ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {\n\n\t\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\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t\t_gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\tif ( restore ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );\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// Map three.js constants to WebGL constants\n\n\t\tfunction paramThreeToGL( p ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( p === RepeatWrapping ) return _gl.REPEAT;\n\t\t\tif ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE;\n\t\t\tif ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT;\n\n\t\t\tif ( p === NearestFilter ) return _gl.NEAREST;\n\t\t\tif ( p === NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST;\n\t\t\tif ( p === NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR;\n\n\t\t\tif ( p === LinearFilter ) return _gl.LINEAR;\n\t\t\tif ( p === LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST;\n\t\t\tif ( p === LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR;\n\n\t\t\tif ( p === UnsignedByteType ) return _gl.UNSIGNED_BYTE;\n\t\t\tif ( p === UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4;\n\t\t\tif ( p === UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1;\n\t\t\tif ( p === UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5;\n\n\t\t\tif ( p === ByteType ) return _gl.BYTE;\n\t\t\tif ( p === ShortType ) return _gl.SHORT;\n\t\t\tif ( p === UnsignedShortType ) return _gl.UNSIGNED_SHORT;\n\t\t\tif ( p === IntType ) return _gl.INT;\n\t\t\tif ( p === UnsignedIntType ) return _gl.UNSIGNED_INT;\n\t\t\tif ( p === FloatType ) return _gl.FLOAT;\n\n\t\t\tif ( p === HalfFloatType ) {\n\n\t\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\t\tif ( extension !== null ) return extension.HALF_FLOAT_OES;\n\n\t\t\t}\n\n\t\t\tif ( p === AlphaFormat ) return _gl.ALPHA;\n\t\t\tif ( p === RGBFormat ) return _gl.RGB;\n\t\t\tif ( p === RGBAFormat ) return _gl.RGBA;\n\t\t\tif ( p === LuminanceFormat ) return _gl.LUMINANCE;\n\t\t\tif ( p === LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA;\n\t\t\tif ( p === DepthFormat ) return _gl.DEPTH_COMPONENT;\n\t\t\tif ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL;\n\n\t\t\tif ( p === AddEquation ) return _gl.FUNC_ADD;\n\t\t\tif ( p === SubtractEquation ) return _gl.FUNC_SUBTRACT;\n\t\t\tif ( p === ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT;\n\n\t\t\tif ( p === ZeroFactor ) return _gl.ZERO;\n\t\t\tif ( p === OneFactor ) return _gl.ONE;\n\t\t\tif ( p === SrcColorFactor ) return _gl.SRC_COLOR;\n\t\t\tif ( p === OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR;\n\t\t\tif ( p === SrcAlphaFactor ) return _gl.SRC_ALPHA;\n\t\t\tif ( p === OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA;\n\t\t\tif ( p === DstAlphaFactor ) return _gl.DST_ALPHA;\n\t\t\tif ( p === OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA;\n\n\t\t\tif ( p === DstColorFactor ) return _gl.DST_COLOR;\n\t\t\tif ( p === OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR;\n\t\t\tif ( p === SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE;\n\n\t\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||\n\t\t\t\tp === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\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}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||\n\t\t\t\t p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\t\tif ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t}\n\n\t\t\tif ( p === MinEquation || p === MaxEquation ) {\n\n\t\t\t\textension = extensions.get( 'EXT_blend_minmax' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === MinEquation ) return extension.MIN_EXT;\n\t\t\t\t\tif ( p === MaxEquation ) return extension.MAX_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\t\tif ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t}\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction FogExp2 ( color, density ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = ( density !== undefined ) ? density : 0.00025;\n\n\t}\n\n\tFogExp2.prototype.isFogExp2 = true;\n\n\tFogExp2.prototype.clone = function () {\n\n\t\treturn new FogExp2( this.color.getHex(), this.density );\n\n\t};\n\n\tFogExp2.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Fog ( color, near, far ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = ( near !== undefined ) ? near : 1;\n\t\tthis.far = ( far !== undefined ) ? far : 1000;\n\n\t}\n\n\tFog.prototype.isFog = true;\n\n\tFog.prototype.clone = function () {\n\n\t\treturn new Fog( this.color.getHex(), this.near, this.far );\n\n\t};\n\n\tFog.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\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\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Scene () {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.fog = null;\n\t\tthis.overrideMaterial = null;\n\n\t\tthis.autoUpdate = true; // checked by the renderer\n\n\t}\n\n\tScene.prototype = Object.create( Object3D.prototype );\n\n\tScene.prototype.constructor = Scene;\n\n\tScene.prototype.copy = function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t};\n\n\tScene.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tif ( this.background !== null ) data.object.background = this.background.toJSON( meta );\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlare( texture, size, distance, blending, color ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.lensFlares = [];\n\n\t\tthis.positionScreen = new Vector3();\n\t\tthis.customUpdateCallback = undefined;\n\n\t\tif ( texture !== undefined ) {\n\n\t\t\tthis.add( texture, size, distance, blending, color );\n\n\t\t}\n\n\t}\n\n\tLensFlare.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LensFlare,\n\n\t\tisLensFlare: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.positionScreen.copy( source.positionScreen );\n\t\t\tthis.customUpdateCallback = source.customUpdateCallback;\n\n\t\t\tfor ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lensFlares.push( source.lensFlares[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( texture, size, distance, blending, color, opacity ) {\n\n\t\t\tif ( size === undefined ) size = - 1;\n\t\t\tif ( distance === undefined ) distance = 0;\n\t\t\tif ( opacity === undefined ) opacity = 1;\n\t\t\tif ( color === undefined ) color = new Color( 0xffffff );\n\t\t\tif ( blending === undefined ) blending = NormalBlending;\n\n\t\t\tdistance = Math.min( distance, Math.max( 0, distance ) );\n\n\t\t\tthis.lensFlares.push( {\n\t\t\t\ttexture: texture,\t// THREE.Texture\n\t\t\t\tsize: size, \t\t// size in pixels (-1 = use texture.width)\n\t\t\t\tdistance: distance, \t// distance (0-1) from light source (0=at light source)\n\t\t\t\tx: 0, y: 0, z: 0,\t// screen position (-1 => 1) z = 0 is in front z = 1 is back\n\t\t\t\tscale: 1, \t\t// scale\n\t\t\t\trotation: 0, \t\t// rotation\n\t\t\t\topacity: opacity,\t// opacity\n\t\t\t\tcolor: color,\t\t// color\n\t\t\t\tblending: blending\t// blending\n\t\t\t} );\n\n\t\t},\n\n\t\t/*\n\t\t * Update lens flares update positions on all flares based on the screen position\n\t\t * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way.\n\t\t */\n\n\t\tupdateLensFlares: function () {\n\n\t\t\tvar f, fl = this.lensFlares.length;\n\t\t\tvar flare;\n\t\t\tvar vecX = - this.positionScreen.x * 2;\n\t\t\tvar vecY = - this.positionScreen.y * 2;\n\n\t\t\tfor ( f = 0; f < fl; f ++ ) {\n\n\t\t\t\tflare = this.lensFlares[ f ];\n\n\t\t\t\tflare.x = this.positionScreen.x + vecX * flare.distance;\n\t\t\t\tflare.y = this.positionScreen.y + vecY * flare.distance;\n\n\t\t\t\tflare.wantedRotation = flare.x * Math.PI * 0.25;\n\t\t\t\tflare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t *\tuvOffset: new THREE.Vector2(),\n\t *\tuvScale: new THREE.Vector2()\n\t * }\n\t */\n\n\tfunction SpriteMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\t\tthis.map = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tSpriteMaterial.prototype = Object.create( Material.prototype );\n\tSpriteMaterial.prototype.constructor = SpriteMaterial;\n\n\tSpriteMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.map = source.map;\n\n\t\tthis.rotation = source.rotation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Sprite( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Sprite';\n\n\t\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\t}\n\n\tSprite.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Sprite,\n\n\t\tisSprite: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distanceSq = raycaster.ray.distanceSqToPoint( matrixPosition );\n\t\t\t\tvar guessSizeSq = this.scale.x * this.scale.y / 4;\n\n\t\t\t\tif ( distanceSq > guessSizeSq ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: Math.sqrt( distanceSq ),\n\t\t\t\t\tpoint: this.position,\n\t\t\t\t\tface: 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\tclone: function () {\n\n\t\t\treturn new this.constructor( this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LOD() {\n\n\t\tObject3D.call( this );\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} );\n\n\t}\n\n\n\tLOD.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LOD,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source, false );\n\n\t\t\tvar levels = source.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddLevel: function ( object, distance ) {\n\n\t\t\tif ( distance === undefined ) distance = 0;\n\n\t\t\tdistance = Math.abs( distance );\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\t\tthis.add( object );\n\n\t\t},\n\n\t\tgetObjectForDistance: function ( distance ) {\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance < levels[ i ].distance ) {\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\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( matrixPosition );\n\n\t\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tupdate: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar levels = this.levels;\n\n\t\t\t\tif ( levels.length > 1 ) {\n\n\t\t\t\t\tv1.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\t\tv2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\t\tvar distance = v1.distanceTo( v2 );\n\n\t\t\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t\t\t} else {\n\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\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\t\t\tlevels[ i ].object.visible = 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\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.levels = [];\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tdata.object.levels.push( {\n\t\t\t\t\tobject: level.object.uuid,\n\t\t\t\t\tdistance: level.distance\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { data: data, 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.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n\tDataTexture.prototype = Object.create( Texture.prototype );\n\tDataTexture.prototype.constructor = DataTexture;\n\n\tDataTexture.prototype.isDataTexture = true;\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author michael guerrero / http://realitymeltdown.com\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Skeleton( bones, boneInverses, useVertexTexture ) {\n\n\t\tthis.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true;\n\n\t\tthis.identityMatrix = new Matrix4();\n\n\t\t// copy the bone array\n\n\t\tbones = bones || [];\n\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t// create a bone texture or an array of floats\n\n\t\tif ( this.useVertexTexture ) {\n\n\t\t\t// layout (1 matrix = 4 pixels)\n\t\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\n\t\t\tvar size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\t\tsize = _Math.nextPowerOfTwo( Math.ceil( size ) );\n\t\t\tsize = Math.max( size, 4 );\n\n\t\t\tthis.boneTextureWidth = size;\n\t\t\tthis.boneTextureHeight = size;\n\n\t\t\tthis.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel\n\t\t\tthis.boneTexture = new DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, RGBAFormat, FloatType );\n\n\t\t} else {\n\n\t\t\tthis.boneMatrices = new Float32Array( 16 * this.bones.length );\n\n\t\t}\n\n\t\t// use the supplied bone inverses or calculate the inverses\n\n\t\tif ( boneInverses === undefined ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\tif ( this.bones.length === boneInverses.length ) {\n\n\t\t\t\tthis.boneInverses = boneInverses.slice( 0 );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton bonInverses is the wrong length.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\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\tObject.assign( Skeleton.prototype, {\n\n\t\tcalculateInverses: function () {\n\n\t\t\tthis.boneInverses = [];\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tvar inverse = new Matrix4();\n\n\t\t\t\tif ( this.bones[ b ] ) {\n\n\t\t\t\t\tinverse.getInverse( this.bones[ b ].matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tthis.boneInverses.push( inverse );\n\n\t\t\t}\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tvar bone;\n\n\t\t\t// recover the bind-time world matrices\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tbone.matrixWorld.getInverse( this.boneInverses[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// compute the local matrices, positions, rotations and scales\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tif ( (bone.parent && bone.parent.isBone) ) {\n\n\t\t\t\t\t\tbone.matrix.getInverse( bone.parent.matrixWorld );\n\t\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdate: ( function () {\n\n\t\t\tvar offsetMatrix = new Matrix4();\n\n\t\t\treturn function update() {\n\n\t\t\t\t// flatten bone matrices to array\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\t\t// compute the offset between the current and the original transform\n\n\t\t\t\t\tvar matrix = this.bones[ b ] ? this.bones[ b ].matrixWorld : this.identityMatrix;\n\n\t\t\t\t\toffsetMatrix.multiplyMatrices( matrix, this.boneInverses[ b ] );\n\t\t\t\t\toffsetMatrix.toArray( this.boneMatrices, b * 16 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.useVertexTexture ) {\n\n\t\t\t\t\tthis.boneTexture.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tclone: function () {\n\n\t\t\treturn new Skeleton( this.bones, this.boneInverses, this.useVertexTexture );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Bone( skin ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Bone';\n\n\t\tthis.skin = skin;\n\n\t}\n\n\tBone.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Bone,\n\n\t\tisBone: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.skin = source.skin;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction SkinnedMesh( geometry, material, useVertexTexture ) {\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\tthis.bindMode = \"attached\";\n\t\tthis.bindMatrix = new Matrix4();\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t// init bones\n\n\t\t// TODO: remove bone creation as there is no reason (other than\n\t\t// convenience) for THREE.SkinnedMesh to do this.\n\n\t\tvar bones = [];\n\n\t\tif ( this.geometry && this.geometry.bones !== undefined ) {\n\n\t\t\tvar bone, gbone;\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tbone = new Bone( this );\n\t\t\t\tbones.push( bone );\n\n\t\t\t\tbone.name = gbone.name;\n\t\t\t\tbone.position.fromArray( gbone.pos );\n\t\t\t\tbone.quaternion.fromArray( gbone.rotq );\n\t\t\t\tif ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );\n\n\t\t\t}\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tif ( gbone.parent !== - 1 && gbone.parent !== null &&\n\t\t\t\t\t\tbones[ gbone.parent ] !== undefined ) {\n\n\t\t\t\t\tbones[ gbone.parent ].add( bones[ b ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.add( bones[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.normalizeSkinWeights();\n\n\t\tthis.updateMatrixWorld( true );\n\t\tthis.bind( new Skeleton( bones, undefined, useVertexTexture ), this.matrixWorld );\n\n\t}\n\n\n\tSkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\t\tconstructor: SkinnedMesh,\n\n\t\tisSkinnedMesh: true,\n\n\t\tbind: function( skeleton, bindMatrix ) {\n\n\t\t\tthis.skeleton = skeleton;\n\n\t\t\tif ( bindMatrix === undefined ) {\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t\t}\n\n\t\t\tthis.bindMatrix.copy( bindMatrix );\n\t\t\tthis.bindMatrixInverse.getInverse( bindMatrix );\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tthis.skeleton.pose();\n\n\t\t},\n\n\t\tnormalizeSkinWeights: function () {\n\n\t\t\tif ( (this.geometry && this.geometry.isGeometry) ) {\n\n\t\t\t\tfor ( var i = 0; i < this.geometry.skinWeights.length; i ++ ) {\n\n\t\t\t\t\tvar sw = this.geometry.skinWeights[ i ];\n\n\t\t\t\t\tvar scale = 1.0 / sw.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tsw.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tsw.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( (this.geometry && this.geometry.isBufferGeometry) ) {\n\n\t\t\t\tvar vec = new Vector4();\n\n\t\t\t\tvar skinWeight = this.geometry.attributes.skinWeight;\n\n\t\t\t\tfor ( var i = 0; i < skinWeight.count; i ++ ) {\n\n\t\t\t\t\tvec.x = skinWeight.getX( i );\n\t\t\t\t\tvec.y = skinWeight.getY( i );\n\t\t\t\t\tvec.z = skinWeight.getZ( i );\n\t\t\t\t\tvec.w = skinWeight.getW( i );\n\n\t\t\t\t\tvar scale = 1.0 / vec.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tvec.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvec.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t\tskinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrixWorld: function( force ) {\n\n\t\t\tMesh.prototype.updateMatrixWorld.call( this, true );\n\n\t\t\tif ( this.bindMode === \"attached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.matrixWorld );\n\n\t\t\t} else if ( this.bindMode === \"detached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.bindMatrix );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.SkinnedMesh unrecognized bindMode: ' + this.bindMode );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function() {\n\n\t\t\treturn new this.constructor( this.geometry, this.material, this.skeleton.useVertexTexture ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t * linecap: \"round\",\n\t * linejoin: \"round\"\n\t * }\n\t */\n\n\tfunction LineBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\t\tthis.linecap = 'round';\n\t\tthis.linejoin = 'round';\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineBasicMaterial.prototype = Object.create( Material.prototype );\n\tLineBasicMaterial.prototype.constructor = LineBasicMaterial;\n\n\tLineBasicMaterial.prototype.isLineBasicMaterial = true;\n\n\tLineBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Line( geometry, material, mode ) {\n\n\t\tif ( mode === 1 ) {\n\n\t\t\tconsole.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' );\n\t\t\treturn new LineSegments( geometry, material );\n\n\t\t}\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tLine.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Line,\n\n\t\tisLine: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar precision = raycaster.linePrecision;\n\t\t\t\tvar precisionSq = precision * precision;\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar vStart = new Vector3();\n\t\t\t\tvar vEnd = new Vector3();\n\t\t\t\tvar interSegment = new Vector3();\n\t\t\t\tvar interRay = new Vector3();\n\t\t\t\tvar step = (this && this.isLineSegments) ? 2 : 1;\n\n\t\t\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, l = indices.length - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\t\t\t\t\t\t\tvar b = indices[ i + 1 ];\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, a * 3 );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, b * 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\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\tfor ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, 3 * i );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, 3 * i + 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\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 if ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar nbVertices = vertices.length;\n\n\t\t\t\t\tfor ( var i = 0; i < nbVertices - 1; i += step ) {\n\n\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );\n\n\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LineSegments( geometry, material ) {\n\n\t\tLine.call( this, geometry, material );\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tLineSegments.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\t\tconstructor: LineSegments,\n\n\t\tisLineSegments: true\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * size: ,\n\t * sizeAttenuation: \n\t * }\n\t */\n\n\tfunction PointsMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tPointsMaterial.prototype = Object.create( Material.prototype );\n\tPointsMaterial.prototype.constructor = PointsMaterial;\n\n\tPointsMaterial.prototype.isPointsMaterial = true;\n\n\tPointsMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Points( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tPoints.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Points,\n\n\t\tisPoints: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar object = this;\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\t\t\t\tvar threshold = raycaster.params.Points.threshold;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\t\t\tvar localThresholdSq = localThreshold * localThreshold;\n\t\t\t\tvar position = new Vector3();\n\n\t\t\t\tfunction testPoint( point, index ) {\n\n\t\t\t\t\tvar rayPointDistanceSq = ray.distanceSqToPoint( point );\n\n\t\t\t\t\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\t\t\t\t\tvar intersectPoint = ray.closestPointToPoint( point );\n\t\t\t\t\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\t\t\t\t\tpoint: intersectPoint.clone(),\n\t\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tobject: 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\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, il = indices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\n\t\t\t\t\t\t\tposition.fromArray( positions, a * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, a );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tposition.fromArray( positions, i * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, i );\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\tvar vertices = geometry.vertices;\n\n\t\t\t\t\tfor ( var i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\ttestPoint( vertices[ i ], i );\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\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Group() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Group';\n\n\t}\n\n\tGroup.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Group\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.generateMipmaps = false;\n\n\t\tvar scope = this;\n\n\t\tfunction update() {\n\n\t\t\trequestAnimationFrame( update );\n\n\t\t\tif ( video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\t\tscope.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tupdate();\n\n\t}\n\n\tVideoTexture.prototype = Object.create( Texture.prototype );\n\tVideoTexture.prototype.constructor = VideoTexture;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\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\tCompressedTexture.prototype = Object.create( Texture.prototype );\n\tCompressedTexture.prototype.constructor = CompressedTexture;\n\n\tCompressedTexture.prototype.isCompressedTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tCanvasTexture.prototype = Object.create( Texture.prototype );\n\tCanvasTexture.prototype.constructor = CanvasTexture;\n\n\t/**\n\t * @author Matt DesLauriers / @mattdesl\n\t * @author atix / arthursilber.de\n\t */\n\n\tfunction DepthTexture( 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\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.type = type !== undefined ? type : UnsignedShortType;\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\t= false;\n\n\t}\n\n\tDepthTexture.prototype = Object.create( Texture.prototype );\n\tDepthTexture.prototype.constructor = DepthTexture;\n\tDepthTexture.prototype.isDepthTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WireframeGeometry( geometry ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tvar edge = [ 0, 0 ], hash = {};\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\tif ( (geometry && geometry.isGeometry) ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\t\t\tvar faces = geometry.faces;\n\t\t\tvar numEdges = 0;\n\n\t\t\t// allocate maximal size\n\t\t\tvar edges = new Uint32Array( 6 * faces.length );\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\t\tvar key = edge.toString();\n\n\t\t\t\t\tif ( hash[ key ] === undefined ) {\n\n\t\t\t\t\t\tedges[ 2 * numEdges ] = edge[ 0 ];\n\t\t\t\t\t\tedges[ 2 * numEdges + 1 ] = edge[ 1 ];\n\t\t\t\t\t\thash[ key ] = true;\n\t\t\t\t\t\tnumEdges ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar coords = new Float32Array( numEdges * 2 * 3 );\n\n\t\t\tfor ( var i = 0, l = numEdges; i < l; i ++ ) {\n\n\t\t\t\tfor ( var j = 0; j < 2; j ++ ) {\n\n\t\t\t\t\tvar vertex = vertices[ edges [ 2 * i + j ] ];\n\n\t\t\t\t\tvar index = 6 * i + 3 * j;\n\t\t\t\t\tcoords[ index + 0 ] = vertex.x;\n\t\t\t\t\tcoords[ index + 1 ] = vertex.y;\n\t\t\t\t\tcoords[ index + 2 ] = vertex.z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.addAttribute( 'position', new BufferAttribute( coords, 3 ) );\n\n\t\t} else if ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// Indexed BufferGeometry\n\n\t\t\t\tvar indices = geometry.index.array;\n\t\t\t\tvar vertices = geometry.attributes.position;\n\t\t\t\tvar groups = geometry.groups;\n\t\t\t\tvar numEdges = 0;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgeometry.addGroup( 0, indices.length );\n\n\t\t\t\t}\n\n\t\t\t\t// allocate maximal size\n\t\t\t\tvar edges = new Uint32Array( 2 * indices.length );\n\n\t\t\t\tfor ( var o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tvar group = groups[ o ];\n\n\t\t\t\t\tvar start = group.start;\n\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tedge[ 0 ] = indices[ i + j ];\n\t\t\t\t\t\t\tedge[ 1 ] = indices[ i + ( j + 1 ) % 3 ];\n\t\t\t\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\t\t\t\tvar key = edge.toString();\n\n\t\t\t\t\t\t\tif ( hash[ key ] === undefined ) {\n\n\t\t\t\t\t\t\t\tedges[ 2 * numEdges ] = edge[ 0 ];\n\t\t\t\t\t\t\t\tedges[ 2 * numEdges + 1 ] = edge[ 1 ];\n\t\t\t\t\t\t\t\thash[ key ] = true;\n\t\t\t\t\t\t\t\tnumEdges ++;\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\tvar coords = new Float32Array( numEdges * 2 * 3 );\n\n\t\t\t\tfor ( var i = 0, l = numEdges; i < l; i ++ ) {\n\n\t\t\t\t\tfor ( var j = 0; j < 2; j ++ ) {\n\n\t\t\t\t\t\tvar index = 6 * i + 3 * j;\n\t\t\t\t\t\tvar index2 = edges[ 2 * i + j ];\n\n\t\t\t\t\t\tcoords[ index + 0 ] = vertices.getX( index2 );\n\t\t\t\t\t\tcoords[ index + 1 ] = vertices.getY( index2 );\n\t\t\t\t\t\tcoords[ index + 2 ] = vertices.getZ( index2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.addAttribute( 'position', new BufferAttribute( coords, 3 ) );\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tvar vertices = geometry.attributes.position.array;\n\t\t\t\tvar numEdges = vertices.length / 3;\n\t\t\t\tvar numTris = numEdges / 3;\n\n\t\t\t\tvar coords = new Float32Array( numEdges * 2 * 3 );\n\n\t\t\t\tfor ( var i = 0, l = numTris; i < l; i ++ ) {\n\n\t\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\tvar index = 18 * i + 6 * j;\n\n\t\t\t\t\t\tvar index1 = 9 * i + 3 * j;\n\t\t\t\t\t\tcoords[ index + 0 ] = vertices[ index1 ];\n\t\t\t\t\t\tcoords[ index + 1 ] = vertices[ index1 + 1 ];\n\t\t\t\t\t\tcoords[ index + 2 ] = vertices[ index1 + 2 ];\n\n\t\t\t\t\t\tvar index2 = 9 * i + 3 * ( ( j + 1 ) % 3 );\n\t\t\t\t\t\tcoords[ index + 3 ] = vertices[ index2 ];\n\t\t\t\t\t\tcoords[ index + 4 ] = vertices[ index2 + 1 ];\n\t\t\t\t\t\tcoords[ index + 5 ] = vertices[ index2 + 2 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.addAttribute( 'position', new BufferAttribute( coords, 3 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tWireframeGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tWireframeGeometry.prototype.constructor = WireframeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricBufferGeometry( func, slices, stacks ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ParametricBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\t// generate vertices and uvs\n\n\t\tvar vertices = [];\n\t\tvar uvs = [];\n\n\t\tvar i, j, p;\n\t\tvar u, v;\n\n\t\tvar sliceCount = slices + 1;\n\n\t\tfor ( i = 0; i <= stacks; i ++ ) {\n\n\t\t\tv = i / stacks;\n\n\t\t\tfor ( j = 0; j <= slices; j ++ ) {\n\n\t\t\t\tu = j / slices;\n\n\t\t\t\tp = func( u, v );\n\t\t\t\tvertices.push( p.x, p.y, p.z );\n\n\t\t\t\tuvs.push( u, v );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tvar indices = [];\n\t\tvar a, b, c, d;\n\n\t\tfor ( i = 0; i < stacks; i ++ ) {\n\n\t\t\tfor ( j = 0; j < slices; j ++ ) {\n\n\t\t\t\ta = i * sliceCount + j;\n\t\t\t\tb = i * sliceCount + j + 1;\n\t\t\t\tc = ( i + 1 ) * sliceCount + j + 1;\n\t\t\t\td = ( i + 1 ) * sliceCount + j;\n\n\t\t\t\t// faces one and two\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.length > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) );\n\t\tthis.addAttribute( 'position', Float32Attribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'uv', Float32Attribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t}\n\n\tParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;\n\n\t/**\n\t * @author zz85 / https://github.com/zz85\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricGeometry( func, slices, stacks ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ParametricGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tParametricGeometry.prototype = Object.create( Geometry.prototype );\n\tParametricGeometry.prototype.constructor = ParametricGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction PolyhedronBufferGeometry( vertices, indices, radius, detail ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronBufferGeometry';\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\tradius = radius || 1;\n\t\tdetail = detail || 0;\n\n\t\t// default buffer data\n\n\t\tvar vertexBuffer = [];\n\t\tvar 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\tappplyRadius( 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.addAttribute( 'position', Float32Attribute( vertexBuffer, 3 ) );\n\t\tthis.addAttribute( 'normal', Float32Attribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.addAttribute( 'uv', Float32Attribute( uvBuffer, 2 ) );\n\t\tthis.normalizeNormals();\n\n\t\tthis.boundingSphere = new Sphere( new Vector3(), radius );\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\t\tfor ( var 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\tvar cols = Math.pow( 2, detail );\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tvar v = [];\n\n\t\t\tvar i, j;\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( i = 0 ; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tvar aj = a.clone().lerp( c, i / cols );\n\t\t\t\tvar bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tvar rows = cols - i;\n\n\t\t\t\tfor ( 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 ( i = 0; i < cols ; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tvar 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 appplyRadius( radius ) {\n\n\t\t\tvar 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 ( var 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\tvar vertex = new Vector3();\n\n\t\t\tfor ( var 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\tvar u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tvar 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 ( var i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tvar x0 = uvBuffer[ i + 0 ];\n\t\t\t\tvar x1 = uvBuffer[ i + 2 ];\n\t\t\t\tvar x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tvar max = Math.max( x0, x1, x2 );\n\t\t\t\tvar 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\tvar 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\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\tvar centroid = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tfor ( var 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\tvar 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\tPolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TetrahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tTetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tTetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction TetrahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTetrahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tTetrahedronGeometry.prototype.constructor = TetrahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction OctahedronBufferGeometry( radius,detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tOctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tOctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction OctahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tOctahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tOctahedronGeometry.prototype.constructor = OctahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction IcosahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tvar vertices = [\n\t\t\t- 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0,\n\t\t\t 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t,\n\t\t\t t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11,\n\t\t\t 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8,\n\t\t\t 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9,\n\t\t\t 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tIcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tIcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction IcosahedronGeometry( radius, detail ) {\n\n\t \tGeometry.call( this );\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\tthis.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tIcosahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tIcosahedronGeometry.prototype.constructor = IcosahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction DodecahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tvar r = 1 / t;\n\n\t\tvar vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1, - 1, - 1, 1,\n\t\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t\t 1, - 1, - 1, 1, - 1, 1,\n\t\t\t 1, 1, - 1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t 0, - r, - t, 0, - r, t,\n\t\t\t 0, 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\t r, - 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\tvar indices = [\n\t\t\t 3, 11, 7, 3, 7, 15, 3, 15, 13,\n\t\t\t 7, 19, 17, 7, 17, 6, 7, 6, 15,\n\t\t\t17, 4, 8, 17, 8, 10, 17, 10, 6,\n\t\t\t 8, 0, 16, 8, 16, 2, 8, 2, 10,\n\t\t\t 0, 12, 1, 0, 1, 18, 0, 18, 16,\n\t\t\t 6, 10, 2, 6, 2, 13, 6, 13, 15,\n\t\t\t 2, 16, 18, 2, 18, 3, 2, 3, 13,\n\t\t\t18, 1, 9, 18, 9, 11, 18, 11, 3,\n\t\t\t 4, 14, 12, 4, 12, 0, 4, 0, 8,\n\t\t\t11, 9, 5, 11, 5, 19, 11, 19, 7,\n\t\t\t19, 5, 14, 19, 14, 4, 19, 4, 17,\n\t\t\t 1, 12, 14, 1, 14, 5, 1, 5, 9\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tDodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tDodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;\n\n\t/**\n\t * @author Abe Pazos / https://hamoid.com\n\t */\n\n\tfunction DodecahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tDodecahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tDodecahedronGeometry.prototype.constructor = DodecahedronGeometry;\n\n\t/**\n\t * @author clockworkgeek / https://github.com/clockworkgeek\n\t * @author timothypratley / https://github.com/timothypratley\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction PolyhedronGeometry( vertices, indices, radius, detail ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tPolyhedronGeometry.prototype = Object.create( Geometry.prototype );\n\tPolyhedronGeometry.prototype.constructor = PolyhedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Creates a tube which extrudes along a 3d spline.\n\t *\n\t */\n\n\tfunction TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TubeBufferGeometry';\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\ttubularSegments = tubularSegments || 64;\n\t\tradius = radius || 1;\n\t\tradialSegments = radialSegments || 8;\n\t\tclosed = closed || false;\n\n\t\tvar 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\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar i, j;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\t\tvar indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( ( indices.length > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) );\n\t\tthis.addAttribute( 'position', Float32Attribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', Float32Attribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', Float32Attribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( 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\tvar P = path.getPointAt( i / tubularSegments );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tvar N = frames.normals[ i ];\n\t\t\tvar B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tvar sin = Math.sin( v );\n\t\t\t\tvar 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 ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tvar 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 ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( 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\tTubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTubeBufferGeometry.prototype.constructor = TubeBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode / https://github.com/oosmoxiecode\n\t * @author WestLangley / https://github.com/WestLangley\n\t * @author zz85 / https://github.com/zz85\n\t * @author miningold / https://github.com/miningold\n\t * @author jonobr1 / https://github.com/jonobr1\n\t *\n\t * Creates a tube which extrudes along a 3d spline.\n\t */\n\n\tfunction TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) {\n\n\t\tGeometry.call( this );\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\tif ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );\n\n\t\tvar bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = bufferGeometry.tangents;\n\t\tthis.normals = bufferGeometry.normals;\n\t\tthis.binormals = bufferGeometry.binormals;\n\n\t\t// create geometry\n\n\t\tthis.fromBufferGeometry( bufferGeometry );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTubeGeometry.prototype = Object.create( Geometry.prototype );\n\tTubeGeometry.prototype.constructor = TubeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * see: http://www.blackpawn.com/texts/pqtorus/\n\t */\n\tfunction TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotBufferGeometry';\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\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 64;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\tp = p || 2;\n\t\tq = q || 3;\n\n\t\t// used to calculate buffer length\n\t\tvar vertexCount = ( ( radialSegments + 1 ) * ( tubularSegments + 1 ) );\n\t\tvar indexCount = radialSegments * tubularSegments * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// helper variables\n\t\tvar i, j, index = 0, indexOffset = 0;\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar P1 = new Vector3();\n\t\tvar P2 = new Vector3();\n\n\t\tvar B = new Vector3();\n\t\tvar T = new Vector3();\n\t\tvar N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( 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 segement\n\n\t\t\tvar 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 ( 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\tvar v = j / radialSegments * Math.PI * 2;\n\t\t\t\tvar cx = - tube * Math.cos( v );\n\t\t\t\tvar 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 vectos, 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\t// vertex\n\t\t\t\tvertices.setXYZ( index, 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\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\t\t\t\tnormals.setXYZ( index, normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\tuv.y = j / radialSegments;\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// face one\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t\t// face two\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\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\tvar cu = Math.cos( u );\n\t\t\tvar su = Math.sin( u );\n\t\t\tvar quOverP = q / p * u;\n\t\t\tvar 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\tTorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t */\n\n\tfunction TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {\n\n\t\tGeometry.call( this );\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\tif( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );\n\n\t\tthis.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTorusKnotGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusKnotGeometry.prototype.constructor = TorusKnotGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusBufferGeometry';\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\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 6;\n\t\tarc = arc || Math.PI * 2;\n\n\t\t// used to calculate buffer length\n\t\tvar vertexCount = ( ( radialSegments + 1 ) * ( tubularSegments + 1 ) );\n\t\tvar indexCount = radialSegments * tubularSegments * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount );\n\t\tvar vertices = new Float32Array( vertexCount * 3 );\n\t\tvar normals = new Float32Array( vertexCount * 3 );\n\t\tvar uvs = new Float32Array( vertexCount * 2 );\n\n\t\t// offset variables\n\t\tvar vertexBufferOffset = 0;\n\t\tvar uvBufferOffset = 0;\n\t\tvar indexBufferOffset = 0;\n\n\t\t// helper variables\n\t\tvar center = new Vector3();\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tvar u = i / tubularSegments * arc;\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\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[ vertexBufferOffset ] = vertex.x;\n\t\t\t\tvertices[ vertexBufferOffset + 1 ] = vertex.y;\n\t\t\t\tvertices[ vertexBufferOffset + 2 ] = vertex.z;\n\n\t\t\t\t// this vector is used to calculate the normal\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\n\t\t\t\t// normal\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals[ vertexBufferOffset ] = normal.x;\n\t\t\t\tnormals[ vertexBufferOffset + 1 ] = normal.y;\n\t\t\t\tnormals[ vertexBufferOffset + 2 ] = normal.z;\n\n\t\t\t\t// uv\n\t\t\t\tuvs[ uvBufferOffset ] = i / tubularSegments;\n\t\t\t\tuvs[ uvBufferOffset + 1 ] = j / radialSegments;\n\n\t\t\t\t// update offsets\n\t\t\t\tvertexBufferOffset += 3;\n\t\t\t\tuvBufferOffset += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\t\t\t\tvar a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tvar b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tvar c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tvar d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// face one\n\t\t\t\tindices[ indexBufferOffset ] = a;\n\t\t\t\tindices[ indexBufferOffset + 1 ] = b;\n\t\t\t\tindices[ indexBufferOffset + 2 ] = d;\n\n\t\t\t\t// face two\n\t\t\t\tindices[ indexBufferOffset + 3 ] = b;\n\t\t\t\tindices[ indexBufferOffset + 4 ] = c;\n\t\t\t\tindices[ indexBufferOffset + 5 ] = d;\n\n\t\t\t\t// update offset\n\t\t\t\tindexBufferOffset += 6;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\t\tthis.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tTorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusBufferGeometry.prototype.constructor = TorusBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888\n\t */\n\n\tfunction TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );\n\n\t}\n\n\tTorusGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusGeometry.prototype.constructor = TorusGeometry;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tvar ShapeUtils = {\n\n\t\t// calculate area of the contour polygon\n\n\t\tarea: function ( contour ) {\n\n\t\t\tvar n = contour.length;\n\t\t\tvar a = 0.0;\n\n\t\t\tfor ( var p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t\t}\n\n\t\t\treturn a * 0.5;\n\n\t\t},\n\n\t\ttriangulate: ( function () {\n\n\t\t\t/**\n\t\t\t * This code is a quick port of code written in C++ which was submitted to\n\t\t\t * flipcode.com by John W. Ratcliff // July 22, 2000\n\t\t\t * See original code and more information here:\n\t\t\t * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml\n\t\t\t *\n\t\t\t * ported to actionscript by Zevan Rosser\n\t\t\t * www.actionsnippet.com\n\t\t\t *\n\t\t\t * ported to javascript by Joshua Koo\n\t\t\t * http://www.lab4games.net/zz85/blog\n\t\t\t *\n\t\t\t */\n\n\t\t\tfunction snip( contour, u, v, w, n, verts ) {\n\n\t\t\t\tvar p;\n\t\t\t\tvar ax, ay, bx, by;\n\t\t\t\tvar cx, cy, px, py;\n\n\t\t\t\tax = contour[ verts[ u ] ].x;\n\t\t\t\tay = contour[ verts[ u ] ].y;\n\n\t\t\t\tbx = contour[ verts[ v ] ].x;\n\t\t\t\tby = contour[ verts[ v ] ].y;\n\n\t\t\t\tcx = contour[ verts[ w ] ].x;\n\t\t\t\tcy = contour[ verts[ w ] ].y;\n\n\t\t\t\tif ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false;\n\n\t\t\t\tvar aX, aY, bX, bY, cX, cY;\n\t\t\t\tvar apx, apy, bpx, bpy, cpx, cpy;\n\t\t\t\tvar cCROSSap, bCROSScp, aCROSSbp;\n\n\t\t\t\taX = cx - bx; aY = cy - by;\n\t\t\t\tbX = ax - cx; bY = ay - cy;\n\t\t\t\tcX = bx - ax; cY = by - ay;\n\n\t\t\t\tfor ( p = 0; p < n; p ++ ) {\n\n\t\t\t\t\tpx = contour[ verts[ p ] ].x;\n\t\t\t\t\tpy = contour[ verts[ p ] ].y;\n\n\t\t\t\t\tif ( ( ( px === ax ) && ( py === ay ) ) ||\n\t\t\t\t\t\t ( ( px === bx ) && ( py === by ) ) ||\n\t\t\t\t\t\t ( ( px === cx ) && ( py === cy ) ) )\tcontinue;\n\n\t\t\t\t\tapx = px - ax; apy = py - ay;\n\t\t\t\t\tbpx = px - bx; bpy = py - by;\n\t\t\t\t\tcpx = px - cx; cpy = py - cy;\n\n\t\t\t\t\t// see if p is inside triangle abc\n\n\t\t\t\t\taCROSSbp = aX * bpy - aY * bpx;\n\t\t\t\t\tcCROSSap = cX * apy - cY * apx;\n\t\t\t\t\tbCROSScp = bX * cpy - bY * cpx;\n\n\t\t\t\t\tif ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false;\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// takes in an contour array and returns\n\n\t\t\treturn function triangulate( contour, indices ) {\n\n\t\t\t\tvar n = contour.length;\n\n\t\t\t\tif ( n < 3 ) return null;\n\n\t\t\t\tvar result = [],\n\t\t\t\t\tverts = [],\n\t\t\t\t\tvertIndices = [];\n\n\t\t\t\t/* we want a counter-clockwise polygon in verts */\n\n\t\t\t\tvar u, v, w;\n\n\t\t\t\tif ( ShapeUtils.area( contour ) > 0.0 ) {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = v;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v;\n\n\t\t\t\t}\n\n\t\t\t\tvar nv = n;\n\n\t\t\t\t/* remove nv - 2 vertices, creating 1 triangle every time */\n\n\t\t\t\tvar count = 2 * nv; /* error detection */\n\n\t\t\t\tfor ( v = nv - 1; nv > 2; ) {\n\n\t\t\t\t\t/* if we loop, it is probably a non-simple polygon */\n\n\t\t\t\t\tif ( ( count -- ) <= 0 ) {\n\n\t\t\t\t\t\t//** Triangulate: ERROR - probable bad polygon!\n\n\t\t\t\t\t\t//throw ( \"Warning, unable to triangulate polygon!\" );\n\t\t\t\t\t\t//return null;\n\t\t\t\t\t\t// Sometimes warning is fine, especially polygons are triangulated in reverse.\n\t\t\t\t\t\tconsole.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' );\n\n\t\t\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t/* three consecutive vertices in current polygon, */\n\n\t\t\t\t\tu = v; \t \tif ( nv <= u ) u = 0; /* previous */\n\t\t\t\t\tv = u + 1; if ( nv <= v ) v = 0; /* new v */\n\t\t\t\t\tw = v + 1; if ( nv <= w ) w = 0; /* next */\n\n\t\t\t\t\tif ( snip( contour, u, v, w, nv, verts ) ) {\n\n\t\t\t\t\t\tvar a, b, c, s, t;\n\n\t\t\t\t\t\t/* true names of the vertices */\n\n\t\t\t\t\t\ta = verts[ u ];\n\t\t\t\t\t\tb = verts[ v ];\n\t\t\t\t\t\tc = verts[ w ];\n\n\t\t\t\t\t\t/* output Triangle */\n\n\t\t\t\t\t\tresult.push( [ contour[ a ],\n\t\t\t\t\t\t\tcontour[ b ],\n\t\t\t\t\t\t\tcontour[ c ] ] );\n\n\n\t\t\t\t\t\tvertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] );\n\n\t\t\t\t\t\t/* remove v from the remaining polygon */\n\n\t\t\t\t\t\tfor ( s = v, t = v + 1; t < nv; s ++, t ++ ) {\n\n\t\t\t\t\t\t\tverts[ s ] = verts[ t ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnv --;\n\n\t\t\t\t\t\t/* reset error detection counter */\n\n\t\t\t\t\t\tcount = 2 * nv;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\treturn result;\n\n\t\t\t}\n\n\t\t} )(),\n\n\t\ttriangulateShape: function ( contour, holes ) {\n\n\t\t\tfunction removeDupEndPts(points) {\n\n\t\t\t\tvar l = points.length;\n\n\t\t\t\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\t\tpoints.pop();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tremoveDupEndPts( contour );\n\t\t\tholes.forEach( removeDupEndPts );\n\n\t\t\tfunction point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) {\n\n\t\t\t\t// inOtherPt needs to be collinear to the inSegment\n\t\t\t\tif ( inSegPt1.x !== inSegPt2.x ) {\n\n\t\t\t\t\tif ( inSegPt1.x < inSegPt2.x ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( inSegPt1.y < inSegPt2.y ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) {\n\n\t\t\t\tvar seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y;\n\t\t\t\tvar seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y;\n\n\t\t\t\tvar seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x;\n\t\t\t\tvar seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y;\n\n\t\t\t\tvar limit\t\t= seg1dy * seg2dx - seg1dx * seg2dy;\n\t\t\t\tvar perpSeg1\t= seg1dy * seg1seg2dx - seg1dx * seg1seg2dy;\n\n\t\t\t\tif ( Math.abs( limit ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\n\t\t\t\t\tvar perpSeg2;\n\t\t\t\t\tif ( limit > 0 ) {\n\n\t\t\t\t\t\tif ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) \t\treturn [];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) \t\treturn [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// i.e. to reduce rounding errors\n\t\t\t\t\t// intersection at endpoint of segment#1?\n\t\t\t\t\tif ( perpSeg2 === 0 ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( perpSeg2 === limit ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt2 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// intersection at endpoint of segment#2?\n\t\t\t\t\tif ( perpSeg1 === 0 )\t\treturn [ inSeg2Pt1 ];\n\t\t\t\t\tif ( perpSeg1 === limit )\treturn [ inSeg2Pt2 ];\n\n\t\t\t\t\t// return real intersection point\n\t\t\t\t\tvar factorSeg1 = perpSeg2 / limit;\n\t\t\t\t\treturn\t[ { x: inSeg1Pt1.x + factorSeg1 * seg1dx,\n\t\t\t\t\t\t\t\ty: inSeg1Pt1.y + factorSeg1 * seg1dy } ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( ( perpSeg1 !== 0 ) ||\n\t\t\t\t\t\t ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) \t\t\treturn [];\n\n\t\t\t\t\t// they are collinear or degenerate\n\t\t\t\t\tvar seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) );\t// segment1 is just a point?\n\t\t\t\t\tvar seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) );\t// segment2 is just a point?\n\t\t\t\t\t// both segments are points\n\t\t\t\t\tif ( seg1Pt && seg2Pt ) {\n\n\t\t\t\t\t\tif ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) ||\n\t\t\t\t\t\t\t ( inSeg1Pt1.y !== inSeg2Pt1.y ) )\t\treturn [];\t// they are distinct points\n\t\t\t\t\t\treturn [ inSeg1Pt1 ]; \t\t\t\t\t\t// they are the same point\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#1 is a single point\n\t\t\t\t\tif ( seg1Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) )\t\treturn [];\t\t// but not in segment#2\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#2 is a single point\n\t\t\t\t\tif ( seg2Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) )\t\treturn [];\t\t// but not in segment#1\n\t\t\t\t\t\treturn [ inSeg2Pt1 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// they are collinear segments, which might overlap\n\t\t\t\t\tvar seg1min, seg1max, seg1minVal, seg1maxVal;\n\t\t\t\t\tvar seg2min, seg2max, seg2minVal, seg2maxVal;\n\t\t\t\t\tif ( seg1dx !== 0 ) {\n\n\t\t\t\t\t\t// the segments are NOT on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.x < inSeg1Pt2.x ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.x < inSeg2Pt2.x ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// the segments are on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.y < inSeg1Pt2.y ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.y < inSeg2Pt2.y ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( seg1minVal <= seg2minVal ) {\n\n\t\t\t\t\t\tif ( seg1maxVal < seg2minVal )\treturn [];\n\t\t\t\t\t\tif ( seg1maxVal === seg2minVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg2min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg2min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg2min, seg2max ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( seg1minVal > seg2maxVal )\treturn [];\n\t\t\t\t\t\tif ( seg1minVal === seg2maxVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg1min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg1min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg1min, seg2max ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) {\n\n\t\t\t\t// The order of legs is important\n\n\t\t\t\t// translation of all points, so that Vertex is at (0,0)\n\t\t\t\tvar legFromPtX\t= inLegFromPt.x - inVertex.x, legFromPtY\t= inLegFromPt.y - inVertex.y;\n\t\t\t\tvar legToPtX\t= inLegToPt.x\t- inVertex.x, legToPtY\t\t= inLegToPt.y\t- inVertex.y;\n\t\t\t\tvar otherPtX\t= inOtherPt.x\t- inVertex.x, otherPtY\t\t= inOtherPt.y\t- inVertex.y;\n\n\t\t\t\t// main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg.\n\t\t\t\tvar from2toAngle\t= legFromPtX * legToPtY - legFromPtY * legToPtX;\n\t\t\t\tvar from2otherAngle\t= legFromPtX * otherPtY - legFromPtY * otherPtX;\n\n\t\t\t\tif ( Math.abs( from2toAngle ) > Number.EPSILON ) {\n\n\t\t\t\t\t// angle != 180 deg.\n\n\t\t\t\t\tvar other2toAngle\t\t= otherPtX * legToPtY - otherPtY * legToPtX;\n\t\t\t\t\t// console.log( \"from2to: \" + from2toAngle + \", from2other: \" + from2otherAngle + \", other2to: \" + other2toAngle );\n\n\t\t\t\t\tif ( from2toAngle > 0 ) {\n\n\t\t\t\t\t\t// main angle < 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// main angle > 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// angle == 180 deg.\n\t\t\t\t\t// console.log( \"from2to: 180 deg., from2other: \" + from2otherAngle );\n\t\t\t\t\treturn\t( from2otherAngle > 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tfunction removeHoles( contour, holes ) {\n\n\t\t\t\tvar shape = contour.concat(); // work on this shape\n\t\t\t\tvar hole;\n\n\t\t\t\tfunction isCutLineInsideAngles( inShapeIdx, inHoleIdx ) {\n\n\t\t\t\t\t// Check if hole point lies within angle around shape point\n\t\t\t\t\tvar lastShapeIdx = shape.length - 1;\n\n\t\t\t\t\tvar prevShapeIdx = inShapeIdx - 1;\n\t\t\t\t\tif ( prevShapeIdx < 0 )\t\t\tprevShapeIdx = lastShapeIdx;\n\n\t\t\t\t\tvar nextShapeIdx = inShapeIdx + 1;\n\t\t\t\t\tif ( nextShapeIdx > lastShapeIdx )\tnextShapeIdx = 0;\n\n\t\t\t\t\tvar insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Shape): \" + inShapeIdx + \", Point: \" + hole[inHoleIdx].x + \"/\" + hole[inHoleIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check if shape point lies within angle around hole point\n\t\t\t\t\tvar lastHoleIdx = hole.length - 1;\n\n\t\t\t\t\tvar prevHoleIdx = inHoleIdx - 1;\n\t\t\t\t\tif ( prevHoleIdx < 0 )\t\t\tprevHoleIdx = lastHoleIdx;\n\n\t\t\t\t\tvar nextHoleIdx = inHoleIdx + 1;\n\t\t\t\t\tif ( nextHoleIdx > lastHoleIdx )\tnextHoleIdx = 0;\n\n\t\t\t\t\tinsideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Hole): \" + inHoleIdx + \", Point: \" + shape[inShapeIdx].x + \"/\" + shape[inShapeIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\ttrue;\n\n\t\t\t\t}\n\n\t\t\t\tfunction intersectsShapeEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with shape edges\n\t\t\t\t\tvar sIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( sIdx = 0; sIdx < shape.length; sIdx ++ ) {\n\n\t\t\t\t\t\tnextIdx = sIdx + 1; nextIdx %= shape.length;\n\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true );\n\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar indepHoles = [];\n\n\t\t\t\tfunction intersectsHoleEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with hole edges\n\t\t\t\t\tvar ihIdx, chkHole,\n\t\t\t\t\t\thIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) {\n\n\t\t\t\t\t\tchkHole = holes[ indepHoles[ ihIdx ]];\n\t\t\t\t\t\tfor ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) {\n\n\t\t\t\t\t\t\tnextIdx = hIdx + 1; nextIdx %= chkHole.length;\n\t\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true );\n\t\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar holeIndex, shapeIndex,\n\t\t\t\t\tshapePt, holePt,\n\t\t\t\t\tholeIdx, cutKey, failedCuts = [],\n\t\t\t\t\ttmpShape1, tmpShape2,\n\t\t\t\t\ttmpHole1, tmpHole2;\n\n\t\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tindepHoles.push( h );\n\n\t\t\t\t}\n\n\t\t\t\tvar minShapeIndex = 0;\n\t\t\t\tvar counter = indepHoles.length * 2;\n\t\t\t\twhile ( indepHoles.length > 0 ) {\n\n\t\t\t\t\tcounter --;\n\t\t\t\t\tif ( counter < 0 ) {\n\n\t\t\t\t\t\tconsole.log( \"Infinite Loop! Holes left:\" + indepHoles.length + \", Probably Hole outside Shape!\" );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// search for shape-vertex and hole-vertex,\n\t\t\t\t\t// which can be connected without intersections\n\t\t\t\t\tfor ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) {\n\n\t\t\t\t\t\tshapePt = shape[ shapeIndex ];\n\t\t\t\t\t\tholeIndex\t= - 1;\n\n\t\t\t\t\t\t// search for hole which can be reached without intersections\n\t\t\t\t\t\tfor ( var h = 0; h < indepHoles.length; h ++ ) {\n\n\t\t\t\t\t\t\tholeIdx = indepHoles[ h ];\n\n\t\t\t\t\t\t\t// prevent multiple checks\n\t\t\t\t\t\t\tcutKey = shapePt.x + \":\" + shapePt.y + \":\" + holeIdx;\n\t\t\t\t\t\t\tif ( failedCuts[ cutKey ] !== undefined )\t\t\tcontinue;\n\n\t\t\t\t\t\t\thole = holes[ holeIdx ];\n\t\t\t\t\t\t\tfor ( var h2 = 0; h2 < hole.length; h2 ++ ) {\n\n\t\t\t\t\t\t\t\tholePt = hole[ h2 ];\n\t\t\t\t\t\t\t\tif ( ! isCutLineInsideAngles( shapeIndex, h2 ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsShapeEdge( shapePt, holePt ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsHoleEdge( shapePt, holePt ) )\t\tcontinue;\n\n\t\t\t\t\t\t\t\tholeIndex = h2;\n\t\t\t\t\t\t\t\tindepHoles.splice( h, 1 );\n\n\t\t\t\t\t\t\t\ttmpShape1 = shape.slice( 0, shapeIndex + 1 );\n\t\t\t\t\t\t\t\ttmpShape2 = shape.slice( shapeIndex );\n\t\t\t\t\t\t\t\ttmpHole1 = hole.slice( holeIndex );\n\t\t\t\t\t\t\t\ttmpHole2 = hole.slice( 0, holeIndex + 1 );\n\n\t\t\t\t\t\t\t\tshape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 );\n\n\t\t\t\t\t\t\t\tminShapeIndex = shapeIndex;\n\n\t\t\t\t\t\t\t\t// Debug only, to show the selected cuts\n\t\t\t\t\t\t\t\t// glob_CutLines.push( [ shapePt, holePt ] );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t\t\tfailedCuts[ cutKey ] = true;\t\t\t// remember failure\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn shape; \t\t\t/* shape with no holes */\n\n\t\t\t}\n\n\n\t\t\tvar i, il, f, face,\n\t\t\t\tkey, index,\n\t\t\t\tallPointsMap = {};\n\n\t\t\t// To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first.\n\n\t\t\tvar allpoints = contour.concat();\n\n\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( allpoints, holes[ h ] );\n\n\t\t\t}\n\n\t\t\t//console.log( \"allpoints\",allpoints, allpoints.length );\n\n\t\t\t// prepare all points map\n\n\t\t\tfor ( i = 0, il = allpoints.length; i < il; i ++ ) {\n\n\t\t\t\tkey = allpoints[ i ].x + \":\" + allpoints[ i ].y;\n\n\t\t\t\tif ( allPointsMap[ key ] !== undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.ShapeUtils: Duplicate point\", key, i );\n\n\t\t\t\t}\n\n\t\t\t\tallPointsMap[ key ] = i;\n\n\t\t\t}\n\n\t\t\t// remove holes by cutting paths to holes and adding them to the shape\n\t\t\tvar shapeWithoutHoles = removeHoles( contour, holes );\n\n\t\t\tvar triangles = ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape\n\t\t\t//console.log( \"triangles\",triangles, triangles.length );\n\n\t\t\t// check all face vertices against all points map\n\n\t\t\tfor ( i = 0, il = triangles.length; i < il; i ++ ) {\n\n\t\t\t\tface = triangles[ i ];\n\n\t\t\t\tfor ( f = 0; f < 3; f ++ ) {\n\n\t\t\t\t\tkey = face[ f ].x + \":\" + face[ f ].y;\n\n\t\t\t\t\tindex = allPointsMap[ key ];\n\n\t\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\t\tface[ f ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn triangles.concat();\n\n\t\t},\n\n\t\tisClockWise: function ( pts ) {\n\n\t\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t\t},\n\n\t\t// Bezier Curves formulas obtained from\n\t\t// http://en.wikipedia.org/wiki/B%C3%A9zier_curve\n\n\t\t// Quad Bezier Functions\n\n\t\tb2: ( function () {\n\n\t\t\tfunction b2p0( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn k * k * p;\n\n\t\t\t}\n\n\t\t\tfunction b2p1( t, p ) {\n\n\t\t\t\treturn 2 * ( 1 - t ) * t * p;\n\n\t\t\t}\n\n\t\t\tfunction b2p2( t, p ) {\n\n\t\t\t\treturn t * t * p;\n\n\t\t\t}\n\n\t\t\treturn function b2( t, p0, p1, p2 ) {\n\n\t\t\t\treturn b2p0( t, p0 ) + b2p1( t, p1 ) + b2p2( t, p2 );\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\t// Cubic Bezier Functions\n\n\t\tb3: ( function () {\n\n\t\t\tfunction b3p0( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn k * k * k * p;\n\n\t\t\t}\n\n\t\t\tfunction b3p1( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn 3 * k * k * t * p;\n\n\t\t\t}\n\n\t\t\tfunction b3p2( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn 3 * k * t * t * p;\n\n\t\t\t}\n\n\t\t\tfunction b3p3( t, p ) {\n\n\t\t\t\treturn t * t * t * p;\n\n\t\t\t}\n\n\t\t\treturn function b3( t, p0, p1, p2, p3 ) {\n\n\t\t\t\treturn b3p0( t, p0 ) + b3p1( t, p1 ) + b3p2( t, p2 ) + b3p3( t, p3 );\n\n\t\t\t};\n\n\t\t} )()\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Creates extruded geometry from a path shape.\n\t *\n\t * parameters = {\n\t *\n\t * curveSegments: , // number of points on the curves\n\t * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n\t * amount: , // Depth to extrude the shape\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into the original shape bevel goes\n\t * bevelSize: , // how far from shape outline is bevel\n\t * bevelSegments: , // number of bevel layers\n\t *\n\t * extrudePath: // 3d spline path to extrude shape along. (creates Frames if .frames aren't defined)\n\t * frames: // containing arrays of tangents, normals, binormals\n\t *\n\t * uvGenerator: // object that provides UV generator functions\n\t *\n\t * }\n\t **/\n\n\tfunction ExtrudeGeometry( shapes, options ) {\n\n\t\tif ( typeof( shapes ) === \"undefined\" ) {\n\n\t\t\tshapes = [];\n\t\t\treturn;\n\n\t\t}\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tthis.addShapeList( shapes, options );\n\n\t\tthis.computeFaceNormals();\n\n\t\t// can't really use automatic vertex normals\n\t\t// as then front and back sides get smoothed too\n\t\t// should do separate smoothing just for sides\n\n\t\t//this.computeVertexNormals();\n\n\t\t//console.log( \"took\", ( Date.now() - startTime ) );\n\n\t}\n\n\tExtrudeGeometry.prototype = Object.create( Geometry.prototype );\n\tExtrudeGeometry.prototype.constructor = ExtrudeGeometry;\n\n\tExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) {\n\n\t\tvar sl = shapes.length;\n\n\t\tfor ( var s = 0; s < sl; s ++ ) {\n\n\t\t\tvar shape = shapes[ s ];\n\t\t\tthis.addShape( shape, options );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.prototype.addShape = function ( shape, options ) {\n\n\t\tvar amount = options.amount !== undefined ? options.amount : 100;\n\n\t\tvar bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10\n\t\tvar bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8\n\t\tvar bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\tvar bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false\n\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\n\t\tvar steps = options.steps !== undefined ? options.steps : 1;\n\n\t\tvar extrudePath = options.extrudePath;\n\t\tvar extrudePts, extrudeByPath = false;\n\n\t\t// Use default WorldUVGenerator if no UV generators are specified.\n\t\tvar uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator;\n\n\t\tvar splineTube, binormal, normal, position2;\n\t\tif ( extrudePath ) {\n\n\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\textrudeByPath = true;\n\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t// SETUP TNB variables\n\n\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\tsplineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\tbinormal = new Vector3();\n\t\t\tnormal = new Vector3();\n\t\t\tposition2 = new Vector3();\n\n\t\t}\n\n\t\t// Safeguards if bevels are not enabled\n\n\t\tif ( ! bevelEnabled ) {\n\n\t\t\tbevelSegments = 0;\n\t\t\tbevelThickness = 0;\n\t\t\tbevelSize = 0;\n\n\t\t}\n\n\t\t// Variables initialization\n\n\t\tvar ahole, h, hl; // looping of holes\n\t\tvar scope = this;\n\n\t\tvar shapesOffset = this.vertices.length;\n\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)!\n\n\t\t}\n\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t/* Vertices */\n\n\t\tvar contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\tvertices = vertices.concat( ahole );\n\n\t\t}\n\n\n\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\tif ( ! vec ) console.error( \"THREE.ExtrudeGeometry: vec does not exist\" );\n\n\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t}\n\n\t\tvar b, bs, t, z,\n\t\t\tvert, vlen = vertices.length,\n\t\t\tface, flen = faces.length;\n\n\n\t\t// Find directions for point movement\n\n\n\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t//\n\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\tvar v_trans_x, v_trans_y, shrink_by = 1;\t\t// resulting translation vector for inPt\n\n\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\tvar v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y;\n\t\t\tvar v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y;\n\n\t\t\tvar v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t// check for collinear edges\n\t\t\tvar collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t// not collinear\n\n\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\tvar v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\tvar v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\tvar ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\tvar ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\tvar ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\tvar ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\tvar sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\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// vector from inPt to intersection point\n\n\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t// but prevent crazy spikes\n\t\t\t\tvar v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\treturn\tnew Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\tvar direction_eq = false;\t\t// assumes: opposite\n\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tnew Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t}\n\n\n\t\tvar contourMovements = [];\n\n\t\tfor ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\tif ( j === il ) j = 0;\n\t\t\tif ( k === il ) k = 0;\n\n\t\t\t// (j)---(i)---(k)\n\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t}\n\n\t\tvar holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\toneHoleMovements = [];\n\n\t\t\tfor ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t}\n\n\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t}\n\n\n\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\tfor ( b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tbs = bevelSize;\n\n\t\t// Back facing vertices\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t} else {\n\n\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add stepped vertices...\n\t\t// Including front facing vertices\n\n\t\tvar s;\n\n\t\tfor ( s = 1; s <= steps; s ++ ) {\n\n\t\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, amount / steps * s );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// Add bevel segments planes\n\n\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\tfor ( b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos ( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/* Faces */\n\n\t\t// Top and bottom faces\n\n\t\tbuildLidFaces();\n\n\t\t// Sides faces\n\n\t\tbuildSideFaces();\n\n\n\t\t///// Internal functions\n\n\t\tfunction buildLidFaces() {\n\n\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\tvar layer = 0; // steps + 1\n\t\t\t\tvar offset = vlen * layer;\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Create faces for the z-sides of the shape\n\n\t\tfunction buildSideFaces() {\n\n\t\t\tvar layeroffset = 0;\n\t\t\tsidewalls( contour, layeroffset );\n\t\t\tlayeroffset += contour.length;\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t//, true\n\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\tvar j, k;\n\t\t\ti = contour.length;\n\n\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\tj = i;\n\t\t\t\tk = i - 1;\n\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\tvar s = 0, sl = steps + bevelSegments * 2;\n\n\t\t\t\tfor ( s = 0; s < sl; s ++ ) {\n\n\t\t\t\t\tvar slen1 = vlen * s;\n\t\t\t\t\tvar slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\tvar a = layeroffset + j + slen1,\n\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\tf4( a, b, c, d, contour, s, sl, j, k );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tfunction v( x, y, z ) {\n\n\t\t\tscope.vertices.push( new Vector3( x, y, z ) );\n\n\t\t}\n\n\t\tfunction f3( a, b, c ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, c, null, null, 0 ) );\n\n\t\t\tvar uvs = uvgen.generateTopUV( scope, a, b, c );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( uvs );\n\n\t\t}\n\n\t\tfunction f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\t\t\td += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, d, null, null, 1 ) );\n\t\t\tscope.faces.push( new Face3( b, c, d, null, null, 1 ) );\n\n\t\t\tvar uvs = uvgen.generateSideWallUV( scope, a, b, c, d );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ] );\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ] );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.WorldUVGenerator = {\n\n\t\tgenerateTopUV: function ( geometry, indexA, indexB, indexC ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a.x, a.y ),\n\t\t\t\tnew Vector2( b.x, b.y ),\n\t\t\t\tnew Vector2( c.x, c.y )\n\t\t\t];\n\n\t\t},\n\n\t\tgenerateSideWallUV: function ( geometry, indexA, indexB, indexC, indexD ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\t\t\tvar d = vertices[ indexD ];\n\n\t\t\tif ( Math.abs( a.y - b.y ) < 0.01 ) {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.x, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.x, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.x, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.x, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t} else {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.y, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.y, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.y, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.y, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t}\n\n\t\t}\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * Text = 3D Text\n\t *\n\t * parameters = {\n\t * font: , // font\n\t *\n\t * size: , // size of the text\n\t * height: , // thickness to extrude text\n\t * curveSegments: , // number of points on the curves\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into text bevel goes\n\t * bevelSize: // how far from text outline is bevel\n\t * }\n\t */\n\n\tfunction TextGeometry( text, parameters ) {\n\n\t\tparameters = parameters || {};\n\n\t\tvar font = parameters.font;\n\n\t\tif ( (font && font.isFont) === false ) {\n\n\t\t\tconsole.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );\n\t\t\treturn new Geometry();\n\n\t\t}\n\n\t\tvar shapes = font.generateShapes( text, parameters.size, parameters.curveSegments );\n\n\t\t// translate parameters to ExtrudeGeometry API\n\n\t\tparameters.amount = parameters.height !== undefined ? parameters.height : 50;\n\n\t\t// defaults\n\n\t\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\n\t\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\n\t\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\n\n\t\tExtrudeGeometry.call( this, shapes, parameters );\n\n\t\tthis.type = 'TextGeometry';\n\n\t}\n\n\tTextGeometry.prototype = Object.create( ExtrudeGeometry.prototype );\n\tTextGeometry.prototype.constructor = TextGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * based on THREE.SphereGeometry\n\t */\n\n\tfunction SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'SphereBufferGeometry';\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\tradius = radius || 50;\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );\n\n\t\tphiStart = phiStart !== undefined ? phiStart : 0;\n\t\tphiLength = phiLength !== undefined ? phiLength : Math.PI * 2;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI;\n\n\t\tvar thetaEnd = thetaStart + thetaLength;\n\n\t\tvar vertexCount = ( ( widthSegments + 1 ) * ( heightSegments + 1 ) );\n\n\t\tvar positions = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\tvar index = 0, vertices = [], normal = new Vector3();\n\n\t\tfor ( var y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\tvar verticesRow = [];\n\n\t\t\tvar v = y / heightSegments;\n\n\t\t\tfor ( var x = 0; x <= widthSegments; x ++ ) {\n\n\t\t\t\tvar u = x / widthSegments;\n\n\t\t\t\tvar px = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvar py = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvar pz = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tnormal.set( px, py, pz ).normalize();\n\n\t\t\t\tpositions.setXYZ( index, px, py, pz );\n\t\t\t\tnormals.setXYZ( index, normal.x, normal.y, normal.z );\n\t\t\t\tuvs.setXY( index, u, 1 - v );\n\n\t\t\t\tverticesRow.push( index );\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\tvertices.push( verticesRow );\n\n\t\t}\n\n\t\tvar indices = [];\n\n\t\tfor ( var y = 0; y < heightSegments; y ++ ) {\n\n\t\t\tfor ( var x = 0; x < widthSegments; x ++ ) {\n\n\t\t\t\tvar v1 = vertices[ y ][ x + 1 ];\n\t\t\t\tvar v2 = vertices[ y ][ x ];\n\t\t\t\tvar v3 = vertices[ y + 1 ][ x ];\n\t\t\t\tvar v4 = vertices[ y + 1 ][ x + 1 ];\n\n\t\t\t\tif ( y !== 0 || thetaStart > 0 ) indices.push( v1, v2, v4 );\n\t\t\t\tif ( y !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( v2, v3, v4 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( new ( positions.count > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) );\n\t\tthis.addAttribute( 'position', positions );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t\tthis.boundingSphere = new Sphere( new Vector3(), radius );\n\n\t}\n\n\tSphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tSphereBufferGeometry.prototype.constructor = SphereBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );\n\n\t}\n\n\tSphereGeometry.prototype = Object.create( Geometry.prototype );\n\tSphereGeometry.prototype.constructor = SphereGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'RingBufferGeometry';\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\tinnerRadius = innerRadius || 20;\n\t\touterRadius = outerRadius || 50;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\tthetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;\n\t\tphiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;\n\n\t\t// these are used to calculate buffer length\n\t\tvar vertexCount = ( thetaSegments + 1 ) * ( phiSegments + 1 );\n\t\tvar indexCount = thetaSegments * phiSegments * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// some helper variables\n\t\tvar index = 0, indexOffset = 0, segment;\n\t\tvar radius = innerRadius;\n\t\tvar radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\t// values are generate from the inside of the ring to the outside\n\n\t\tfor ( j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\tsegment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\t\t\t\tvertices.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\t\t\t\tnormals.setXYZ( index, 0, 0, 1 );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex++;\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tvar thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tsegment = i + thetaSegmentLevel;\n\n\t\t\t\t// indices\n\t\t\t\tvar a = segment;\n\t\t\t\tvar b = segment + thetaSegments + 1;\n\t\t\t\tvar c = segment + thetaSegments + 2;\n\t\t\t\tvar d = segment + 1;\n\n\t\t\t\t// face one\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\n\t\t\t\t// face two\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t}\n\n\tRingBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tRingBufferGeometry.prototype.constructor = RingBufferGeometry;\n\n\t/**\n\t * @author Kaleb Murphy\n\t */\n\n\tfunction RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );\n\n\t}\n\n\tRingGeometry.prototype = Object.create( Geometry.prototype );\n\tRingGeometry.prototype.constructor = RingGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );\n\n\t}\n\n\tPlaneGeometry.prototype = Object.create( Geometry.prototype );\n\tPlaneGeometry.prototype.constructor = PlaneGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\t // points - to create a closed torus, one must use a set of points\n\t // like so: [ a, b, c, d, a ], see first is the same as last.\n\t // segments - the number of circumference segments to create\n\t // phiStart - the starting radian\n\t // phiLength - the radian (0 to 2PI) range of the lathed section\n\t // 2PI is a closed lathe, less than 2PI is a portion.\n\n\tfunction LatheBufferGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'LatheBufferGeometry';\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 ) || 12;\n\t\tphiStart = phiStart || 0;\n\t\tphiLength = phiLength || Math.PI * 2;\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\t\tphiLength = _Math.clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// these are used to calculate buffer length\n\t\tvar vertexCount = ( segments + 1 ) * points.length;\n\t\tvar indexCount = segments * points.length * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// helper variables\n\t\tvar index = 0, indexOffset = 0, base;\n\t\tvar inverseSegments = 1.0 / segments;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar i, j;\n\n\t\t// generate vertices and uvs\n\n\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\tvar phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tvar sin = Math.sin( phi );\n\t\t\tvar cos = Math.cos( phi );\n\n\t\t\tfor ( j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\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\t\t\t\tvertices.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tbase = j + i * points.length;\n\n\t\t\t\t// indices\n\t\t\t\tvar a = base;\n\t\t\t\tvar b = base + points.length;\n\t\t\t\tvar c = base + points.length + 1;\n\t\t\t\tvar d = base + 1;\n\n\t\t\t\t// face one\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t\t// face two\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t\t// if the geometry is closed, we need to average the normals along the seam.\n\t\t// because the corresponding vertices are identical (but still have different UVs).\n\n\t\tif( phiLength === Math.PI * 2 ) {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\t\t\tvar n1 = new Vector3();\n\t\t\tvar n2 = new Vector3();\n\t\t\tvar n = new Vector3();\n\n\t\t\t// this is the buffer offset for the last line of vertices\n\t\t\tbase = segments * points.length * 3;\n\n\t\t\tfor( i = 0, j = 0; i < points.length; i ++, j += 3 ) {\n\n\t\t\t\t// select the normal of the vertex in the first line\n\t\t\t\tn1.x = normals[ j + 0 ];\n\t\t\t\tn1.y = normals[ j + 1 ];\n\t\t\t\tn1.z = normals[ j + 2 ];\n\n\t\t\t\t// select the normal of the vertex in the last line\n\t\t\t\tn2.x = normals[ base + j + 0 ];\n\t\t\t\tn2.y = normals[ base + j + 1 ];\n\t\t\t\tn2.z = normals[ base + j + 2 ];\n\n\t\t\t\t// average normals\n\t\t\t\tn.addVectors( n1, n2 ).normalize();\n\n\t\t\t\t// assign the new values to both normals\n\t\t\t\tnormals[ j + 0 ] = normals[ base + j + 0 ] = n.x;\n\t\t\t\tnormals[ j + 1 ] = normals[ base + j + 1 ] = n.y;\n\t\t\t\tnormals[ j + 2 ] = normals[ base + j + 2 ] = n.z;\n\n\t\t\t} // next row\n\n\t\t}\n\n\t}\n\n\tLatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tLatheBufferGeometry.prototype.constructor = LatheBufferGeometry;\n\n\t/**\n\t * @author astrodud / http://astrodud.isgreat.org/\n\t * @author zz85 / https://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t */\n\n\t// points - to create a closed torus, one must use a set of points\n\t// like so: [ a, b, c, d, a ], see first is the same as last.\n\t// segments - the number of circumference segments to create\n\t// phiStart - the starting radian\n\t// phiLength - the radian (0 to 2PI) range of the lathed section\n\t// 2PI is a closed lathe, less than 2PI is a portion.\n\n\tfunction LatheGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tLatheGeometry.prototype = Object.create( Geometry.prototype );\n\tLatheGeometry.prototype.constructor = LatheGeometry;\n\n\t/**\n\t * @author jonobr1 / http://jonobr1.com\n\t *\n\t * Creates a one-sided polygonal geometry from a path shape. Similar to\n\t * ExtrudeGeometry.\n\t *\n\t * parameters = {\n\t *\n\t *\tcurveSegments: , // number of points on the curves. NOT USED AT THE MOMENT.\n\t *\n\t *\tmaterial: // material index for front and back faces\n\t *\tuvGenerator: // object that provides UV generator functions\n\t *\n\t * }\n\t **/\n\n\tfunction ShapeGeometry( shapes, options ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tif ( Array.isArray( shapes ) === false ) shapes = [ shapes ];\n\n\t\tthis.addShapeList( shapes, options );\n\n\t\tthis.computeFaceNormals();\n\n\t}\n\n\tShapeGeometry.prototype = Object.create( Geometry.prototype );\n\tShapeGeometry.prototype.constructor = ShapeGeometry;\n\n\t/**\n\t * Add an array of shapes to THREE.ShapeGeometry.\n\t */\n\tShapeGeometry.prototype.addShapeList = function ( shapes, options ) {\n\n\t\tfor ( var i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tthis.addShape( shapes[ i ], options );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * Adds a shape to THREE.ShapeGeometry, based on THREE.ExtrudeGeometry.\n\t */\n\tShapeGeometry.prototype.addShape = function ( shape, options ) {\n\n\t\tif ( options === undefined ) options = {};\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\n\t\tvar material = options.material;\n\t\tvar uvgen = options.UVGenerator === undefined ? ExtrudeGeometry.WorldUVGenerator : options.UVGenerator;\n\n\t\t//\n\n\t\tvar i, l, hole;\n\n\t\tvar shapesOffset = this.vertices.length;\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe...\n\n\t\t\tfor ( i = 0, l = holes.length; i < l; i ++ ) {\n\n\t\t\t\thole = holes[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( hole ) ) {\n\n\t\t\t\t\tholes[ i ] = hole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treverse = false;\n\n\t\t}\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t// Vertices\n\n\t\tfor ( i = 0, l = holes.length; i < l; i ++ ) {\n\n\t\t\thole = holes[ i ];\n\t\t\tvertices = vertices.concat( hole );\n\n\t\t}\n\n\t\t//\n\n\t\tvar vert, vlen = vertices.length;\n\t\tvar face, flen = faces.length;\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = vertices[ i ];\n\n\t\t\tthis.vertices.push( new Vector3( vert.x, vert.y, 0 ) );\n\n\t\t}\n\n\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\tface = faces[ i ];\n\n\t\t\tvar a = face[ 0 ] + shapesOffset;\n\t\t\tvar b = face[ 1 ] + shapesOffset;\n\t\t\tvar c = face[ 2 ] + shapesOffset;\n\n\t\t\tthis.faces.push( new Face3( a, b, c, null, null, material ) );\n\t\t\tthis.faceVertexUvs[ 0 ].push( uvgen.generateTopUV( this, a, b, c ) );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction EdgesGeometry( geometry, thresholdAngle ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;\n\n\t\tvar thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle );\n\n\t\tvar edge = [ 0, 0 ], hash = {};\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\tvar geometry2;\n\n\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\tgeometry2 = new Geometry();\n\t\t\tgeometry2.fromBufferGeometry( geometry );\n\n\t\t} else {\n\n\t\t\tgeometry2 = geometry.clone();\n\n\t\t}\n\n\t\tgeometry2.mergeVertices();\n\t\tgeometry2.computeFaceNormals();\n\n\t\tvar vertices = geometry2.vertices;\n\t\tvar faces = geometry2.faces;\n\n\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\tvar key = edge.toString();\n\n\t\t\t\tif ( hash[ key ] === undefined ) {\n\n\t\t\t\t\thash[ key ] = { vert1: edge[ 0 ], vert2: edge[ 1 ], face1: i, face2: undefined };\n\n\t\t\t\t} else {\n\n\t\t\t\t\thash[ key ].face2 = i;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar coords = [];\n\n\t\tfor ( var key in hash ) {\n\n\t\t\tvar h = hash[ key ];\n\n\t\t\tif ( h.face2 === undefined || faces[ h.face1 ].normal.dot( faces[ h.face2 ].normal ) <= thresholdDot ) {\n\n\t\t\t\tvar vertex = vertices[ h.vert1 ];\n\t\t\t\tcoords.push( vertex.x );\n\t\t\t\tcoords.push( vertex.y );\n\t\t\t\tcoords.push( vertex.z );\n\n\t\t\t\tvertex = vertices[ h.vert2 ];\n\t\t\t\tcoords.push( vertex.x );\n\t\t\t\tcoords.push( vertex.y );\n\t\t\t\tcoords.push( vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.addAttribute( 'position', new BufferAttribute( new Float32Array( coords ), 3 ) );\n\n\t}\n\n\tEdgesGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tEdgesGeometry.prototype.constructor = EdgesGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CylinderBufferGeometry';\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\tvar scope = this;\n\n\t\tradiusTop = radiusTop !== undefined ? radiusTop : 20;\n\t\tradiusBottom = radiusBottom !== undefined ? radiusBottom : 20;\n\t\theight = height !== undefined ? height : 100;\n\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\n\t\topenEnded = openEnded !== undefined ? openEnded : false;\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0.0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI;\n\n\t\t// used to calculate buffer length\n\n\t\tvar nbCap = 0;\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) nbCap ++;\n\t\t\tif ( radiusBottom > 0 ) nbCap ++;\n\n\t\t}\n\n\t\tvar vertexCount = calculateVertexCount();\n\t\tvar indexCount = calculateIndexCount();\n\n\t\t// buffers\n\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ), 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// helper variables\n\n\t\tvar index = 0,\n\t\t indexOffset = 0,\n\t\t indexArray = [],\n\t\t halfHeight = height / 2;\n\n\t\t// group variables\n\t\tvar 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.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t\t// helper functions\n\n\t\tfunction calculateVertexCount() {\n\n\t\t\tvar count = ( radialSegments + 1 ) * ( heightSegments + 1 );\n\n\t\t\tif ( openEnded === false ) {\n\n\t\t\t\tcount += ( ( radialSegments + 1 ) * nbCap ) + ( radialSegments * nbCap );\n\n\t\t\t}\n\n\t\t\treturn count;\n\n\t\t}\n\n\t\tfunction calculateIndexCount() {\n\n\t\t\tvar count = radialSegments * heightSegments * 2 * 3;\n\n\t\t\tif ( openEnded === false ) {\n\n\t\t\t\tcount += radialSegments * nbCap * 3;\n\n\t\t\t}\n\n\t\t\treturn count;\n\n\t\t}\n\n\t\tfunction generateTorso() {\n\n\t\t\tvar x, y;\n\t\t\tvar normal = new Vector3();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tvar slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tvar indexRow = [];\n\n\t\t\t\tvar v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\t\t\t\tvar radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tvar u = x / radialSegments;\n\n\t\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tvar sinTheta = Math.sin( theta );\n\t\t\t\t\tvar cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\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.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.setXYZ( index, normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\t\t\t\t\tuvs.setXY( index, u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\t\t\t\t\tindexRow.push( index );\n\n\t\t\t\t\t// increase index\n\t\t\t\t\tindex ++;\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\t\t\t\t\tvar i1 = indexArray[ y ][ x ];\n\t\t\t\t\tvar i2 = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tvar i3 = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tvar i4 = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// face one\n\t\t\t\t\tindices.setX( indexOffset, i1 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i2 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i4 ); indexOffset ++;\n\n\t\t\t\t\t// face two\n\t\t\t\t\tindices.setX( indexOffset, i2 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i3 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i4 ); indexOffset ++;\n\n\t\t\t\t\t// update counters\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\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\tvar x, centerIndexStart, centerIndexEnd;\n\n\t\t\tvar uv = new Vector2();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tvar sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// save the index of the first center vertex\n\t\t\tcenterIndexStart = index;\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 ( x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\t\t\t\tvertices.setXYZ( index, 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\t\t\t\tnormals.setXYZ( index, 0, sign, 0 );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = 0.5;\n\t\t\t\tuv.y = 0.5;\n\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\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\tcenterIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tvar u = x / radialSegments;\n\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\tvar cosTheta = Math.cos( theta );\n\t\t\t\tvar sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\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.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\t\t\t\tnormals.setXYZ( index, 0, sign, 0 );\n\n\t\t\t\t// uv\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.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tvar c = centerIndexStart + x;\n\t\t\t\tvar i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\t\t\t\t\tindices.setX( indexOffset, i ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i + 1 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, c ); indexOffset ++;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\t\t\t\t\tindices.setX( indexOffset, i + 1 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, c ); indexOffset ++;\n\n\t\t\t\t}\n\n\t\t\t\t// update counters\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\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tCylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tCylinderGeometry.prototype = Object.create( Geometry.prototype );\n\tCylinderGeometry.prototype.constructor = CylinderGeometry;\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderGeometry.call( this, 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\tConeGeometry.prototype = Object.create( CylinderGeometry.prototype );\n\tConeGeometry.prototype.constructor = ConeGeometry;\n\n\t/**\n\t * @author: abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeBufferGeometry';\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\tConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype );\n\tConeBufferGeometry.prototype.constructor = ConeBufferGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CircleBufferGeometry';\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\tradius = radius || 50;\n\t\tsegments = segments !== undefined ? Math.max( 3, segments ) : 8;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\tvar vertices = segments + 2;\n\n\t\tvar positions = new Float32Array( vertices * 3 );\n\t\tvar normals = new Float32Array( vertices * 3 );\n\t\tvar uvs = new Float32Array( vertices * 2 );\n\n\t\t// center data is already zero, but need to set a few extras\n\t\tnormals[ 2 ] = 1.0;\n\t\tuvs[ 0 ] = 0.5;\n\t\tuvs[ 1 ] = 0.5;\n\n\t\tfor ( var s = 0, i = 3, ii = 2 ; s <= segments; s ++, i += 3, ii += 2 ) {\n\n\t\t\tvar segment = thetaStart + s / segments * thetaLength;\n\n\t\t\tpositions[ i ] = radius * Math.cos( segment );\n\t\t\tpositions[ i + 1 ] = radius * Math.sin( segment );\n\n\t\t\tnormals[ i + 2 ] = 1; // normal z\n\n\t\t\tuvs[ ii ] = ( positions[ i ] / radius + 1 ) / 2;\n\t\t\tuvs[ ii + 1 ] = ( positions[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t}\n\n\t\tvar indices = [];\n\n\t\tfor ( var i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\tthis.setIndex( new BufferAttribute( new Uint16Array( indices ), 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t\tthis.boundingSphere = new Sphere( new Vector3(), radius );\n\n\t}\n\n\tCircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCircleBufferGeometry.prototype.constructor = CircleBufferGeometry;\n\n\t/**\n\t * @author hughes\n\t */\n\n\tfunction CircleGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );\n\n\t}\n\n\tCircleGeometry.prototype = Object.create( Geometry.prototype );\n\tCircleGeometry.prototype.constructor = CircleGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as\n\t */\n\n\tfunction BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tBoxGeometry.prototype = Object.create( Geometry.prototype );\n\tBoxGeometry.prototype.constructor = BoxGeometry;\n\n\n\n\tvar Geometries = Object.freeze({\n\t\tWireframeGeometry: WireframeGeometry,\n\t\tParametricGeometry: ParametricGeometry,\n\t\tParametricBufferGeometry: ParametricBufferGeometry,\n\t\tTetrahedronGeometry: TetrahedronGeometry,\n\t\tTetrahedronBufferGeometry: TetrahedronBufferGeometry,\n\t\tOctahedronGeometry: OctahedronGeometry,\n\t\tOctahedronBufferGeometry: OctahedronBufferGeometry,\n\t\tIcosahedronGeometry: IcosahedronGeometry,\n\t\tIcosahedronBufferGeometry: IcosahedronBufferGeometry,\n\t\tDodecahedronGeometry: DodecahedronGeometry,\n\t\tDodecahedronBufferGeometry: DodecahedronBufferGeometry,\n\t\tPolyhedronGeometry: PolyhedronGeometry,\n\t\tPolyhedronBufferGeometry: PolyhedronBufferGeometry,\n\t\tTubeGeometry: TubeGeometry,\n\t\tTubeBufferGeometry: TubeBufferGeometry,\n\t\tTorusKnotGeometry: TorusKnotGeometry,\n\t\tTorusKnotBufferGeometry: TorusKnotBufferGeometry,\n\t\tTorusGeometry: TorusGeometry,\n\t\tTorusBufferGeometry: TorusBufferGeometry,\n\t\tTextGeometry: TextGeometry,\n\t\tSphereBufferGeometry: SphereBufferGeometry,\n\t\tSphereGeometry: SphereGeometry,\n\t\tRingGeometry: RingGeometry,\n\t\tRingBufferGeometry: RingBufferGeometry,\n\t\tPlaneBufferGeometry: PlaneBufferGeometry,\n\t\tPlaneGeometry: PlaneGeometry,\n\t\tLatheGeometry: LatheGeometry,\n\t\tLatheBufferGeometry: LatheBufferGeometry,\n\t\tShapeGeometry: ShapeGeometry,\n\t\tExtrudeGeometry: ExtrudeGeometry,\n\t\tEdgesGeometry: EdgesGeometry,\n\t\tConeGeometry: ConeGeometry,\n\t\tConeBufferGeometry: ConeBufferGeometry,\n\t\tCylinderGeometry: CylinderGeometry,\n\t\tCylinderBufferGeometry: CylinderBufferGeometry,\n\t\tCircleBufferGeometry: CircleBufferGeometry,\n\t\tCircleGeometry: CircleGeometry,\n\t\tBoxBufferGeometry: BoxBufferGeometry,\n\t\tBoxGeometry: BoxGeometry\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ShadowMaterial() {\n\n\t\tShaderMaterial.call( this, {\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib[ \"lights\" ],\n\t\t\t\t{\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t}\n\t\t\t] ),\n\t\t\tvertexShader: ShaderChunk[ 'shadow_vert' ],\n\t\t\tfragmentShader: ShaderChunk[ 'shadow_frag' ]\n\t\t} );\n\n\t\tthis.lights = true;\n\t\tthis.transparent = true;\n\n\t\tObject.defineProperties( this, {\n\t\t\topacity: {\n\t\t\t\tenumerable: true,\n\t\t\t\tget: function () {\n\t\t\t\t\treturn this.uniforms.opacity.value;\n\t\t\t\t},\n\t\t\t\tset: function ( value ) {\n\t\t\t\t\tthis.uniforms.opacity.value = value;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tShadowMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tShadowMaterial.prototype.constructor = ShadowMaterial;\n\n\tShadowMaterial.prototype.isShadowMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction RawShaderMaterial( parameters ) {\n\n\t\tShaderMaterial.call( this, parameters );\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n\tRawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tRawShaderMaterial.prototype.constructor = RawShaderMaterial;\n\n\tRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MultiMaterial( materials ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.type = 'MultiMaterial';\n\n\t\tthis.materials = materials instanceof Array ? materials : [];\n\n\t\tthis.visible = true;\n\n\t}\n\n\tMultiMaterial.prototype = {\n\n\t\tconstructor: MultiMaterial,\n\n\t\tisMultiMaterial: true,\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.2,\n\t\t\t\t\ttype: 'material',\n\t\t\t\t\tgenerator: 'MaterialExporter'\n\t\t\t\t},\n\t\t\t\tuuid: this.uuid,\n\t\t\t\ttype: this.type,\n\t\t\t\tmaterials: []\n\t\t\t};\n\n\t\t\tvar materials = this.materials;\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tvar material = materials[ i ].toJSON( meta );\n\t\t\t\tdelete material.metadata;\n\n\t\t\t\toutput.materials.push( material );\n\n\t\t\t}\n\n\t\t\toutput.visible = this.visible;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\tvar material = new this.constructor();\n\n\t\t\tfor ( var i = 0; i < this.materials.length; i ++ ) {\n\n\t\t\t\tmaterial.materials.push( this.materials[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tmaterial.visible = this.visible;\n\n\t\t\treturn material;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * color: ,\n\t * roughness: ,\n\t * metalness: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * roughnessMap: new THREE.Texture( ),\n\t *\n\t * metalnessMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n\t * envMapIntensity: \n\t *\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshStandardMaterial( parameters ) {\n\n\t\tMaterial.call( this );\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 = 0.5;\n\t\tthis.metalness = 0.5;\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.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.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.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshStandardMaterial.prototype = Object.create( Material.prototype );\n\tMeshStandardMaterial.prototype.constructor = MeshStandardMaterial;\n\n\tMeshStandardMaterial.prototype.isMeshStandardMaterial = true;\n\n\tMeshStandardMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, 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.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.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.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * reflectivity: \n\t * }\n\t */\n\n\tfunction MeshPhysicalMaterial( parameters ) {\n\n\t\tMeshStandardMaterial.call( this );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.reflectivity = 0.5; // maps to F0 = 0.04\n\n\t\tthis.clearCoat = 0.0;\n\t\tthis.clearCoatRoughness = 0.0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );\n\tMeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;\n\n\tMeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;\n\n\tMeshPhysicalMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshStandardMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.reflectivity = source.reflectivity;\n\n\t\tthis.clearCoat = source.clearCoat;\n\t\tthis.clearCoatRoughness = source.clearCoatRoughness;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * specular: ,\n\t * shininess: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshPhongMaterial( parameters ) {\n\n\t\tMaterial.call( this );\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.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.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhongMaterial.prototype = Object.create( Material.prototype );\n\tMeshPhongMaterial.prototype.constructor = MeshPhongMaterial;\n\n\tMeshPhongMaterial.prototype.isMeshPhongMaterial = true;\n\n\tMeshPhongMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, 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.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.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t *\n\t * parameters = {\n\t * opacity: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t * }\n\t */\n\n\tfunction MeshNormalMaterial( parameters ) {\n\n\t\tMaterial.call( this, parameters );\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshNormalMaterial.prototype = Object.create( Material.prototype );\n\tMeshNormalMaterial.prototype.constructor = MeshNormalMaterial;\n\n\tMeshNormalMaterial.prototype.isMeshNormalMaterial = true;\n\n\tMeshNormalMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshLambertMaterial( parameters ) {\n\n\t\tMaterial.call( this );\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.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.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshLambertMaterial.prototype = Object.create( Material.prototype );\n\tMeshLambertMaterial.prototype.constructor = MeshLambertMaterial;\n\n\tMeshLambertMaterial.prototype.isMeshLambertMaterial = true;\n\n\tMeshLambertMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, 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.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.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t *\n\t * scale: ,\n\t * dashSize: ,\n\t * gapSize: \n\t * }\n\t */\n\n\tfunction LineDashedMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineDashedMaterial.prototype = Object.create( Material.prototype );\n\tLineDashedMaterial.prototype.constructor = LineDashedMaterial;\n\n\tLineDashedMaterial.prototype.isLineDashedMaterial = true;\n\n\tLineDashedMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\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\tvar Materials = Object.freeze({\n\t\tShadowMaterial: ShadowMaterial,\n\t\tSpriteMaterial: SpriteMaterial,\n\t\tRawShaderMaterial: RawShaderMaterial,\n\t\tShaderMaterial: ShaderMaterial,\n\t\tPointsMaterial: PointsMaterial,\n\t\tMultiMaterial: MultiMaterial,\n\t\tMeshPhysicalMaterial: MeshPhysicalMaterial,\n\t\tMeshStandardMaterial: MeshStandardMaterial,\n\t\tMeshPhongMaterial: MeshPhongMaterial,\n\t\tMeshNormalMaterial: MeshNormalMaterial,\n\t\tMeshLambertMaterial: MeshLambertMaterial,\n\t\tMeshDepthMaterial: MeshDepthMaterial,\n\t\tMeshBasicMaterial: MeshBasicMaterial,\n\t\tLineDashedMaterial: LineDashedMaterial,\n\t\tLineBasicMaterial: LineBasicMaterial,\n\t\tMaterial: Material\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar Cache = {\n\n\t\tenabled: false,\n\n\t\tfiles: {},\n\n\t\tadd: function ( key, file ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\t\tthis.files[ key ] = file;\n\n\t\t},\n\n\t\tget: function ( key ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\t\treturn this.files[ key ];\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete this.files[ key ];\n\n\t\t},\n\n\t\tclear: function () {\n\n\t\t\tthis.files = {};\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LoadingManager( onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar isLoading = false, itemsLoaded = 0, itemsTotal = 0;\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}\n\n\tvar DefaultLoadingManager = new LoadingManager();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction XHRLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( XHRLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\t// Check for data: URI\n\t\t\tvar dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\t\t\tvar dataUriRegexResult = url.match( dataUriRegex );\n\n\t\t\t// Safari can not handle Data URIs through XMLHttpRequest so process manually\n\t\t\tif ( dataUriRegexResult ) {\n\n\t\t\t\tvar mimeType = dataUriRegexResult[1];\n\t\t\t\tvar isBase64 = !!dataUriRegexResult[2];\n\t\t\t\tvar data = dataUriRegexResult[3];\n\n\t\t\t\tdata = window.decodeURIComponent(data);\n\n\t\t\t\tif( isBase64 ) {\n\t\t\t\t\tdata = window.atob(data);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar response;\n\t\t\t\t\tvar responseType = ( this.responseType || '' ).toLowerCase();\n\n\t\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\t \tresponse = new ArrayBuffer( data.length );\n\t\t\t\t\t\t\tvar view = new Uint8Array( response );\n\t\t\t\t\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tview[ i ] = data.charCodeAt( i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( responseType === 'blob' ) {\n\n\t\t\t\t\t\t\t\tresponse = new Blob( [ response ], { \"type\" : mimeType } );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\t\tvar parser = new DOMParser();\n\t\t\t\t\t\t\tresponse = parser.parseFromString( data, mimeType );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\t\tresponse = JSON.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault: // 'text' or other\n\n\t\t\t\t\t\t\tresponse = data;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function() {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t}, 0);\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function() {\n\n\t\t\t\t\t\tif ( onError ) onError( error );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}, 0);\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar request = new XMLHttpRequest();\n\t\t\t\trequest.open( 'GET', url, true );\n\n\t\t\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\t\t\tvar response = event.target.response;\n\n\t\t\t\t\tCache.add( url, response );\n\n\t\t\t\t\tif ( this.status === 200 ) {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else if ( this.status === 0 ) {\n\n\t\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\t\tconsole.warn( 'THREE.XHRLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( onProgress !== undefined ) {\n\n\t\t\t\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\t\t\tonProgress( event );\n\n\t\t\t\t\t}, false );\n\n\t\t\t\t}\n\n\t\t\t\trequest.addEventListener( 'error', function ( event ) {\n\n\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( this.responseType !== undefined ) request.responseType = this.responseType;\n\t\t\t\tif ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;\n\n\t\t\t\tif ( request.overrideMimeType ) request.overrideMimeType( 'text/plain' );\n\n\t\t\t\trequest.send( null );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn request;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetResponseType: function ( value ) {\n\n\t\t\tthis.responseType = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t *\n\t * Abstract Base class to block based textures loader (dds, pvr, ...)\n\t */\n\n\tfunction CompressedTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( CompressedTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar images = [];\n\n\t\t\tvar texture = new CompressedTexture();\n\t\t\ttexture.image = images;\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\timages[ i ] = {\n\t\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t\t};\n\n\t\t\t\t\tloaded += 1;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\tif ( texDatas.mipmapCount === 1 )\n\t\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\tvar loaded = 0;\n\n\t\t\t\tfor ( var i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\t\tloadTexture( i );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\t\tvar faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\t\tfor ( var f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\t\timages[ f ] = { mipmaps : [] };\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\t\timages[ f ].height = texDatas.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} else {\n\n\t\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author Nikos M. / https://github.com/foo123/\n\t *\n\t * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n\t */\n\n\tvar DataTextureLoader = BinaryTextureLoader;\n\tfunction BinaryTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( BinaryTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texture = new DataTexture();\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar texData = scope._parser( buffer );\n\n\t\t\t\tif ( ! texData ) return;\n\n\t\t\t\tif ( undefined !== texData.image ) {\n\n\t\t\t\t\ttexture.image = texData.image;\n\n\t\t\t\t} else if ( undefined !== texData.data ) {\n\n\t\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\t\ttexture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\t\ttexture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter;\n\t\t\t\ttexture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter;\n\n\t\t\t\ttexture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;\n\n\t\t\t\tif ( undefined !== texData.format ) {\n\n\t\t\t\t\ttexture.format = texData.format;\n\n\t\t\t\t}\n\t\t\t\tif ( undefined !== texData.type ) {\n\n\t\t\t\t\ttexture.type = texData.type;\n\n\t\t\t\t}\n\n\t\t\t\tif ( undefined !== texData.mipmaps ) {\n\n\t\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( 1 === texData.mipmapCount ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t\t}, onProgress, onError );\n\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ImageLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( ImageLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );\n\t\t\timage.onload = function () {\n\n\t\t\t\timage.onload = null;\n\n\t\t\t\tURL.revokeObjectURL( image.src );\n\n\t\t\t\tif ( onLoad ) onLoad( image );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t};\n\t\t\timage.onerror = onError;\n\n\t\t\tif ( url.indexOf( 'data:' ) === 0 ) {\n\n\t\t\t\timage.src = url;\n\n\t\t\t} else {\n\n\t\t\t\tvar loader = new XHRLoader();\n\t\t\t\tloader.setPath( this.path );\n\t\t\t\tloader.setResponseType( 'blob' );\n\t\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\t\tloader.load( url, function ( blob ) {\n\n\t\t\t\t\timage.src = URL.createObjectURL( blob );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn image;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( CubeTextureLoader.prototype, {\n\n\t\tload: function ( urls, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new CubeTexture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\n\t\t\tvar loaded = 0;\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\t\tloaded ++;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, undefined, onError );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < urls.length; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction TextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( TextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new Texture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.load( url, function ( image ) {\n\n\t\t\t\t// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.\n\t\t\t\tvar isJPEG = url.search( /\\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\\:image\\/jpeg/ ) === 0;\n\n\t\t\t\ttexture.format = isJPEG ? RGBFormat : RGBAFormat;\n\t\t\t\ttexture.image = image;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\t\tonLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Light( color, intensity ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Light';\n\n\t\tthis.color = new Color( color );\n\t\tthis.intensity = intensity !== undefined ? intensity : 1;\n\n\t\tthis.receiveShadow = undefined;\n\n\t}\n\n\tLight.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Light,\n\n\t\tisLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.color.copy( source.color );\n\t\t\tthis.intensity = source.intensity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.color = this.color.getHex();\n\t\t\tdata.object.intensity = this.intensity;\n\n\t\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction HemisphereLight( skyColor, groundColor, intensity ) {\n\n\t\tLight.call( this, skyColor, intensity );\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.castShadow = undefined;\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tHemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: HemisphereLight,\n\n\t\tisHemisphereLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.groundColor.copy( source.groundColor );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LightShadow( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.bias = 0;\n\t\tthis.radius = 1;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.matrix = new Matrix4();\n\n\t}\n\n\tObject.assign( LightShadow.prototype, {\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.camera = source.camera.clone();\n\n\t\t\tthis.bias = source.bias;\n\t\t\tthis.radius = source.radius;\n\n\t\t\tthis.mapSize.copy( source.mapSize );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar object = {};\n\n\t\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\t\tdelete object.camera.matrix;\n\n\t\t\treturn object;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SpotLightShadow() {\n\n\t\tLightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t}\n\n\tSpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: SpotLightShadow,\n\n\t\tisSpotLightShadow: true,\n\n\t\tupdate: function ( light ) {\n\n\t\t\tvar fov = _Math.RAD2DEG * 2 * light.angle;\n\t\t\tvar aspect = this.mapSize.width / this.mapSize.height;\n\t\t\tvar far = light.distance || 500;\n\n\t\t\tvar camera = this.camera;\n\n\t\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\t\tcamera.fov = fov;\n\t\t\t\tcamera.aspect = aspect;\n\t\t\t\tcamera.far = far;\n\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpotLight( color, intensity, distance, angle, penumbra, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * Math.PI;\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / Math.PI;\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.angle = ( angle !== undefined ) ? angle : Math.PI / 3;\n\t\tthis.penumbra = ( penumbra !== undefined ) ? penumbra : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\tSpotLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: SpotLight,\n\n\t\tisSpotLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.angle = source.angle;\n\t\t\tthis.penumbra = source.penumbra;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\n\tfunction PointLight( color, intensity, distance, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'PointLight';\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * 4 * Math.PI;\n\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / ( 4 * Math.PI );\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t}\n\n\tPointLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: PointLight,\n\n\t\tisPointLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectionalLightShadow( light ) {\n\n\t\tLightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n\t}\n\n\tDirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: DirectionalLightShadow\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DirectionalLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tDirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: DirectionalLight,\n\n\t\tisDirectionalLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AmbientLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'AmbientLight';\n\n\t\tthis.castShadow = undefined;\n\n\t}\n\n\tAmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: AmbientLight,\n\n\t\tisAmbientLight: true,\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tvar AnimationUtils = {\n\n\t\t// same as Array.prototype.slice, but also works on typed arrays\n\t\tarraySlice: function( array, from, to ) {\n\n\t\t\tif ( AnimationUtils.isTypedArray( array ) ) {\n\n\t\t\t\treturn new array.constructor( array.subarray( from, to ) );\n\n\t\t\t}\n\n\t\t\treturn array.slice( from, to );\n\n\t\t},\n\n\t\t// converts an array to a specific type\n\t\tconvertArray: function( array, type, forceClone ) {\n\n\t\t\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t\t\t\t! forceClone && array.constructor === type ) return array;\n\n\t\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\t\t\treturn new type( array ); // create typed array\n\n\t\t\t}\n\n\t\t\treturn Array.prototype.slice.call( array ); // create Array\n\n\t\t},\n\n\t\tisTypedArray: function( object ) {\n\n\t\t\treturn ArrayBuffer.isView( object ) &&\n\t\t\t\t\t! ( object instanceof DataView );\n\n\t\t},\n\n\t\t// returns an array by which times and values can be sorted\n\t\tgetKeyframeOrder: function( times ) {\n\n\t\t\tfunction compareTime( i, j ) {\n\n\t\t\t\treturn times[ i ] - times[ j ];\n\n\t\t\t}\n\n\t\t\tvar n = times.length;\n\t\t\tvar result = new Array( n );\n\t\t\tfor ( var i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\t\t\tresult.sort( compareTime );\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// uses the array previously returned by 'getKeyframeOrder' to sort data\n\t\tsortedArray: function( values, stride, order ) {\n\n\t\t\tvar nValues = values.length;\n\t\t\tvar result = new values.constructor( nValues );\n\n\t\t\tfor ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\t\t\tvar srcOffset = order[ i ] * stride;\n\n\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// function for parsing AOS keyframe formats\n\t\tflattenJSON: function( jsonKeys, times, values, valuePropertyName ) {\n\n\t\t\tvar i = 1, key = jsonKeys[ 0 ];\n\n\t\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t}\n\n\t\t\tif ( key === undefined ) return; // no data\n\n\t\t\tvar value = key[ valuePropertyName ];\n\t\t\tif ( value === undefined ) return; // no data\n\n\t\t\tif ( Array.isArray( value ) ) {\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else if ( value.toArray !== undefined ) {\n\t\t\t\t// ...assume THREE.Math-ish\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else {\n\t\t\t\t// otherwise push as-is\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push( value );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Abstract base class of interpolants over parametric samples.\n\t *\n\t * The parameter domain is one dimensional, typically the time or a path\n\t * along a curve defined by the data.\n\t *\n\t * The sample values can have any dimensionality and derived classes may\n\t * apply special interpretations to the data.\n\t *\n\t * This class provides the interval seek in a Template Method, deferring\n\t * the actual interpolation to derived classes.\n\t *\n\t * Time complexity is O(1) for linear access crossing at most two points\n\t * and O(log N) for random access, where N is the number of positions.\n\t *\n\t * References:\n\t *\n\t * \t\thttp://www.oodesign.com/template-method-pattern.html\n\t *\n\t * @author tschw\n\t */\n\n\tfunction Interpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tthis.parameterPositions = parameterPositions;\n\t\tthis._cachedIndex = 0;\n\n\t\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\t\tthis.sampleValues = sampleValues;\n\t\tthis.valueSize = sampleSize;\n\n\t}\n\n\tInterpolant.prototype = {\n\n\t\tconstructor: Interpolant,\n\n\t\tevaluate: function( t ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\ti1 = this._cachedIndex,\n\n\t\t\t\tt1 = pp[ i1 ],\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\tvalidate_interval: {\n\n\t\t\t\tseek: {\n\n\t\t\t\t\tvar right;\n\n\t\t\t\t\tlinear_scan: {\n\t//- See http://jsperf.com/comparison-to-undefined/3\n\t//- slower code:\n\t//-\n\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 + 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\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\t// prepare binary search on the right side of the index\n\t\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t//- slower code:\n\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\t\tvar t1global = pp[ 1 ];\n\n\t\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 - 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\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\t// prepare binary search on the left side of the index\n\t\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t\t} // linear scan\n\n\t\t\t\t\t// binary search\n\n\t\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\t\tvar mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t\t// check boundary cases, again\n\n\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\n\n\t\t\t\t\t}\n\n\t\t\t\t} // seek\n\n\t\t\t\tthis._cachedIndex = i1;\n\n\t\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t\t} // validate_interval\n\n\t\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t\t},\n\n\t\tsettings: null, // optional, subclass-specific settings structure\n\t\t// Note: The indirection allows central control of many interpolants.\n\n\t\t// --- Protected interface\n\n\t\tDefaultSettings_: {},\n\n\t\tgetSettings_: function() {\n\n\t\t\treturn this.settings || this.DefaultSettings_;\n\n\t\t},\n\n\t\tcopySampleValue_: function( index ) {\n\n\t\t\t// copies a sample value to the result buffer\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = index * stride;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// Template methods for derived classes:\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tthrow new Error( \"call to abstract method\" );\n\t\t\t// implementations shall return this.resultBuffer\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\t// empty\n\n\t\t}\n\n\t};\n\n\tObject.assign( Interpolant.prototype, {\n\n\t\tbeforeStart_: //( 0, t, t0 ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_,\n\n\t\tafterEnd_: //( N-1, tN-1, t ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_\n\n\t} );\n\n\t/**\n\t * Fast and simple cubic spline interpolant.\n\t *\n\t * It was derived from a Hermitian construction setting the first derivative\n\t * at each sample position to the linear slope between neighboring positions\n\t * over their parameter interval.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction CubicInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, 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}\n\n\tCubicInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: CubicInterpolant,\n\n\t\tDefaultSettings_: {\n\n\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\tiPrev = i1 - 2,\n\t\t\t\tiNext = i1 + 1,\n\n\t\t\t\ttPrev = pp[ iPrev ],\n\t\t\t\ttNext = pp[ iNext ];\n\n\t\t\tif ( tPrev === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = t1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tNext === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\t\tiNext = i1;\n\t\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiNext = 1;\n\t\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\t\ttNext = t0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar halfDt = ( t1 - t0 ) * 0.5,\n\t\t\t\tstride = this.valueSize;\n\n\t\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\t\tthis._offsetPrev = iPrev * stride;\n\t\t\tthis._offsetNext = iNext * stride;\n\n\t\t},\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tpp = p * p,\n\t\t\t\tppp = pp * p;\n\n\t\t\t// evaluate polynomials\n\n\t\t\tvar sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\t\tvar s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\t\tvar s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\t\tvar sN = wN * ppp - wN * pp;\n\n\t\t\t// combine data linearly\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction LinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: LinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset1 = i1 * stride,\n\t\t\t\toffset0 = offset1 - stride,\n\n\t\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tweight0 = 1 - weight1;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Interpolant that evaluates to the sample value at the position preceeding\n\t * the parameter.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction DiscreteInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tDiscreteInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: DiscreteInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t}\n\n\t} );\n\n\tvar KeyframeTrackPrototype;\n\n\tKeyframeTrackPrototype = {\n\n\t\tTimeBufferType: Float32Array,\n\t\tValueBufferType: Float32Array,\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodDiscrete: function( result ) {\n\n\t\t\treturn new DiscreteInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodLinear: function( result ) {\n\n\t\t\treturn new LinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: function( result ) {\n\n\t\t\treturn new CubicInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tsetInterpolation: function( interpolation ) {\n\n\t\t\tvar factoryMethod;\n\n\t\t\tswitch ( interpolation ) {\n\n\t\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateLinear:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateSmooth:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( factoryMethod === undefined ) {\n\n\t\t\t\tvar message = \"unsupported interpolation for \" +\n\t\t\t\t\t\tthis.ValueTypeName + \" keyframe track named \" + this.name;\n\n\t\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( message );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.createInterpolant = factoryMethod;\n\n\t\t},\n\n\t\tgetInterpolation: function() {\n\n\t\t\tswitch ( this.createInterpolant ) {\n\n\t\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\t\treturn InterpolateLinear;\n\n\t\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\t\treturn InterpolateSmooth;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetValueSize: function() {\n\n\t\t\treturn this.values.length / this.times.length;\n\n\t\t},\n\n\t\t// move all keyframes either forwards or backwards in time\n\t\tshift: function( timeOffset ) {\n\n\t\t\tif( timeOffset !== 0.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\t\tscale: function( timeScale ) {\n\n\t\t\tif( timeScale !== 1.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t\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\t\ttrim: function( startTime, endTime ) {\n\n\t\t\tvar times = this.times,\n\t\t\t\tnKeys = times.length,\n\t\t\t\tfrom = 0,\n\t\t\t\tto = nKeys - 1;\n\n\t\t\twhile ( from !== nKeys && times[ from ] < startTime ) ++ from;\n\t\t\twhile ( to !== -1 && times[ to ] > endTime ) -- to;\n\n\t\t\t++ to; // inclusive -> exclusive bound\n\n\t\t\tif( from !== 0 || to !== nKeys ) {\n\n\t\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\t\tif ( from >= to ) to = Math.max( to , 1 ), from = to - 1;\n\n\t\t\t\tvar stride = this.getValueSize();\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, from, to );\n\t\t\t\tthis.values = AnimationUtils.\n\t\t\t\t\t\tarraySlice( this.values, from * stride, to * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\t\tvalidate: function() {\n\n\t\t\tvar valid = true;\n\n\t\t\tvar valueSize = this.getValueSize();\n\t\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\t\tconsole.error( \"invalid value size in track\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\n\t\t\t\tnKeys = times.length;\n\n\t\t\tif( nKeys === 0 ) {\n\n\t\t\t\tconsole.error( \"track is empty\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar prevTime = null;\n\n\t\t\tfor( var i = 0; i !== nKeys; i ++ ) {\n\n\t\t\t\tvar currTime = times[ i ];\n\n\t\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\t\tconsole.error( \"time is not a valid number\", this, i, currTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\t\tconsole.error( \"out of order keys\", this, i, currTime, prevTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tprevTime = currTime;\n\n\t\t\t}\n\n\t\t\tif ( values !== undefined ) {\n\n\t\t\t\tif ( AnimationUtils.isTypedArray( values ) ) {\n\n\t\t\t\t\tfor ( var i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tvar value = values[ i ];\n\n\t\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\t\tconsole.error( \"value is not a valid number\", this, i, value );\n\t\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn valid;\n\n\t\t},\n\n\t\t// removes equivalent sequential keys as common in morph target sequences\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\t\toptimize: function() {\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\t\t\t\tstride = this.getValueSize(),\n\n\t\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\t\twriteIndex = 1,\n\t\t\t\tlastIndex = times.length - 1;\n\n\t\t\tfor( var i = 1; i < lastIndex; ++ i ) {\n\n\t\t\t\tvar keep = false;\n\n\t\t\t\tvar time = times[ i ];\n\t\t\t\tvar timeNext = times[ i + 1 ];\n\n\t\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\t\tif ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {\n\n\t\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\t\tvar offset = i * stride,\n\t\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\t\tvar value = values[ offset + j ];\n\n\t\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\t\tbreak;\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 keep = true;\n\n\t\t\t\t}\n\n\t\t\t\t// in-place compaction\n\n\t\t\t\tif ( keep ) {\n\n\t\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\t\tvar readOffset = i * stride,\n\t\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j )\n\n\t\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t++ writeIndex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// flush last keyframe (compaction looks ahead)\n\n\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\t\tfor ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j )\n\n\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t\tif ( writeIndex !== times.length ) {\n\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, 0, writeIndex );\n\t\t\t\tthis.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\tfunction KeyframeTrackConstructor( name, times, values, interpolation ) {\n\n\t\tif( name === undefined ) throw new Error( \"track name is undefined\" );\n\n\t\tif( times === undefined || times.length === 0 ) {\n\n\t\t\tthrow new Error( \"no keyframes in track named \" + name );\n\n\t\t}\n\n\t\tthis.name = name;\n\n\t\tthis.times = AnimationUtils.convertArray( times, this.TimeBufferType );\n\t\tthis.values = AnimationUtils.convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t\tthis.validate();\n\t\tthis.optimize();\n\n\t}\n\n\t/**\n\t *\n\t * A Track of vectored keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction VectorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tVectorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: VectorKeyframeTrack,\n\n\t\tValueTypeName: 'vector'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t * Spherical linear unit quaternion interpolant.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction QuaternionLinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tQuaternionLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: QuaternionLinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset = i1 * stride,\n\n\t\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\t\tfor ( var end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\t\tQuaternion.slerpFlat( result, 0,\n\t\t\t\t\t\tvalues, offset - stride, values, offset, alpha );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of quaternion keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction QuaternionKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tQuaternionKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: QuaternionKeyframeTrack,\n\n\t\tValueTypeName: 'quaternion',\n\n\t\t// ValueBufferType is inherited\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodLinear: function( result ) {\n\n\t\t\treturn new QuaternionLinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: undefined // not yet implemented\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of numeric keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction NumberKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tNumberKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: NumberKeyframeTrack,\n\n\t\tValueTypeName: 'number',\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t *\n\t * A Track that interpolates Strings\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction StringKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tStringKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: StringKeyframeTrack,\n\n\t\tValueTypeName: 'string',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of Boolean keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction BooleanKeyframeTrack( name, times, values ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values );\n\n\t}\n\n\tBooleanKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: BooleanKeyframeTrack,\n\n\t\tValueTypeName: 'bool',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t\t// Note: Actually this track could have a optimized / compressed\n\t\t// representation of a single value and a custom interpolant that\n\t\t// computes \"firstValue ^ isOdd( index )\".\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of keyframe values that represent color.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction ColorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tColorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: ColorKeyframeTrack,\n\n\t\tValueTypeName: 'color'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\n\t\t// Note: Very basic implementation and nothing special yet.\n\t\t// However, this is the place for color space parameterization.\n\n\t} );\n\n\t/**\n\t *\n\t * A timed sequence of keyframes for a specific property.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction KeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.apply( this, arguments );\n\n\t}\n\n\tKeyframeTrack.prototype = KeyframeTrackPrototype;\n\tKeyframeTrackPrototype.constructor = KeyframeTrack;\n\n\t// Static methods:\n\n\tObject.assign( KeyframeTrack, {\n\n\t\t// Serialization (in static context, because of constructor invocation\n\t\t// and automatic invocation of .toJSON):\n\n\t\tparse: function( json ) {\n\n\t\t\tif( json.type === undefined ) {\n\n\t\t\t\tthrow new Error( \"track type undefined, can not parse\" );\n\n\t\t\t}\n\n\t\t\tvar trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type );\n\n\t\t\tif ( json.times === undefined ) {\n\n\t\t\t\tvar times = [], values = [];\n\n\t\t\t\tAnimationUtils.flattenJSON( json.keys, times, values, 'value' );\n\n\t\t\t\tjson.times = times;\n\t\t\t\tjson.values = values;\n\n\t\t\t}\n\n\t\t\t// derived classes can define a static parse method\n\t\t\tif ( trackType.parse !== undefined ) {\n\n\t\t\t\treturn trackType.parse( json );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we asssume a constructor compatible with the base\n\t\t\t\treturn new trackType(\n\t\t\t\t\t\tjson.name, json.times, json.values, json.interpolation );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function( track ) {\n\n\t\t\tvar trackType = track.constructor;\n\n\t\t\tvar json;\n\n\t\t\t// derived classes can define a static toJSON method\n\t\t\tif ( trackType.toJSON !== undefined ) {\n\n\t\t\t\tjson = trackType.toJSON( track );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\t\tjson = {\n\n\t\t\t\t\t'name': track.name,\n\t\t\t\t\t'times': AnimationUtils.convertArray( track.times, Array ),\n\t\t\t\t\t'values': AnimationUtils.convertArray( track.values, Array )\n\n\t\t\t\t};\n\n\t\t\t\tvar interpolation = track.getInterpolation();\n\n\t\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\t\treturn json;\n\n\t\t},\n\n\t\t_getTrackTypeForValueTypeName: function( typeName ) {\n\n\t\t\tswitch( typeName.toLowerCase() ) {\n\n\t\t\t\tcase \"scalar\":\n\t\t\t\tcase \"double\":\n\t\t\t\tcase \"float\":\n\t\t\t\tcase \"number\":\n\t\t\t\tcase \"integer\":\n\n\t\t\t\t\treturn NumberKeyframeTrack;\n\n\t\t\t\tcase \"vector\":\n\t\t\t\tcase \"vector2\":\n\t\t\t\tcase \"vector3\":\n\t\t\t\tcase \"vector4\":\n\n\t\t\t\t\treturn VectorKeyframeTrack;\n\n\t\t\t\tcase \"color\":\n\n\t\t\t\t\treturn ColorKeyframeTrack;\n\n\t\t\t\tcase \"quaternion\":\n\n\t\t\t\t\treturn QuaternionKeyframeTrack;\n\n\t\t\t\tcase \"bool\":\n\t\t\t\tcase \"boolean\":\n\n\t\t\t\t\treturn BooleanKeyframeTrack;\n\n\t\t\t\tcase \"string\":\n\n\t\t\t\t\treturn StringKeyframeTrack;\n\n\t\t\t}\n\n\t\t\tthrow new Error( \"Unsupported typeName: \" + typeName );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Reusable set of Tracks that represent an animation.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tfunction AnimationClip( name, duration, tracks ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = ( duration !== undefined ) ? duration : -1;\n\n\t\tthis.uuid = _Math.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\tthis.optimize();\n\n\t}\n\n\tAnimationClip.prototype = {\n\n\t\tconstructor: AnimationClip,\n\n\t\tresetDuration: function() {\n\n\t\t\tvar tracks = this.tracks,\n\t\t\t\tduration = 0;\n\n\t\t\tfor ( var i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\t\tvar track = this.tracks[ i ];\n\n\t\t\t\tduration = Math.max(\n\t\t\t\t\t\tduration, track.times[ track.times.length - 1 ] );\n\n\t\t\t}\n\n\t\t\tthis.duration = duration;\n\n\t\t},\n\n\t\ttrim: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\toptimize: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].optimize();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t// Static methods:\n\n\tObject.assign( AnimationClip, {\n\n\t\tparse: function( json ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tjsonTracks = json.tracks,\n\t\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\t\tfor ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( json.name, json.duration, tracks );\n\n\t\t},\n\n\n\t\ttoJSON: function( clip ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tclipTracks = clip.tracks;\n\n\t\t\tvar json = {\n\n\t\t\t\t'name': clip.name,\n\t\t\t\t'duration': clip.duration,\n\t\t\t\t'tracks': tracks\n\n\t\t\t};\n\n\t\t\tfor ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn json;\n\n\t\t},\n\n\n\t\tCreateFromMorphTargetSequence: function( name, morphTargetSequence, fps, noLoop ) {\n\n\t\t\tvar numMorphTargets = morphTargetSequence.length;\n\t\t\tvar tracks = [];\n\n\t\t\tfor ( var i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\t\tvar times = [];\n\t\t\t\tvar values = [];\n\n\t\t\t\ttimes.push(\n\t\t\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\t\t\ti,\n\t\t\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\t\tvar order = AnimationUtils.getKeyframeOrder( times );\n\t\t\t\ttimes = AnimationUtils.sortedArray( times, 1, order );\n\t\t\t\tvalues = AnimationUtils.sortedArray( values, 1, order );\n\n\t\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t\t// last frame as well for perfect loop.\n\t\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\ttracks.push(\n\t\t\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\t\t\ttimes, values\n\t\t\t\t\t\t).scale( 1.0 / fps ) );\n\t\t\t}\n\n\t\t\treturn new AnimationClip( name, -1, tracks );\n\n\t\t},\n\n\t\tfindByName: function( objectOrClipArray, name ) {\n\n\t\t\tvar clipArray = objectOrClipArray;\n\n\t\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\t\tvar o = objectOrClipArray;\n\t\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\t\treturn clipArray[ i ];\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\tCreateClipsFromMorphTargetSequences: function( morphTargets, fps, noLoop ) {\n\n\t\t\tvar animationToMorphTargets = {};\n\n\t\t\t// tested with https://regex101.com/ on trick sequences\n\t\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\t\tvar pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t\t// sort morph target names into animation groups based\n\t\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\t\tfor ( var i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = morphTargets[ i ];\n\t\t\t\tvar parts = morphTarget.name.match( pattern );\n\n\t\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\t\tvar name = parts[ 1 ];\n\n\t\t\t\t\tvar animationMorphTargets = animationToMorphTargets[ name ];\n\t\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar clips = [];\n\n\t\t\tfor ( var name in animationToMorphTargets ) {\n\n\t\t\t\tclips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t\t}\n\n\t\t\treturn clips;\n\n\t\t},\n\n\t\t// parse the animation.hierarchy format\n\t\tparseAnimation: function( animation, bones ) {\n\n\t\t\tif ( ! animation ) {\n\n\t\t\t\tconsole.error( \" no animation in JSONLoader data\" );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar addNonemptyTrack = function(\n\t\t\t\t\ttrackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t\t// only return track if there are actually keys.\n\t\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\t\tvar times = [];\n\t\t\t\t\tvar values = [];\n\n\t\t\t\t\tAnimationUtils.flattenJSON(\n\t\t\t\t\t\t\tanimationKeys, times, values, propertyName );\n\n\t\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tvar tracks = [];\n\n\t\t\tvar clipName = animation.name || 'default';\n\t\t\t// automatic length determination in AnimationClip.\n\t\t\tvar duration = animation.length || -1;\n\t\t\tvar fps = animation.fps || 30;\n\n\t\t\tvar hierarchyTracks = animation.hierarchy || [];\n\n\t\t\tfor ( var h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\t\tvar animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t\t// skip empty tracks\n\t\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t\t// process morph targets in a way exactly compatible\n\t\t\t\t// with AnimationHandler.init( animation )\n\t\t\t\tif ( animationKeys[0].morphTargets ) {\n\n\t\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\t\tvar morphTargetNames = {};\n\t\t\t\t\tfor ( var k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\t\tif ( animationKeys[k].morphTargets ) {\n\n\t\t\t\t\t\t\tfor ( var m = 0; m < animationKeys[k].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[k].morphTargets[m] ] = -1;\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\t// create a track for each morph target with all zero\n\t\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t\t// the morphTarget is named.\n\t\t\t\t\tfor ( var morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\t\tvar times = [];\n\t\t\t\t\t\tvar values = [];\n\n\t\t\t\t\t\tfor ( var m = 0;\n\t\t\t\t\t\t\t\tm !== animationKeys[k].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\t\tvar animationKey = animationKeys[k];\n\n\t\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttracks.push( new NumberKeyframeTrack(\n\t\t\t\t\t\t\t\t'.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tduration = morphTargetNames.length * ( fps || 1.0 );\n\n\t\t\t\t} else {\n\t\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\t\tvar boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tracks.length === 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar clip = new AnimationClip( clipName, duration, tracks );\n\n\t\t\treturn clip;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MaterialLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.textures = {};\n\n\t}\n\n\tObject.assign( MaterialLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTextures: function ( value ) {\n\n\t\t\tthis.textures = value;\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar textures = this.textures;\n\n\t\t\tfunction getTexture( name ) {\n\n\t\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t\t}\n\n\t\t\t\treturn textures[ name ];\n\n\t\t\t}\n\n\t\t\tvar material = new Materials[ json.type ]();\n\n\t\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\t\tif ( json.color !== undefined ) material.color.setHex( json.color );\n\t\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\t\tif ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\t\tif ( json.specular !== undefined ) material.specular.setHex( json.specular );\n\t\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\t\tif ( json.uniforms !== undefined ) material.uniforms = json.uniforms;\n\t\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\t\tif ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;\n\t\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\t\tif ( json.shading !== undefined ) material.shading = json.shading;\n\t\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\t\t\tif ( json.skinning !== undefined ) material.skinning = json.skinning;\n\t\t\tif ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;\n\n\t\t\t// for PointsMaterial\n\n\t\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t\t// maps\n\n\t\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\n\t\t\tif ( json.alphaMap !== undefined ) {\n\n\t\t\t\tmaterial.alphaMap = getTexture( json.alphaMap );\n\t\t\t\tmaterial.transparent = true;\n\n\t\t\t}\n\n\t\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\t\tvar normalScale = json.normalScale;\n\n\t\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t\t}\n\n\t\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\n\t\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\n\t\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\n\t\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\t\t// MultiMaterial\n\n\t\t\tif ( json.materials !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.materials.length; i < l; i ++ ) {\n\n\t\t\t\t\tmaterial.materials.push( this.parse( json.materials[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn material;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometryLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( BufferGeometryLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar geometry = new BufferGeometry();\n\n\t\t\tvar index = json.data.index;\n\n\t\t\tvar TYPED_ARRAYS = {\n\t\t\t\t'Int8Array': Int8Array,\n\t\t\t\t'Uint8Array': Uint8Array,\n\t\t\t\t'Uint8ClampedArray': Uint8ClampedArray,\n\t\t\t\t'Int16Array': Int16Array,\n\t\t\t\t'Uint16Array': Uint16Array,\n\t\t\t\t'Int32Array': Int32Array,\n\t\t\t\t'Uint32Array': Uint32Array,\n\t\t\t\t'Float32Array': Float32Array,\n\t\t\t\t'Float64Array': Float64Array\n\t\t\t};\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ index.type ]( index.array );\n\t\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tvar attributes = json.data.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );\n\n\t\t\t\tgeometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) );\n\n\t\t\t}\n\n\t\t\tvar groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\t\tif ( groups !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = json.data.boundingSphere;\n\n\t\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\t\tvar center = new Vector3();\n\n\t\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Loader() {\n\n\t\tthis.onLoadStart = function () {};\n\t\tthis.onLoadProgress = function () {};\n\t\tthis.onLoadComplete = function () {};\n\n\t}\n\n\tLoader.prototype = {\n\n\t\tconstructor: Loader,\n\n\t\tcrossOrigin: undefined,\n\n\t\textractUrlBase: function ( url ) {\n\n\t\t\tvar parts = url.split( '/' );\n\n\t\t\tif ( parts.length === 1 ) return './';\n\n\t\t\tparts.pop();\n\n\t\t\treturn parts.join( '/' ) + '/';\n\n\t\t},\n\n\t\tinitMaterials: function ( materials, texturePath, crossOrigin ) {\n\n\t\t\tvar array = [];\n\n\t\t\tfor ( var i = 0; i < materials.length; ++ i ) {\n\n\t\t\t\tarray[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tcreateMaterial: ( function () {\n\n\t\t\tvar color, textureLoader, materialLoader;\n\n\t\t\treturn function createMaterial( m, texturePath, crossOrigin ) {\n\n\t\t\t\tif ( color === undefined ) color = new Color();\n\t\t\t\tif ( textureLoader === undefined ) textureLoader = new TextureLoader();\n\t\t\t\tif ( materialLoader === undefined ) materialLoader = new MaterialLoader();\n\n\t\t\t\t// convert from old material format\n\n\t\t\t\tvar textures = {};\n\n\t\t\t\tfunction loadTexture( path, repeat, offset, wrap, anisotropy ) {\n\n\t\t\t\t\tvar fullPath = texturePath + path;\n\t\t\t\t\tvar loader = Loader.Handlers.get( fullPath );\n\n\t\t\t\t\tvar texture;\n\n\t\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\t\ttexture = loader.load( fullPath );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttextureLoader.setCrossOrigin( crossOrigin );\n\t\t\t\t\t\ttexture = textureLoader.load( fullPath );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( repeat !== undefined ) {\n\n\t\t\t\t\t\ttexture.repeat.fromArray( repeat );\n\n\t\t\t\t\t\tif ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\t\t\ttexture.offset.fromArray( offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( wrap !== undefined ) {\n\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;\n\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( anisotropy !== undefined ) {\n\n\t\t\t\t\t\ttexture.anisotropy = anisotropy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar uuid = _Math.generateUUID();\n\n\t\t\t\t\ttextures[ uuid ] = texture;\n\n\t\t\t\t\treturn uuid;\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tvar json = {\n\t\t\t\t\tuuid: _Math.generateUUID(),\n\t\t\t\t\ttype: 'MeshLambertMaterial'\n\t\t\t\t};\n\n\t\t\t\tfor ( var name in m ) {\n\n\t\t\t\t\tvar value = m[ name ];\n\n\t\t\t\t\tswitch ( name ) {\n\t\t\t\t\t\tcase 'DbgColor':\n\t\t\t\t\t\tcase 'DbgIndex':\n\t\t\t\t\t\tcase 'opticalDensity':\n\t\t\t\t\t\tcase 'illumination':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'DbgName':\n\t\t\t\t\t\t\tjson.name = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'blending':\n\t\t\t\t\t\t\tjson.blending = BlendingMode[ value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorAmbient':\n\t\t\t\t\t\tcase 'mapAmbient':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorDiffuse':\n\t\t\t\t\t\t\tjson.color = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorSpecular':\n\t\t\t\t\t\t\tjson.specular = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorEmissive':\n\t\t\t\t\t\t\tjson.emissive = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'specularCoef':\n\t\t\t\t\t\t\tjson.shininess = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'shading':\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuse':\n\t\t\t\t\t\t\tjson.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuseRepeat':\n\t\t\t\t\t\tcase 'mapDiffuseOffset':\n\t\t\t\t\t\tcase 'mapDiffuseWrap':\n\t\t\t\t\t\tcase 'mapDiffuseAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissive':\n\t\t\t\t\t\t\tjson.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissiveRepeat':\n\t\t\t\t\t\tcase 'mapEmissiveOffset':\n\t\t\t\t\t\tcase 'mapEmissiveWrap':\n\t\t\t\t\t\tcase 'mapEmissiveAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLight':\n\t\t\t\t\t\t\tjson.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLightRepeat':\n\t\t\t\t\t\tcase 'mapLightOffset':\n\t\t\t\t\t\tcase 'mapLightWrap':\n\t\t\t\t\t\tcase 'mapLightAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAO':\n\t\t\t\t\t\t\tjson.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAORepeat':\n\t\t\t\t\t\tcase 'mapAOOffset':\n\t\t\t\t\t\tcase 'mapAOWrap':\n\t\t\t\t\t\tcase 'mapAOAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBump':\n\t\t\t\t\t\t\tjson.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpScale':\n\t\t\t\t\t\t\tjson.bumpScale = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpRepeat':\n\t\t\t\t\t\tcase 'mapBumpOffset':\n\t\t\t\t\t\tcase 'mapBumpWrap':\n\t\t\t\t\t\tcase 'mapBumpAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormal':\n\t\t\t\t\t\t\tjson.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalFactor':\n\t\t\t\t\t\t\tjson.normalScale = [ value, value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalRepeat':\n\t\t\t\t\t\tcase 'mapNormalOffset':\n\t\t\t\t\t\tcase 'mapNormalWrap':\n\t\t\t\t\t\tcase 'mapNormalAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecular':\n\t\t\t\t\t\t\tjson.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecularRepeat':\n\t\t\t\t\t\tcase 'mapSpecularOffset':\n\t\t\t\t\t\tcase 'mapSpecularWrap':\n\t\t\t\t\t\tcase 'mapSpecularAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalness':\n\t\t\t\t\t\t\tjson.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalnessRepeat':\n\t\t\t\t\t\tcase 'mapMetalnessOffset':\n\t\t\t\t\t\tcase 'mapMetalnessWrap':\n\t\t\t\t\t\tcase 'mapMetalnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughness':\n\t\t\t\t\t\t\tjson.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughnessRepeat':\n\t\t\t\t\t\tcase 'mapRoughnessOffset':\n\t\t\t\t\t\tcase 'mapRoughnessWrap':\n\t\t\t\t\t\tcase 'mapRoughnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlpha':\n\t\t\t\t\t\t\tjson.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlphaRepeat':\n\t\t\t\t\t\tcase 'mapAlphaOffset':\n\t\t\t\t\t\tcase 'mapAlphaWrap':\n\t\t\t\t\t\tcase 'mapAlphaAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'flipSided':\n\t\t\t\t\t\t\tjson.side = BackSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'doubleSided':\n\t\t\t\t\t\t\tjson.side = DoubleSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );\n\t\t\t\t\t\t\tjson.opacity = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'depthTest':\n\t\t\t\t\t\tcase 'depthWrite':\n\t\t\t\t\t\tcase 'colorWrite':\n\t\t\t\t\t\tcase 'opacity':\n\t\t\t\t\t\tcase 'reflectivity':\n\t\t\t\t\t\tcase 'transparent':\n\t\t\t\t\t\tcase 'visible':\n\t\t\t\t\t\tcase 'wireframe':\n\t\t\t\t\t\t\tjson[ name ] = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'vertexColors':\n\t\t\t\t\t\t\tif ( value === true ) json.vertexColors = VertexColors;\n\t\t\t\t\t\t\tif ( value === 'face' ) json.vertexColors = FaceColors;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.Loader.createMaterial: Unsupported', name, value );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.type === 'MeshBasicMaterial' ) delete json.emissive;\n\t\t\t\tif ( json.type !== 'MeshPhongMaterial' ) delete json.specular;\n\n\t\t\t\tif ( json.opacity < 1 ) json.transparent = true;\n\n\t\t\t\tmaterialLoader.setTextures( textures );\n\n\t\t\t\treturn materialLoader.parse( json );\n\n\t\t\t};\n\n\t\t} )()\n\n\t};\n\n\tLoader.Handlers = {\n\n\t\thandlers: [],\n\n\t\tadd: function ( regex, loader ) {\n\n\t\t\tthis.handlers.push( regex, loader );\n\n\t\t},\n\n\t\tget: function ( file ) {\n\n\t\t\tvar handlers = this.handlers;\n\n\t\t\tfor ( var i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tvar regex = handlers[ i ];\n\t\t\t\tvar loader = handlers[ i + 1 ];\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\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction JSONLoader( manager ) {\n\n\t\tif ( typeof manager === 'boolean' ) {\n\n\t\t\tconsole.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );\n\t\t\tmanager = undefined;\n\n\t\t}\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\tthis.withCredentials = false;\n\n\t}\n\n\tObject.assign( JSONLoader.prototype, {\n\n\t\tload: function( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texturePath = this.texturePath && ( typeof this.texturePath === \"string\" ) ? this.texturePath : Loader.prototype.extractUrlBase( url );\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = JSON.parse( text );\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata !== undefined ) {\n\n\t\t\t\t\tvar type = metadata.type;\n\n\t\t\t\t\tif ( type !== undefined ) {\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'object' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'scene' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' );\n\t\t\t\t\t\t\treturn;\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\tvar object = scope.parse( json, texturePath );\n\t\t\t\tonLoad( object.geometry, object.materials );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tparse: function ( json, texturePath ) {\n\n\t\t\tvar geometry = new Geometry(),\n\t\t\tscale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0;\n\n\t\t\tparseModel( scale );\n\n\t\t\tparseSkin();\n\t\t\tparseMorphing( scale );\n\t\t\tparseAnimations();\n\n\t\t\tgeometry.computeFaceNormals();\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\tfunction parseModel( scale ) {\n\n\t\t\t\tfunction isBitSet( value, position ) {\n\n\t\t\t\t\treturn value & ( 1 << position );\n\n\t\t\t\t}\n\n\t\t\t\tvar i, j, fi,\n\n\t\t\t\toffset, zLength,\n\n\t\t\tcolorIndex, normalIndex, uvIndex, materialIndex,\n\n\t\t\t\ttype,\n\t\t\t\tisQuad,\n\t\t\t\thasMaterial,\n\t\t\t\thasFaceVertexUv,\n\t\t\t\thasFaceNormal, hasFaceVertexNormal,\n\t\t\t\thasFaceColor, hasFaceVertexColor,\n\n\t\t\tvertex, face, faceA, faceB, hex, normal,\n\n\t\t\t\tuvLayer, uv, u, v,\n\n\t\t\t\tfaces = json.faces,\n\t\t\t\tvertices = json.vertices,\n\t\t\t\tnormals = json.normals,\n\t\t\t\tcolors = json.colors,\n\n\t\t\t\tnUvLayers = 0;\n\n\t\t\t\tif ( json.uvs !== undefined ) {\n\n\t\t\t\t\t// disregard empty arrays\n\n\t\t\t\t\tfor ( i = 0; i < json.uvs.length; i ++ ) {\n\n\t\t\t\t\t\tif ( json.uvs[ i ].length ) nUvLayers ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\tgeometry.faceVertexUvs[ i ] = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = vertices.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\tvertex = new Vector3();\n\n\t\t\t\t\tvertex.x = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.y = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.z = vertices[ offset ++ ] * scale;\n\n\t\t\t\t\tgeometry.vertices.push( vertex );\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = faces.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\ttype = faces[ offset ++ ];\n\n\n\t\t\t\t\tisQuad = isBitSet( type, 0 );\n\t\t\t\t\thasMaterial = isBitSet( type, 1 );\n\t\t\t\t\thasFaceVertexUv = isBitSet( type, 3 );\n\t\t\t\t\thasFaceNormal = isBitSet( type, 4 );\n\t\t\t\t\thasFaceVertexNormal = isBitSet( type, 5 );\n\t\t\t\t\thasFaceColor\t = isBitSet( type, 6 );\n\t\t\t\t\thasFaceVertexColor = isBitSet( type, 7 );\n\n\t\t\t\t\t// console.log(\"type\", type, \"bits\", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);\n\n\t\t\t\t\tif ( isQuad ) {\n\n\t\t\t\t\t\tfaceA = new Face3();\n\t\t\t\t\t\tfaceA.a = faces[ offset ];\n\t\t\t\t\t\tfaceA.b = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceA.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\tfaceB = new Face3();\n\t\t\t\t\t\tfaceB.a = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceB.b = faces[ offset + 2 ];\n\t\t\t\t\t\tfaceB.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tfaceA.materialIndex = materialIndex;\n\t\t\t\t\t\t\tfaceB.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi + 1 ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tif ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );\n\t\t\t\t\t\t\t\t\tif ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );\n\n\t\t\t\t\t\t\t\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\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tfaceA.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tfaceB.normal.copy( faceA.normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexNormals.push( normal );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\tfaceA.color.setHex( hex );\n\t\t\t\t\t\t\tfaceB.color.setHex( hex );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( faceA );\n\t\t\t\t\t\tgeometry.faces.push( faceB );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface = new Face3();\n\t\t\t\t\t\tface.a = faces[ offset ++ ];\n\t\t\t\t\t\tface.b = faces[ offset ++ ];\n\t\t\t\t\t\tface.c = faces[ offset ++ ];\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ].push( uv );\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\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tface.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tface.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.color.setHex( colors[ colorIndex ] );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\tface.vertexColors.push( new Color( colors[ colorIndex ] ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( face );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseSkin() {\n\n\t\t\t\tvar influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;\n\n\t\t\t\tif ( json.skinWeights ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar x = json.skinWeights[ i ];\n\t\t\t\t\t\tvar y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;\n\t\t\t\t\t\tvar z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;\n\t\t\t\t\t\tvar w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinWeights.push( new Vector4( x, y, z, w ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.skinIndices ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar a = json.skinIndices[ i ];\n\t\t\t\t\t\tvar b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;\n\t\t\t\t\t\tvar c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;\n\t\t\t\t\t\tvar d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinIndices.push( new Vector4( a, b, c, d ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.bones = json.bones;\n\n\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {\n\n\t\t\t\t\tconsole.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +\n\t\t\t\t\t\tgeometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseMorphing( scale ) {\n\n\t\t\t\tif ( json.morphTargets !== undefined ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tgeometry.morphTargets[ i ] = {};\n\t\t\t\t\t\tgeometry.morphTargets[ i ].name = json.morphTargets[ i ].name;\n\t\t\t\t\t\tgeometry.morphTargets[ i ].vertices = [];\n\n\t\t\t\t\t\tvar dstVertices = geometry.morphTargets[ i ].vertices;\n\t\t\t\t\t\tvar srcVertices = json.morphTargets[ i ].vertices;\n\n\t\t\t\t\t\tfor ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {\n\n\t\t\t\t\t\t\tvar vertex = new Vector3();\n\t\t\t\t\t\t\tvertex.x = srcVertices[ v ] * scale;\n\t\t\t\t\t\t\tvertex.y = srcVertices[ v + 1 ] * scale;\n\t\t\t\t\t\t\tvertex.z = srcVertices[ v + 2 ] * scale;\n\n\t\t\t\t\t\t\tdstVertices.push( vertex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.morphColors !== undefined && json.morphColors.length > 0 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.JSONLoader: \"morphColors\" no longer supported. Using them as face colors.' );\n\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar morphColors = json.morphColors[ 0 ].colors;\n\n\t\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tfaces[ i ].color.fromArray( morphColors, i * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseAnimations() {\n\n\t\t\t\tvar outputAnimations = [];\n\n\t\t\t\t// parse old style Bone/Hierarchy animations\n\t\t\t\tvar animations = [];\n\n\t\t\t\tif ( json.animation !== undefined ) {\n\n\t\t\t\t\tanimations.push( json.animation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.animations !== undefined ) {\n\n\t\t\t\t\tif ( json.animations.length ) {\n\n\t\t\t\t\t\tanimations = animations.concat( json.animations );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tanimations.push( json.animations );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0; i < animations.length; i ++ ) {\n\n\t\t\t\t\tvar clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones );\n\t\t\t\t\tif ( clip ) outputAnimations.push( clip );\n\n\t\t\t\t}\n\n\t\t\t\t// parse implicit morph animations\n\t\t\t\tif ( geometry.morphTargets ) {\n\n\t\t\t\t\t// TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary.\n\t\t\t\t\tvar morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );\n\t\t\t\t\toutputAnimations = outputAnimations.concat( morphAnimationClips );\n\n\t\t\t\t}\n\n\t\t\t\tif ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;\n\n\t\t\t}\n\n\t\t\tif ( json.materials === undefined || json.materials.length === 0 ) {\n\n\t\t\t\treturn { geometry: geometry };\n\n\t\t\t} else {\n\n\t\t\t\tvar materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin );\n\n\t\t\t\treturn { geometry: geometry, materials: materials };\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ObjectLoader ( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.texturePath = '';\n\n\t}\n\n\tObject.assign( ObjectLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( this.texturePath === '' ) {\n\n\t\t\t\tthis.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );\n\n\t\t\t}\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tscope.parse( JSON.parse( text ), onLoad );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\n\t\t},\n\n\t\tparse: function ( json, onLoad ) {\n\n\t\t\tvar geometries = this.parseGeometries( json.geometries );\n\n\t\t\tvar images = this.parseImages( json.images, function () {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t} );\n\n\t\t\tvar textures = this.parseTextures( json.textures, images );\n\t\t\tvar materials = this.parseMaterials( json.materials, textures );\n\n\t\t\tvar object = this.parseObject( json.object, geometries, materials );\n\n\t\t\tif ( json.animations ) {\n\n\t\t\t\tobject.animations = this.parseAnimations( json.animations );\n\n\t\t\t}\n\n\t\t\tif ( json.images === undefined || json.images.length === 0 ) {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t}\n\n\t\t\treturn object;\n\n\t\t},\n\n\t\tparseGeometries: function ( json ) {\n\n\t\t\tvar geometries = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar geometryLoader = new JSONLoader();\n\t\t\t\tvar bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar geometry;\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\t\tcase 'PlaneGeometry':\n\t\t\t\t\t\tcase 'PlaneBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BoxGeometry':\n\t\t\t\t\t\tcase 'BoxBufferGeometry':\n\t\t\t\t\t\tcase 'CubeGeometry': // backwards compatible\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.depth,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.depthSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CircleGeometry':\n\t\t\t\t\t\tcase 'CircleBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CylinderGeometry':\n\t\t\t\t\t\tcase 'CylinderBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radiusTop,\n\t\t\t\t\t\t\t\tdata.radiusBottom,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'ConeGeometry':\n\t\t\t\t\t\tcase 'ConeBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'SphereGeometry':\n\t\t\t\t\t\tcase 'SphereBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'DodecahedronGeometry':\n\t\t\t\t\t\tcase 'IcosahedronGeometry':\n\t\t\t\t\t\tcase 'OctahedronGeometry':\n\t\t\t\t\t\tcase 'TetrahedronGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.detail\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'RingGeometry':\n\t\t\t\t\t\tcase 'RingBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.innerRadius,\n\t\t\t\t\t\t\t\tdata.outerRadius,\n\t\t\t\t\t\t\t\tdata.thetaSegments,\n\t\t\t\t\t\t\t\tdata.phiSegments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusGeometry':\n\t\t\t\t\t\tcase 'TorusBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.arc\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusKnotGeometry':\n\t\t\t\t\t\tcase 'TorusKnotBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.p,\n\t\t\t\t\t\t\t\tdata.q\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'LatheGeometry':\n\t\t\t\t\t\tcase 'LatheBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.points,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\t\tgeometry = geometryLoader.parse( data.data, this.texturePath ).geometry;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\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\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\n\t\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometries;\n\n\t\t},\n\n\t\tparseMaterials: function ( json, textures ) {\n\n\t\t\tvar materials = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar loader = new MaterialLoader();\n\t\t\t\tloader.setTextures( textures );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar material = loader.parse( json[ i ] );\n\t\t\t\t\tmaterials[ material.uuid ] = material;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn materials;\n\n\t\t},\n\n\t\tparseAnimations: function ( json ) {\n\n\t\t\tvar animations = [];\n\n\t\t\tfor ( var i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tvar clip = AnimationClip.parse( json[ i ] );\n\n\t\t\t\tanimations.push( clip );\n\n\t\t\t}\n\n\t\t\treturn animations;\n\n\t\t},\n\n\t\tparseImages: function ( json, onLoad ) {\n\n\t\t\tvar scope = this;\n\t\t\tvar images = {};\n\n\t\t\tfunction loadImage( url ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\treturn loader.load( url, function () {\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, undefined, function () {\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\t\tvar manager = new LoadingManager( onLoad );\n\n\t\t\t\tvar loader = new ImageLoader( manager );\n\t\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar image = json[ i ];\n\t\t\t\t\tvar path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url;\n\n\t\t\t\t\timages[ image.uuid ] = loadImage( path );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn images;\n\n\t\t},\n\n\t\tparseTextures: function ( json, images ) {\n\n\t\t\tfunction parseConstant( value, type ) {\n\n\t\t\t\tif ( typeof( value ) === 'number' ) return value;\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\t\treturn type[ value ];\n\n\t\t\t}\n\n\t\t\tvar textures = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar texture = new Texture( images[ data.image ] );\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TextureMapping );\n\n\t\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TextureWrapping );\n\t\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TextureWrapping );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TextureFilter );\n\t\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TextureFilter );\n\t\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn textures;\n\n\t\t},\n\n\t\tparseObject: function () {\n\n\t\t\tvar matrix = new Matrix4();\n\n\t\t\treturn function parseObject( data, geometries, materials ) {\n\n\t\t\t\tvar object;\n\n\t\t\t\tfunction getGeometry( name ) {\n\n\t\t\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn geometries[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tfunction getMaterial( name ) {\n\n\t\t\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn materials[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'Scene':\n\n\t\t\t\t\t\tobject = new Scene();\n\n\t\t\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\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\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'AmbientLight':\n\n\t\t\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'DirectionalLight':\n\n\t\t\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\n\t\t\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\n\t\t\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\n\t\t\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Mesh':\n\n\t\t\t\t\t\tvar geometry = getGeometry( data.geometry );\n\t\t\t\t\t\tvar material = getMaterial( data.material );\n\n\t\t\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 ) {\n\n\t\t\t\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LOD':\n\n\t\t\t\t\t\tobject = new LOD();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Line':\n\n\t\t\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LineSegments':\n\n\t\t\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointCloud':\n\t\t\t\t\tcase 'Points':\n\n\t\t\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Sprite':\n\n\t\t\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Group':\n\n\t\t\t\t\t\tobject = new Group();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tobject = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t\tobject.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) object.name = data.name;\n\t\t\t\tif ( data.matrix !== undefined ) {\n\n\t\t\t\t\tmatrix.fromArray( data.matrix );\n\t\t\t\t\tmatrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\t\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\t\t\tif ( data.shadow ) {\n\n\t\t\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\t\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\n\t\t\t\tif ( data.children !== undefined ) {\n\n\t\t\t\t\tfor ( var child in data.children ) {\n\n\t\t\t\t\t\tobject.add( this.parseObject( data.children[ child ], geometries, materials ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.type === 'LOD' ) {\n\n\t\t\t\t\tvar levels = data.levels;\n\n\t\t\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\t\t\tvar level = levels[ l ];\n\t\t\t\t\t\tvar child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn object;\n\n\t\t\t};\n\n\t\t}()\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Extensible curve object\n\t *\n\t * Some common of Curve methods\n\t * .getPoint(t), getTangent(t)\n\t * .getPointAt(u), getTangentAt(u)\n\t * .getPoints(), .getSpacedPoints()\n\t * .getLength()\n\t * .updateArcLengths()\n\t *\n\t * This following classes subclasses THREE.Curve:\n\t *\n\t * -- 2d classes --\n\t * THREE.LineCurve\n\t * THREE.QuadraticBezierCurve\n\t * THREE.CubicBezierCurve\n\t * THREE.SplineCurve\n\t * THREE.ArcCurve\n\t * THREE.EllipseCurve\n\t *\n\t * -- 3d classes --\n\t * THREE.LineCurve3\n\t * THREE.QuadraticBezierCurve3\n\t * THREE.CubicBezierCurve3\n\t * THREE.SplineCurve3\n\t *\n\t * A series of curves can be represented as a THREE.CurvePath\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tAbstract Curve base class\n\t **************************************************************/\n\n\tfunction Curve() {}\n\n\tCurve.prototype = {\n\n\t\tconstructor: Curve,\n\n\t\t// Virtual base class method to overwrite and implement in subclasses\n\t\t//\t- t [0 .. 1]\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tconsole.warn( \"THREE.Curve: Warning, getPoint() not implemented!\" );\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// Get point at relative position in curve according to arc length\n\t\t// - u [0 .. 1]\n\n\t\tgetPointAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getPoint( t );\n\n\t\t},\n\n\t\t// Get sequence of points using getPoint( t )\n\n\t\tgetPoints: function ( divisions ) {\n\n\t\t\tif ( ! divisions ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get sequence of points using getPointAt( u )\n\n\t\tgetSpacedPoints: function ( divisions ) {\n\n\t\t\tif ( ! divisions ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get total curve arc length\n\n\t\tgetLength: function () {\n\n\t\t\tvar lengths = this.getLengths();\n\t\t\treturn lengths[ lengths.length - 1 ];\n\n\t\t},\n\n\t\t// Get list of cumulative segment lengths\n\n\t\tgetLengths: function ( divisions ) {\n\n\t\t\tif ( ! divisions ) divisions = ( this.__arcLengthDivisions ) ? ( this.__arcLengthDivisions ) : 200;\n\n\t\t\tif ( this.cacheArcLengths\n\t\t\t\t&& ( this.cacheArcLengths.length === divisions + 1 )\n\t\t\t\t&& ! this.needsUpdate ) {\n\n\t\t\t\t//console.log( \"cached\", this.cacheArcLengths );\n\t\t\t\treturn this.cacheArcLengths;\n\n\t\t\t}\n\n\t\t\tthis.needsUpdate = false;\n\n\t\t\tvar cache = [];\n\t\t\tvar current, last = this.getPoint( 0 );\n\t\t\tvar p, sum = 0;\n\n\t\t\tcache.push( 0 );\n\n\t\t\tfor ( p = 1; p <= divisions; p ++ ) {\n\n\t\t\t\tcurrent = this.getPoint ( p / divisions );\n\t\t\t\tsum += current.distanceTo( last );\n\t\t\t\tcache.push( sum );\n\t\t\t\tlast = current;\n\n\t\t\t}\n\n\t\t\tthis.cacheArcLengths = cache;\n\n\t\t\treturn cache; // { sums: cache, sum:sum }; Sum is in the last element.\n\n\t\t},\n\n\t\tupdateArcLengths: function() {\n\n\t\t\tthis.needsUpdate = true;\n\t\t\tthis.getLengths();\n\n\t\t},\n\n\t\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\t\tgetUtoTmapping: function ( u, distance ) {\n\n\t\t\tvar arcLengths = this.getLengths();\n\n\t\t\tvar i = 0, il = arcLengths.length;\n\n\t\t\tvar targetArcLength; // The targeted u distance value to get\n\n\t\t\tif ( distance ) {\n\n\t\t\t\ttargetArcLength = distance;\n\n\t\t\t} else {\n\n\t\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t\t}\n\n\t\t\t//var time = Date.now();\n\n\t\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\t\tvar low = 0, high = il - 1, comparison;\n\n\t\t\twhile ( low <= high ) {\n\n\t\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\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\t\tlow = i + 1;\n\n\t\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\t\thigh = i - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thigh = i;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// DONE\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ti = high;\n\n\t\t\t//console.log('b' , i, low, high, Date.now()- time);\n\n\t\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\t\tvar t = i / ( il - 1 );\n\t\t\t\treturn t;\n\n\t\t\t}\n\n\t\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\t\tvar lengthBefore = arcLengths[ i ];\n\t\t\tvar lengthAfter = arcLengths[ i + 1 ];\n\n\t\t\tvar segmentLength = lengthAfter - lengthBefore;\n\n\t\t\t// determine where we are between the 'before' and 'after' points\n\n\t\t\tvar segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t\t// add that fractional amount to t\n\n\t\t\tvar t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\t\treturn t;\n\n\t\t},\n\n\t\t// Returns a unit vector tangent at t\n\t\t// In case any sub curve does not implement its tangent derivation,\n\t\t// 2 points a small delta apart will be used to find its gradient\n\t\t// which seems to give a reasonable approximation\n\n\t\tgetTangent: function( t ) {\n\n\t\t\tvar delta = 0.0001;\n\t\t\tvar t1 = t - delta;\n\t\t\tvar t2 = t + delta;\n\n\t\t\t// Capping in case of danger\n\n\t\t\tif ( t1 < 0 ) t1 = 0;\n\t\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\t\tvar pt1 = this.getPoint( t1 );\n\t\t\tvar pt2 = this.getPoint( t2 );\n\n\t\t\tvar vec = pt2.clone().sub( pt1 );\n\t\t\treturn vec.normalize();\n\n\t\t},\n\n\t\tgetTangentAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getTangent( t );\n\n\t\t},\n\n\t\tcomputeFrenetFrames: function ( segments, closed ) {\n\n\t\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\t\tvar normal = new Vector3();\n\n\t\t\tvar tangents = [];\n\t\t\tvar normals = [];\n\t\t\tvar binormals = [];\n\n\t\t\tvar vec = new Vector3();\n\t\t\tvar mat = new Matrix4();\n\n\t\t\tvar i, u, theta;\n\n\t\t\t// compute the tangent vectors for each segment on the curve\n\n\t\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\t\tu = i / segments;\n\n\t\t\t\ttangents[ i ] = this.getTangentAt( u );\n\t\t\t\ttangents[ i ].normalize();\n\n\t\t\t}\n\n\t\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t\t// and in the direction of the minimum tangent xyz component\n\n\t\t\tnormals[ 0 ] = new Vector3();\n\t\t\tbinormals[ 0 ] = new Vector3();\n\t\t\tvar min = Number.MAX_VALUE;\n\t\t\tvar tx = Math.abs( tangents[ 0 ].x );\n\t\t\tvar ty = Math.abs( tangents[ 0 ].y );\n\t\t\tvar tz = Math.abs( tangents[ 0 ].z );\n\n\t\t\tif ( tx <= min ) {\n\n\t\t\t\tmin = tx;\n\t\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( ty <= min ) {\n\n\t\t\t\tmin = ty;\n\t\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t\t}\n\n\t\t\tif ( tz <= min ) {\n\n\t\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t\t}\n\n\t\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\t\tvec.normalize();\n\n\t\t\t\t\ttheta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t\t}\n\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\t\tif ( closed === true ) {\n\n\t\t\t\ttheta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\t\ttheta /= segments;\n\n\t\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\t\ttheta = - theta;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t\t// twist a little...\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttangents: tangents,\n\t\t\t\tnormals: normals,\n\t\t\t\tbinormals: binormals\n\t\t\t};\n\n\t\t}\n\n\t};\n\n\t// TODO: Transformation for Curves?\n\n\t/**************************************************************\n\t *\t3D Curves\n\t **************************************************************/\n\n\t// A Factory method for creating new curve subclasses\n\n\tCurve.create = function ( constructor, getPointFunc ) {\n\n\t\tconstructor.prototype = Object.create( Curve.prototype );\n\t\tconstructor.prototype.constructor = constructor;\n\t\tconstructor.prototype.getPoint = getPointFunc;\n\n\t\treturn constructor;\n\n\t};\n\n\t/**************************************************************\n\t *\tLine\n\t **************************************************************/\n\n\tfunction LineCurve( v1, v2 ) {\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve.prototype = Object.create( Curve.prototype );\n\tLineCurve.prototype.constructor = LineCurve;\n\n\tLineCurve.prototype.isLineCurve = true;\n\n\tLineCurve.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar point = this.v2.clone().sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\treturn point;\n\n\t};\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\n\tLineCurve.prototype.getPointAt = function ( u ) {\n\n\t\treturn this.getPoint( u );\n\n\t};\n\n\tLineCurve.prototype.getTangent = function( t ) {\n\n\t\tvar tangent = this.v2.clone().sub( this.v1 );\n\n\t\treturn tangent.normalize();\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tCurved Path - a curve path is simply a array of connected\n\t * curves, but retains the api of a curve\n\t **************************************************************/\n\n\tfunction CurvePath() {\n\n\t\tthis.curves = [];\n\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tCurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {\n\n\t\tconstructor: CurvePath,\n\n\t\tadd: function ( curve ) {\n\n\t\t\tthis.curves.push( curve );\n\n\t\t},\n\n\t\tclosePath: function () {\n\n\t\t\t// Add a line curve if start and end of lines are not connected\n\t\t\tvar startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\t\tvar endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tvar d = t * this.getLength();\n\t\t\tvar curveLengths = this.getCurveLengths();\n\t\t\tvar i = 0;\n\n\t\t\t// To think about boundaries points.\n\n\t\t\twhile ( i < curveLengths.length ) {\n\n\t\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\t\tvar diff = curveLengths[ i ] - d;\n\t\t\t\t\tvar curve = this.curves[ i ];\n\n\t\t\t\t\tvar segmentLength = curve.getLength();\n\t\t\t\t\tvar u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\t\treturn curve.getPointAt( u );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t\t// loop where sum != 0, sum > d , sum+1 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\tpoints.push( points[ 0 ] );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t/**************************************************************\n\t\t *\tCreate Geometries Helpers\n\t\t **************************************************************/\n\n\t\t/// Generate geometry from path points (for Line or Points objects)\n\n\t\tcreatePointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\t// Generate geometry from equidistant sampling along the path\n\n\t\tcreateSpacedPointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getSpacedPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\tcreateGeometry: function ( points ) {\n\n\t\t\tvar geometry = new Geometry();\n\n\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tvar point = points[ i ];\n\t\t\t\tgeometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\t/**************************************************************\n\t *\tEllipse curve\n\t **************************************************************/\n\n\tfunction EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\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 || 0;\n\n\t}\n\n\tEllipseCurve.prototype = Object.create( Curve.prototype );\n\tEllipseCurve.prototype.constructor = EllipseCurve;\n\n\tEllipseCurve.prototype.isEllipseCurve = true;\n\n\tEllipseCurve.prototype.getPoint = function( t ) {\n\n\t\tvar twoPi = Math.PI * 2;\n\t\tvar deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tvar 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\tvar angle = this.aStartAngle + t * deltaAngle;\n\t\tvar x = this.aX + this.xRadius * Math.cos( angle );\n\t\tvar y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tvar cos = Math.cos( this.aRotation );\n\t\t\tvar sin = Math.sin( this.aRotation );\n\n\t\t\tvar tx = x - this.aX;\n\t\t\tvar 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 new Vector2( x, y );\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tvar CurveUtils = {\n\n\t\ttangentQuadraticBezier: function ( t, p0, p1, p2 ) {\n\n\t\t\treturn 2 * ( 1 - t ) * ( p1 - p0 ) + 2 * t * ( p2 - p1 );\n\n\t\t},\n\n\t\t// Puay Bing, thanks for helping with this derivative!\n\n\t\ttangentCubicBezier: function ( t, p0, p1, p2, p3 ) {\n\n\t\t\treturn - 3 * p0 * ( 1 - t ) * ( 1 - t ) +\n\t\t\t\t3 * p1 * ( 1 - t ) * ( 1 - t ) - 6 * t * p1 * ( 1 - t ) +\n\t\t\t\t6 * t * p2 * ( 1 - t ) - 3 * t * t * p2 +\n\t\t\t\t3 * t * t * p3;\n\n\t\t},\n\n\t\ttangentSpline: function ( t, p0, p1, p2, p3 ) {\n\n\t\t\t// To check if my formulas are correct\n\n\t\t\tvar h00 = 6 * t * t - 6 * t; \t// derived from 2t^3 − 3t^2 + 1\n\t\t\tvar h10 = 3 * t * t - 4 * t + 1; // t^3 − 2t^2 + t\n\t\t\tvar h01 = - 6 * t * t + 6 * t; \t// − 2t3 + 3t2\n\t\t\tvar h11 = 3 * t * t - 2 * t;\t// t3 − t2\n\n\t\t\treturn h00 + h10 + h01 + h11;\n\n\t\t},\n\n\t\t// Catmull-Rom\n\n\t\tinterpolate: function( p0, p1, p2, p3, t ) {\n\n\t\t\tvar v0 = ( p2 - p0 ) * 0.5;\n\t\t\tvar v1 = ( p3 - p1 ) * 0.5;\n\t\t\tvar t2 = t * t;\n\t\t\tvar t3 = t * t2;\n\t\t\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t\t}\n\n\t};\n\n\t/**************************************************************\n\t *\tSpline curve\n\t **************************************************************/\n\n\tfunction SplineCurve( points /* array of Vector2 */ ) {\n\n\t\tthis.points = ( points === undefined ) ? [] : points;\n\n\t}\n\n\tSplineCurve.prototype = Object.create( Curve.prototype );\n\tSplineCurve.prototype.constructor = SplineCurve;\n\n\tSplineCurve.prototype.isSplineCurve = true;\n\n\tSplineCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar point = ( points.length - 1 ) * t;\n\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tvar point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tvar point1 = points[ intPoint ];\n\t\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tvar interpolate = CurveUtils.interpolate;\n\n\t\treturn new Vector2(\n\t\t\tinterpolate( point0.x, point1.x, point2.x, point3.x, weight ),\n\t\t\tinterpolate( point0.y, point1.y, point2.y, point3.y, weight )\n\t\t);\n\n\t};\n\n\t/**************************************************************\n\t *\tCubic Bezier curve\n\t **************************************************************/\n\n\tfunction CubicBezierCurve( v0, v1, v2, v3 ) {\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\tCubicBezierCurve.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve.prototype.constructor = CubicBezierCurve;\n\n\tCubicBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar b3 = ShapeUtils.b3;\n\n\t\treturn new Vector2(\n\t\t\tb3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ),\n\t\t\tb3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y )\n\t\t);\n\n\t};\n\n\tCubicBezierCurve.prototype.getTangent = function( t ) {\n\n\t\tvar tangentCubicBezier = CurveUtils.tangentCubicBezier;\n\n\t\treturn new Vector2(\n\t\t\ttangentCubicBezier( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ),\n\t\t\ttangentCubicBezier( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y )\n\t\t).normalize();\n\n\t};\n\n\t/**************************************************************\n\t *\tQuadratic Bezier curve\n\t **************************************************************/\n\n\n\tfunction QuadraticBezierCurve( v0, v1, v2 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;\n\n\n\tQuadraticBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar b2 = ShapeUtils.b2;\n\n\t\treturn new Vector2(\n\t\t\tb2( t, this.v0.x, this.v1.x, this.v2.x ),\n\t\t\tb2( t, this.v0.y, this.v1.y, this.v2.y )\n\t\t);\n\n\t};\n\n\n\tQuadraticBezierCurve.prototype.getTangent = function( t ) {\n\n\t\tvar tangentQuadraticBezier = CurveUtils.tangentQuadraticBezier;\n\n\t\treturn new Vector2(\n\t\t\ttangentQuadraticBezier( t, this.v0.x, this.v1.x, this.v2.x ),\n\t\t\ttangentQuadraticBezier( t, this.v0.y, this.v1.y, this.v2.y )\n\t\t).normalize();\n\n\t};\n\n\tvar PathPrototype = Object.assign( Object.create( CurvePath.prototype ), {\n\n\t\tfromPoints: function ( vectors ) {\n\n\t\t\tthis.moveTo( vectors[ 0 ].x, vectors[ 0 ].y );\n\n\t\t\tfor ( var i = 1, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lineTo( vectors[ i ].x, vectors[ i ].y );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tvar curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tvar curve = new QuadraticBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tvar curve = new CubicBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts /*Array of Vector*/ ) {\n\n\t\t\tvar npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\t\tvar curve = new SplineCurve( npts );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\t},\n\n\t\tarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tabsarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t},\n\n\t\tabsellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t\t// if a previous curve is present, attempt to join\n\t\t\t\tvar firstPoint = curve.getPoint( 0 );\n\n\t\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tvar lastPoint = curve.getPoint( 1 );\n\t\t\tthis.currentPoint.copy( lastPoint );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Defines a 2d shape plane using paths.\n\t **/\n\n\t// STEP 1 Create a path.\n\t// STEP 2 Turn path into shape.\n\t// STEP 3 ExtrudeGeometry takes in Shape/Shapes\n\t// STEP 3a - Extract points from each shape, turn to vertices\n\t// STEP 3b - Triangulate each shape, add faces.\n\n\tfunction Shape() {\n\n\t\tPath.apply( this, arguments );\n\n\t\tthis.holes = [];\n\n\t}\n\n\tShape.prototype = Object.assign( Object.create( PathPrototype ), {\n\n\t\tconstructor: Shape,\n\n\t\tgetPointsHoles: function ( divisions ) {\n\n\t\t\tvar holesPts = [];\n\n\t\t\tfor ( var i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t\t}\n\n\t\t\treturn holesPts;\n\n\t\t},\n\n\t\t// Get points of shape and holes (keypoints based on segments parameter)\n\n\t\textractAllPoints: function ( divisions ) {\n\n\t\t\treturn {\n\n\t\t\t\tshape: this.getPoints( divisions ),\n\t\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t\t};\n\n\t\t},\n\n\t\textractPoints: function ( divisions ) {\n\n\t\t\treturn this.extractAllPoints( divisions );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Creates free form 2d path using series of points, lines or curves.\n\t *\n\t **/\n\n\tfunction Path( points ) {\n\n\t\tCurvePath.call( this );\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.fromPoints( points );\n\n\t\t}\n\n\t}\n\n\tPath.prototype = PathPrototype;\n\tPathPrototype.constructor = Path;\n\n\n\t// minimal class for proxing functions to Path. Replaces old \"extractSubpaths()\"\n\tfunction ShapePath() {\n\t\tthis.subPaths = [];\n\t\tthis.currentPath = null;\n\t}\n\n\tShapePath.prototype = {\n\t\tmoveTo: function ( x, y ) {\n\t\t\tthis.currentPath = new Path();\n\t\t\tthis.subPaths.push(this.currentPath);\n\t\t\tthis.currentPath.moveTo( x, y );\n\t\t},\n\t\tlineTo: function ( x, y ) {\n\t\t\tthis.currentPath.lineTo( x, y );\n\t\t},\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\t\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\t\t},\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\t\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\t\t},\n\t\tsplineThru: function ( pts ) {\n\t\t\tthis.currentPath.splineThru( pts );\n\t\t},\n\n\t\ttoShapes: function ( isCCW, noHoles ) {\n\n\t\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\t\tvar shapes = [];\n\n\t\t\t\tfor ( var i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar tmpPath = inSubpaths[ i ];\n\n\t\t\t\t\tvar tmpShape = new Shape();\n\t\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t\t}\n\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\t\tvar polyLen = inPolygon.length;\n\n\t\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\t\tvar inside = false;\n\t\t\t\tfor ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\t\tvar edgeLowPt = inPolygon[ p ];\n\t\t\t\t\tvar edgeHighPt = inPolygon[ q ];\n\n\t\t\t\t\tvar edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\t\tvar edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t\t// not parallel\n\t\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\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\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\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\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// parallel or collinear\n\t\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\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\t// continue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn\tinside;\n\n\t\t\t}\n\n\t\t\tvar isClockWise = ShapeUtils.isClockWise;\n\n\t\t\tvar subPaths = this.subPaths;\n\t\t\tif ( subPaths.length === 0 ) return [];\n\n\t\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tvar solid, tmpPath, tmpShape, shapes = [];\n\n\t\t\tif ( subPaths.length === 1 ) {\n\n\t\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\t\ttmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tvar holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\t\tvar betterShapeHoles = [];\n\t\t\tvar newShapes = [];\n\t\t\tvar newShapeHoles = [];\n\t\t\tvar mainIdx = 0;\n\t\t\tvar tmpPoints;\n\n\t\t\tnewShapes[ mainIdx ] = undefined;\n\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\tfor ( var i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\t\ttmpPath = subPaths[ i ];\n\t\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\t\tif ( solid ) {\n\n\t\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t\t//console.log('cw', i);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t\t//console.log('ccw', i);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tif ( newShapes.length > 1 ) {\n\n\t\t\t\tvar ambiguous = false;\n\t\t\t\tvar toChange = [];\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tvar sho = newShapeHoles[ sIdx ];\n\n\t\t\t\t\tfor ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\t\tvar ho = sho[ hIdx ];\n\t\t\t\t\t\tvar hole_unassigned = true;\n\n\t\t\t\t\t\tfor ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );\n\t\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\t// console.log(\"ambiguous: \", ambiguous);\n\t\t\t\tif ( toChange.length > 0 ) {\n\n\t\t\t\t\t// console.log(\"to change: \", toChange);\n\t\t\t\t\tif ( ! ambiguous )\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar tmpHoles;\n\n\t\t\tfor ( var i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\t\tfor ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//console.log(\"shape\", shapes);\n\n\t\t\treturn shapes;\n\n\t\t}\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Font( data ) {\n\n\t\tthis.data = data;\n\n\t}\n\n\tObject.assign( Font.prototype, {\n\n\t\tisFont: true,\n\n\t\tgenerateShapes: function ( text, size, divisions ) {\n\n\t\t\tfunction createPaths( text ) {\n\n\t\t\t\tvar chars = String( text ).split( '' );\n\t\t\t\tvar scale = size / data.resolution;\n\t\t\t\tvar offset = 0;\n\n\t\t\t\tvar paths = [];\n\n\t\t\t\tfor ( var i = 0; i < chars.length; i ++ ) {\n\n\t\t\t\t\tvar ret = createPath( chars[ i ], scale, offset );\n\t\t\t\t\toffset += ret.offset;\n\n\t\t\t\t\tpaths.push( ret.path );\n\n\t\t\t\t}\n\n\t\t\t\treturn paths;\n\n\t\t\t}\n\n\t\t\tfunction createPath( c, scale, offset ) {\n\n\t\t\t\tvar glyph = data.glyphs[ c ] || data.glyphs[ '?' ];\n\n\t\t\t\tif ( ! glyph ) return;\n\n\t\t\t\tvar path = new ShapePath();\n\n\t\t\t\tvar pts = [], b2 = ShapeUtils.b2, b3 = ShapeUtils.b3;\n\t\t\t\tvar x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste;\n\n\t\t\t\tif ( glyph.o ) {\n\n\t\t\t\t\tvar outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\t\t\t\tfor ( var i = 0, l = outline.length; i < l; ) {\n\n\t\t\t\t\t\tvar action = outline[ i ++ ];\n\n\t\t\t\t\t\tswitch ( action ) {\n\n\t\t\t\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tb2( t, cpx0, cpx1, cpx );\n\t\t\t\t\t\t\t\t\t\tb2( t, cpy0, cpy1, cpy );\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\tbreak;\n\n\t\t\t\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale;\n\t\t\t\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy2 = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tb3( t, cpx0, cpx1, cpx2, cpx );\n\t\t\t\t\t\t\t\t\t\tb3( t, cpy0, cpy1, cpy2, cpy );\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\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn { offset: glyph.ha * scale, path: path };\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( size === undefined ) size = 100;\n\t\t\tif ( divisions === undefined ) divisions = 4;\n\n\t\t\tvar data = this.data;\n\n\t\t\tvar paths = createPaths( text );\n\t\t\tvar shapes = [];\n\n\t\t\tfor ( var p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FontLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FontLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\t\t\t\tjson = JSON.parse( text.substring( 65, text.length - 2 ) );\n\n\t\t\t\t}\n\n\t\t\t\tvar font = scope.parse( json );\n\n\t\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\treturn new Font( json );\n\n\t\t}\n\n\t} );\n\n\tvar context;\n\n\tfunction getAudioContext() {\n\n\t\tif ( context === undefined ) {\n\n\t\t\tcontext = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn context;\n\n\t}\n\n\t/**\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction AudioLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( AudioLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar context = getAudioContext();\n\n\t\t\t\tcontext.decodeAudioData( buffer, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction StereoCamera() {\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}\n\n\tObject.assign( StereoCamera.prototype, {\n\n\t\tupdate: ( function () {\n\n\t\t\tvar instance, focus, fov, aspect, near, far, zoom;\n\n\t\t\tvar eyeRight = new Matrix4();\n\t\t\tvar eyeLeft = new Matrix4();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov ||\n\t\t\t\t\t\t\t\t\t\t\t\t\taspect !== camera.aspect * this.aspect || near !== camera.near ||\n\t\t\t\t\t\t\t\t\t\t\t\t\tfar !== camera.far || zoom !== camera.zoom;\n\n\t\t\t\tif ( needsUpdate ) {\n\n\t\t\t\t\tinstance = this;\n\t\t\t\t\tfocus = camera.focus;\n\t\t\t\t\tfov = camera.fov;\n\t\t\t\t\taspect = camera.aspect * this.aspect;\n\t\t\t\t\tnear = camera.near;\n\t\t\t\t\tfar = camera.far;\n\t\t\t\t\tzoom = camera.zoom;\n\n\t\t\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t\t\tvar projectionMatrix = camera.projectionMatrix.clone();\n\t\t\t\t\tvar eyeSep = this.eyeSep / 2;\n\t\t\t\t\tvar eyeSepOnProjection = eyeSep * near / focus;\n\t\t\t\t\tvar ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom;\n\t\t\t\t\tvar xmin, xmax;\n\n\t\t\t\t\t// translate xOffset\n\n\t\t\t\t\teyeLeft.elements[ 12 ] = - eyeSep;\n\t\t\t\t\teyeRight.elements[ 12 ] = eyeSep;\n\n\t\t\t\t\t// for left eye\n\n\t\t\t\t\txmin = - ymax * aspect + eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect + eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t\t// for right eye\n\n\t\t\t\t\txmin = - ymax * aspect - eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect - eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\n\t\t\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * Camera for rendering cube maps\n\t *\t- renders scene into axis-aligned cube\n\t *\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CubeCamera( near, far, cubeResolution ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tvar fov = 90, aspect = 1;\n\n\t\tvar cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.up.set( 0, - 1, 0 );\n\t\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\t\tthis.add( cameraPX );\n\n\t\tvar cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.up.set( 0, - 1, 0 );\n\t\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\t\tthis.add( cameraNX );\n\n\t\tvar cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.up.set( 0, 0, 1 );\n\t\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\t\tthis.add( cameraPY );\n\n\t\tvar cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.up.set( 0, 0, - 1 );\n\t\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\t\tthis.add( cameraNY );\n\n\t\tvar cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.up.set( 0, - 1, 0 );\n\t\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\t\tthis.add( cameraPZ );\n\n\t\tvar cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.up.set( 0, - 1, 0 );\n\t\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\t\tthis.add( cameraNZ );\n\n\t\tvar options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };\n\n\t\tthis.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );\n\n\t\tthis.updateCubeMap = function ( renderer, scene ) {\n\n\t\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\t\tvar renderTarget = this.renderTarget;\n\t\t\tvar generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\t\trenderTarget.activeCubeFace = 0;\n\t\t\trenderer.render( scene, cameraPX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 1;\n\t\t\trenderer.render( scene, cameraNX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 2;\n\t\t\trenderer.render( scene, cameraPY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 3;\n\t\t\trenderer.render( scene, cameraNY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 4;\n\t\t\trenderer.render( scene, cameraPZ, renderTarget );\n\n\t\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\t\trenderTarget.activeCubeFace = 5;\n\t\t\trenderer.render( scene, cameraNZ, renderTarget );\n\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t};\n\n\t}\n\n\tCubeCamera.prototype = Object.create( Object3D.prototype );\n\tCubeCamera.prototype.constructor = CubeCamera;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioListener() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = getAudioContext();\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}\n\n\tAudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: AudioListener,\n\n\t\tgetInput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tremoveFilter: function ( ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\t\tthis.gain.connect( this.context.destination );\n\t\t\t\tthis.filter = null;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.filter;\n\n\t\t},\n\n\t\tsetFilter: function ( value ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t\t} else {\n\n\t\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t\t}\n\n\t\t\tthis.filter = value;\n\t\t\tthis.gain.connect( this.filter );\n\t\t\tthis.filter.connect( this.context.destination );\n\n\t\t},\n\n\t\tgetMasterVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\t\tsetMasterVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\t\t\tvar scale = new Vector3();\n\n\t\t\tvar orientation = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tvar listener = this.context.listener;\n\t\t\t\tvar up = this.up;\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, scale );\n\n\t\t\t\torientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t\t\tlistener.setPosition( position.x, position.y, position.z );\n\t\t\t\tlistener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z );\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction Audio( listener ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.context = listener.context;\n\t\tthis.source = this.context.createBufferSource();\n\t\tthis.source.onended = this.onEnded.bind( this );\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.startTime = 0;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis.filters = [];\n\n\t}\n\n\tAudio.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Audio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tsetNodeSource: function ( audioNode ) {\n\n\t\t\tthis.hasPlaybackControl = false;\n\t\t\tthis.sourceType = 'audioNode';\n\t\t\tthis.source = audioNode;\n\t\t\tthis.connect();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetBuffer: function ( audioBuffer ) {\n\n\t\t\tthis.source.buffer = audioBuffer;\n\t\t\tthis.sourceType = 'buffer';\n\n\t\t\tif ( this.autoplay ) this.play();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tplay: function () {\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar source = this.context.createBufferSource();\n\n\t\t\tsource.buffer = this.source.buffer;\n\t\t\tsource.loop = this.source.loop;\n\t\t\tsource.onended = this.source.onended;\n\t\t\tsource.start( 0, this.startTime );\n\t\t\tsource.playbackRate.value = this.playbackRate;\n\n\t\t\tthis.isPlaying = true;\n\n\t\t\tthis.source = source;\n\n\t\t\treturn this.connect();\n\n\t\t},\n\n\t\tpause: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = this.context.currentTime;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = 0;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdisconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilters: function () {\n\n\t\t\treturn this.filters;\n\n\t\t},\n\n\t\tsetFilters: function ( value ) {\n\n\t\t\tif ( ! value ) value = [];\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.disconnect();\n\t\t\t\tthis.filters = value;\n\t\t\t\tthis.connect();\n\n\t\t\t} else {\n\n\t\t\t\tthis.filters = value;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.getFilters()[ 0 ];\n\n\t\t},\n\n\t\tsetFilter: function ( filter ) {\n\n\t\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t\t},\n\n\t\tsetPlaybackRate: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.playbackRate = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.playbackRate.value = this.playbackRate;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetPlaybackRate: function () {\n\n\t\t\treturn this.playbackRate;\n\n\t\t},\n\n\t\tonEnded: function () {\n\n\t\t\tthis.isPlaying = false;\n\n\t\t},\n\n\t\tgetLoop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn this.source.loop;\n\n\t\t},\n\n\t\tsetLoop: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.loop = value;\n\n\t\t},\n\n\t\tgetVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\n\t\tsetVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PositionalAudio( listener ) {\n\n\t\tAudio.call( this, listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tPositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {\n\n\t\tconstructor: PositionalAudio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.panner;\n\n\t\t},\n\n\t\tgetRefDistance: function () {\n\n\t\t\treturn this.panner.refDistance;\n\n\t\t},\n\n\t\tsetRefDistance: function ( value ) {\n\n\t\t\tthis.panner.refDistance = value;\n\n\t\t},\n\n\t\tgetRolloffFactor: function () {\n\n\t\t\treturn this.panner.rolloffFactor;\n\n\t\t},\n\n\t\tsetRolloffFactor: function ( value ) {\n\n\t\t\tthis.panner.rolloffFactor = value;\n\n\t\t},\n\n\t\tgetDistanceModel: function () {\n\n\t\t\treturn this.panner.distanceModel;\n\n\t\t},\n\n\t\tsetDistanceModel: function ( value ) {\n\n\t\t\tthis.panner.distanceModel = value;\n\n\t\t},\n\n\t\tgetMaxDistance: function () {\n\n\t\t\treturn this.panner.maxDistance;\n\n\t\t},\n\n\t\tsetMaxDistance: function ( value ) {\n\n\t\t\tthis.panner.maxDistance = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tposition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tthis.panner.setPosition( position.x, position.y, position.z );\n\n\t\t\t};\n\n\t\t} )()\n\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioAnalyser( audio, fftSize ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\tObject.assign( AudioAnalyser.prototype, {\n\n\t\tgetFrequencyData: function () {\n\n\t\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\t\treturn this.data;\n\n\t\t},\n\n\t\tgetAverageFrequency: function () {\n\n\t\t\tvar value = 0, data = this.getFrequencyData();\n\n\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tvalue += data[ i ];\n\n\t\t\t}\n\n\t\t\treturn value / data.length;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Buffered scene graph property that allows weighted accumulation.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyMixer( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tvar bufferType = Float64Array,\n\t\t\tmixFunction;\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\t\t\tmixFunction = this._slerp;\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\n\t\t\t\tbufferType = Array,\t\tmixFunction = this._select;\t\tbreak;\n\n\t\t\tdefault:\t\t\t\t\tmixFunction = this._lerp;\n\n\t\t}\n\n\t\tthis.buffer = new bufferType( valueSize * 4 );\n\t\t// layout: [ incoming | accu0 | accu1 | orig ]\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\n\t\tthis._mixBufferRegion = mixFunction;\n\n\t\tthis.cumulativeWeight = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\tPropertyMixer.prototype = {\n\n\t\tconstructor: PropertyMixer,\n\n\t\t// accumulate data in the 'incoming' region into 'accu'\n\t\taccumulate: function( accuIndex, weight ) {\n\n\t\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t\t// the weight and shouldn't have made the call in the first place\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tcurrentWeight = this.cumulativeWeight;\n\n\t\t\tif ( currentWeight === 0 ) {\n\n\t\t\t\t// accuN := incoming * weight\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcurrentWeight = weight;\n\n\t\t\t} else {\n\n\t\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\t\tcurrentWeight += weight;\n\t\t\t\tvar mix = weight / currentWeight;\n\t\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = currentWeight;\n\n\t\t},\n\n\t\t// apply the state of 'accu' to the binding when accus differ\n\t\tapply: function( accuIndex ) {\n\n\t\t\tvar stride = this.valueSize,\n\t\t\t\tbuffer = this.buffer,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tweight = this.cumulativeWeight,\n\n\t\t\t\tbinding = this.binding;\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t\tif ( weight < 1 ) {\n\n\t\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\t\tvar originalValueOffset = stride * 3;\n\n\t\t\t\tthis._mixBufferRegion(\n\t\t\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t\t}\n\n\t\t\tfor ( var i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remember the state of the bound property and copy it to both accus\n\t\tsaveOriginalState: function() {\n\n\t\t\tvar binding = this.binding;\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toriginalValueOffset = stride * 3;\n\n\t\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\t\tfor ( var i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t},\n\n\t\t// apply the state previously taken via 'saveOriginalState' to the binding\n\t\trestoreOriginalState: function() {\n\n\t\t\tvar originalValueOffset = this.valueSize * 3;\n\t\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t\t},\n\n\n\t\t// mix functions\n\n\t\t_select: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tif ( t >= 0.5 ) {\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_slerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tQuaternion.slerpFlat( buffer, dstOffset,\n\t\t\t\t\tbuffer, dstOffset, buffer, srcOffset, t );\n\n\t\t},\n\n\t\t_lerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tvar s = 1 - t;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tvar j = dstOffset + i;\n\n\t\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * A reference to a real property in the scene graph.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyBinding( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode(\n\t\t\t\trootNode, this.parsedPath.nodeName ) || rootNode;\n\n\t\tthis.rootNode = rootNode;\n\n\t}\n\n\tPropertyBinding.prototype = {\n\n\t\tconstructor: PropertyBinding,\n\n\t\tgetValue: function getValue_unbound( targetArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.getValue( targetArray, offset );\n\n\t\t\t// Note: This class uses a State pattern on a per-method basis:\n\t\t\t// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n\t\t\t// prototype version of these methods with one that represents\n\t\t\t// the bound state. When the property is not found, the methods\n\t\t\t// become no-ops.\n\n\t\t},\n\n\t\tsetValue: function getValue_unbound( sourceArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.setValue( sourceArray, offset );\n\n\t\t},\n\n\t\t// create getter / setter pair for a property in the scene graph\n\t\tbind: function() {\n\n\t\t\tvar targetObject = this.node,\n\t\t\t\tparsedPath = this.parsedPath,\n\n\t\t\t\tobjectName = parsedPath.objectName,\n\t\t\t\tpropertyName = parsedPath.propertyName,\n\t\t\t\tpropertyIndex = parsedPath.propertyIndex;\n\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\ttargetObject = PropertyBinding.findNode(\n\t\t\t\t\t\tthis.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\t\tthis.node = targetObject;\n\n\t\t\t}\n\n\t\t\t// set fail state so we can just 'return' on error\n\t\t\tthis.getValue = this._getValue_unavailable;\n\t\t\tthis.setValue = this._setValue_unavailable;\n\n\t \t\t// ensure there is a value node\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\tconsole.error( \" trying to update node for track: \" + this.path + \" but it wasn't found.\" );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( objectName ) {\n\n\t\t\t\tvar objectIndex = parsedPath.objectIndex;\n\n\t\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\t\tswitch ( objectName ) {\n\n\t\t\t\t\tcase 'materials':\n\n\t\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material as node does not have a material', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material.materials as node.material does not have a materials array', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bones':\n\n\t\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to bones as node does not have a skeleton', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\t\tfor ( var i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to objectName of node, undefined', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( \" trying to bind to objectIndex of objectName, but is undefined:\", this, targetObject );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// resolve property\n\t\t\tvar nodeProperty = targetObject[ propertyName ];\n\n\t\t\tif ( nodeProperty === undefined ) {\n\n\t\t\t\tvar nodeName = parsedPath.nodeName;\n\n\t\t\t\tconsole.error( \" trying to update property for track: \" + nodeName +\n\t\t\t\t\t\t'.' + propertyName + \" but it wasn't found.\", targetObject );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// determine versioning scheme\n\t\t\tvar versioning = this.Versioning.None;\n\n\t\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\t\tversioning = this.Versioning.NeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t}\n\n\t\t\t// determine how the property gets bound\n\t\t\tvar bindingType = this.BindingType.Direct;\n\n\t\t\tif ( propertyIndex !== undefined ) {\n\t\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\t\tif ( propertyName === \"morphTargetInfluences\" ) {\n\t\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\t// support resolving morphTarget names into indices.\n\t\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphTargets ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) {\n\n\t\t\t\t\t\t\tpropertyIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\t\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else if ( nodeProperty.length !== undefined ) {\n\n\t\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else {\n\n\t\t\t\tthis.propertyName = propertyName;\n\n\t\t\t}\n\n\t\t\t// select getter / setter\n\t\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tthis.node = null;\n\n\t\t\t// back to the prototype version of getValue / setValue\n\t\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\t\tthis.getValue = this._getValue_unbound;\n\t\t\tthis.setValue = this._setValue_unbound;\n\n\t\t}\n\n\t};\n\n\tObject.assign( PropertyBinding.prototype, { // prototype, continued\n\n\t\t// these are used to \"bind\" a nonexistent property\n\t\t_getValue_unavailable: function() {},\n\t\t_setValue_unavailable: function() {},\n\n\t\t// initial state of these methods that calls 'bind'\n\t\t_getValue_unbound: PropertyBinding.prototype.getValue,\n\t\t_setValue_unbound: PropertyBinding.prototype.setValue,\n\n\t\tBindingType: {\n\t\t\tDirect: 0,\n\t\t\tEntireArray: 1,\n\t\t\tArrayElement: 2,\n\t\t\tHasFromToArray: 3\n\t\t},\n\n\t\tVersioning: {\n\t\t\tNone: 0,\n\t\t\tNeedsUpdate: 1,\n\t\t\tMatrixWorldNeedsUpdate: 2\n\t\t},\n\n\t\tGetterByBindingType: [\n\n\t\t\tfunction getValue_direct( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.node[ this.propertyName ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_array( buffer, offset ) {\n\n\t\t\t\tvar source = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tfunction getValue_arrayElement( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_toArray( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t\t\t}\n\n\t\t],\n\n\t\tSetterByBindingTypeAndVersioning: [\n\n\t\t\t[\n\t\t\t\t// Direct\n\n\t\t\t\tfunction setValue_direct( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// EntireArray\n\n\t\t\t\tfunction setValue_array( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// ArrayElement\n\n\t\t\t\tfunction setValue_arrayElement( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// HasToFromArray\n\n\t\t\t\tfunction setValue_fromArray( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t]\n\n\t\t]\n\n\t} );\n\n\tPropertyBinding.Composite =\n\t\t\tfunction( targetGroup, path, optionalParsedPath ) {\n\n\t\tvar parsedPath = optionalParsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t};\n\n\tPropertyBinding.Composite.prototype = {\n\n\t\tconstructor: PropertyBinding.Composite,\n\n\t\tgetValue: function( array, offset ) {\n\n\t\t\tthis.bind(); // bind all binding\n\n\t\t\tvar firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t\t// and only call .getValue on the first\n\t\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t\t},\n\n\t\tsetValue: function( array, offset ) {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t\t}\n\n\t\t},\n\n\t\tbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].bind();\n\n\t\t\t}\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].unbind();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.create = function( root, path, parsedPath ) {\n\n\t\tif ( ! ( (root && root.isAnimationObjectGroup) ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.parseTrackName = function( trackName ) {\n\n\t\t// matches strings in the form of:\n\t\t// nodeName.property\n\t\t// nodeName.property[accessor]\n\t\t// nodeName.material.property[accessor]\n\t\t// uuid.property[accessor]\n\t\t// uuid.objectName[objectIndex].propertyName[propertyIndex]\n\t\t// parentName/nodeName.property\n\t\t// parentName/parentName/nodeName.property[index]\n\t\t// .bone[Armature.DEF_cog].position\n\t\t// scene:helium_balloon_model:helium_balloon_model.position\n\t\t// created and tested via https://regex101.com/#javascript\n\n\t\tvar re = /^((?:\\w+[\\/:])*)(\\w+)?(?:\\.(\\w+)(?:\\[(.+)\\])?)?\\.(\\w+)(?:\\[(.+)\\])?$/;\n\t\tvar matches = re.exec( trackName );\n\n\t\tif ( ! matches ) {\n\n\t\t\tthrow new Error( \"cannot parse trackName at all: \" + trackName );\n\n\t\t}\n\n\t\tvar results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ], \t// allowed to be null, specified root node.\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ],\n\t\t\tpropertyIndex: matches[ 6 ]\t// allowed to be null, specifies that the whole property is set.\n\t\t};\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( \"can not parse propertyName from trackName: \" + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t};\n\n\tPropertyBinding.findNode = function( root, nodeName ) {\n\n\t\tif ( ! nodeName || nodeName === \"\" || nodeName === \"root\" || nodeName === \".\" || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tvar searchSkeleton = function( skeleton ) {\n\n\t\t\t\tfor( var i = 0; i < skeleton.bones.length; i ++ ) {\n\n\t\t\t\t\tvar bone = skeleton.bones[ i ];\n\n\t\t\t\t\tif ( bone.name === nodeName ) {\n\n\t\t\t\t\t\treturn bone;\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar bone = searchSkeleton( root.skeleton );\n\n\t\t\tif ( bone ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tvar searchNodeSubtree = function( children ) {\n\n\t\t\t\tfor( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tvar childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\t/**\n\t *\n\t * A group of objects that receives a shared animation state.\n\t *\n\t * Usage:\n\t *\n\t * \t-\tAdd objects you would otherwise pass as 'root' to the\n\t * \t\tconstructor or the .clipAction method of AnimationMixer.\n\t *\n\t * \t-\tInstead pass this object as 'root'.\n\t *\n\t * \t-\tYou can also add and remove objects later when the mixer\n\t * \t\tis running.\n\t *\n\t * Note:\n\t *\n\t * \tObjects of this class appear as one object to the mixer,\n\t * \tso cache control of the individual objects must be done\n\t * \ton the group.\n\t *\n\t * Limitation:\n\t *\n\t * \t- \tThe animated properties must be compatible among the\n\t * \t\tall objects in the group.\n\t *\n\t * -\tA single property can either be controlled through a\n\t * \ttarget group or directly, but not both.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction AnimationObjectGroup( var_args ) {\n\n\t\tthis.uuid = _Math.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;\t\t\t// threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tvar indices = {};\n\t\tthis._indicesByUUID = indices;\t\t// for bookkeeping\n\n\t\tfor ( var 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 = [];\t\t\t\t\t// inside: string\n\t\tthis._parsedPaths = [];\t\t\t\t// inside: { we don't care, here }\n\t\tthis._bindings = []; \t\t\t\t// inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; \t// inside: indices in these arrays\n\n\t\tvar scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() { return scope._objects.length; },\n\t\t\t\tget inUse() { return this.total - scope.nCachedObjects_; }\n\t\t\t},\n\n\t\t\tget bindingsPerObject() { return scope._bindings.length; }\n\n\t\t};\n\n\t}\n\n\tAnimationObjectGroup.prototype = {\n\n\t\tconstructor: AnimationObjectGroup,\n\n\t\tisAnimationObjectGroup: true,\n\n\t\tadd: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tpaths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index === undefined ) {\n\n\t\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\t\tindex = nObjects ++;\n\t\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\t\tobjects.push( object );\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tbindings[ j ].push(\n\t\t\t\t\t\t\t\tnew PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\t\tvar knownObject = objects[ index ];\n\n\t\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\t\tbinding = new PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( objects[ index ] !== knownObject) {\n\n\t\t\t\t\tconsole.error( \"Different objects with the same UUID \" +\n\t\t\t\t\t\t\t\"detected. Clean the caches or recreate your \" +\n\t\t\t\t\t\t\t\"infrastructure when reloading scenes...\" );\n\n\t\t\t\t} // else the object is already where we want it to be\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\tremove: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\t\tvar lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// remove & forget\n\t\tuncache: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\t\tvar lastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} // cached or active\n\n\t\t\t\t} // if object is known\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\t\tsubscribe_: function( path, parsedPath ) {\n\t\t\t// returns an array of bindings for the given path that is changed\n\t\t\t// according to the contained objects in the group\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ],\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\t\tvar paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tobjects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\t\tindex = bindings.length;\n\n\t\t\tindicesByPath[ path ] = index;\n\n\t\t\tpaths.push( path );\n\t\t\tparsedPaths.push( parsedPath );\n\t\t\tbindings.push( bindingsForPath );\n\n\t\t\tfor ( var i = nCachedObjects,\n\t\t\t\t\tn = objects.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = objects[ i ];\n\n\t\t\t\tbindingsForPath[ i ] =\n\t\t\t\t\t\tnew PropertyBinding( object, path, parsedPath );\n\n\t\t\t}\n\n\t\t\treturn bindingsForPath;\n\n\t\t},\n\n\t\tunsubscribe_: function( path ) {\n\t\t\t// tells the group to forget about a property path and no longer\n\t\t\t// update the array previously obtained with 'subscribe_'\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar paths = this._paths,\n\t\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\t\tbindings = this._bindings,\n\t\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\t\tbindings[ index ] = lastBindings;\n\t\t\t\tbindings.pop();\n\n\t\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\t\tparsedPaths.pop();\n\n\t\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\t\tpaths.pop();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Action provided by AnimationMixer for scheduling clip playback on specific\n\t * objects.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t *\n\t */\n\n\tfunction AnimationAction( mixer, clip, localRoot ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot || null;\n\n\t\tvar tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tvar interpolantSettings = {\n\t\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tvar 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;\t// 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;\t\t\t// for the memory manager\n\t\tthis._byClipCacheIndex = null;\t\t// 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; \t\t// no. of repetitions when looping\n\n\t\tthis.paused = false;\t\t\t\t// false -> zero effective time scale\n\t\tthis.enabled = true;\t\t\t\t// true -> zero effective weight\n\n\t\tthis.clampWhenFinished \t= false;\t// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart \t= true;\t\t// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd\t\t= true;\t\t// clips for start, loop and end\n\n\t}\n\n\tAnimationAction.prototype = {\n\n\t\tconstructor: AnimationAction,\n\n\t\t// State & Scheduling\n\n\t\tplay: function() {\n\n\t\t\tthis._mixer._activateAction( this );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function() {\n\n\t\t\tthis._mixer._deactivateAction( this );\n\n\t\t\treturn this.reset();\n\n\t\t},\n\n\t\treset: function() {\n\n\t\t\tthis.paused = false;\n\t\t\tthis.enabled = true;\n\n\t\t\tthis.time = 0;\t\t\t// restart clip\n\t\t\tthis._loopCount = -1;\t// forget previous loops\n\t\t\tthis._startTime = null;\t// forget scheduling\n\n\t\t\treturn this.stopFading().stopWarping();\n\n\t\t},\n\n\t\tisRunning: function() {\n\n\t\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\t// return true when play has been called\n\t\tisScheduled: function() {\n\n\t\t\treturn this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\tstartAt: function( time ) {\n\n\t\t\tthis._startTime = time;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetLoop: function( mode, repetitions ) {\n\n\t\t\tthis.loop = mode;\n\t\t\tthis.repetitions = repetitions;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Weight\n\n\t\t// set the weight stopping any scheduled fading\n\t\t// although .enabled = false yields an effective weight of zero, this\n\t\t// method does *not* change .enabled, because it would be confusing\n\t\tsetEffectiveWeight: function( weight ) {\n\n\t\t\tthis.weight = weight;\n\n\t\t\t// note: same logic as when updated at runtime\n\t\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\t\treturn this.stopFading();\n\n\t\t},\n\n\t\t// return the weight considering fading and .enabled\n\t\tgetEffectiveWeight: function() {\n\n\t\t\treturn this._effectiveWeight;\n\n\t\t},\n\n\t\tfadeIn: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t\t},\n\n\t\tfadeOut: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t\t},\n\n\t\tcrossFadeFrom: function( fadeOutAction, duration, warp ) {\n\n\t\t\tfadeOutAction.fadeOut( duration );\n\t\t\tthis.fadeIn( duration );\n\n\t\t\tif( warp ) {\n\n\t\t\t\tvar fadeInDuration = this._clip.duration,\n\t\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossFadeTo: function( fadeInAction, duration, warp ) {\n\n\t\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t\t},\n\n\t\tstopFading: function() {\n\n\t\t\tvar weightInterpolant = this._weightInterpolant;\n\n\t\t\tif ( weightInterpolant !== null ) {\n\n\t\t\t\tthis._weightInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Time Scale Control\n\n\t\t// set the weight stopping any scheduled warping\n\t\t// although .paused = true yields an effective time scale of zero, this\n\t\t// method does *not* change .paused, because it would be confusing\n\t\tsetEffectiveTimeScale: function( timeScale ) {\n\n\t\t\tthis.timeScale = timeScale;\n\t\t\tthis._effectiveTimeScale = this.paused ? 0 :timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\t// return the time scale considering warping and .paused\n\t\tgetEffectiveTimeScale: function() {\n\n\t\t\treturn this._effectiveTimeScale;\n\n\t\t},\n\n\t\tsetDuration: function( duration ) {\n\n\t\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\tsyncWith: function( action ) {\n\n\t\t\tthis.time = action.time;\n\t\t\tthis.timeScale = action.timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\thalt: function( duration ) {\n\n\t\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t\t},\n\n\t\twarp: function( startTimeScale, endTimeScale, duration ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._timeScaleInterpolant,\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant(),\n\t\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now;\n\t\t\ttimes[ 1 ] = now + duration;\n\n\t\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstopWarping: function() {\n\n\t\t\tvar timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\t\tthis._timeScaleInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Object Accessors\n\n\t\tgetMixer: function() {\n\n\t\t\treturn this._mixer;\n\n\t\t},\n\n\t\tgetClip: function() {\n\n\t\t\treturn this._clip;\n\n\t\t},\n\n\t\tgetRoot: function() {\n\n\t\t\treturn this._localRoot || this._mixer._root;\n\n\t\t},\n\n\t\t// Interna\n\n\t\t_update: function( time, deltaTime, timeDirection, accuIndex ) {\n\t\t\t// called by the mixer\n\n\t\t\tvar startTime = this._startTime;\n\n\t\t\tif ( startTime !== null ) {\n\n\t\t\t\t// check for scheduled start of action\n\n\t\t\t\tvar timeRunning = ( time - startTime ) * timeDirection;\n\t\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t\t}\n\n\t\t\t\t// start\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\t// apply time scale and advance time\n\n\t\t\tdeltaTime *= this._updateTimeScale( time );\n\t\t\tvar clipTime = this._updateTime( deltaTime );\n\n\t\t\t// note: _updateTime may disable the action resulting in\n\t\t\t// an effective weight of 0\n\n\t\t\tvar weight = this._updateWeight( time );\n\n\t\t\tif ( weight > 0 ) {\n\n\t\t\t\tvar interpolants = this._interpolants;\n\t\t\t\tvar propertyMixers = this._propertyBindings;\n\n\t\t\t\tfor ( var j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_updateWeight: function( time ) {\n\n\t\t\tvar weight = 0;\n\n\t\t\tif ( this.enabled ) {\n\n\t\t\t\tweight = this.weight;\n\t\t\t\tvar interpolant = this._weightInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\t\tthis.enabled = 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\tthis._effectiveWeight = weight;\n\t\t\treturn weight;\n\n\t\t},\n\n\t\t_updateTimeScale: function( time ) {\n\n\t\t\tvar timeScale = 0;\n\n\t\t\tif ( ! this.paused ) {\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\t\tvar interpolant = this._timeScaleInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\t\tthis.timeScale = timeScale;\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\tthis._effectiveTimeScale = timeScale;\n\t\t\treturn timeScale;\n\n\t\t},\n\n\t\t_updateTime: function( deltaTime ) {\n\n\t\t\tvar time = this.time + deltaTime;\n\n\t\t\tif ( deltaTime === 0 ) return time;\n\n\t\t\tvar duration = this._clip.duration,\n\n\t\t\t\tloop = this.loop,\n\t\t\t\tloopCount = this._loopCount;\n\n\t\t\tif ( loop === LoopOnce ) {\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tthis.loopCount = 0;\n\t\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t\t}\n\n\t\t\t\thandle_stop: {\n\n\t\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\t\ttime = duration;\n\n\t\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\t\ttime = 0;\n\n\t\t\t\t\t} else break handle_stop;\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\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}\n\n\t\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\t\tvar pingPong = ( loop === LoopPingPong );\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\ttrue, this.repetitions === 0, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\tthis.repetitions === 0, true, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( time >= duration || time < 0 ) {\n\t\t\t\t\t// wrap around\n\n\t\t\t\t\tvar loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\t\tvar pending = this.repetitions - loopCount;\n\n\t\t\t\t\tif ( pending < 0 ) {\n\t\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// keep running\n\n\t\t\t\t\t\tif ( pending === 0 ) {\n\t\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\t\tvar atStart = deltaTime < 0;\n\t\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\t\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\t\tthis.time = time;\n\t\t\t\t\treturn duration - time;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.time = time;\n\t\t\treturn time;\n\n\t\t},\n\n\t\t_setEndings: function( atStart, atEnd, pingPong ) {\n\n\t\t\tvar settings = this._interpolantSettings;\n\n\t\t\tif ( pingPong ) {\n\n\t\t\t\tsettings.endingStart \t= ZeroSlopeEnding;\n\t\t\t\tsettings.endingEnd\t\t= ZeroSlopeEnding;\n\n\t\t\t} else {\n\n\t\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\t\tif ( atStart ) {\n\n\t\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t\tif ( atEnd ) {\n\n\t\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_scheduleFading: function( duration, weightNow, weightThen ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant(),\n\t\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now; \t\t\t\tvalues[ 0 ] = weightNow;\n\t\t\ttimes[ 1 ] = now + duration;\tvalues[ 1 ] = weightThen;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Player for AnimationClips.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction AnimationMixer( root ) {\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\tObject.assign( AnimationMixer.prototype, EventDispatcher.prototype, {\n\n\t\t// return an action for a clip optionally using a custom root target\n\t\t// object (this method allocates a lot of dynamic memory in case a\n\t\t// previously unknown clip/root combination is specified)\n\t\tclipAction: function( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject !== null ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ],\n\t\t\t\tprototypeAction = null;\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\tvar existingAction =\n\t\t\t\t\t\tactionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( existingAction !== undefined ) {\n\n\t\t\t\t\treturn existingAction;\n\n\t\t\t\t}\n\n\t\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t\t// the bindings again but can just copy\n\t\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t\t// also, take the clip from the prototype action\n\t\t\t\tif ( clipObject === null )\n\t\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t\t}\n\n\t\t\t// clip must be known when specified via string\n\t\t\tif ( clipObject === null ) return null;\n\n\t\t\t// allocate all resources required to run it\n\t\t\tvar newAction = new AnimationAction( this, clipObject, optionalRoot );\n\n\t\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t\t// and make the action known to the memory manager\n\t\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\t\treturn newAction;\n\n\t\t},\n\n\t\t// get an existing action\n\t\texistingAction: function( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// deactivates all previously scheduled actions\n\t\tstopAllAction: function() {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tthis._nActiveActions = 0;\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tactions[ i ].reset();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].useCount = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// advance the time and update apply the animation\n\t\tupdate: function( deltaTime ) {\n\n\t\t\tdeltaTime *= this.timeScale;\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\n\t\t\t\ttime = this.time += deltaTime,\n\t\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t\t// run active actions\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tvar action = actions[ i ];\n\n\t\t\t\tif ( action.enabled ) {\n\n\t\t\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// update scene graph\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// return this mixer's root target object\n\t\tgetRoot: function() {\n\n\t\t\treturn this._root;\n\n\t\t},\n\n\t\t// free all resources specific to a particular clip\n\t\tuncacheClip: function( clip ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tclipUuid = clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t\t// iteration state and also require updating the state we can\n\t\t\t\t// just throw away\n\n\t\t\t\tvar actionsToRemove = actionsForClip.knownActions;\n\n\t\t\t\tfor ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar action = actionsToRemove[ i ];\n\n\t\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\t\tvar cacheIndex = action._cacheIndex,\n\t\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\t\taction._cacheIndex = null;\n\t\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\t\tactions.pop();\n\n\t\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t\t}\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t// free all resources specific to a particular root target object\n\t\tuncacheRoot: function( root ) {\n\n\t\t\tvar rootUuid = root.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip;\n\n\t\t\tfor ( var clipUuid in actionsByClip ) {\n\n\t\t\t\tvar actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( action !== undefined ) {\n\n\t\t\t\t\tthis._deactivateAction( action );\n\t\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingByName !== undefined ) {\n\n\t\t\t\tfor ( var trackName in bindingByName ) {\n\n\t\t\t\t\tvar binding = bindingByName[ trackName ];\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remove a targeted clip from the cache\n\t\tuncacheAction: function( clip, optionalRoot ) {\n\n\t\t\tvar action = this.existingAction( clip, optionalRoot );\n\n\t\t\tif ( action !== null ) {\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} );\n\n\t// Implementation details:\n\n\tObject.assign( AnimationMixer.prototype, {\n\n\t\t_bindAction: function( action, prototypeAction ) {\n\n\t\t\tvar root = action._localRoot || this._root,\n\t\t\t\ttracks = action._clip.tracks,\n\t\t\t\tnTracks = tracks.length,\n\t\t\t\tbindings = action._propertyBindings,\n\t\t\t\tinterpolants = action._interpolants,\n\t\t\t\trootUuid = root.uuid,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingsByName === undefined ) {\n\n\t\t\t\tbindingsByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\t\tvar track = tracks[ i ],\n\t\t\t\t\ttrackName = track.name,\n\t\t\t\t\tbinding = bindingsByName[ trackName ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar path = prototypeAction && prototypeAction.\n\t\t\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t}\n\n\t\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t\t}\n\n\t\t},\n\n\t\t_activateAction: function( action ) {\n\n\t\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\t\tvar rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\t\tthis._bindAction( action,\n\t\t\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t\t}\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// increment reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._lendAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t_deactivateAction: function( action ) {\n\n\t\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// decrement reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._takeBackAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// Memory manager\n\n\t\t_initMemoryManager: function() {\n\n\t\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\t\tthis._nActiveActions = 0;\n\n\t\t\tthis._actionsByClip = {};\n\t\t\t// inside:\n\t\t\t// {\n\t\t\t// \t\tknownActions: Array< AnimationAction >\t- used as prototypes\n\t\t\t// \t\tactionByRoot: AnimationAction\t\t\t- lookup\n\t\t\t// }\n\n\n\t\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\t\tthis._controlInterpolants = []; // same game as above\n\t\t\tthis._nActiveControlInterpolants = 0;\n\n\t\t\tvar scope = this;\n\n\t\t\tthis.stats = {\n\n\t\t\t\tactions: {\n\t\t\t\t\tget total() { return scope._actions.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveActions; }\n\t\t\t\t},\n\t\t\t\tbindings: {\n\t\t\t\t\tget total() { return scope._bindings.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveBindings; }\n\t\t\t\t},\n\t\t\t\tcontrolInterpolants: {\n\t\t\t\t\tget total() { return scope._controlInterpolants.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveControlInterpolants; }\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t},\n\n\t\t// Memory management for AnimationAction objects\n\n\t\t_isActiveAction: function( action ) {\n\n\t\t\tvar index = action._cacheIndex;\n\t\t\treturn index !== null && index < this._nActiveActions;\n\n\t\t},\n\n\t\t_addInactiveAction: function( action, clipUuid, rootUuid ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip === undefined ) {\n\n\t\t\t\tactionsForClip = {\n\n\t\t\t\t\tknownActions: [ action ],\n\t\t\t\t\tactionByRoot: {}\n\n\t\t\t\t};\n\n\t\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t\t} else {\n\n\t\t\t\tvar knownActions = actionsForClip.knownActions;\n\n\t\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\t\tknownActions.push( action );\n\n\t\t\t}\n\n\t\t\taction._cacheIndex = actions.length;\n\t\t\tactions.push( action );\n\n\t\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t\t},\n\n\t\t_removeInactiveAction: function( action ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\t\tcacheIndex = action._cacheIndex;\n\n\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\tactions.pop();\n\n\t\t\taction._cacheIndex = null;\n\n\n\t\t\tvar clipUuid = action._clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\t\tlastKnownAction =\n\t\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\t\tknownActionsForClip.pop();\n\n\t\t\taction._byClipCacheIndex = null;\n\n\n\t\t\tvar actionByRoot = actionsForClip.actionByRoot,\n\t\t\t\trootUuid = ( actions._localRoot || this._root ).uuid;\n\n\t\t\tdelete actionByRoot[ rootUuid ];\n\n\t\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t},\n\n\t\t_removeInactiveBindingsForAction: function( action ) {\n\n\t\t\tvar bindings = action._propertyBindings;\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendAction: function( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions >| inactive actions ]\n\t\t\t// s a\n\t\t\t// <-swap->\n\t\t\t// a s\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\t\taction._cacheIndex = lastActiveIndex;\n\t\t\tactions[ lastActiveIndex ] = action;\n\n\t\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t\t},\n\n\t\t_takeBackAction: function( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions |< inactive actions ]\n\t\t\t// a s\n\t\t\t// <-swap->\n\t\t\t// s a\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\t\taction._cacheIndex = firstInactiveIndex;\n\t\t\tactions[ firstInactiveIndex ] = action;\n\n\t\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t\t},\n\n\t\t// Memory management for PropertyMixer objects\n\n\t\t_addInactiveBinding: function( binding, rootUuid, trackName ) {\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( bindingByName === undefined ) {\n\n\t\t\t\tbindingByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t\t}\n\n\t\t\tbindingByName[ trackName ] = binding;\n\n\t\t\tbinding._cacheIndex = bindings.length;\n\t\t\tbindings.push( binding );\n\n\t\t},\n\n\t\t_removeInactiveBinding: function( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tpropBinding = binding.binding,\n\t\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\t\ttrackName = propBinding.path,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\t\tbindings.pop();\n\n\t\t\tdelete bindingByName[ trackName ];\n\n\t\t\tremove_empty_map: {\n\n\t\t\t\tfor ( var _ in bindingByName ) break remove_empty_map;\n\n\t\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendBinding: function( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\t\tbinding._cacheIndex = lastActiveIndex;\n\t\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t\t},\n\n\t\t_takeBackBinding: function( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t\t},\n\n\n\t\t// Memory management of Interpolants for weight and time scale\n\n\t\t_lendControlInterpolant: function() {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++,\n\t\t\t\tinterpolant = interpolants[ lastActiveIndex ];\n\n\t\t\tif ( interpolant === undefined ) {\n\n\t\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t\t\t\t1, this._controlInterpolantsResultBuffer );\n\n\t\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t\t}\n\n\t\t\treturn interpolant;\n\n\t\t},\n\n\t\t_takeBackControlInterpolant: function( interpolant ) {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t\t},\n\n\t\t_controlInterpolantsResultBuffer: new Float32Array( 1 )\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Uniform( value ) {\n\n\t\tif ( typeof value === 'string' ) {\n\n\t\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\n\t\t\tvalue = arguments[ 1 ];\n\n\t\t}\n\n\t\tthis.value = value;\n\n\t}\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferGeometry() {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.maxInstancedCount = undefined;\n\n\t}\n\n\tInstancedBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tInstancedBufferGeometry.prototype.constructor = InstancedBufferGeometry;\n\n\tInstancedBufferGeometry.prototype.isInstancedBufferGeometry = true;\n\n\tInstancedBufferGeometry.prototype.addGroup = function ( start, count, materialIndex ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t};\n\n\tInstancedBufferGeometry.prototype.copy = function ( source ) {\n\n\t\tvar index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\tvar attributes = source.attributes;\n\n\t\tfor ( var name in attributes ) {\n\n\t\t\tvar attribute = attributes[ name ];\n\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t}\n\n\t\tvar groups = source.groups;\n\n\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tvar group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.data = interleavedBuffer;\n\t\tthis.itemSize = itemSize;\n\t\tthis.offset = offset;\n\n\t\tthis.normalized = normalized === true;\n\n\t}\n\n\n\tInterleavedBufferAttribute.prototype = {\n\n\t\tconstructor: InterleavedBufferAttribute,\n\n\t\tisInterleavedBufferAttribute: true,\n\n\t\tget count() {\n\n\t\t\treturn this.data.count;\n\n\t\t},\n\n\t\tget array() {\n\n\t\t\treturn this.data.array;\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\t\t\tthis.data.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBuffer( array, stride ) {\n\n\t\tthis.uuid = _Math.generateUUID();\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.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t}\n\n\tInterleavedBuffer.prototype = {\n\n\t\tconstructor: InterleavedBuffer,\n\n\t\tisInterleavedBuffer: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.stride : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.count = source.count;\n\t\t\tthis.stride = source.stride;\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.stride;\n\t\t\tindex2 *= attribute.stride;\n\n\t\t\tfor ( var i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {\n\n\t\tInterleavedBuffer.call( this, array, stride );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedInterleavedBuffer.prototype = Object.create( InterleavedBuffer.prototype );\n\tInstancedInterleavedBuffer.prototype.constructor = InstancedInterleavedBuffer;\n\n\tInstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true;\n\n\tInstancedInterleavedBuffer.prototype.copy = function ( source ) {\n\n\t\tInterleavedBuffer.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferAttribute( array, itemSize, meshPerAttribute ) {\n\n\t\tBufferAttribute.call( this, array, itemSize );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInstancedBufferAttribute.prototype.constructor = InstancedBufferAttribute;\n\n\tInstancedBufferAttribute.prototype.isInstancedBufferAttribute = true;\n\n\tInstancedBufferAttribute.prototype.copy = function ( source ) {\n\n\t\tBufferAttribute.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author bhouston / http://clara.io/\n\t * @author stephomi / http://stephaneginier.com/\n\t */\n\n\tfunction Raycaster( origin, direction, near, far ) {\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 || 0;\n\t\tthis.far = far || Infinity;\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: {},\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t\tObject.defineProperties( this.params, {\n\t\t\tPointCloud: {\n\t\t\t\tget: function () {\n\t\t\t\t\tconsole.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );\n\t\t\t\t\treturn this.Points;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tfunction ascSort( a, b ) {\n\n\t\treturn a.distance - b.distance;\n\n\t}\n\n\tfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t//\n\n\tRaycaster.prototype = {\n\n\t\tconstructor: Raycaster,\n\n\t\tlinePrecision: 1,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\t\tthis.ray.set( origin, direction );\n\n\t\t},\n\n\t\tsetFromCamera: function ( coords, camera ) {\n\n\t\t\tif ( (camera && camera.isPerspectiveCamera) ) {\n\n\t\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\n\t\t\t} else if ( (camera && camera.isOrthographicCamera) ) {\n\n\t\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\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type.' );\n\n\t\t\t}\n\n\t\t},\n\n\t\tintersectObject: function ( object, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tintersectObject( object, this, intersects, recursive );\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t},\n\n\t\tintersectObjects: function ( objects, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tif ( Array.isArray( objects ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );\n\t\t\t\treturn intersects;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t\t}\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Clock( autoStart ) {\n\n\t\tthis.autoStart = ( autoStart !== undefined ) ? autoStart : true;\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\tClock.prototype = {\n\n\t\tconstructor: Clock,\n\n\t\tstart: function () {\n\n\t\t\tthis.startTime = ( performance || Date ).now();\n\n\t\t\tthis.oldTime = this.startTime;\n\t\t\tthis.elapsedTime = 0;\n\t\t\tthis.running = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tthis.getElapsedTime();\n\t\t\tthis.running = false;\n\n\t\t},\n\n\t\tgetElapsedTime: function () {\n\n\t\t\tthis.getDelta();\n\t\t\treturn this.elapsedTime;\n\n\t\t},\n\n\t\tgetDelta: function () {\n\n\t\t\tvar diff = 0;\n\n\t\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\t\tthis.start();\n\n\t\t\t}\n\n\t\t\tif ( this.running ) {\n\n\t\t\t\tvar newTime = ( performance || Date ).now();\n\n\t\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\t\tthis.oldTime = newTime;\n\n\t\t\t\tthis.elapsedTime += diff;\n\n\t\t\t}\n\n\t\t\treturn diff;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Spline from Tween.js, slightly optimized (and trashed)\n\t * http://sole.github.com/tween.js/examples/05_spline.html\n\t *\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Spline( points ) {\n\n\t\tthis.points = points;\n\n\t\tvar c = [], v3 = { x: 0, y: 0, z: 0 },\n\t\tpoint, intPoint, weight, w2, w3,\n\t\tpa, pb, pc, pd;\n\n\t\tthis.initFromArray = function ( a ) {\n\n\t\t\tthis.points = [];\n\n\t\t\tfor ( var i = 0; i < a.length; i ++ ) {\n\n\t\t\t\tthis.points[ i ] = { x: a[ i ][ 0 ], y: a[ i ][ 1 ], z: a[ i ][ 2 ] };\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getPoint = function ( k ) {\n\n\t\t\tpoint = ( this.points.length - 1 ) * k;\n\t\t\tintPoint = Math.floor( point );\n\t\t\tweight = point - intPoint;\n\n\t\t\tc[ 0 ] = intPoint === 0 ? intPoint : intPoint - 1;\n\t\t\tc[ 1 ] = intPoint;\n\t\t\tc[ 2 ] = intPoint > this.points.length - 2 ? this.points.length - 1 : intPoint + 1;\n\t\t\tc[ 3 ] = intPoint > this.points.length - 3 ? this.points.length - 1 : intPoint + 2;\n\n\t\t\tpa = this.points[ c[ 0 ] ];\n\t\t\tpb = this.points[ c[ 1 ] ];\n\t\t\tpc = this.points[ c[ 2 ] ];\n\t\t\tpd = this.points[ c[ 3 ] ];\n\n\t\t\tw2 = weight * weight;\n\t\t\tw3 = weight * w2;\n\n\t\t\tv3.x = interpolate( pa.x, pb.x, pc.x, pd.x, weight, w2, w3 );\n\t\t\tv3.y = interpolate( pa.y, pb.y, pc.y, pd.y, weight, w2, w3 );\n\t\t\tv3.z = interpolate( pa.z, pb.z, pc.z, pd.z, weight, w2, w3 );\n\n\t\t\treturn v3;\n\n\t\t};\n\n\t\tthis.getControlPointsArray = function () {\n\n\t\t\tvar i, p, l = this.points.length,\n\t\t\t\tcoords = [];\n\n\t\t\tfor ( i = 0; i < l; i ++ ) {\n\n\t\t\t\tp = this.points[ i ];\n\t\t\t\tcoords[ i ] = [ p.x, p.y, p.z ];\n\n\t\t\t}\n\n\t\t\treturn coords;\n\n\t\t};\n\n\t\t// approximate length by summing linear segments\n\n\t\tthis.getLength = function ( nSubDivisions ) {\n\n\t\t\tvar i, index, nSamples, position,\n\t\t\t\tpoint = 0, intPoint = 0, oldIntPoint = 0,\n\t\t\t\toldPosition = new Vector3(),\n\t\t\t\ttmpVec = new Vector3(),\n\t\t\t\tchunkLengths = [],\n\t\t\t\ttotalLength = 0;\n\n\t\t\t// first point has 0 length\n\n\t\t\tchunkLengths[ 0 ] = 0;\n\n\t\t\tif ( ! nSubDivisions ) nSubDivisions = 100;\n\n\t\t\tnSamples = this.points.length * nSubDivisions;\n\n\t\t\toldPosition.copy( this.points[ 0 ] );\n\n\t\t\tfor ( i = 1; i < nSamples; i ++ ) {\n\n\t\t\t\tindex = i / nSamples;\n\n\t\t\t\tposition = this.getPoint( index );\n\t\t\t\ttmpVec.copy( position );\n\n\t\t\t\ttotalLength += tmpVec.distanceTo( oldPosition );\n\n\t\t\t\toldPosition.copy( position );\n\n\t\t\t\tpoint = ( this.points.length - 1 ) * index;\n\t\t\t\tintPoint = Math.floor( point );\n\n\t\t\t\tif ( intPoint !== oldIntPoint ) {\n\n\t\t\t\t\tchunkLengths[ intPoint ] = totalLength;\n\t\t\t\t\toldIntPoint = intPoint;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// last point ends with total length\n\n\t\t\tchunkLengths[ chunkLengths.length ] = totalLength;\n\n\t\t\treturn { chunks: chunkLengths, total: totalLength };\n\n\t\t};\n\n\t\tthis.reparametrizeByArcLength = function ( samplingCoef ) {\n\n\t\t\tvar i, j,\n\t\t\t\tindex, indexCurrent, indexNext,\n\t\t\t\trealDistance,\n\t\t\t\tsampling, position,\n\t\t\t\tnewpoints = [],\n\t\t\t\ttmpVec = new Vector3(),\n\t\t\t\tsl = this.getLength();\n\n\t\t\tnewpoints.push( tmpVec.copy( this.points[ 0 ] ).clone() );\n\n\t\t\tfor ( i = 1; i < this.points.length; i ++ ) {\n\n\t\t\t\t//tmpVec.copy( this.points[ i - 1 ] );\n\t\t\t\t//linearDistance = tmpVec.distanceTo( this.points[ i ] );\n\n\t\t\t\trealDistance = sl.chunks[ i ] - sl.chunks[ i - 1 ];\n\n\t\t\t\tsampling = Math.ceil( samplingCoef * realDistance / sl.total );\n\n\t\t\t\tindexCurrent = ( i - 1 ) / ( this.points.length - 1 );\n\t\t\t\tindexNext = i / ( this.points.length - 1 );\n\n\t\t\t\tfor ( j = 1; j < sampling - 1; j ++ ) {\n\n\t\t\t\t\tindex = indexCurrent + j * ( 1 / sampling ) * ( indexNext - indexCurrent );\n\n\t\t\t\t\tposition = this.getPoint( index );\n\t\t\t\t\tnewpoints.push( tmpVec.copy( position ).clone() );\n\n\t\t\t\t}\n\n\t\t\t\tnewpoints.push( tmpVec.copy( this.points[ i ] ).clone() );\n\n\t\t\t}\n\n\t\t\tthis.points = newpoints;\n\n\t\t};\n\n\t\t// Catmull-Rom\n\n\t\tfunction interpolate( p0, p1, p2, p3, t, t2, t3 ) {\n\n\t\t\tvar v0 = ( p2 - p0 ) * 0.5,\n\t\t\t\tv1 = ( p3 - p1 ) * 0.5;\n\n\t\t\treturn ( 2 * ( p1 - p2 ) + v0 + v1 ) * t3 + ( - 3 * ( p1 - p2 ) - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n\t *\n\t * The poles (phi) are at the positive and negative y axis.\n\t * The equator starts at positive z.\n\t */\n\n\tfunction Spherical( radius, phi, theta ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0;\n\t\tthis.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere\n\n\t\treturn this;\n\n\t}\n\n\tSpherical.prototype = {\n\n\t\tconstructor: Spherical,\n\n\t\tset: function ( radius, phi, theta ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.phi = phi;\n\t\t\tthis.theta = theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.phi = other.phi;\n\t\t\tthis.theta = other.theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\tmakeSafe: function() {\n\n\t\t\tvar EPS = 0.000001;\n\t\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = vec3.length();\n\n\t\t\tif ( this.radius === 0 ) {\n\n\t\t\t\tthis.theta = 0;\n\t\t\t\tthis.phi = 0;\n\n\t\t\t} else {\n\n\t\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis\n\t\t\t\tthis.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t};\n\n\t/**\r\n\t * @author alteredq / http://alteredqualia.com/\r\n\t */\r\n\r\n\tfunction MorphBlendMesh( geometry, material ) {\n\r\n\t\tMesh.call( this, geometry, material );\r\n\r\n\t\tthis.animationsMap = {};\r\n\t\tthis.animationsList = [];\r\n\r\n\t\t// prepare default animation\r\n\t\t// (all frames played together in 1 second)\r\n\r\n\t\tvar numFrames = this.geometry.morphTargets.length;\r\n\r\n\t\tvar name = \"__default\";\r\n\r\n\t\tvar startFrame = 0;\r\n\t\tvar endFrame = numFrames - 1;\r\n\r\n\t\tvar fps = numFrames / 1;\r\n\r\n\t\tthis.createAnimation( name, startFrame, endFrame, fps );\r\n\t\tthis.setAnimationWeight( name, 1 );\r\n\r\n\t}\r\n\r\n\tMorphBlendMesh.prototype = Object.create( Mesh.prototype );\r\n\tMorphBlendMesh.prototype.constructor = MorphBlendMesh;\r\n\r\n\tMorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) {\r\n\r\n\t\tvar animation = {\r\n\r\n\t\t\tstart: start,\r\n\t\t\tend: end,\r\n\r\n\t\t\tlength: end - start + 1,\r\n\r\n\t\t\tfps: fps,\r\n\t\t\tduration: ( end - start ) / fps,\r\n\r\n\t\t\tlastFrame: 0,\r\n\t\t\tcurrentFrame: 0,\r\n\r\n\t\t\tactive: false,\r\n\r\n\t\t\ttime: 0,\r\n\t\t\tdirection: 1,\r\n\t\t\tweight: 1,\r\n\r\n\t\t\tdirectionBackwards: false,\r\n\t\t\tmirroredLoop: false\r\n\r\n\t\t};\r\n\r\n\t\tthis.animationsMap[ name ] = animation;\r\n\t\tthis.animationsList.push( animation );\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) {\r\n\r\n\t\tvar pattern = /([a-z]+)_?(\\d+)/i;\r\n\r\n\t\tvar firstAnimation, frameRanges = {};\r\n\r\n\t\tvar geometry = this.geometry;\r\n\r\n\t\tfor ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar morph = geometry.morphTargets[ i ];\r\n\t\t\tvar chunks = morph.name.match( pattern );\r\n\r\n\t\t\tif ( chunks && chunks.length > 1 ) {\r\n\r\n\t\t\t\tvar name = chunks[ 1 ];\r\n\r\n\t\t\t\tif ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity };\r\n\r\n\t\t\t\tvar range = frameRanges[ name ];\r\n\r\n\t\t\t\tif ( i < range.start ) range.start = i;\r\n\t\t\t\tif ( i > range.end ) range.end = i;\r\n\r\n\t\t\t\tif ( ! firstAnimation ) firstAnimation = name;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var name in frameRanges ) {\r\n\r\n\t\t\tvar range = frameRanges[ name ];\r\n\t\t\tthis.createAnimation( name, range.start, range.end, fps );\r\n\r\n\t\t}\r\n\r\n\t\tthis.firstAnimation = firstAnimation;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = 1;\r\n\t\t\tanimation.directionBackwards = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = - 1;\r\n\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.fps = fps;\r\n\t\t\tanimation.duration = ( animation.end - animation.start ) / animation.fps;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.duration = duration;\r\n\t\t\tanimation.fps = ( animation.end - animation.start ) / animation.duration;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.weight = weight;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationTime = function ( name, time ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = time;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationTime = function ( name ) {\r\n\r\n\t\tvar time = 0;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\ttime = animation.time;\r\n\r\n\t\t}\r\n\r\n\t\treturn time;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationDuration = function ( name ) {\r\n\r\n\t\tvar duration = - 1;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tduration = animation.duration;\r\n\r\n\t\t}\r\n\r\n\t\treturn duration;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.playAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = 0;\r\n\t\t\tanimation.active = true;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconsole.warn( \"THREE.MorphBlendMesh: animation[\" + name + \"] undefined in .playAnimation()\" );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.stopAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.active = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.update = function ( delta ) {\r\n\r\n\t\tfor ( var i = 0, il = this.animationsList.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar animation = this.animationsList[ i ];\r\n\r\n\t\t\tif ( ! animation.active ) continue;\r\n\r\n\t\t\tvar frameTime = animation.duration / animation.length;\r\n\r\n\t\t\tanimation.time += animation.direction * delta;\r\n\r\n\t\t\tif ( animation.mirroredLoop ) {\r\n\r\n\t\t\t\tif ( animation.time > animation.duration || animation.time < 0 ) {\r\n\r\n\t\t\t\t\tanimation.direction *= - 1;\r\n\r\n\t\t\t\t\tif ( animation.time > animation.duration ) {\r\n\r\n\t\t\t\t\t\tanimation.time = animation.duration;\r\n\t\t\t\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( animation.time < 0 ) {\r\n\r\n\t\t\t\t\t\tanimation.time = 0;\r\n\t\t\t\t\t\tanimation.directionBackwards = false;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tanimation.time = animation.time % animation.duration;\r\n\r\n\t\t\t\tif ( animation.time < 0 ) animation.time += animation.duration;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar keyframe = animation.start + _Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 );\r\n\t\t\tvar weight = animation.weight;\r\n\r\n\t\t\tif ( keyframe !== animation.currentFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = 0;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = 1 * weight;\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ keyframe ] = 0;\r\n\r\n\t\t\t\tanimation.lastFrame = animation.currentFrame;\r\n\t\t\t\tanimation.currentFrame = keyframe;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar mix = ( animation.time % frameTime ) / frameTime;\r\n\r\n\t\t\tif ( animation.directionBackwards ) mix = 1 - mix;\r\n\r\n\t\t\tif ( animation.currentFrame !== animation.lastFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = mix * weight;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = weight;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction ImmediateRenderObject( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.material = material;\n\t\tthis.render = function ( renderCallback ) {};\n\n\t}\n\n\tImmediateRenderObject.prototype = Object.create( Object3D.prototype );\n\tImmediateRenderObject.prototype.constructor = ImmediateRenderObject;\n\n\tImmediateRenderObject.prototype.isImmediateRenderObject = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction VertexNormalsHelper( object, size, hex, linewidth ) {\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xff0000;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( (objGeometry && objGeometry.isGeometry) ) {\n\n\t\t\tnNormals = objGeometry.faces.length * 3;\n\n\t\t} else if ( (objGeometry && objGeometry.isBufferGeometry) ) {\n\n\t\t\tnNormals = objGeometry.attributes.normal.count;\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32Attribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tVertexNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tVertexNormalsHelper.prototype.constructor = VertexNormalsHelper;\n\n\tVertexNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tif ( (objGeometry && objGeometry.isGeometry) ) {\n\n\t\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\t\tvar faces = objGeometry.faces;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar vertex = vertices[ face[ keys[ j ] ] ];\n\n\t\t\t\t\t\tvar normal = face.vertexNormals[ j ];\n\n\t\t\t\t\t\tv1.copy( vertex ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( (objGeometry && objGeometry.isBufferGeometry) ) {\n\n\t\t\t\tvar objPos = objGeometry.attributes.position;\n\n\t\t\t\tvar objNorm = objGeometry.attributes.normal;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\t// for simplicity, ignore index and drawcalls, and render every normal\n\n\t\t\t\tfor ( var j = 0, jl = objPos.count; j < jl; j ++ ) {\n\n\t\t\t\t\tv1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\tv2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) );\n\n\t\t\t\t\tv2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction SpotLightHelper( light ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = [\n\t\t\t0, 0, 0, 0, 0, 1,\n\t\t\t0, 0, 0, 1, 0, 1,\n\t\t\t0, 0, 0, - 1, 0, 1,\n\t\t\t0, 0, 0, 0, 1, 1,\n\t\t\t0, 0, 0, 0, - 1, 1\n\t\t];\n\n\t\tfor ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tvar p1 = ( i / l ) * Math.PI * 2;\n\t\t\tvar 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.addAttribute( 'position', new Float32Attribute( positions, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: 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\tSpotLightHelper.prototype = Object.create( Object3D.prototype );\n\tSpotLightHelper.prototype.constructor = SpotLightHelper;\n\n\tSpotLightHelper.prototype.dispose = function () {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t};\n\n\tSpotLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\t\tvar vector2 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tvar coneLength = this.light.distance ? this.light.distance : 1000;\n\t\t\tvar coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t\tvector.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\t\tthis.cone.lookAt( vector2.sub( vector ) );\n\n\t\t\tthis.cone.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author Sean Griffin / http://twitter.com/sgrif\n\t * @author Michael Guerrero / http://realitymeltdown.com\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction SkeletonHelper( object ) {\n\n\t\tthis.bones = this.getBoneList( object );\n\n\t\tvar geometry = new Geometry();\n\n\t\tfor ( var i = 0; i < this.bones.length; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( (bone.parent && bone.parent.isBone) ) {\n\n\t\t\t\tgeometry.vertices.push( new Vector3() );\n\t\t\t\tgeometry.vertices.push( new Vector3() );\n\t\t\t\tgeometry.colors.push( new Color( 0, 0, 1 ) );\n\t\t\t\tgeometry.colors.push( new Color( 0, 1, 0 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.dynamic = true;\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.root = object;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\n\tSkeletonHelper.prototype = Object.create( LineSegments.prototype );\n\tSkeletonHelper.prototype.constructor = SkeletonHelper;\n\n\tSkeletonHelper.prototype.getBoneList = function( object ) {\n\n\t\tvar boneList = [];\n\n\t\tif ( (object && object.isBone) ) {\n\n\t\t\tboneList.push( object );\n\n\t\t}\n\n\t\tfor ( var i = 0; i < object.children.length; i ++ ) {\n\n\t\t\tboneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) );\n\n\t\t}\n\n\t\treturn boneList;\n\n\t};\n\n\tSkeletonHelper.prototype.update = function () {\n\n\t\tvar geometry = this.geometry;\n\n\t\tvar matrixWorldInv = new Matrix4().getInverse( this.root.matrixWorld );\n\n\t\tvar boneMatrix = new Matrix4();\n\n\t\tvar j = 0;\n\n\t\tfor ( var i = 0; i < this.bones.length; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( (bone.parent && bone.parent.isBone) ) {\n\n\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );\n\t\t\t\tgeometry.vertices[ j ].setFromMatrixPosition( boneMatrix );\n\n\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\tgeometry.vertices[ j + 1 ].setFromMatrixPosition( boneMatrix );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.verticesNeedUpdate = true;\n\n\t\tgeometry.computeBoundingSphere();\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PointLightHelper( light, sphereSize ) {\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar geometry = new SphereBufferGeometry( sphereSize, 4, 2 );\n\t\tvar material = new MeshBasicMaterial( { wireframe: true, fog: false } );\n\t\tmaterial.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/*\n\t\tvar distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\t\tvar distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\t\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\t\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\t\tvar d = 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.scale.set( d, d, d );\n\n\t\t}\n\n\t\tthis.add( this.lightDistance );\n\t\t*/\n\n\t}\n\n\tPointLightHelper.prototype = Object.create( Mesh.prototype );\n\tPointLightHelper.prototype.constructor = PointLightHelper;\n\n\tPointLightHelper.prototype.dispose = function () {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t};\n\n\tPointLightHelper.prototype.update = function () {\n\n\t\tthis.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t/*\n\t\tvar 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\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction HemisphereLightHelper( light, sphereSize ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.colors = [ new Color(), new Color() ];\n\n\t\tvar geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tgeometry.rotateX( - Math.PI / 2 );\n\n\t\tfor ( var i = 0, il = 8; i < il; i ++ ) {\n\n\t\t\tgeometry.faces[ i ].color = this.colors[ i < 4 ? 0 : 1 ];\n\n\t\t}\n\n\t\tvar material = new MeshBasicMaterial( { vertexColors: FaceColors, wireframe: true } );\n\n\t\tthis.lightSphere = new Mesh( geometry, material );\n\t\tthis.add( this.lightSphere );\n\n\t\tthis.update();\n\n\t}\n\n\tHemisphereLightHelper.prototype = Object.create( Object3D.prototype );\n\tHemisphereLightHelper.prototype.constructor = HemisphereLightHelper;\n\n\tHemisphereLightHelper.prototype.dispose = function () {\n\n\t\tthis.lightSphere.geometry.dispose();\n\t\tthis.lightSphere.material.dispose();\n\n\t};\n\n\tHemisphereLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tthis.colors[ 0 ].copy( this.light.color ).multiplyScalar( this.light.intensity );\n\t\t\tthis.colors[ 1 ].copy( this.light.groundColor ).multiplyScalar( this.light.intensity );\n\n\t\t\tthis.lightSphere.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\t\t\tthis.lightSphere.geometry.colorsNeedUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction GridHelper( size, divisions, color1, color2 ) {\n\n\t\tdivisions = divisions || 1;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar center = divisions / 2;\n\t\tvar step = ( size * 2 ) / divisions;\n\t\tvar vertices = [], colors = [];\n\n\t\tfor ( var i = 0, j = 0, k = - size; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - size, 0, k, size, 0, k );\n\t\t\tvertices.push( k, 0, - size, k, 0, size );\n\n\t\t\tvar 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\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32Attribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32Attribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tGridHelper.prototype = Object.create( LineSegments.prototype );\n\tGridHelper.prototype.constructor = GridHelper;\n\n\tGridHelper.prototype.setColors = function () {\n\n\t\tconsole.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction FaceNormalsHelper( object, size, hex, linewidth ) {\n\n\t\t// FaceNormalsHelper only supports THREE.Geometry\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( (objGeometry && objGeometry.isGeometry) ) {\n\n\t\t\tnNormals = objGeometry.faces.length;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' );\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32Attribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\t\tthis.update();\n\n\t}\n\n\tFaceNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tFaceNormalsHelper.prototype.constructor = FaceNormalsHelper;\n\n\tFaceNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\tvar faces = objGeometry.faces;\n\n\t\t\tvar idx = 0;\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar normal = face.normal;\n\n\t\t\t\tv1.copy( vertices[ face.a ] )\n\t\t\t\t\t.add( vertices[ face.b ] )\n\t\t\t\t\t.add( vertices[ face.c ] )\n\t\t\t\t\t.divideScalar( 3 )\n\t\t\t\t\t.applyMatrix4( matrixWorld );\n\n\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction DirectionalLightHelper( light, size ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32Attribute( [\n\t\t\t- size, size, 0,\n\t\t\t size, size, 0,\n\t\t\t size, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.add( new Line( geometry, material ) );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32Attribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.add( new Line( geometry, material ));\n\n\t\tthis.update();\n\n\t}\n\n\tDirectionalLightHelper.prototype = Object.create( Object3D.prototype );\n\tDirectionalLightHelper.prototype.constructor = DirectionalLightHelper;\n\n\tDirectionalLightHelper.prototype.dispose = function () {\n\n\t\tvar lightPlane = this.children[ 0 ];\n\t\tvar targetLine = this.children[ 1 ];\n\n\t\tlightPlane.geometry.dispose();\n\t\tlightPlane.material.dispose();\n\t\ttargetLine.geometry.dispose();\n\t\ttargetLine.material.dispose();\n\n\t};\n\n\tDirectionalLightHelper.prototype.update = function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar v3 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tv1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tv2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t\tv3.subVectors( v2, v1 );\n\n\t\t\tvar lightPlane = this.children[ 0 ];\n\t\t\tvar targetLine = this.children[ 1 ];\n\n\t\t\tlightPlane.lookAt( v3 );\n\t\t\tlightPlane.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\ttargetLine.lookAt( v3 );\n\t\t\ttargetLine.scale.z = v3.length();\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t *\t- shows frustum, line of sight and up of the camera\n\t *\t- suitable for fast updates\n\t * \t- based on frustum visualization in lightgl.js shadowmap example\n\t *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\n\t */\n\n\tfunction CameraHelper( camera ) {\n\n\t\tvar geometry = new Geometry();\n\t\tvar material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } );\n\n\t\tvar pointMap = {};\n\n\t\t// colors\n\n\t\tvar hexFrustum = 0xffaa00;\n\t\tvar hexCone = 0xff0000;\n\t\tvar hexUp = 0x00aaff;\n\t\tvar hexTarget = 0xffffff;\n\t\tvar hexCross = 0x333333;\n\n\t\t// near\n\n\t\taddLine( \"n1\", \"n2\", hexFrustum );\n\t\taddLine( \"n2\", \"n4\", hexFrustum );\n\t\taddLine( \"n4\", \"n3\", hexFrustum );\n\t\taddLine( \"n3\", \"n1\", hexFrustum );\n\n\t\t// far\n\n\t\taddLine( \"f1\", \"f2\", hexFrustum );\n\t\taddLine( \"f2\", \"f4\", hexFrustum );\n\t\taddLine( \"f4\", \"f3\", hexFrustum );\n\t\taddLine( \"f3\", \"f1\", hexFrustum );\n\n\t\t// sides\n\n\t\taddLine( \"n1\", \"f1\", hexFrustum );\n\t\taddLine( \"n2\", \"f2\", hexFrustum );\n\t\taddLine( \"n3\", \"f3\", hexFrustum );\n\t\taddLine( \"n4\", \"f4\", hexFrustum );\n\n\t\t// cone\n\n\t\taddLine( \"p\", \"n1\", hexCone );\n\t\taddLine( \"p\", \"n2\", hexCone );\n\t\taddLine( \"p\", \"n3\", hexCone );\n\t\taddLine( \"p\", \"n4\", hexCone );\n\n\t\t// up\n\n\t\taddLine( \"u1\", \"u2\", hexUp );\n\t\taddLine( \"u2\", \"u3\", hexUp );\n\t\taddLine( \"u3\", \"u1\", hexUp );\n\n\t\t// target\n\n\t\taddLine( \"c\", \"t\", hexTarget );\n\t\taddLine( \"p\", \"c\", hexCross );\n\n\t\t// cross\n\n\t\taddLine( \"cn1\", \"cn2\", hexCross );\n\t\taddLine( \"cn3\", \"cn4\", hexCross );\n\n\t\taddLine( \"cf1\", \"cf2\", hexCross );\n\t\taddLine( \"cf3\", \"cf4\", hexCross );\n\n\t\tfunction addLine( a, b, hex ) {\n\n\t\t\taddPoint( a, hex );\n\t\t\taddPoint( b, hex );\n\n\t\t}\n\n\t\tfunction addPoint( id, hex ) {\n\n\t\t\tgeometry.vertices.push( new Vector3() );\n\t\t\tgeometry.colors.push( new Color( hex ) );\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( geometry.vertices.length - 1 );\n\n\t\t}\n\n\t\tLineSegments.call( this, geometry, material );\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}\n\n\tCameraHelper.prototype = Object.create( LineSegments.prototype );\n\tCameraHelper.prototype.constructor = CameraHelper;\n\n\tCameraHelper.prototype.update = function () {\n\n\t\tvar geometry, pointMap;\n\n\t\tvar vector = new Vector3();\n\t\tvar camera = new Camera();\n\n\t\tfunction setPoint( point, x, y, z ) {\n\n\t\t\tvector.set( x, y, z ).unproject( camera );\n\n\t\t\tvar points = pointMap[ point ];\n\n\t\t\tif ( points !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\t\tgeometry.vertices[ points[ i ] ].copy( vector );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn function update() {\n\n\t\t\tgeometry = this.geometry;\n\t\t\tpointMap = this.pointMap;\n\n\t\t\tvar w = 1, h = 1;\n\n\t\t\t// we need just camera projection matrix\n\t\t\t// world matrix must be identity\n\n\t\t\tcamera.projectionMatrix.copy( this.camera.projectionMatrix );\n\n\t\t\t// center / target\n\n\t\t\tsetPoint( \"c\", 0, 0, - 1 );\n\t\t\tsetPoint( \"t\", 0, 0, 1 );\n\n\t\t\t// near\n\n\t\t\tsetPoint( \"n1\", - w, - h, - 1 );\n\t\t\tsetPoint( \"n2\", w, - h, - 1 );\n\t\t\tsetPoint( \"n3\", - w, h, - 1 );\n\t\t\tsetPoint( \"n4\", w, h, - 1 );\n\n\t\t\t// far\n\n\t\t\tsetPoint( \"f1\", - w, - h, 1 );\n\t\t\tsetPoint( \"f2\", w, - h, 1 );\n\t\t\tsetPoint( \"f3\", - w, h, 1 );\n\t\t\tsetPoint( \"f4\", w, h, 1 );\n\n\t\t\t// up\n\n\t\t\tsetPoint( \"u1\", w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u2\", - w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u3\", 0, h * 2, - 1 );\n\n\t\t\t// cross\n\n\t\t\tsetPoint( \"cf1\", - w, 0, 1 );\n\t\t\tsetPoint( \"cf2\", w, 0, 1 );\n\t\t\tsetPoint( \"cf3\", 0, - h, 1 );\n\t\t\tsetPoint( \"cf4\", 0, h, 1 );\n\n\t\t\tsetPoint( \"cn1\", - w, 0, - 1 );\n\t\t\tsetPoint( \"cn2\", w, 0, - 1 );\n\t\t\tsetPoint( \"cn3\", 0, - h, - 1 );\n\t\t\tsetPoint( \"cn4\", 0, h, - 1 );\n\n\t\t\tgeometry.verticesNeedUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\t// a helper to show the world-axis-aligned bounding box for an object\n\n\tfunction BoundingBoxHelper( object, hex ) {\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0x888888;\n\n\t\tthis.object = object;\n\n\t\tthis.box = new Box3();\n\n\t\tMesh.call( this, new BoxGeometry( 1, 1, 1 ), new MeshBasicMaterial( { color: color, wireframe: true } ) );\n\n\t}\n\n\tBoundingBoxHelper.prototype = Object.create( Mesh.prototype );\n\tBoundingBoxHelper.prototype.constructor = BoundingBoxHelper;\n\n\tBoundingBoxHelper.prototype.update = function () {\n\n\t\tthis.box.setFromObject( this.object );\n\n\t\tthis.box.getSize( this.scale );\n\n\t\tthis.box.getCenter( this.position );\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BoxHelper( object, color ) {\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\n\t\tvar indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\t\tvar positions = new Float32Array( 8 * 3 );\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tthis.update( object );\n\n\t\t}\n\n\t}\n\n\tBoxHelper.prototype = Object.create( LineSegments.prototype );\n\tBoxHelper.prototype.constructor = BoxHelper;\n\n\tBoxHelper.prototype.update = ( function () {\n\n\t\tvar box = new Box3();\n\n\t\treturn function update( object ) {\n\n\t\t\tif ( (object && object.isBox3) ) {\n\n\t\t\t\tbox.copy( object );\n\n\t\t\t} else {\n\n\t\t\t\tbox.setFromObject( object );\n\n\t\t\t}\n\n\t\t\tif ( box.isEmpty() ) return;\n\n\t\t\tvar min = box.min;\n\t\t\tvar max = box.max;\n\n\t\t\t/*\n\t\t\t 5____4\n\t\t\t1/___0/|\n\t\t\t| 6__|_7\n\t\t\t2/___3/\n\n\t\t\t0: max.x, max.y, max.z\n\t\t\t1: min.x, max.y, max.z\n\t\t\t2: min.x, min.y, max.z\n\t\t\t3: max.x, min.y, max.z\n\t\t\t4: max.x, max.y, min.z\n\t\t\t5: min.x, max.y, min.z\n\t\t\t6: min.x, min.y, min.z\n\t\t\t7: max.x, min.y, min.z\n\t\t\t*/\n\n\t\t\tvar position = this.geometry.attributes.position;\n\t\t\tvar array = position.array;\n\n\t\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\tthis.geometry.computeBoundingSphere();\n\n\t\t};\n\n\t} )();\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author zz85 / http://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t *\n\t * Creates an arrow for visualizing directions\n\t *\n\t * Parameters:\n\t * dir - Vector3\n\t * origin - Vector3\n\t * length - Number\n\t * color - color in hex value\n\t * headLength - Number\n\t * headWidth - Number\n\t */\n\n\tvar lineGeometry = new BufferGeometry();\n\tlineGeometry.addAttribute( 'position', new Float32Attribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\tvar coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );\n\tconeGeometry.translate( 0, - 0.5, 0 );\n\n\tfunction ArrowHelper( dir, origin, length, color, headLength, headWidth ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tObject3D.call( this );\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\t\tif ( length === undefined ) length = 1;\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) );\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\tArrowHelper.prototype = Object.create( Object3D.prototype );\n\tArrowHelper.prototype.constructor = ArrowHelper;\n\n\tArrowHelper.prototype.setDirection = ( function () {\n\n\t\tvar axis = new Vector3();\n\t\tvar radians;\n\n\t\treturn function setDirection( dir ) {\n\n\t\t\t// dir is assumed to be normalized\n\n\t\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\taxis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\t\tradians = Math.acos( dir.y );\n\n\t\t\t\tthis.quaternion.setFromAxisAngle( axis, radians );\n\n\t\t\t}\n\n\t\t};\n\n\t}() );\n\n\tArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {\n\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tthis.line.scale.set( 1, Math.max( 0, length - headLength ), 1 );\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\tArrowHelper.prototype.setColor = function ( color ) {\n\n\t\tthis.line.material.color.copy( color );\n\t\tthis.cone.material.color.copy( color );\n\n\t};\n\n\t/**\n\t * @author sroucheray / http://sroucheray.org/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AxisHelper( size ) {\n\n\t\tsize = size || 1;\n\n\t\tvar vertices = new Float32Array( [\n\t\t\t0, 0, 0, size, 0, 0,\n\t\t\t0, 0, 0, 0, size, 0,\n\t\t\t0, 0, 0, 0, 0, size\n\t\t] );\n\n\t\tvar colors = new Float32Array( [\n\t\t\t1, 0, 0, 1, 0.6, 0,\n\t\t\t0, 1, 0, 0.6, 1, 0,\n\t\t\t0, 0, 1, 0, 0.6, 1\n\t\t] );\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tAxisHelper.prototype = Object.create( LineSegments.prototype );\n\tAxisHelper.prototype.constructor = AxisHelper;\n\n\t/**\n\t * @author zz85 https://github.com/zz85\n\t *\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t * cusps and self-intersections in non-uniform catmull rom curves.\n\t * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t *\n\t * curve.type accepts centripetal(default), chordal and catmullrom\n\t * curve.tension is used for catmullrom which defaults to 0.5\n\t */\n\n\tvar CatmullRomCurve3 = ( function() {\n\n\t\tvar\n\t\t\ttmp = new Vector3(),\n\t\t\tpx = new CubicPoly(),\n\t\t\tpy = new CubicPoly(),\n\t\t\tpz = new CubicPoly();\n\n\t\t/*\n\t\tBased on an optimized c++ solution in\n\t\t - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t\t - http://ideone.com/NoEbVM\n\n\t\tThis CubicPoly class could be used for reusing some variables and calculations,\n\t\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\t\twhich can be placed in CurveUtils.\n\t\t*/\n\n\t\tfunction CubicPoly() {}\n\n\t\t/*\n\t\t * Compute coefficients for a cubic polynomial\n\t\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t\t * such that\n\t\t * p(0) = x0, p(1) = x1\n\t\t * and\n\t\t * p'(0) = t0, p'(1) = t1.\n\t\t */\n\t\tCubicPoly.prototype.init = function( x0, x1, t0, t1 ) {\n\n\t\t\tthis.c0 = x0;\n\t\t\tthis.c1 = t0;\n\t\t\tthis.c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\t\tthis.c3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t\t};\n\n\t\tCubicPoly.prototype.initNonuniformCatmullRom = function( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tvar t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tvar t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\t// initCubicPoly\n\t\t\tthis.init( x1, x2, t1, t2 );\n\n\t\t};\n\n\t\t// standard Catmull-Rom spline: interpolate between x1 and x2 with previous/following points x1/x4\n\t\tCubicPoly.prototype.initCatmullRom = function( x0, x1, x2, x3, tension ) {\n\n\t\t\tthis.init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t};\n\n\t\tCubicPoly.prototype.calc = function( t ) {\n\n\t\t\tvar t2 = t * t;\n\t\t\tvar t3 = t2 * t;\n\t\t\treturn this.c0 + this.c1 * t + this.c2 * t2 + this.c3 * t3;\n\n\t\t};\n\n\t\t// Subclass Three.js curve\n\t\treturn Curve.create(\n\n\t\t\tfunction ( p /* array of Vector3 */ ) {\n\n\t\t\t\tthis.points = p || [];\n\t\t\t\tthis.closed = false;\n\n\t\t\t},\n\n\t\t\tfunction ( t ) {\n\n\t\t\t\tvar points = this.points,\n\t\t\t\t\tpoint, intPoint, weight, l;\n\n\t\t\t\tl = points.length;\n\n\t\t\t\tif ( l < 2 ) console.log( 'duh, you need at least 2 points' );\n\n\t\t\t\tpoint = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\t\t\tintPoint = Math.floor( point );\n\t\t\t\tweight = point - intPoint;\n\n\t\t\t\tif ( this.closed ) {\n\n\t\t\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length;\n\n\t\t\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\t\t\tintPoint = l - 2;\n\t\t\t\t\tweight = 1;\n\n\t\t\t\t}\n\n\t\t\t\tvar p0, p1, p2, p3; // 4 points\n\n\t\t\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// extrapolate first point\n\t\t\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\t\t\tp0 = tmp;\n\n\t\t\t\t}\n\n\t\t\t\tp1 = points[ intPoint % l ];\n\t\t\t\tp2 = points[ ( intPoint + 1 ) % l ];\n\n\t\t\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// extrapolate last point\n\t\t\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\t\t\tp3 = tmp;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) {\n\n\t\t\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\t\t\tvar pow = this.type === 'chordal' ? 0.5 : 0.25;\n\t\t\t\t\tvar dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\t\t\tvar dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\t\t\tvar dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t\t\t// safety check for repeated points\n\t\t\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t\t\t} else if ( this.type === 'catmullrom' ) {\n\n\t\t\t\t\tvar tension = this.tension !== undefined ? this.tension : 0.5;\n\t\t\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension );\n\t\t\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension );\n\t\t\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension );\n\n\t\t\t\t}\n\n\t\t\t\tvar v = new Vector3(\n\t\t\t\t\tpx.calc( weight ),\n\t\t\t\t\tpy.calc( weight ),\n\t\t\t\t\tpz.calc( weight )\n\t\t\t\t);\n\n\t\t\t\treturn v;\n\n\t\t\t}\n\n\t\t);\n\n\t} )();\n\n\t/**************************************************************\n\t *\tClosed Spline 3D curve\n\t **************************************************************/\n\n\n\tfunction ClosedSplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Please use THREE.CatmullRomCurve3.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\t\tthis.closed = true;\n\n\t}\n\n\tClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t/**************************************************************\n\t *\tSpline 3D curve\n\t **************************************************************/\n\n\n\tvar SplineCurve3 = Curve.create(\n\n\t\tfunction ( points /* array of Vector3 */ ) {\n\n\t\t\tconsole.warn( 'THREE.SplineCurve3 will be deprecated. Please use THREE.CatmullRomCurve3' );\n\t\t\tthis.points = ( points === undefined ) ? [] : points;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tvar points = this.points;\n\t\t\tvar point = ( points.length - 1 ) * t;\n\n\t\t\tvar intPoint = Math.floor( point );\n\t\t\tvar weight = point - intPoint;\n\n\t\t\tvar point0 = points[ intPoint == 0 ? intPoint : intPoint - 1 ];\n\t\t\tvar point1 = points[ intPoint ];\n\t\t\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\t\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\t\tvar interpolate = CurveUtils.interpolate;\n\n\t\t\treturn new Vector3(\n\t\t\t\tinterpolate( point0.x, point1.x, point2.x, point3.x, weight ),\n\t\t\t\tinterpolate( point0.y, point1.y, point2.y, point3.y, weight ),\n\t\t\t\tinterpolate( point0.z, point1.z, point2.z, point3.z, weight )\n\t\t\t);\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tCubic Bezier 3D curve\n\t **************************************************************/\n\n\tvar CubicBezierCurve3 = Curve.create(\n\n\t\tfunction ( v0, v1, v2, v3 ) {\n\n\t\t\tthis.v0 = v0;\n\t\t\tthis.v1 = v1;\n\t\t\tthis.v2 = v2;\n\t\t\tthis.v3 = v3;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tvar b3 = ShapeUtils.b3;\n\n\t\t\treturn new Vector3(\n\t\t\t\tb3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ),\n\t\t\t\tb3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ),\n\t\t\t\tb3( t, this.v0.z, this.v1.z, this.v2.z, this.v3.z )\n\t\t\t);\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tQuadratic Bezier 3D curve\n\t **************************************************************/\n\n\tvar QuadraticBezierCurve3 = Curve.create(\n\n\t\tfunction ( v0, v1, v2 ) {\n\n\t\t\tthis.v0 = v0;\n\t\t\tthis.v1 = v1;\n\t\t\tthis.v2 = v2;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tvar b2 = ShapeUtils.b2;\n\n\t\t\treturn new Vector3(\n\t\t\t\tb2( t, this.v0.x, this.v1.x, this.v2.x ),\n\t\t\t\tb2( t, this.v0.y, this.v1.y, this.v2.y ),\n\t\t\t\tb2( t, this.v0.z, this.v1.z, this.v2.z )\n\t\t\t);\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tLine3D\n\t **************************************************************/\n\n\tvar LineCurve3 = Curve.create(\n\n\t\tfunction ( v1, v2 ) {\n\n\t\t\tthis.v1 = v1;\n\t\t\tthis.v2 = v2;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tif ( t === 1 ) {\n\n\t\t\t\treturn this.v2.clone();\n\n\t\t\t}\n\n\t\t\tvar vector = new Vector3();\n\n\t\t\tvector.subVectors( this.v2, this.v1 ); // diff\n\t\t\tvector.multiplyScalar( t );\n\t\t\tvector.add( this.v1 );\n\n\t\t\treturn vector;\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tArc curve\n\t **************************************************************/\n\n\tfunction ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tEllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t}\n\n\tArcCurve.prototype = Object.create( EllipseCurve.prototype );\n\tArcCurve.prototype.constructor = ArcCurve;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar SceneUtils = {\n\n\t\tcreateMultiMaterialObject: function ( geometry, materials ) {\n\n\t\t\tvar group = new Group();\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tgroup.add( new Mesh( geometry, materials[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t},\n\n\t\tdetach: function ( child, parent, scene ) {\n\n\t\t\tchild.applyMatrix( parent.matrixWorld );\n\t\t\tparent.remove( child );\n\t\t\tscene.add( child );\n\n\t\t},\n\n\t\tattach: function ( child, scene, parent ) {\n\n\t\t\tvar matrixWorldInverse = new Matrix4();\n\t\t\tmatrixWorldInverse.getInverse( parent.matrixWorld );\n\t\t\tchild.applyMatrix( matrixWorldInverse );\n\n\t\t\tscene.remove( child );\n\t\t\tparent.add( child );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Face4 ( a, b, c, d, normal, color, materialIndex ) {\n\t\tconsole.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' );\n\t\treturn new Face3( a, b, c, normal, color, materialIndex );\n\t}\n\n\tvar LineStrip = 0;\n\n\tvar LinePieces = 1;\n\n\tfunction PointCloud ( geometry, material ) {\n\t\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\t}\n\n\tfunction ParticleSystem ( geometry, material ) {\n\t\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\t}\n\n\tfunction PointCloudMaterial ( parameters ) {\n\t\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\t}\n\n\tfunction ParticleBasicMaterial ( parameters ) {\n\t\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\t}\n\n\tfunction ParticleSystemMaterial ( parameters ) {\n\t\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\t}\n\n\tfunction Vertex ( x, y, z ) {\n\t\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\n\t\treturn new Vector3( x, y, z );\n\t}\n\n\t//\n\n\tfunction EdgesHelper( object, hex ) {\n\t\tconsole.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );\n\t\treturn new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\t}\n\n\tfunction WireframeHelper( object, hex ) {\n\t\tconsole.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );\n\t\treturn new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\t}\n\n\t//\n\n\tObject.assign( Box2.prototype, {\n\t\tcenter: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\t\t},\n\t\tempty: function () {\n\t\t\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\t\t\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\t\t}\n\t} );\n\n\tObject.assign( Box3.prototype, {\n\t\tcenter: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\t\t},\n\t\tempty: function () {\n\t\t\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\t\t}\n\t} );\n\n\tObject.assign( Line3.prototype, {\n\t\tcenter: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\t\t}\n\t} );\n\n\tObject.assign( Matrix3.prototype, {\n\t\tmultiplyVector3: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix3( this );\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\t\t}\n\t} );\n\n\tObject.assign( Matrix4.prototype, {\n\t\textractPosition: function ( m ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\n\t\t\treturn this.copyPosition( m );\n\t\t},\n\t\tsetRotationFromQuaternion: function ( q ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\n\t\t\treturn this.makeRotationFromQuaternion( q );\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.' );\n\t\t\treturn vector.applyProjection( this );\n\t\t},\n\t\tmultiplyVector4: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\t\t},\n\t\trotateAxis: function ( v ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\n\t\t\tv.transformDirection( this );\n\t\t},\n\t\tcrossVector: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\t\t},\n\t\ttranslate: function ( v ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\n\t\t},\n\t\trotateX: function ( angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\n\t\t},\n\t\trotateY: function ( angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\n\t\t},\n\t\trotateZ: function ( angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\n\t\t},\n\t\trotateByAxis: function ( axis, angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\n\t\t}\n\t} );\n\n\tObject.assign( Plane.prototype, {\n\t\tisIntersectionLine: function ( line ) {\n\t\t\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\n\t\t\treturn this.intersectsLine( line );\n\t\t}\n\t} );\n\n\tObject.assign( Quaternion.prototype, {\n\t\tmultiplyVector3: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\n\t\t\treturn vector.applyQuaternion( this );\n\t\t}\n\t} );\n\n\tObject.assign( Ray.prototype, {\n\t\tisIntersectionBox: function ( box ) {\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\t\t},\n\t\tisIntersectionPlane: function ( plane ) {\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\n\t\t\treturn this.intersectsPlane( plane );\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\t\t}\n\t} );\n\n\tObject.assign( Shape.prototype, {\n\t\textrude: function ( options ) {\n\t\t\tconsole.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );\n\t\t\treturn new ExtrudeGeometry( this, options );\n\t\t},\n\t\tmakeGeometry: function ( options ) {\n\t\t\tconsole.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );\n\t\t\treturn new ShapeGeometry( this, options );\n\t\t}\n\t} );\n\n\tObject.assign( Vector3.prototype, {\n\t\tsetEulerFromRotationMatrix: function () {\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\n\t\t},\n\t\tsetEulerFromQuaternion: function () {\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\n\t\t},\n\t\tgetPositionFromMatrix: function ( m ) {\n\t\t\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\n\t\t\treturn this.setFromMatrixPosition( m );\n\t\t},\n\t\tgetScaleFromMatrix: function ( m ) {\n\t\t\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\n\t\t\treturn this.setFromMatrixScale( m );\n\t\t},\n\t\tgetColumnFromMatrix: function ( index, matrix ) {\n\t\t\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\n\t\t\treturn this.setFromMatrixColumn( matrix, index );\n\t\t}\n\t} );\n\n\t//\n\n\tObject.assign( Object3D.prototype, {\n\t\tgetChildByName: function ( name ) {\n\t\t\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\n\t\t\treturn this.getObjectByName( name );\n\t\t},\n\t\trenderDepth: function ( value ) {\n\t\t\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\n\t\t},\n\t\ttranslate: function ( distance, axis ) {\n\t\t\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\n\t\t\treturn this.translateOnAxis( axis, distance );\n\t\t}\n\t} );\n\n\tObject.defineProperties( Object3D.prototype, {\n\t\teulerOrder: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\treturn this.rotation.order;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\tthis.rotation.order = value;\n\t\t\t}\n\t\t},\n\t\tuseQuaternion: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( LOD.prototype, {\n\t\tobjects: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.LOD: .objects has been renamed to .levels.' );\n\t\t\t\treturn this.levels;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tPerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {\n\n\t\tconsole.warn( \"THREE.PerspectiveCamera.setLens is deprecated. \" +\n\t\t\t\t\"Use .setFocalLength and .filmGauge for a photographic setup.\" );\n\n\t\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\n\t\tthis.setFocalLength( focalLength );\n\n\t};\n\n\t//\n\n\tObject.defineProperties( Light.prototype, {\n\t\tonlyShadow: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\n\t\t\t}\n\t\t},\n\t\tshadowCameraFov: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\n\t\t\t\tthis.shadow.camera.fov = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraLeft: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\n\t\t\t\tthis.shadow.camera.left = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraRight: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\n\t\t\t\tthis.shadow.camera.right = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraTop: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\n\t\t\t\tthis.shadow.camera.top = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraBottom: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\n\t\t\t\tthis.shadow.camera.bottom = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraNear: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\n\t\t\t\tthis.shadow.camera.near = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraFar: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\n\t\t\t\tthis.shadow.camera.far = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraVisible: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\n\t\t\t}\n\t\t},\n\t\tshadowBias: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\n\t\t\t\tthis.shadow.bias = value;\n\t\t\t}\n\t\t},\n\t\tshadowDarkness: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\n\t\t\t}\n\t\t},\n\t\tshadowMapWidth: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\n\t\t\t\tthis.shadow.mapSize.width = value;\n\t\t\t}\n\t\t},\n\t\tshadowMapHeight: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\n\t\t\t\tthis.shadow.mapSize.height = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( BufferAttribute.prototype, {\n\t\tlength: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Please use .count.' );\n\t\t\t\treturn this.array.length;\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.assign( BufferGeometry.prototype, {\n\t\taddIndex: function ( index ) {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\n\t\t\tthis.setIndex( index );\n\t\t},\n\t\taddDrawCall: function ( start, count, indexOffset ) {\n\t\t\tif ( indexOffset !== undefined ) {\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\n\t\t\t}\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\n\t\t\tthis.addGroup( start, count );\n\t\t},\n\t\tclearDrawCalls: function () {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\n\t\t\tthis.clearGroups();\n\t\t},\n\t\tcomputeTangents: function () {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );\n\t\t},\n\t\tcomputeOffsets: function () {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\n\t\t}\n\t} );\n\n\tObject.defineProperties( BufferGeometry.prototype, {\n\t\tdrawcalls: {\n\t\t\tget: function () {\n\t\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\t\t\t}\n\t\t},\n\t\toffsets: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( Material.prototype, {\n\t\twrapAround: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\t\t\t}\n\t\t},\n\t\twrapRGB: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapRGB has been removed.' );\n\t\t\t\treturn new Color();\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( MeshPhongMaterial.prototype, {\n\t\tmetal: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( ShaderMaterial.prototype, {\n\t\tderivatives: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\treturn this.extensions.derivatives;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\tthis.extensions.derivatives = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tEventDispatcher.prototype = Object.assign( Object.create( {\n\n\t\t// Note: Extra base ensures these properties are not 'assign'ed.\n\n\t\tconstructor: EventDispatcher,\n\n\t\tapply: function ( target ) {\n\n\t\t\tconsole.warn( \"THREE.EventDispatcher: .apply is deprecated, \" +\n\t\t\t\t\t\"just inherit or Object.assign the prototype to mix-in.\" );\n\n\t\t\tObject.assign( target, this );\n\n\t\t}\n\n\t} ), EventDispatcher.prototype );\n\n\t//\n\n\tObject.defineProperties( Uniform.prototype, {\n\t\tdynamic: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );\n\t\t\t}\n\t\t},\n\t\tonUpdate: {\n\t\t\tvalue: function () {\n\t\t\t\tconsole.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.assign( WebGLRenderer.prototype, {\n\t\tsupportsFloatTextures: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_float' );\n\t\t},\n\t\tsupportsHalfFloatTextures: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_half_float' );\n\t\t},\n\t\tsupportsStandardDerivatives: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_standard_derivatives' );\n\t\t},\n\t\tsupportsCompressedTextureS3TC: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\t\t},\n\t\tsupportsCompressedTexturePVRTC: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\t\t},\n\t\tsupportsBlendMinMax: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\n\t\t\treturn this.extensions.get( 'EXT_blend_minmax' );\n\t\t},\n\t\tsupportsVertexTextures: function () {\n\t\t\treturn this.capabilities.vertexTextures;\n\t\t},\n\t\tsupportsInstancedArrays: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\n\t\t\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\n\t\t},\n\t\tenableScissorTest: function ( boolean ) {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\n\t\t\tthis.setScissorTest( boolean );\n\t\t},\n\t\tinitMaterial: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\n\t\t},\n\t\taddPrePlugin: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\n\t\t},\n\t\taddPostPlugin: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\n\t\t},\n\t\tupdateShadowMap: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\n\t\t}\n\t} );\n\n\tObject.defineProperties( WebGLRenderer.prototype, {\n\t\tshadowMapEnabled: {\n\t\t\tget: function () {\n\t\t\t\treturn this.shadowMap.enabled;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\n\t\t\t\tthis.shadowMap.enabled = value;\n\t\t\t}\n\t\t},\n\t\tshadowMapType: {\n\t\t\tget: function () {\n\t\t\t\treturn this.shadowMap.type;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\n\t\t\t\tthis.shadowMap.type = value;\n\t\t\t}\n\t\t},\n\t\tshadowMapCullFace: {\n\t\t\tget: function () {\n\t\t\t\treturn this.shadowMap.cullFace;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' );\n\t\t\t\tthis.shadowMap.cullFace = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( WebGLShadowMap.prototype, {\n\t\tcullFace: {\n\t\t\tget: function () {\n\t\t\t\treturn this.renderReverseSided ? CullFaceFront : CullFaceBack;\n\t\t\t},\n\t\t\tset: function ( cullFace ) {\n\t\t\t\tvar value = ( cullFace !== CullFaceBack );\n\t\t\t\tconsole.warn( \"WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to \" + value + \".\" );\n\t\t\t\tthis.renderReverseSided = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( WebGLRenderTarget.prototype, {\n\t\twrapS: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\treturn this.texture.wrapS;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\tthis.texture.wrapS = value;\n\t\t\t}\n\t\t},\n\t\twrapT: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\treturn this.texture.wrapT;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\tthis.texture.wrapT = value;\n\t\t\t}\n\t\t},\n\t\tmagFilter: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\treturn this.texture.magFilter;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\tthis.texture.magFilter = value;\n\t\t\t}\n\t\t},\n\t\tminFilter: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\treturn this.texture.minFilter;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\tthis.texture.minFilter = value;\n\t\t\t}\n\t\t},\n\t\tanisotropy: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\treturn this.texture.anisotropy;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\tthis.texture.anisotropy = value;\n\t\t\t}\n\t\t},\n\t\toffset: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\treturn this.texture.offset;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\tthis.texture.offset = value;\n\t\t\t}\n\t\t},\n\t\trepeat: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\treturn this.texture.repeat;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\tthis.texture.repeat = value;\n\t\t\t}\n\t\t},\n\t\tformat: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\treturn this.texture.format;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\tthis.texture.format = value;\n\t\t\t}\n\t\t},\n\t\ttype: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\treturn this.texture.type;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\tthis.texture.type = value;\n\t\t\t}\n\t\t},\n\t\tgenerateMipmaps: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\treturn this.texture.generateMipmaps;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\tthis.texture.generateMipmaps = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.assign( Audio.prototype, {\n\t\tload: function ( file ) {\n\t\t\tconsole.warn( 'THREE.Audio: .load has been deprecated. Please use THREE.AudioLoader.' );\n\t\t\tvar scope = this;\n\t\t\tvar audioLoader = new AudioLoader();\n\t\t\taudioLoader.load( file, function ( buffer ) {\n\t\t\t\tscope.setBuffer( buffer );\n\t\t\t} );\n\t\t\treturn this;\n\t\t}\n\t} );\n\n\tObject.assign( AudioAnalyser.prototype, {\n\t\tgetData: function ( file ) {\n\t\t\tconsole.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );\n\t\t\treturn this.getFrequencyData();\n\t\t}\n\t} );\n\n\t//\n\n\tvar GeometryUtils = {\n\n\t\tmerge: function ( geometry1, geometry2, materialIndexOffset ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );\n\n\t\t\tvar matrix;\n\n\t\t\tif ( geometry2.isMesh ) {\n\n\t\t\t\tgeometry2.matrixAutoUpdate && geometry2.updateMatrix();\n\n\t\t\t\tmatrix = geometry2.matrix;\n\t\t\t\tgeometry2 = geometry2.geometry;\n\n\t\t\t}\n\n\t\t\tgeometry1.merge( geometry2, matrix, materialIndexOffset );\n\n\t\t},\n\n\t\tcenter: function ( geometry ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );\n\t\t\treturn geometry.center();\n\n\t\t}\n\n\t};\n\n\tvar ImageUtils = {\n\n\t\tcrossOrigin: undefined,\n\n\t\tloadTexture: function ( url, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\n\n\t\t\tvar loader = new TextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( url, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadTextureCube: function ( urls, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\n\n\t\t\tvar loader = new CubeTextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( urls, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadCompressedTexture: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t},\n\n\t\tloadCompressedTextureCube: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Projector () {\n\n\t\tconsole.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' );\n\n\t\tthis.projectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .projectVector() is now vector.project().' );\n\t\t\tvector.project( camera );\n\n\t\t};\n\n\t\tthis.unprojectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' );\n\t\t\tvector.unproject( camera );\n\n\t\t};\n\n\t\tthis.pickingRay = function ( vector, camera ) {\n\n\t\t\tconsole.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' );\n\n\t\t};\n\n\t}\n\n\t//\n\n\tfunction CanvasRenderer () {\n\n\t\tconsole.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' );\n\n\t\tthis.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\tthis.clear = function () {};\n\t\tthis.render = function () {};\n\t\tthis.setClearColor = function () {};\n\t\tthis.setSize = function () {};\n\n\t}\n\n\texports.WebGLRenderTargetCube = WebGLRenderTargetCube;\n\texports.WebGLRenderTarget = WebGLRenderTarget;\n\texports.WebGLRenderer = WebGLRenderer;\n\texports.ShaderLib = ShaderLib;\n\texports.UniformsLib = UniformsLib;\n\texports.UniformsUtils = UniformsUtils;\n\texports.ShaderChunk = ShaderChunk;\n\texports.FogExp2 = FogExp2;\n\texports.Fog = Fog;\n\texports.Scene = Scene;\n\texports.LensFlare = LensFlare;\n\texports.Sprite = Sprite;\n\texports.LOD = LOD;\n\texports.SkinnedMesh = SkinnedMesh;\n\texports.Skeleton = Skeleton;\n\texports.Bone = Bone;\n\texports.Mesh = Mesh;\n\texports.LineSegments = LineSegments;\n\texports.Line = Line;\n\texports.Points = Points;\n\texports.Group = Group;\n\texports.VideoTexture = VideoTexture;\n\texports.DataTexture = DataTexture;\n\texports.CompressedTexture = CompressedTexture;\n\texports.CubeTexture = CubeTexture;\n\texports.CanvasTexture = CanvasTexture;\n\texports.DepthTexture = DepthTexture;\n\texports.TextureIdCount = TextureIdCount;\n\texports.Texture = Texture;\n\texports.MaterialIdCount = MaterialIdCount;\n\texports.CompressedTextureLoader = CompressedTextureLoader;\n\texports.BinaryTextureLoader = BinaryTextureLoader;\n\texports.DataTextureLoader = DataTextureLoader;\n\texports.CubeTextureLoader = CubeTextureLoader;\n\texports.TextureLoader = TextureLoader;\n\texports.ObjectLoader = ObjectLoader;\n\texports.MaterialLoader = MaterialLoader;\n\texports.BufferGeometryLoader = BufferGeometryLoader;\n\texports.DefaultLoadingManager = DefaultLoadingManager;\n\texports.LoadingManager = LoadingManager;\n\texports.JSONLoader = JSONLoader;\n\texports.ImageLoader = ImageLoader;\n\texports.FontLoader = FontLoader;\n\texports.XHRLoader = XHRLoader;\n\texports.Loader = Loader;\n\texports.Cache = Cache;\n\texports.AudioLoader = AudioLoader;\n\texports.SpotLightShadow = SpotLightShadow;\n\texports.SpotLight = SpotLight;\n\texports.PointLight = PointLight;\n\texports.HemisphereLight = HemisphereLight;\n\texports.DirectionalLightShadow = DirectionalLightShadow;\n\texports.DirectionalLight = DirectionalLight;\n\texports.AmbientLight = AmbientLight;\n\texports.LightShadow = LightShadow;\n\texports.Light = Light;\n\texports.StereoCamera = StereoCamera;\n\texports.PerspectiveCamera = PerspectiveCamera;\n\texports.OrthographicCamera = OrthographicCamera;\n\texports.CubeCamera = CubeCamera;\n\texports.Camera = Camera;\n\texports.AudioListener = AudioListener;\n\texports.PositionalAudio = PositionalAudio;\n\texports.getAudioContext = getAudioContext;\n\texports.AudioAnalyser = AudioAnalyser;\n\texports.Audio = Audio;\n\texports.VectorKeyframeTrack = VectorKeyframeTrack;\n\texports.StringKeyframeTrack = StringKeyframeTrack;\n\texports.QuaternionKeyframeTrack = QuaternionKeyframeTrack;\n\texports.NumberKeyframeTrack = NumberKeyframeTrack;\n\texports.ColorKeyframeTrack = ColorKeyframeTrack;\n\texports.BooleanKeyframeTrack = BooleanKeyframeTrack;\n\texports.PropertyMixer = PropertyMixer;\n\texports.PropertyBinding = PropertyBinding;\n\texports.KeyframeTrack = KeyframeTrack;\n\texports.AnimationUtils = AnimationUtils;\n\texports.AnimationObjectGroup = AnimationObjectGroup;\n\texports.AnimationMixer = AnimationMixer;\n\texports.AnimationClip = AnimationClip;\n\texports.Uniform = Uniform;\n\texports.InstancedBufferGeometry = InstancedBufferGeometry;\n\texports.BufferGeometry = BufferGeometry;\n\texports.GeometryIdCount = GeometryIdCount;\n\texports.Geometry = Geometry;\n\texports.InterleavedBufferAttribute = InterleavedBufferAttribute;\n\texports.InstancedInterleavedBuffer = InstancedInterleavedBuffer;\n\texports.InterleavedBuffer = InterleavedBuffer;\n\texports.InstancedBufferAttribute = InstancedBufferAttribute;\n\texports.DynamicBufferAttribute = DynamicBufferAttribute;\n\texports.Float64Attribute = Float64Attribute;\n\texports.Float32Attribute = Float32Attribute;\n\texports.Uint32Attribute = Uint32Attribute;\n\texports.Int32Attribute = Int32Attribute;\n\texports.Uint16Attribute = Uint16Attribute;\n\texports.Int16Attribute = Int16Attribute;\n\texports.Uint8ClampedAttribute = Uint8ClampedAttribute;\n\texports.Uint8Attribute = Uint8Attribute;\n\texports.Int8Attribute = Int8Attribute;\n\texports.BufferAttribute = BufferAttribute;\n\texports.Face3 = Face3;\n\texports.Object3DIdCount = Object3DIdCount;\n\texports.Object3D = Object3D;\n\texports.Raycaster = Raycaster;\n\texports.Layers = Layers;\n\texports.EventDispatcher = EventDispatcher;\n\texports.Clock = Clock;\n\texports.QuaternionLinearInterpolant = QuaternionLinearInterpolant;\n\texports.LinearInterpolant = LinearInterpolant;\n\texports.DiscreteInterpolant = DiscreteInterpolant;\n\texports.CubicInterpolant = CubicInterpolant;\n\texports.Interpolant = Interpolant;\n\texports.Triangle = Triangle;\n\texports.Spline = Spline;\n\texports.Math = _Math;\n\texports.Spherical = Spherical;\n\texports.Plane = Plane;\n\texports.Frustum = Frustum;\n\texports.Sphere = Sphere;\n\texports.Ray = Ray;\n\texports.Matrix4 = Matrix4;\n\texports.Matrix3 = Matrix3;\n\texports.Box3 = Box3;\n\texports.Box2 = Box2;\n\texports.Line3 = Line3;\n\texports.Euler = Euler;\n\texports.Vector4 = Vector4;\n\texports.Vector3 = Vector3;\n\texports.Vector2 = Vector2;\n\texports.Quaternion = Quaternion;\n\texports.ColorKeywords = ColorKeywords;\n\texports.Color = Color;\n\texports.MorphBlendMesh = MorphBlendMesh;\n\texports.ImmediateRenderObject = ImmediateRenderObject;\n\texports.VertexNormalsHelper = VertexNormalsHelper;\n\texports.SpotLightHelper = SpotLightHelper;\n\texports.SkeletonHelper = SkeletonHelper;\n\texports.PointLightHelper = PointLightHelper;\n\texports.HemisphereLightHelper = HemisphereLightHelper;\n\texports.GridHelper = GridHelper;\n\texports.FaceNormalsHelper = FaceNormalsHelper;\n\texports.DirectionalLightHelper = DirectionalLightHelper;\n\texports.CameraHelper = CameraHelper;\n\texports.BoundingBoxHelper = BoundingBoxHelper;\n\texports.BoxHelper = BoxHelper;\n\texports.ArrowHelper = ArrowHelper;\n\texports.AxisHelper = AxisHelper;\n\texports.ClosedSplineCurve3 = ClosedSplineCurve3;\n\texports.CatmullRomCurve3 = CatmullRomCurve3;\n\texports.SplineCurve3 = SplineCurve3;\n\texports.CubicBezierCurve3 = CubicBezierCurve3;\n\texports.QuadraticBezierCurve3 = QuadraticBezierCurve3;\n\texports.LineCurve3 = LineCurve3;\n\texports.ArcCurve = ArcCurve;\n\texports.EllipseCurve = EllipseCurve;\n\texports.SplineCurve = SplineCurve;\n\texports.CubicBezierCurve = CubicBezierCurve;\n\texports.QuadraticBezierCurve = QuadraticBezierCurve;\n\texports.LineCurve = LineCurve;\n\texports.Shape = Shape;\n\texports.ShapePath = ShapePath;\n\texports.Path = Path;\n\texports.Font = Font;\n\texports.CurvePath = CurvePath;\n\texports.Curve = Curve;\n\texports.ShapeUtils = ShapeUtils;\n\texports.SceneUtils = SceneUtils;\n\texports.CurveUtils = CurveUtils;\n\texports.WireframeGeometry = WireframeGeometry;\n\texports.ParametricGeometry = ParametricGeometry;\n\texports.ParametricBufferGeometry = ParametricBufferGeometry;\n\texports.TetrahedronGeometry = TetrahedronGeometry;\n\texports.TetrahedronBufferGeometry = TetrahedronBufferGeometry;\n\texports.OctahedronGeometry = OctahedronGeometry;\n\texports.OctahedronBufferGeometry = OctahedronBufferGeometry;\n\texports.IcosahedronGeometry = IcosahedronGeometry;\n\texports.IcosahedronBufferGeometry = IcosahedronBufferGeometry;\n\texports.DodecahedronGeometry = DodecahedronGeometry;\n\texports.DodecahedronBufferGeometry = DodecahedronBufferGeometry;\n\texports.PolyhedronGeometry = PolyhedronGeometry;\n\texports.PolyhedronBufferGeometry = PolyhedronBufferGeometry;\n\texports.TubeGeometry = TubeGeometry;\n\texports.TubeBufferGeometry = TubeBufferGeometry;\n\texports.TorusKnotGeometry = TorusKnotGeometry;\n\texports.TorusKnotBufferGeometry = TorusKnotBufferGeometry;\n\texports.TorusGeometry = TorusGeometry;\n\texports.TorusBufferGeometry = TorusBufferGeometry;\n\texports.TextGeometry = TextGeometry;\n\texports.SphereBufferGeometry = SphereBufferGeometry;\n\texports.SphereGeometry = SphereGeometry;\n\texports.RingGeometry = RingGeometry;\n\texports.RingBufferGeometry = RingBufferGeometry;\n\texports.PlaneBufferGeometry = PlaneBufferGeometry;\n\texports.PlaneGeometry = PlaneGeometry;\n\texports.LatheGeometry = LatheGeometry;\n\texports.LatheBufferGeometry = LatheBufferGeometry;\n\texports.ShapeGeometry = ShapeGeometry;\n\texports.ExtrudeGeometry = ExtrudeGeometry;\n\texports.EdgesGeometry = EdgesGeometry;\n\texports.ConeGeometry = ConeGeometry;\n\texports.ConeBufferGeometry = ConeBufferGeometry;\n\texports.CylinderGeometry = CylinderGeometry;\n\texports.CylinderBufferGeometry = CylinderBufferGeometry;\n\texports.CircleBufferGeometry = CircleBufferGeometry;\n\texports.CircleGeometry = CircleGeometry;\n\texports.BoxBufferGeometry = BoxBufferGeometry;\n\texports.BoxGeometry = BoxGeometry;\n\texports.ShadowMaterial = ShadowMaterial;\n\texports.SpriteMaterial = SpriteMaterial;\n\texports.RawShaderMaterial = RawShaderMaterial;\n\texports.ShaderMaterial = ShaderMaterial;\n\texports.PointsMaterial = PointsMaterial;\n\texports.MultiMaterial = MultiMaterial;\n\texports.MeshPhysicalMaterial = MeshPhysicalMaterial;\n\texports.MeshStandardMaterial = MeshStandardMaterial;\n\texports.MeshPhongMaterial = MeshPhongMaterial;\n\texports.MeshNormalMaterial = MeshNormalMaterial;\n\texports.MeshLambertMaterial = MeshLambertMaterial;\n\texports.MeshDepthMaterial = MeshDepthMaterial;\n\texports.MeshBasicMaterial = MeshBasicMaterial;\n\texports.LineDashedMaterial = LineDashedMaterial;\n\texports.LineBasicMaterial = LineBasicMaterial;\n\texports.Material = Material;\n\texports.REVISION = REVISION;\n\texports.MOUSE = MOUSE;\n\texports.CullFaceNone = CullFaceNone;\n\texports.CullFaceBack = CullFaceBack;\n\texports.CullFaceFront = CullFaceFront;\n\texports.CullFaceFrontBack = CullFaceFrontBack;\n\texports.FrontFaceDirectionCW = FrontFaceDirectionCW;\n\texports.FrontFaceDirectionCCW = FrontFaceDirectionCCW;\n\texports.BasicShadowMap = BasicShadowMap;\n\texports.PCFShadowMap = PCFShadowMap;\n\texports.PCFSoftShadowMap = PCFSoftShadowMap;\n\texports.FrontSide = FrontSide;\n\texports.BackSide = BackSide;\n\texports.DoubleSide = DoubleSide;\n\texports.FlatShading = FlatShading;\n\texports.SmoothShading = SmoothShading;\n\texports.NoColors = NoColors;\n\texports.FaceColors = FaceColors;\n\texports.VertexColors = VertexColors;\n\texports.NoBlending = NoBlending;\n\texports.NormalBlending = NormalBlending;\n\texports.AdditiveBlending = AdditiveBlending;\n\texports.SubtractiveBlending = SubtractiveBlending;\n\texports.MultiplyBlending = MultiplyBlending;\n\texports.CustomBlending = CustomBlending;\n\texports.BlendingMode = BlendingMode;\n\texports.AddEquation = AddEquation;\n\texports.SubtractEquation = SubtractEquation;\n\texports.ReverseSubtractEquation = ReverseSubtractEquation;\n\texports.MinEquation = MinEquation;\n\texports.MaxEquation = MaxEquation;\n\texports.ZeroFactor = ZeroFactor;\n\texports.OneFactor = OneFactor;\n\texports.SrcColorFactor = SrcColorFactor;\n\texports.OneMinusSrcColorFactor = OneMinusSrcColorFactor;\n\texports.SrcAlphaFactor = SrcAlphaFactor;\n\texports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor;\n\texports.DstAlphaFactor = DstAlphaFactor;\n\texports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor;\n\texports.DstColorFactor = DstColorFactor;\n\texports.OneMinusDstColorFactor = OneMinusDstColorFactor;\n\texports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor;\n\texports.NeverDepth = NeverDepth;\n\texports.AlwaysDepth = AlwaysDepth;\n\texports.LessDepth = LessDepth;\n\texports.LessEqualDepth = LessEqualDepth;\n\texports.EqualDepth = EqualDepth;\n\texports.GreaterEqualDepth = GreaterEqualDepth;\n\texports.GreaterDepth = GreaterDepth;\n\texports.NotEqualDepth = NotEqualDepth;\n\texports.MultiplyOperation = MultiplyOperation;\n\texports.MixOperation = MixOperation;\n\texports.AddOperation = AddOperation;\n\texports.NoToneMapping = NoToneMapping;\n\texports.LinearToneMapping = LinearToneMapping;\n\texports.ReinhardToneMapping = ReinhardToneMapping;\n\texports.Uncharted2ToneMapping = Uncharted2ToneMapping;\n\texports.CineonToneMapping = CineonToneMapping;\n\texports.UVMapping = UVMapping;\n\texports.CubeReflectionMapping = CubeReflectionMapping;\n\texports.CubeRefractionMapping = CubeRefractionMapping;\n\texports.EquirectangularReflectionMapping = EquirectangularReflectionMapping;\n\texports.EquirectangularRefractionMapping = EquirectangularRefractionMapping;\n\texports.SphericalReflectionMapping = SphericalReflectionMapping;\n\texports.CubeUVReflectionMapping = CubeUVReflectionMapping;\n\texports.CubeUVRefractionMapping = CubeUVRefractionMapping;\n\texports.TextureMapping = TextureMapping;\n\texports.RepeatWrapping = RepeatWrapping;\n\texports.ClampToEdgeWrapping = ClampToEdgeWrapping;\n\texports.MirroredRepeatWrapping = MirroredRepeatWrapping;\n\texports.TextureWrapping = TextureWrapping;\n\texports.NearestFilter = NearestFilter;\n\texports.NearestMipMapNearestFilter = NearestMipMapNearestFilter;\n\texports.NearestMipMapLinearFilter = NearestMipMapLinearFilter;\n\texports.LinearFilter = LinearFilter;\n\texports.LinearMipMapNearestFilter = LinearMipMapNearestFilter;\n\texports.LinearMipMapLinearFilter = LinearMipMapLinearFilter;\n\texports.TextureFilter = TextureFilter;\n\texports.UnsignedByteType = UnsignedByteType;\n\texports.ByteType = ByteType;\n\texports.ShortType = ShortType;\n\texports.UnsignedShortType = UnsignedShortType;\n\texports.IntType = IntType;\n\texports.UnsignedIntType = UnsignedIntType;\n\texports.FloatType = FloatType;\n\texports.HalfFloatType = HalfFloatType;\n\texports.UnsignedShort4444Type = UnsignedShort4444Type;\n\texports.UnsignedShort5551Type = UnsignedShort5551Type;\n\texports.UnsignedShort565Type = UnsignedShort565Type;\n\texports.UnsignedInt248Type = UnsignedInt248Type;\n\texports.AlphaFormat = AlphaFormat;\n\texports.RGBFormat = RGBFormat;\n\texports.RGBAFormat = RGBAFormat;\n\texports.LuminanceFormat = LuminanceFormat;\n\texports.LuminanceAlphaFormat = LuminanceAlphaFormat;\n\texports.RGBEFormat = RGBEFormat;\n\texports.DepthFormat = DepthFormat;\n\texports.DepthStencilFormat = DepthStencilFormat;\n\texports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format;\n\texports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format;\n\texports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format;\n\texports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format;\n\texports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format;\n\texports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format;\n\texports.RGB_ETC1_Format = RGB_ETC1_Format;\n\texports.LoopOnce = LoopOnce;\n\texports.LoopRepeat = LoopRepeat;\n\texports.LoopPingPong = LoopPingPong;\n\texports.InterpolateDiscrete = InterpolateDiscrete;\n\texports.InterpolateLinear = InterpolateLinear;\n\texports.InterpolateSmooth = InterpolateSmooth;\n\texports.ZeroCurvatureEnding = ZeroCurvatureEnding;\n\texports.ZeroSlopeEnding = ZeroSlopeEnding;\n\texports.WrapAroundEnding = WrapAroundEnding;\n\texports.TrianglesDrawMode = TrianglesDrawMode;\n\texports.TriangleStripDrawMode = TriangleStripDrawMode;\n\texports.TriangleFanDrawMode = TriangleFanDrawMode;\n\texports.LinearEncoding = LinearEncoding;\n\texports.sRGBEncoding = sRGBEncoding;\n\texports.GammaEncoding = GammaEncoding;\n\texports.RGBEEncoding = RGBEEncoding;\n\texports.LogLuvEncoding = LogLuvEncoding;\n\texports.RGBM7Encoding = RGBM7Encoding;\n\texports.RGBM16Encoding = RGBM16Encoding;\n\texports.RGBDEncoding = RGBDEncoding;\n\texports.BasicDepthPacking = BasicDepthPacking;\n\texports.RGBADepthPacking = RGBADepthPacking;\n\texports.CubeGeometry = BoxGeometry;\n\texports.Face4 = Face4;\n\texports.LineStrip = LineStrip;\n\texports.LinePieces = LinePieces;\n\texports.MeshFaceMaterial = MultiMaterial;\n\texports.PointCloud = PointCloud;\n\texports.Particle = Sprite;\n\texports.ParticleSystem = ParticleSystem;\n\texports.PointCloudMaterial = PointCloudMaterial;\n\texports.ParticleBasicMaterial = ParticleBasicMaterial;\n\texports.ParticleSystemMaterial = ParticleSystemMaterial;\n\texports.Vertex = Vertex;\n\texports.EdgesHelper = EdgesHelper;\n\texports.WireframeHelper = WireframeHelper;\n\texports.GeometryUtils = GeometryUtils;\n\texports.ImageUtils = ImageUtils;\n\texports.Projector = Projector;\n\texports.CanvasRenderer = CanvasRenderer;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n\tObject.defineProperty( exports, 'AudioContext', {\n\t\tget: function () {\n\t\t\treturn exports.getAudioContext();\n\t\t}\n\t});\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three/build/three.js\n// module id = 2\n// module chunks = 0","const THREE = require('three');\n\nexport default class Agent {\n constructor(id, pos, vel, goal, size, col) {\n \tthis.id = id;\n this.position = pos;\n this.velocity = vel;\n this.goal = goal\n this.size = size;\n this.markers = [];\n this.color = col;\n this.mesh = null;\n }\n} \n\n\n// WEBPACK FOOTER //\n// ./src/agent.js","export default class Marker {\n\tconstructor(position) {\n\t\tthis.position = position;\n\t\tthis.color = 0xff0000;\n\t\tthis.owned = false;\n\t\tthis.mesh = null;\n\t\tthis.agent = null;\n\t}\n}\n\n\n// WEBPACK FOOTER //\n// ./src/marker.js","const THREE = require('three');\nimport Grid from './grid.js'\nimport Agent from './agent.js'\nimport Marker from './marker.js'\n\nexport default class Crowd {\n constructor(renderengine) {\n \tthis.renderengine = renderengine;\n \tthis.markers = [];\n \tthis.agents = [];\n \tthis.board = new Grid(10.0, 100.0);\n\n \tthis.create_agents();\n \tthis.populate_board();\n \tthis.create_markers();\n \tthis.renderengine.render_plane(100.0);\n \tthis.renderengine.render_agents(this.agents);\n \tthis.renderengine.render_markers(this.markers);\n }\n\n create_agents() {\n \tvar agent_1_pos = new THREE.Vector3(-49, 1, 49);\n \tvar agent_2_pos = new THREE.Vector3(49, 1, 49);\n \tvar agent_1_goal = new THREE.Vector3(49, 0, -49);\n \tvar agent_2_goal = new THREE.Vector3(-49, 0, -49);\n \tvar zero = new THREE.Vector3(0, 0, 0);\n\n \tvar agent_1 = new Agent(0, agent_1_pos, zero, agent_1_goal, 2.0, 0x00ff00);\n \tvar agent_2 = new Agent(1, agent_2_pos, zero, agent_2_goal, 2.0, 0x0000ff);\n\tthis.agents.push(agent_1);\n\tthis.agents.push(agent_2);\n }\n\n populate_board() {\n \tfor (var i = 0; i < this.agents.length; i++) {\n \t\tvar agent = this.agents[i];\n \t\tvar gs = this.board.find_nearest_grid(agent.position.x, agent.position.z);\n \t\tthis.board.grid[gs.z][gs.x].add(agent);\n \t}\n }\n\n create_markers() {\n\tfor (var i = 0; i < 2000; i++) {\n\t\tvar x = Math.random() * 98 - 49;\n\t\tvar z = Math.random() * 98 - 49;\n\t\tvar marker = new Marker(new THREE.Vector3(x, 0.5, z));\n\t\tthis.markers.push(marker);\n\t}\n }\n\n /* \n\tupdate() - for each agent in the crowd, the velocity is calculated based off of the markers that belongs to each agent. \n */ \n update(time) {\n \tthis.update_marker_ownership();\n \tthis.update_agent_velocities(time);\n \tthis.renderengine.update_agents(this.agents);\n \tthis.renderengine.update_markers(this.markers);\n \tthis.reset_ownership();\n }\n\n reset_ownership() {\n \tfor (var i = 0; i < this.agents.length; i++) {\n \t\tthis.agents[i].markers = [];\n \t}\n\n \tfor (var i = 0; i < this.markers.length; i++) {\n \t\tthis.markers[i].owned = false;\n \t\tthis.markers[i].color = 0xff0000;\n \t\tthis.markers[i].agent = null;\n \t}\n }\n\n update_marker_ownership() {\n \tfor (var i = 0; i < this.markers.length; i++) {\n \t\tvar marker = this.markers[i];\n \t\tif (marker.owned) {\n \t\t\tcontinue;\n \t\t}\n \t\tvar ngs = this.board.find_nearest_grid(marker.position.x, marker.position.z);\n \t\tvar top_left = {x: ngs.x -1, z: ngs.z - 1};\n \t\tvar top = {x: ngs.x, z: ngs.z - 1};\n \t\tvar left = {x: ngs.x - 1, z: ngs.z};\n \t\tvar grid = this.board.grid;\n \t\tvar eligible_agents = [];\n \t\tif (top_left.z > -1 && top_left.x > -1 && grid[top_left.z][top_left.x].size > 0) {\n \t\t\tgrid[top_left.z][top_left.x].forEach(function(agent) {\n \t\t\t\teligible_agents.push(agent);\n \t\t\t});\n \t\t}\n \t\tif (top.z > -1 && top.x > -1 && grid[top.z][top.x].size > 0) {\n \t\t\tgrid[top.z][top.x].forEach(function(agent) {\n \t\t\t\teligible_agents.push(agent);\n \t\t\t});\n\t\t}\n \t\tif (left.z > -1 && left.x > -1 && grid[left.z][left.x].size > 0) {\n \t\t\tgrid[left.z][left.x].forEach(function(agent) {\n \t\t\t\teligible_agents.push(agent);\n \t\t\t});\n \t\t}\n \t\tif (ngs.z > -1 && ngs.x > -1 && grid[ngs.z][ngs.x].size > 0) {\n \t\t\tgrid[ngs.z][ngs.x].forEach(function(agent) {\n \t\t\t\teligible_agents.push(agent);\n \t\t\t});\n \t\t}\n \t\tthis.assign_marker_to_agent(eligible_agents, marker);\n \t}\n }\n\n assign_marker_to_agent(agents, marker) {\n \tif (agents.length === 0) {\n \t\tmarker.color = 0xff0000;\n \t\tmarker.owned = false;\n \t\tmarker.agent = null;\n \t\treturn;\n \t}\n \tvar closest = {dist: marker.position.distanceTo(agents[0].position), agent: agents[0]};\n \tagents.forEach(function(agent) {\n \t\tvar test_dist = marker.position.distanceTo(agent.position);\n \t\tif (test_dist < closest.dist) {\n \t\t\tclosest.dist = test_dist;\n \t\t\tclosest.agent = agent;\n \t\t}\n \t});\n \tmarker.agent = closest.agent;\n \tmarker.color = closest.agent.color;\n \tmarker.owned = true;\n \tclosest.agent.markers.push(marker);\n \treturn;\n }\n\n update_agent_velocities(time) {\n \tfor (var i = 0; i < this.agents.length; i++) {\n \t\tvar agent = this.agents[i];\n \t\tif (agent.position.distanceTo(agent.goal) > 2.0) {\n\t \t\tvar old_gs = this.board.find_nearest_grid(agent.position.x, agent.position.z);\n\n\t \t\t// computing total marker influence\n\t \t\tvar G = new THREE.Vector3(agent.goal.x - agent.position.x, 0, agent.goal.z - agent.position.z);\n\t \t\tvar total_weight = 0.0;\n\t \t\tvar total_velocity = new THREE.Vector3(0, 0, 0);\n\t \t\tfor (var j = 0; j < agent.markers.length; j++) {\n\t \t\t\tvar marker = agent.markers[j];\n\t \t\t\tvar m = new THREE.Vector3(marker.position.x - agent.position.x, 0, marker.position.z - agent.position.z);\n\t \t\t\tvar weight = (1.0 + Math.cos(m.angleTo(G))) / (1.0 + m.length());\n\t \t\t\ttotal_weight += weight;\n\t \t\t}\n\t \t\tfor (var j = 0; j < agent.markers.length; j++) {\n\t \t\t\tvar marker = agent.markers[j];\n\t \t\t\tvar m = new THREE.Vector3(marker.position.x - agent.position.x, 0, marker.position.z - agent.position.z);\n\t \t\t\tvar weight = (1.0 + Math.cos(m.angleTo(G))) / (1.0 + m.length());\n\t \t\t\ttotal_velocity.add(m.multiplyScalar(weight / total_weight));\n\t \t\t}\n\t\t\tif (i === 1) {\n\t \t\t}\n\t \t\t// agent.velocity = total_velocity.normalize();\n\t \t\tagent.position.add(total_velocity.multiplyScalar(time).normalize());\n\t \t\t// agent.position.add(G.divideScalar(100.0));\n\t \t\t// check if the movement of this agent causes it to leave its current grid\n\t\t\tvar agent_gs = this.board.find_nearest_grid(agent.position.x, agent.position.z);\n\t\t\tif (old_gs.x !== agent_gs.x || old_gs.z !== agent_gs.z) {\n \t\t\t\tthis.board.grid[old_gs.z][old_gs.x].delete(agent);\n \t\t\t\tthis.board.grid[agent_gs.z][agent_gs.x].add(agent);\n\t\t\t}\n\t \t}\n \t}\n }\n}\n\n\n// WEBPACK FOOTER //\n// ./src/crowd.js","const THREE = require('three');\n\nexport default class RenderEngine {\n\n\tconstructor(scene) {\n\t\tthis.scene = scene;\n \t}\n\n \trender_plane(size) {\n\t \tvar plane_geo = new THREE.PlaneGeometry(size, size);\n\t\tvar plane_mesh = new THREE.Mesh(plane_geo, new THREE.MeshBasicMaterial( {color: 0xcccccc, side: THREE.DoubleSide}));\n\t\tplane_mesh.rotation.x = Math.PI / 2.0;\n\t\tplane_mesh.position.set(0.0, 0.0, 0.0);\n\t\tthis.scene.add(plane_mesh);\n \t}\n\n \trender_agents(agents) {\n\t \tvar cylinder_geo = new THREE.CylinderGeometry(1, 1, 2, 20);\n\t\tvar agent; \n\t\tfor (var i = 0; i < agents.length; i++) {\n\t\t\tagent = new THREE.Mesh(cylinder_geo, new THREE.MeshBasicMaterial( {color: agents[i].color, side: THREE.DoubleSide}));\n\t\t\tagent.position.set(agents[i].position.x, agents[i].position.y, agents[i].position.z);\n\t\t\tagents[i].mesh = agent;\n\t\t\tthis.scene.add(agent);\n\t\t}\n \t}\n \n \trender_markers(markers) {\n\t\tvar cube_geo = new THREE.BoxGeometry(0.5, 0.5, 0.5);\n\t\tvar marker;\n\t\tfor (var i = 0; i < markers.length; i++) {\n\t\t\tmarker = new THREE.Mesh(cube_geo, new THREE.MeshBasicMaterial( {color: markers[i].color, side: THREE.DoubleSide}));\n\t\t\tmarker.position.set(markers[i].position.x, markers[i].position.y, markers[i].position.z);\n\t\t\tmarkers[i].mesh = marker;\n\t\t\tthis.scene.add(marker);\n\t\t}\n \t}\n\n \tupdate_agents(agents) {\n \t\tfor (var i = 0; i < agents.length; i++) {\n \t\t\tvar pos = agents[i].position;\n \t\t\tvar mesh = agents[i].mesh;\n \t\t\tmesh.position.set(pos.x, pos.y, pos.z);\n \t\t\tmesh.geometry.verticesNeedUpdate = true;\n \t\t}\n \t}\n\n \tupdate_markers(markers) {\n \t\tmarkers.forEach(function(marker) {\n \t\t\tmarker.mesh.material.color.setHex(marker.color);\n \t\t});\n \t}\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/renderengine.js","\nconst THREE = require('three');\nconst OrbitControls = require('three-orbit-controls')(THREE)\nimport Stats from 'stats-js'\nimport DAT from 'dat-gui'\n\n// when the scene is done initializing, the function passed as `callback` will be executed\n// then, every frame, the function passed as `update` will be executed\nfunction init(callback, update) {\n var stats = new Stats();\n stats.setMode(1);\n stats.domElement.style.position = 'absolute';\n stats.domElement.style.left = '0px';\n stats.domElement.style.top = '0px';\n document.body.appendChild(stats.domElement);\n\n var gui = new DAT.GUI();\n\n var framework = {\n gui: gui,\n stats: stats\n };\n\n // run this function after the window loads\n window.addEventListener('load', function() {\n\n var scene = new THREE.Scene();\n var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );\n var renderer = new THREE.WebGLRenderer( { antialias: true } );\n renderer.setPixelRatio(window.devicePixelRatio);\n renderer.setSize(window.innerWidth, window.innerHeight);\n renderer.setClearColor(0x020202, 0);\n\n var controls = new OrbitControls(camera, renderer.domElement);\n controls.enableDamping = true;\n controls.enableZoom = true;\n controls.target.set(0, 0, 0);\n controls.rotateSpeed = 0.3;\n controls.zoomSpeed = 1.0;\n controls.panSpeed = 2.0;\n\n document.body.appendChild(renderer.domElement);\n\n // resize the canvas when the window changes\n window.addEventListener('resize', function() {\n camera.aspect = window.innerWidth / window.innerHeight;\n camera.updateProjectionMatrix();\n renderer.setSize(window.innerWidth, window.innerHeight);\n }, false);\n\n // assign THREE.js objects to the object we will return\n framework.scene = scene;\n framework.camera = camera;\n framework.renderer = renderer;\n\n // begin the animation loop\n (function tick() {\n stats.begin();\n update(framework); // perform any requested updates\n renderer.render(scene, camera); // render the scene\n stats.end();\n requestAnimationFrame(tick); // register to call this again when the browser renders a new frame\n })();\n\n // we will pass the scene, gui, renderer, camera, etc... to the callback function\n return callback(framework);\n });\n}\n\nexport default {\n init: init\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/framework.js","// stats.js - http://github.com/mrdoob/stats.js\nvar Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement(\"div\");f.id=\"stats\";f.addEventListener(\"mousedown\",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText=\"width:80px;opacity:0.9;cursor:pointer\";var a=document.createElement(\"div\");a.id=\"fps\";a.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#002\";f.appendChild(a);var i=document.createElement(\"div\");i.id=\"fpsText\";i.style.cssText=\"color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";\ni.innerHTML=\"FPS\";a.appendChild(i);var c=document.createElement(\"div\");c.id=\"fpsGraph\";c.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0ff\";for(a.appendChild(c);74>c.children.length;){var j=document.createElement(\"span\");j.style.cssText=\"width:1px;height:30px;float:left;background-color:#113\";c.appendChild(j)}var d=document.createElement(\"div\");d.id=\"ms\";d.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#020;display:none\";f.appendChild(d);var k=document.createElement(\"div\");\nk.id=\"msText\";k.style.cssText=\"color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";k.innerHTML=\"MS\";d.appendChild(k);var e=document.createElement(\"div\");e.id=\"msGraph\";e.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0f0\";for(d.appendChild(e);74>e.children.length;)j=document.createElement(\"span\"),j.style.cssText=\"width:1px;height:30px;float:left;background-color:#131\",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display=\n\"block\";d.style.display=\"none\";break;case 1:a.style.display=\"none\",d.style.display=\"block\"}};return{REVISION:12,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+\" MS (\"+n+\"-\"+o+\")\";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+\"px\";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+\" FPS (\"+p+\"-\"+q+\")\",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height=\na+\"px\",m=b,r=0);return b},update:function(){l=this.end()}}};\"object\"===typeof module&&(module.exports=Stats);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/stats-js/build/stats.min.js\n// module id = 8\n// module chunks = 0","module.exports = require('./vendor/dat.gui')\nmodule.exports.color = require('./vendor/dat.color')\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/index.js\n// module id = 9\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.gui = dat.gui || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\n/** @namespace */\ndat.controllers = dat.controllers || {};\n\n/** @namespace */\ndat.dom = dat.dom || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\ndat.utils.css = (function () {\n return {\n load: function (url, doc) {\n doc = doc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function(css, doc) {\n doc = doc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = css;\n doc.getElementsByTagName('head')[0].appendChild(injected);\n }\n }\n})();\n\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.controllers.Controller = (function (common) {\n\n /**\n * @class An \"abstract\" class that represents a given property of an object.\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var Controller = function(object, property) {\n\n this.initialValue = object[property];\n\n /**\n * Those who extend this class will put their DOM elements in here.\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n\n /**\n * The object to manipulate\n * @type {Object}\n */\n this.object = object;\n\n /**\n * The name of the property to manipulate\n * @type {String}\n */\n this.property = property;\n\n /**\n * The function to be called on change.\n * @type {Function}\n * @ignore\n */\n this.__onChange = undefined;\n\n /**\n * The function to be called on finishing change.\n * @type {Function}\n * @ignore\n */\n this.__onFinishChange = undefined;\n\n };\n\n common.extend(\n\n Controller.prototype,\n\n /** @lends dat.controllers.Controller.prototype */\n {\n\n /**\n * Specify that a function fire every time someone changes the value with\n * this Controller.\n *\n * @param {Function} fnc This function will be called whenever the value\n * is modified via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onChange: function(fnc) {\n this.__onChange = fnc;\n return this;\n },\n\n /**\n * Specify that a function fire every time someone \"finishes\" changing\n * the value wih this Controller. Useful for values that change\n * incrementally like numbers or strings.\n *\n * @param {Function} fnc This function will be called whenever\n * someone \"finishes\" changing the value via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onFinishChange: function(fnc) {\n this.__onFinishChange = fnc;\n return this;\n },\n\n /**\n * Change the value of object[property]\n *\n * @param {Object} newValue The new value of object[property]\n */\n setValue: function(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n },\n\n /**\n * Gets the value of object[property]\n *\n * @returns {Object} The current value of object[property]\n */\n getValue: function() {\n return this.object[this.property];\n },\n\n /**\n * Refreshes the visual display of a Controller in order to keep sync\n * with the object's current value.\n * @returns {dat.controllers.Controller} this\n */\n updateDisplay: function() {\n return this;\n },\n\n /**\n * @returns {Boolean} true if the value has deviated from initialValue\n */\n isModified: function() {\n return this.initialValue !== this.getValue()\n }\n\n }\n\n );\n\n return Controller;\n\n\n})(dat.utils.common);\n\n\ndat.dom.dom = (function (common) {\n\n var EVENT_MAP = {\n 'HTMLEvents': ['change'],\n 'MouseEvents': ['click','mousemove','mousedown','mouseup', 'mouseover'],\n 'KeyboardEvents': ['keydown']\n };\n\n var EVENT_MAP_INV = {};\n common.each(EVENT_MAP, function(v, k) {\n common.each(v, function(e) {\n EVENT_MAP_INV[e] = k;\n });\n });\n\n var CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\n\n function cssValueToPixels(val) {\n\n if (val === '0' || common.isUndefined(val)) return 0;\n\n var match = val.match(CSS_VALUE_PIXELS);\n\n if (!common.isNull(match)) {\n return parseFloat(match[1]);\n }\n\n // TODO ...ems? %?\n\n return 0;\n\n }\n\n /**\n * @namespace\n * @member dat.dom\n */\n var dom = {\n\n /**\n * \n * @param elem\n * @param selectable\n */\n makeSelectable: function(elem, selectable) {\n\n if (elem === undefined || elem.style === undefined) return;\n\n elem.onselectstart = selectable ? function() {\n return false;\n } : function() {\n };\n\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n\n },\n\n /**\n *\n * @param elem\n * @param horizontal\n * @param vertical\n */\n makeFullscreen: function(elem, horizontal, vertical) {\n\n if (common.isUndefined(horizontal)) horizontal = true;\n if (common.isUndefined(vertical)) vertical = true;\n\n elem.style.position = 'absolute';\n\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n\n },\n\n /**\n *\n * @param elem\n * @param eventType\n * @param params\n */\n fakeEvent: function(elem, eventType, params, aux) {\n params = params || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false,\n params.cancelable || true, window, params.clickCount || 1,\n 0, //screen X\n 0, //screen Y\n clientX, //client X\n clientY, //client Y\n false, false, false, false, 0, null);\n break;\n case 'KeyboardEvents':\n var init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz\n common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false,\n params.cancelable, window,\n params.ctrlKey, params.altKey,\n params.shiftKey, params.metaKey,\n params.keyCode, params.charCode);\n break;\n default:\n evt.initEvent(eventType, params.bubbles || false,\n params.cancelable || true);\n break;\n }\n common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n bind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.addEventListener)\n elem.addEventListener(event, func, bool);\n else if (elem.attachEvent)\n elem.attachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n unbind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.removeEventListener)\n elem.removeEventListener(event, func, bool);\n else if (elem.detachEvent)\n elem.detachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n addClass: function(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) == -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n removeClass: function(elem, className) {\n if (className) {\n if (elem.className === undefined) {\n // elem.className = className;\n } else if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index != -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n\n hasClass: function(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n\n /**\n *\n * @param elem\n */\n getWidth: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-left-width']) +\n cssValueToPixels(style['border-right-width']) +\n cssValueToPixels(style['padding-left']) +\n cssValueToPixels(style['padding-right']) +\n cssValueToPixels(style['width']);\n },\n\n /**\n *\n * @param elem\n */\n getHeight: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-top-width']) +\n cssValueToPixels(style['border-bottom-width']) +\n cssValueToPixels(style['padding-top']) +\n cssValueToPixels(style['padding-bottom']) +\n cssValueToPixels(style['height']);\n },\n\n /**\n *\n * @param elem\n */\n getOffset: function(elem) {\n var offset = {left: 0, top:0};\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n } while (elem = elem.offsetParent);\n }\n return offset;\n },\n\n // http://stackoverflow.com/posts/2684561/revisions\n /**\n * \n * @param elem\n */\n isActive: function(elem) {\n return elem === document.activeElement && ( elem.type || elem.href );\n }\n\n };\n\n return dom;\n\n})(dat.utils.common);\n\n\ndat.controllers.OptionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a select input to alter the property of an object, using a\n * list of accepted values.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object|string[]} options A map of labels to acceptable values, or\n * a list of acceptable string values.\n *\n * @member dat.controllers\n */\n var OptionController = function(object, property, options) {\n\n OptionController.superclass.call(this, object, property);\n\n var _this = this;\n\n /**\n * The drop down menu\n * @ignore\n */\n this.__select = document.createElement('select');\n\n if (common.isArray(options)) {\n var map = {};\n common.each(options, function(element) {\n map[element] = element;\n });\n options = map;\n }\n\n common.each(options, function(value, key) {\n\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n\n });\n\n // Acknowledge original value\n this.updateDisplay();\n\n dom.bind(this.__select, 'change', function() {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n\n this.domElement.appendChild(this.__select);\n\n };\n\n OptionController.superclass = Controller;\n\n common.extend(\n\n OptionController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = OptionController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n },\n\n updateDisplay: function() {\n this.__select.value = this.getValue();\n return OptionController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return OptionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberController = (function (Controller, common) {\n\n /**\n * @class Represents a given property of an object that is a number.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberController = function(object, property, params) {\n\n NumberController.superclass.call(this, object, property);\n\n params = params || {};\n\n this.__min = params.min;\n this.__max = params.max;\n this.__step = params.step;\n\n if (common.isUndefined(this.__step)) {\n\n if (this.initialValue == 0) {\n this.__impliedStep = 1; // What are we, psychics?\n } else {\n // Hey Doug, check this out.\n this.__impliedStep = Math.pow(10, Math.floor(Math.log(this.initialValue)/Math.LN10))/10;\n }\n\n } else {\n\n this.__impliedStep = this.__step;\n\n }\n\n this.__precision = numDecimals(this.__impliedStep);\n\n\n };\n\n NumberController.superclass = Controller;\n\n common.extend(\n\n NumberController.prototype,\n Controller.prototype,\n\n /** @lends dat.controllers.NumberController.prototype */\n {\n\n setValue: function(v) {\n\n if (this.__min !== undefined && v < this.__min) {\n v = this.__min;\n } else if (this.__max !== undefined && v > this.__max) {\n v = this.__max;\n }\n\n if (this.__step !== undefined && v % this.__step != 0) {\n v = Math.round(v / this.__step) * this.__step;\n }\n\n return NumberController.superclass.prototype.setValue.call(this, v);\n\n },\n\n /**\n * Specify a minimum value for object[property].\n *\n * @param {Number} minValue The minimum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n min: function(v) {\n this.__min = v;\n return this;\n },\n\n /**\n * Specify a maximum value for object[property].\n *\n * @param {Number} maxValue The maximum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n max: function(v) {\n this.__max = v;\n return this;\n },\n\n /**\n * Specify a step value that dat.controllers.NumberController\n * increments by.\n *\n * @param {Number} stepValue The step value for\n * dat.controllers.NumberController\n * @default if minimum and maximum specified increment is 1% of the\n * difference otherwise stepValue is 1\n * @returns {dat.controllers.NumberController} this\n */\n step: function(v) {\n this.__step = v;\n return this;\n }\n\n }\n\n );\n\n function numDecimals(x) {\n x = x.toString();\n if (x.indexOf('.') > -1) {\n return x.length - x.indexOf('.') - 1;\n } else {\n return 0;\n }\n }\n\n return NumberController;\n\n})(dat.controllers.Controller,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerBox = (function (NumberController, dom, common) {\n\n /**\n * @class Represents a given property of an object that is a number and\n * provides an input element with which to manipulate it.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerBox = function(object, property, params) {\n\n this.__truncationSuspended = false;\n\n NumberControllerBox.superclass.call(this, object, property, params);\n\n var _this = this;\n\n /**\n * {Number} Previous mouse y position\n * @ignore\n */\n var prev_y;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n // Makes it so manually specified values are not truncated.\n\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'mousedown', onMouseDown);\n dom.bind(this.__input, 'keydown', function(e) {\n\n // When pressing entire, you can be as precise as you want.\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n }\n\n });\n\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!common.isNaN(attempted)) _this.setValue(attempted);\n }\n\n function onBlur() {\n onChange();\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prev_y = e.clientY;\n }\n\n function onMouseDrag(e) {\n\n var diff = prev_y - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n\n prev_y = e.clientY;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n NumberControllerBox.superclass = NumberController;\n\n common.extend(\n\n NumberControllerBox.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return NumberControllerBox.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n function roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n }\n\n return NumberControllerBox;\n\n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerSlider = (function (NumberController, dom, css, common, styleSheet) {\n\n /**\n * @class Represents a given property of an object that is a number, contains\n * a minimum and maximum, and provides a slider element with which to\n * manipulate it. It should be noted that the slider element is made up of\n * <div> tags, not the html5\n * <slider> element.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n * \n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Number} minValue Minimum allowed value\n * @param {Number} maxValue Maximum allowed value\n * @param {Number} stepValue Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerSlider = function(object, property, min, max, step) {\n\n NumberControllerSlider.superclass.call(this, object, property, { min: min, max: max, step: step });\n\n var _this = this;\n\n this.__background = document.createElement('div');\n this.__foreground = document.createElement('div');\n \n\n\n dom.bind(this.__background, 'mousedown', onMouseDown);\n \n dom.addClass(this.__background, 'slider');\n dom.addClass(this.__foreground, 'slider-fg');\n\n function onMouseDown(e) {\n\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n\n onMouseDrag(e);\n }\n\n function onMouseDrag(e) {\n\n e.preventDefault();\n\n var offset = dom.getOffset(_this.__background);\n var width = dom.getWidth(_this.__background);\n \n _this.setValue(\n map(e.clientX, offset.left, offset.left + width, _this.__min, _this.__max)\n );\n\n return false;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.__background.appendChild(this.__foreground);\n this.domElement.appendChild(this.__background);\n\n };\n\n NumberControllerSlider.superclass = NumberController;\n\n /**\n * Injects default stylesheet for slider elements.\n */\n NumberControllerSlider.useDefaultStyles = function() {\n css.inject(styleSheet);\n };\n\n common.extend(\n\n NumberControllerSlider.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n var pct = (this.getValue() - this.__min)/(this.__max - this.__min);\n this.__foreground.style.width = pct*100+'%';\n return NumberControllerSlider.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n\n\n );\n\n function map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n }\n\n return NumberControllerSlider;\n \n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.css,\ndat.utils.common,\n\".slider {\\n box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);\\n height: 1em;\\n border-radius: 1em;\\n background-color: #eee;\\n padding: 0 0.5em;\\n overflow: hidden;\\n}\\n\\n.slider-fg {\\n padding: 1px 0 2px 0;\\n background-color: #aaa;\\n height: 1em;\\n margin-left: -0.5em;\\n padding-right: 0.5em;\\n border-radius: 1em 0 0 1em;\\n}\\n\\n.slider-fg:after {\\n display: inline-block;\\n border-radius: 1em;\\n background-color: #fff;\\n border: 1px solid #aaa;\\n content: '';\\n float: right;\\n margin-right: -1em;\\n margin-top: -1px;\\n height: 0.9em;\\n width: 0.9em;\\n}\");\n\n\ndat.controllers.FunctionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a GUI interface to fire a specified method, a property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var FunctionController = function(object, property, text) {\n\n FunctionController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__button = document.createElement('div');\n this.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(this.__button, 'click', function(e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n\n dom.addClass(this.__button, 'button');\n\n this.domElement.appendChild(this.__button);\n\n\n };\n\n FunctionController.superclass = Controller;\n\n common.extend(\n\n FunctionController.prototype,\n Controller.prototype,\n {\n \n fire: function() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.getValue().call(this.object);\n }\n }\n\n );\n\n return FunctionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.BooleanController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a checkbox input to alter the boolean property of an object.\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var BooleanController = function(object, property) {\n\n BooleanController.superclass.call(this, object, property);\n\n var _this = this;\n this.__prev = this.getValue();\n\n this.__checkbox = document.createElement('input');\n this.__checkbox.setAttribute('type', 'checkbox');\n\n\n dom.bind(this.__checkbox, 'change', onChange, false);\n\n this.domElement.appendChild(this.__checkbox);\n\n // Match original value\n this.updateDisplay();\n\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n\n };\n\n BooleanController.superclass = Controller;\n\n common.extend(\n\n BooleanController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = BooleanController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n },\n\n updateDisplay: function() {\n \n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true; \n } else {\n this.__checkbox.checked = false;\n }\n\n return BooleanController.superclass.prototype.updateDisplay.call(this);\n\n }\n\n\n }\n\n );\n\n return BooleanController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common);\n\n\ndat.GUI = dat.gui.GUI = (function (css, saveDialogueContents, styleSheet, controllerFactory, Controller, BooleanController, FunctionController, NumberControllerBox, NumberControllerSlider, OptionController, ColorController, requestAnimationFrame, CenteredDiv, dom, common) {\n\n css.inject(styleSheet);\n\n /** Outer-most className for GUI's */\n var CSS_NAMESPACE = 'dg';\n\n var HIDE_KEY_CODE = 72;\n\n /** The only value shared between the JS and SCSS. Use caution. */\n var CLOSE_BUTTON_HEIGHT = 20;\n\n var DEFAULT_DEFAULT_PRESET_NAME = 'Default';\n\n var SUPPORTS_LOCAL_STORAGE = (function() {\n try {\n return 'localStorage' in window && window['localStorage'] !== null;\n } catch (e) {\n return false;\n }\n })();\n\n var SAVE_DIALOGUE;\n\n /** Have we yet to create an autoPlace GUI? */\n var auto_place_virgin = true;\n\n /** Fixed position div that auto place GUI's go inside */\n var auto_place_container;\n\n /** Are we hiding the GUI's ? */\n var hide = false;\n\n /** GUI's which should be hidden */\n var hideable_guis = [];\n\n /**\n * A lightweight controller library for JavaScript. It allows you to easily\n * manipulate variables and fire functions on the fly.\n * @class\n *\n * @member dat.gui\n *\n * @param {Object} [params]\n * @param {String} [params.name] The name of this GUI.\n * @param {Object} [params.load] JSON object representing the saved state of\n * this GUI.\n * @param {Boolean} [params.auto=true]\n * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.\n * @param {Boolean} [params.closed] If true, starts closed\n */\n var GUI = function(params) {\n\n var _this = this;\n\n /**\n * Outermost DOM Element\n * @type DOMElement\n */\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n\n dom.addClass(this.domElement, CSS_NAMESPACE);\n\n /**\n * Nested GUI's by name\n * @ignore\n */\n this.__folders = {};\n\n this.__controllers = [];\n\n /**\n * List of objects I'm remembering for save, only used in top level GUI\n * @ignore\n */\n this.__rememberedObjects = [];\n\n /**\n * Maps the index of remembered objects to a map of controllers, only used\n * in top level GUI.\n *\n * @private\n * @ignore\n *\n * @example\n * [\n * {\n * propertyName: Controller,\n * anotherPropertyName: Controller\n * },\n * {\n * propertyName: Controller\n * }\n * ]\n */\n this.__rememberedObjectIndecesToControllers = [];\n\n this.__listening = [];\n\n params = params || {};\n\n // Default parameters\n params = common.defaults(params, {\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n\n params = common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n\n\n if (!common.isUndefined(params.load)) {\n\n // Explicit preset\n if (params.preset) params.load.preset = params.preset;\n\n } else {\n\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n\n }\n\n if (common.isUndefined(params.parent) && params.hideable) {\n hideable_guis.push(this);\n }\n\n // Only root level GUI's are resizable.\n params.resizable = common.isUndefined(params.parent) && params.resizable;\n\n\n if (params.autoPlace && common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;\n\n // Not part of params because I don't want people passing this in via\n // constructor. Should be a 'remembered' value.\n var use_local_storage =\n SUPPORTS_LOCAL_STORAGE &&\n localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n\n Object.defineProperties(this,\n\n /** @lends dat.gui.GUI.prototype */\n {\n\n /**\n * The parent GUI\n * @type dat.gui.GUI\n */\n parent: {\n get: function() {\n return params.parent;\n }\n },\n\n scrollable: {\n get: function() {\n return params.scrollable;\n }\n },\n\n /**\n * Handles GUI's element placement for you\n * @type Boolean\n */\n autoPlace: {\n get: function() {\n return params.autoPlace;\n }\n },\n\n /**\n * The identifier for a set of saved values\n * @type String\n */\n preset: {\n\n get: function() {\n if (_this.parent) {\n return _this.getRoot().preset;\n } else {\n return params.load.preset;\n }\n },\n\n set: function(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n\n },\n\n /**\n * The width of GUI element\n * @type Number\n */\n width: {\n get: function() {\n return params.width;\n },\n set: function(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n\n /**\n * The name of GUI. Used for folders. i.e\n * a folder's name\n * @type String\n */\n name: {\n get: function() {\n return params.name;\n },\n set: function(v) {\n // TODO Check for collisions among sibling folders\n params.name = v;\n if (title_row_name) {\n title_row_name.innerHTML = params.name;\n }\n }\n },\n\n /**\n * Whether the GUI is collapsed or not\n * @type Boolean\n */\n closed: {\n get: function() {\n return params.closed;\n },\n set: function(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n // For browsers that aren't going to respect the CSS transition,\n // Lets just check our height against the window height right off\n // the bat.\n this.onResize();\n\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n\n /**\n * Contains all presets\n * @type Object\n */\n load: {\n get: function() {\n return params.load;\n }\n },\n\n /**\n * Determines whether or not to use localStorage as the means for\n * remembering\n * @type Boolean\n */\n useLocalStorage: {\n\n get: function() {\n return use_local_storage;\n },\n set: function(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n use_local_storage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n\n }\n\n });\n\n // Are we a root level GUI?\n if (common.isUndefined(params.parent)) {\n\n params.closed = false;\n\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n\n // Are we supposed to be loading locally?\n if (SUPPORTS_LOCAL_STORAGE) {\n\n if (use_local_storage) {\n\n _this.useLocalStorage = true;\n\n var saved_gui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n\n if (saved_gui) {\n params.load = JSON.parse(saved_gui);\n }\n\n }\n\n }\n\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n this.domElement.appendChild(this.__closeButton);\n\n dom.bind(this.__closeButton, 'click', function() {\n\n _this.closed = !_this.closed;\n\n\n });\n\n\n // Oh, you're a nested GUI!\n } else {\n\n if (params.closed === undefined) {\n params.closed = true;\n }\n\n var title_row_name = document.createTextNode(params.name);\n dom.addClass(title_row_name, 'controller-name');\n\n var title_row = addRow(_this, title_row_name);\n\n var on_click_title = function(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n\n dom.addClass(title_row, 'title');\n dom.bind(title_row, 'click', on_click_title);\n\n if (!params.closed) {\n this.closed = false;\n }\n\n }\n\n if (params.autoPlace) {\n\n if (common.isUndefined(params.parent)) {\n\n if (auto_place_virgin) {\n auto_place_container = document.createElement('div');\n dom.addClass(auto_place_container, CSS_NAMESPACE);\n dom.addClass(auto_place_container, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(auto_place_container);\n auto_place_virgin = false;\n }\n\n // Put it in the dom for you.\n auto_place_container.appendChild(this.domElement);\n\n // Apply the auto styles\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n\n }\n\n\n // Make it not elastic.\n if (!this.parent) setWidth(_this, params.width);\n\n }\n\n dom.bind(window, 'resize', function() { _this.onResize() });\n dom.bind(this.__ul, 'webkitTransitionEnd', function() { _this.onResize(); });\n dom.bind(this.__ul, 'transitionend', function() { _this.onResize() });\n dom.bind(this.__ul, 'oTransitionEnd', function() { _this.onResize() });\n this.onResize();\n\n\n if (params.resizable) {\n addResizeHandle(this);\n }\n\n function saveToLocalStorage() {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n\n var root = _this.getRoot();\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n common.defer(function() {\n root.width -= 1;\n });\n }\n\n if (!params.parent) {\n resetWidth();\n }\n\n };\n\n GUI.toggleHide = function() {\n\n hide = !hide;\n common.each(hideable_guis, function(gui) {\n gui.domElement.style.zIndex = hide ? -999 : 999;\n gui.domElement.style.opacity = hide ? 0 : 1;\n });\n };\n\n GUI.CLASS_AUTO_PLACE = 'a';\n GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\n GUI.CLASS_MAIN = 'main';\n GUI.CLASS_CONTROLLER_ROW = 'cr';\n GUI.CLASS_TOO_TALL = 'taller-than-window';\n GUI.CLASS_CLOSED = 'closed';\n GUI.CLASS_CLOSE_BUTTON = 'close-button';\n GUI.CLASS_DRAG = 'drag';\n\n GUI.DEFAULT_WIDTH = 245;\n GUI.TEXT_CLOSED = 'Close Controls';\n GUI.TEXT_OPEN = 'Open Controls';\n\n dom.bind(window, 'keydown', function(e) {\n\n if (document.activeElement.type !== 'text' &&\n (e.which === HIDE_KEY_CODE || e.keyCode == HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n\n }, false);\n\n common.extend(\n\n GUI.prototype,\n\n /** @lends dat.gui.GUI */\n {\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.Controller} The new controller that was added.\n * @instance\n */\n add: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n }\n );\n\n },\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.ColorController} The new controller that was added.\n * @instance\n */\n addColor: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n color: true\n }\n );\n\n },\n\n /**\n * @param controller\n * @instance\n */\n remove: function(controller) {\n\n // TODO listening?\n this.__ul.removeChild(controller.__li);\n this.__controllers.slice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n common.defer(function() {\n _this.onResize();\n });\n\n },\n\n destroy: function() {\n\n if (this.autoPlace) {\n auto_place_container.removeChild(this.domElement);\n }\n\n },\n\n /**\n * @param name\n * @returns {dat.gui.GUI} The new folder.\n * @throws {Error} if this GUI already has a folder by the specified\n * name\n * @instance\n */\n addFolder: function(name) {\n\n // We have to prevent collisions on names in order to have a key\n // by which to remember saved values\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' +\n ' name \"' + name + '\"');\n }\n\n var new_gui_params = { name: name, parent: this };\n\n // We need to pass down the autoPlace trait so that we can\n // attach event listeners to open/close folder actions to\n // ensure that a scrollbar appears if the window is too short.\n new_gui_params.autoPlace = this.autoPlace;\n\n // Do we have saved appearance data for this folder?\n\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[name]) { // Did daddy remember me?\n\n // Start me closed if I was closed\n new_gui_params.closed = this.load.folders[name].closed;\n\n // Pass down the loaded data\n new_gui_params.load = this.load.folders[name];\n\n }\n\n var gui = new GUI(new_gui_params);\n this.__folders[name] = gui;\n\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n\n },\n\n open: function() {\n this.closed = false;\n },\n\n close: function() {\n this.closed = true;\n },\n\n onResize: function() {\n\n var root = this.getRoot();\n\n if (root.scrollable) {\n\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n\n common.each(root.__ul.childNodes, function(node) {\n if (! (root.autoPlace && node === root.__save_row))\n h += dom.getHeight(node);\n });\n\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n\n }\n\n if (root.__resize_handle) {\n common.defer(function() {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n\n },\n\n /**\n * Mark objects for saving. The order of these objects cannot change as\n * the GUI grows. When remembering new objects, append them to the end\n * of the list.\n *\n * @param {Object...} objects\n * @throws {Error} if not called on a top level GUI.\n * @instance\n */\n remember: function() {\n\n if (common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;\n }\n\n if (this.parent) {\n throw new Error(\"You can only call remember on a top level GUI.\");\n }\n\n var _this = this;\n\n common.each(Array.prototype.slice.call(arguments), function(object) {\n if (_this.__rememberedObjects.length == 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) == -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n\n if (this.autoPlace) {\n // Set save row width\n setWidth(this, this.width);\n }\n\n },\n\n /**\n * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.\n * @instance\n */\n getRoot: function() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n\n /**\n * @returns {Object} a JSON object representing the current state of\n * this GUI as well as its remembered properties.\n * @instance\n */\n getSaveObject: function() {\n\n var toReturn = this.load;\n\n toReturn.closed = this.closed;\n\n // Am I remembering any values?\n if (this.__rememberedObjects.length > 0) {\n\n toReturn.preset = this.preset;\n\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n\n }\n\n toReturn.folders = {};\n common.each(this.__folders, function(element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n\n return toReturn;\n\n },\n\n save: function() {\n\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n\n },\n\n saveAs: function(presetName) {\n\n if (!this.load.remembered) {\n\n // Retain default values upon first save\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n\n }\n\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n\n },\n\n revert: function(gui) {\n\n common.each(this.__controllers, function(controller) {\n // Make revert work on Default.\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n }, this);\n\n common.each(this.__folders, function(folder) {\n folder.revert(folder);\n });\n\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n\n\n },\n\n listen: function(controller) {\n\n var init = this.__listening.length == 0;\n this.__listening.push(controller);\n if (init) updateDisplays(this.__listening);\n\n }\n\n }\n\n );\n\n function add(gui, object, property, params) {\n\n if (object[property] === undefined) {\n throw new Error(\"Object \" + object + \" has no property \\\"\" + property + \"\\\"\");\n }\n\n var controller;\n\n if (params.color) {\n\n controller = new ColorController(object, property);\n\n } else {\n\n var factoryArgs = [object,property].concat(params.factoryArgs);\n controller = controllerFactory.apply(gui, factoryArgs);\n\n }\n\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n\n recallSavedValue(gui, controller);\n\n dom.addClass(controller.domElement, 'c');\n\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n\n var li = addRow(gui, container, params.before);\n\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n dom.addClass(li, typeof controller.getValue());\n\n augmentController(gui, li, controller);\n\n gui.__controllers.push(controller);\n\n return controller;\n\n }\n\n /**\n * Add a row to the end of the GUI or before another row.\n *\n * @param gui\n * @param [dom] If specified, inserts the dom content in the new row\n * @param [liBefore] If specified, places the new row before another row\n */\n function addRow(gui, dom, liBefore) {\n var li = document.createElement('li');\n if (dom) li.appendChild(dom);\n if (liBefore) {\n gui.__ul.insertBefore(li, params.before);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n }\n\n function augmentController(gui, li, controller) {\n\n controller.__li = li;\n controller.__gui = gui;\n\n common.extend(controller, {\n\n options: function(options) {\n\n if (arguments.length > 1) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [common.toArray(arguments)]\n }\n );\n\n }\n\n if (common.isArray(options) || common.isObject(options)) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [options]\n }\n );\n\n }\n\n },\n\n name: function(v) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = v;\n return controller;\n },\n\n listen: function() {\n controller.__gui.listen(controller);\n return controller;\n },\n\n remove: function() {\n controller.__gui.remove(controller);\n return controller;\n }\n\n });\n\n // All sliders should be accompanied by a box.\n if (controller instanceof NumberControllerSlider) {\n\n var box = new NumberControllerBox(controller.object, controller.property,\n { min: controller.__min, max: controller.__max, step: controller.__step });\n\n common.each(['updateDisplay', 'onChange', 'onFinishChange'], function(method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function() {\n var args = Array.prototype.slice.call(arguments);\n pc.apply(controller, args);\n return pb.apply(box, args);\n }\n });\n\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n\n }\n else if (controller instanceof NumberControllerBox) {\n\n var r = function(returned) {\n\n // Have we defined both boundaries?\n if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {\n\n // Well, then lets just replace this with a slider.\n controller.remove();\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n\n }\n\n return returned;\n\n };\n\n controller.min = common.compose(r, controller.min);\n controller.max = common.compose(r, controller.max);\n\n }\n else if (controller instanceof BooleanController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n\n dom.bind(controller.__checkbox, 'click', function(e) {\n e.stopPropagation(); // Prevents double-toggle\n })\n\n }\n else if (controller instanceof FunctionController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__button, 'click');\n });\n\n dom.bind(li, 'mouseover', function() {\n dom.addClass(controller.__button, 'hover');\n });\n\n dom.bind(li, 'mouseout', function() {\n dom.removeClass(controller.__button, 'hover');\n });\n\n }\n else if (controller instanceof ColorController) {\n\n dom.addClass(li, 'color');\n controller.updateDisplay = common.compose(function(r) {\n li.style.borderLeftColor = controller.__color.toString();\n return r;\n }, controller.updateDisplay);\n\n controller.updateDisplay();\n\n }\n\n controller.setValue = common.compose(function(r) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return r;\n }, controller.setValue);\n\n }\n\n function recallSavedValue(gui, controller) {\n\n // Find the topmost GUI, that's where remembered objects live.\n var root = gui.getRoot();\n\n // Does the object we're controlling match anything we've been told to\n // remember?\n var matched_index = root.__rememberedObjects.indexOf(controller.object);\n\n // Why yes, it does!\n if (matched_index != -1) {\n\n // Let me fetch a map of controllers for thcommon.isObject.\n var controller_map =\n root.__rememberedObjectIndecesToControllers[matched_index];\n\n // Ohp, I believe this is the first controller we've created for this\n // object. Lets make the map fresh.\n if (controller_map === undefined) {\n controller_map = {};\n root.__rememberedObjectIndecesToControllers[matched_index] =\n controller_map;\n }\n\n // Keep track of this controller\n controller_map[controller.property] = controller;\n\n // Okay, now have we saved any values for this controller?\n if (root.load && root.load.remembered) {\n\n var preset_map = root.load.remembered;\n\n // Which preset are we trying to load?\n var preset;\n\n if (preset_map[gui.preset]) {\n\n preset = preset_map[gui.preset];\n\n } else if (preset_map[DEFAULT_DEFAULT_PRESET_NAME]) {\n\n // Uhh, you can have the default instead?\n preset = preset_map[DEFAULT_DEFAULT_PRESET_NAME];\n\n } else {\n\n // Nada.\n\n return;\n\n }\n\n\n // Did the loaded object remember thcommon.isObject?\n if (preset[matched_index] &&\n\n // Did we remember this particular property?\n preset[matched_index][controller.property] !== undefined) {\n\n // We did remember something for this guy ...\n var value = preset[matched_index][controller.property];\n\n // And that's what it is.\n controller.initialValue = value;\n controller.setValue(value);\n\n }\n\n }\n\n }\n\n }\n\n function getLocalStorageHash(gui, key) {\n // TODO how does this deal with multiple GUI's?\n return document.location.href + '.' + key;\n\n }\n\n function addSaveMenu(gui) {\n\n var div = gui.__save_row = document.createElement('li');\n\n dom.addClass(gui.domElement, 'has-save');\n\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n\n dom.addClass(div, 'save-row');\n\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n\n // TODO replace with FunctionController\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n\n var select = gui.__preset_select = document.createElement('select');\n\n if (gui.load && gui.load.remembered) {\n\n common.each(gui.load.remembered, function(value, key) {\n addPresetOption(gui, key, key == gui.preset);\n });\n\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n\n dom.bind(select, 'change', function() {\n\n\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n\n gui.preset = this.value;\n\n });\n\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n\n if (SUPPORTS_LOCAL_STORAGE) {\n\n var saveLocally = document.getElementById('dg-save-locally');\n var explain = document.getElementById('dg-local-explain');\n\n saveLocally.style.display = 'block';\n\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n\n function showHideExplain() {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n }\n\n showHideExplain();\n\n // TODO: Use a boolean controller, fool!\n dom.bind(localStorageCheckBox, 'change', function() {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain();\n });\n\n }\n\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n\n dom.bind(newConstructorTextArea, 'keydown', function(e) {\n if (e.metaKey && (e.which === 67 || e.keyCode == 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n\n dom.bind(gears, 'click', function() {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n\n dom.bind(button, 'click', function() {\n gui.save();\n });\n\n dom.bind(button2, 'click', function() {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) gui.saveAs(presetName);\n });\n\n dom.bind(button3, 'click', function() {\n gui.revert();\n });\n\n// div.appendChild(button2);\n\n }\n\n function addResizeHandle(gui) {\n\n gui.__resize_handle = document.createElement('div');\n\n common.extend(gui.__resize_handle.style, {\n\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n// border: '1px solid blue'\n\n });\n\n var pmouseX;\n\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n\n function dragStart(e) {\n\n e.preventDefault();\n\n pmouseX = e.clientX;\n\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n\n return false;\n\n }\n\n function drag(e) {\n\n e.preventDefault();\n\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n\n return false;\n\n }\n\n function dragStop() {\n\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n\n }\n\n }\n\n function setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n // Auto placed save-rows are position fixed, so we have to\n // set the width manually if we want it to bleed to the edge\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n }\n\n function getCurrentPreset(gui, useInitialValues) {\n\n var toReturn = {};\n\n // For each object I'm remembering\n common.each(gui.__rememberedObjects, function(val, index) {\n\n var saved_values = {};\n\n // The controllers I've made for thcommon.isObject by property\n var controller_map =\n gui.__rememberedObjectIndecesToControllers[index];\n\n // Remember each value for each property\n common.each(controller_map, function(controller, property) {\n saved_values[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n\n // Save the values for thcommon.isObject\n toReturn[index] = saved_values;\n\n });\n\n return toReturn;\n\n }\n\n function addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n }\n\n function setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value == gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n }\n\n function markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n// console.log('mark', modified, opt);\n if (modified) {\n opt.innerHTML = opt.value + \"*\";\n } else {\n opt.innerHTML = opt.value;\n }\n }\n\n function updateDisplays(controllerArray) {\n\n\n if (controllerArray.length != 0) {\n\n requestAnimationFrame(function() {\n updateDisplays(controllerArray);\n });\n\n }\n\n common.each(controllerArray, function(c) {\n c.updateDisplay();\n });\n\n }\n\n return GUI;\n\n})(dat.utils.css,\n\"
\\n\\n Here's the new load parameter for your GUI's constructor:\\n\\n \\n\\n
\\n\\n Automatically save\\n values to localStorage on exit.\\n\\n
The values saved to localStorage will\\n override those passed to dat.GUI's constructor. This makes it\\n easier to work incrementally, but localStorage is fragile,\\n and your friends may not see the same values you do.\\n \\n
\\n \\n
\\n\\n
\",\n\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear;border:0;position:absolute;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save ul{margin-top:27px}.dg.a.has-save ul.closed{margin-top:0}.dg.a .save-row{position:fixed;top:0;z-index:1002}.dg li{-webkit-transition:height 0.1s ease-out;-o-transition:height 0.1s ease-out;-moz-transition:height 0.1s ease-out;transition:height 0.1s ease-out}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:hidden;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li > *{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:9px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\",\ndat.controllers.factory = (function (OptionController, NumberControllerBox, NumberControllerSlider, StringController, FunctionController, BooleanController, common) {\n\n return function(object, property) {\n\n var initialValue = object[property];\n\n // Providing options?\n if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n\n // Providing a map?\n\n if (common.isNumber(initialValue)) {\n\n if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {\n\n // Has min and max.\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n\n } else {\n\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n\n }\n\n }\n\n if (common.isString(initialValue)) {\n return new StringController(object, property);\n }\n\n if (common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n\n if (common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n\n }\n\n })(dat.controllers.OptionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.StringController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a text input to alter the string property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var StringController = function(object, property) {\n\n StringController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n dom.bind(this.__input, 'keyup', onChange);\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n \n\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n StringController.superclass = Controller;\n\n common.extend(\n\n StringController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n // Stops the caret from moving on account of:\n // keyup -> setValue -> updateDisplay\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return StringController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return StringController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common),\ndat.controllers.FunctionController,\ndat.controllers.BooleanController,\ndat.utils.common),\ndat.controllers.Controller,\ndat.controllers.BooleanController,\ndat.controllers.FunctionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.OptionController,\ndat.controllers.ColorController = (function (Controller, dom, Color, interpret, common) {\n\n var ColorController = function(object, property) {\n\n ColorController.superclass.call(this, object, property);\n\n this.__color = new Color(this.getValue());\n this.__temp = new Color(0);\n\n var _this = this;\n\n this.domElement = document.createElement('div');\n\n dom.makeSelectable(this.domElement, false);\n\n this.__selector = document.createElement('div');\n this.__selector.className = 'selector';\n\n this.__saturation_field = document.createElement('div');\n this.__saturation_field.className = 'saturation-field';\n\n this.__field_knob = document.createElement('div');\n this.__field_knob.className = 'field-knob';\n this.__field_knob_border = '2px solid ';\n\n this.__hue_knob = document.createElement('div');\n this.__hue_knob.className = 'hue-knob';\n\n this.__hue_field = document.createElement('div');\n this.__hue_field.className = 'hue-field';\n\n this.__input = document.createElement('input');\n this.__input.type = 'text';\n this.__input_textShadow = '0 1px 1px ';\n\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) { // on enter\n onBlur.call(this);\n }\n });\n\n dom.bind(this.__input, 'blur', onBlur);\n\n dom.bind(this.__selector, 'mousedown', function(e) {\n\n dom\n .addClass(this, 'drag')\n .bind(window, 'mouseup', function(e) {\n dom.removeClass(_this.__selector, 'drag');\n });\n\n });\n\n var value_field = document.createElement('div');\n\n common.extend(this.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n\n common.extend(this.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: this.__field_knob_border + (this.__color.v < .5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n \n common.extend(this.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n\n common.extend(this.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n\n common.extend(value_field.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n \n linearGradient(value_field, 'top', 'rgba(0,0,0,0)', '#000');\n\n common.extend(this.__hue_field.style, {\n width: '15px',\n height: '100px',\n display: 'inline-block',\n border: '1px solid #555',\n cursor: 'ns-resize'\n });\n\n hueGradient(this.__hue_field);\n\n common.extend(this.__input.style, {\n outline: 'none',\n// width: '120px',\n textAlign: 'center',\n// padding: '4px',\n// marginBottom: '6px',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n\n dom.bind(this.__saturation_field, 'mousedown', fieldDown);\n dom.bind(this.__field_knob, 'mousedown', fieldDown);\n\n dom.bind(this.__hue_field, 'mousedown', function(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'mouseup', unbindH);\n });\n\n function fieldDown(e) {\n setSV(e);\n // document.body.style.cursor = 'none';\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'mouseup', unbindSV);\n }\n\n function unbindSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'mouseup', unbindSV);\n // document.body.style.cursor = 'default';\n }\n\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n\n function unbindH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'mouseup', unbindH);\n }\n\n this.__saturation_field.appendChild(value_field);\n this.__selector.appendChild(this.__field_knob);\n this.__selector.appendChild(this.__saturation_field);\n this.__selector.appendChild(this.__hue_field);\n this.__hue_field.appendChild(this.__hue_knob);\n\n this.domElement.appendChild(this.__input);\n this.domElement.appendChild(this.__selector);\n\n this.updateDisplay();\n\n function setSV(e) {\n\n e.preventDefault();\n\n var w = dom.getWidth(_this.__saturation_field);\n var o = dom.getOffset(_this.__saturation_field);\n var s = (e.clientX - o.left + document.body.scrollLeft) / w;\n var v = 1 - (e.clientY - o.top + document.body.scrollTop) / w;\n\n if (v > 1) v = 1;\n else if (v < 0) v = 0;\n\n if (s > 1) s = 1;\n else if (s < 0) s = 0;\n\n _this.__color.v = v;\n _this.__color.s = s;\n\n _this.setValue(_this.__color.toOriginal());\n\n\n return false;\n\n }\n\n function setH(e) {\n\n e.preventDefault();\n\n var s = dom.getHeight(_this.__hue_field);\n var o = dom.getOffset(_this.__hue_field);\n var h = 1 - (e.clientY - o.top + document.body.scrollTop) / s;\n\n if (h > 1) h = 1;\n else if (h < 0) h = 0;\n\n _this.__color.h = h * 360;\n\n _this.setValue(_this.__color.toOriginal());\n\n return false;\n\n }\n\n };\n\n ColorController.superclass = Controller;\n\n common.extend(\n\n ColorController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n\n var i = interpret(this.getValue());\n\n if (i !== false) {\n\n var mismatch = false;\n\n // Check for mismatch on the interpreted value.\n\n common.each(Color.COMPONENTS, function(component) {\n if (!common.isUndefined(i[component]) &&\n !common.isUndefined(this.__color.__state[component]) &&\n i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {}; // break\n }\n }, this);\n\n // If nothing diverges, we keep our previous values\n // for statefulness, otherwise we recalculate fresh\n if (mismatch) {\n common.extend(this.__color.__state, i);\n }\n\n }\n\n common.extend(this.__temp.__state, this.__color.__state);\n\n this.__temp.a = 1;\n\n var flip = (this.__color.v < .5 || this.__color.s > .5) ? 255 : 0;\n var _flip = 255 - flip;\n\n common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip +')'\n });\n\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'\n\n this.__temp.s = 1;\n this.__temp.v = 1;\n\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toString());\n\n common.extend(this.__input.style, {\n backgroundColor: this.__input.value = this.__color.toString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip +')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip +',.7)'\n });\n\n }\n\n }\n\n );\n \n var vendors = ['-moz-','-o-','-webkit-','-ms-',''];\n \n function linearGradient(elem, x, a, b) {\n elem.style.background = '';\n common.each(vendors, function(vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient('+x+', '+a+' 0%, ' + b + ' 100%); ';\n });\n }\n \n function hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n }\n\n\n return ColorController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret,\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common),\ndat.color.interpret,\ndat.utils.common),\ndat.utils.requestAnimationFrame = (function () {\n\n /**\n * requirejs version of Paul Irish's RequestAnimationFrame\n * http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n */\n\n return window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function(callback, element) {\n\n window.setTimeout(callback, 1000 / 60);\n\n };\n})(),\ndat.dom.CenteredDiv = (function (dom, common) {\n\n\n var CenteredDiv = function() {\n\n this.backgroundElement = document.createElement('div');\n common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear'\n });\n\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n\n this.domElement = document.createElement('div');\n common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear'\n });\n\n\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function() {\n _this.hide();\n });\n\n\n };\n\n CenteredDiv.prototype.show = function() {\n\n var _this = this;\n \n\n\n this.backgroundElement.style.display = 'block';\n\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n// this.domElement.style.top = '52%';\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n this.layout();\n\n common.defer(function() {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n\n };\n\n CenteredDiv.prototype.hide = function() {\n\n var _this = this;\n\n var hide = function() {\n\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n\n };\n\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n\n this.backgroundElement.style.opacity = 0;\n// this.domElement.style.top = '48%';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n };\n\n CenteredDiv.prototype.layout = function() {\n this.domElement.style.left = window.innerWidth/2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight/2 - dom.getHeight(this.domElement) / 2 + 'px';\n };\n \n function lockScroll(e) {\n console.log(e);\n }\n\n return CenteredDiv;\n\n})(dat.dom.dom,\ndat.utils.common),\ndat.dom.dom,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.gui.js\n// module id = 10\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.Color = dat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common),\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.color.js\n// module id = 11\n// module chunks = 0","module.exports = function( THREE ) {\n\t/**\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one finger move\n// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n// Pan - right mouse, or arrow keys / touch: three finter swipe\n\n\tfunction OrbitControls( object, domElement ) {\n\n\t\tthis.object = object;\n\n\t\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new THREE.Vector3();\n\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = - Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t//\n\t\t// public methods\n\t\t//\n\n\t\tthis.getPolarAngle = function () {\n\n\t\t\treturn spherical.phi;\n\n\t\t};\n\n\t\tthis.getAzimuthalAngle = function () {\n\n\t\t\treturn spherical.theta;\n\n\t\t};\n\n\t\tthis.reset = function () {\n\n\t\t\tscope.target.copy( scope.target0 );\n\t\t\tscope.object.position.copy( scope.position0 );\n\t\t\tscope.object.zoom = scope.zoom0;\n\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\tscope.update();\n\n\t\t\tstate = STATE.NONE;\n\n\t\t};\n\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\t// so camera.up is the orbit axis\n\t\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\t\tvar quatInverse = quat.clone().inverse();\n\n\t\t\tvar lastPosition = new THREE.Vector3();\n\t\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\t\treturn function update () {\n\n\t\t\t\tvar position = scope.object.position;\n\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t\t// angle from z-axis around y-axis\n\t\t\t\tspherical.setFromVector3( offset );\n\n\t\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t\t}\n\n\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\tspherical.phi += sphericalDelta.phi;\n\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\tspherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) );\n\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tspherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n\t\t\t\tspherical.makeSafe();\n\n\n\t\t\t\tspherical.radius *= scale;\n\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tspherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n\t\t\t\t// move target to panned location\n\t\t\t\tscope.target.add( panOffset );\n\n\t\t\t\toffset.setFromSpherical( spherical );\n\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\t\tsphericalDelta.theta *= ( 1 - scope.dampingFactor );\n\t\t\t\t\tsphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsphericalDelta.set( 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\t\tif ( zoomChanged ||\n\t\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\t\tzoomChanged = false;\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t};\n\n\t\t}();\n\n\t\tthis.dispose = function() {\n\n\t\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\t\tscope.domElement.removeEventListener( 'wheel', onMouseWheel, false );\n\n\t\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t\t};\n\n\t\t//\n\t\t// internals\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tvar changeEvent = { type: 'change' };\n\t\tvar startEvent = { type: 'start' };\n\t\tvar endEvent = { type: 'end' };\n\n\t\tvar STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\n\t\tvar state = STATE.NONE;\n\n\t\tvar EPS = 0.000001;\n\n\t\t// current position in spherical coordinates\n\t\tvar spherical = new THREE.Spherical();\n\t\tvar sphericalDelta = new THREE.Spherical();\n\n\t\tvar scale = 1;\n\t\tvar panOffset = new THREE.Vector3();\n\t\tvar zoomChanged = false;\n\n\t\tvar rotateStart = new THREE.Vector2();\n\t\tvar rotateEnd = new THREE.Vector2();\n\t\tvar rotateDelta = new THREE.Vector2();\n\n\t\tvar panStart = new THREE.Vector2();\n\t\tvar panEnd = new THREE.Vector2();\n\t\tvar panDelta = new THREE.Vector2();\n\n\t\tvar dollyStart = new THREE.Vector2();\n\t\tvar dollyEnd = new THREE.Vector2();\n\t\tvar dollyDelta = new THREE.Vector2();\n\n\t\tfunction getAutoRotationAngle() {\n\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t\t}\n\n\t\tfunction getZoomScale() {\n\n\t\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t\t}\n\n\t\tfunction rotateLeft( angle ) {\n\n\t\t\tsphericalDelta.theta -= angle;\n\n\t\t}\n\n\t\tfunction rotateUp( angle ) {\n\n\t\t\tsphericalDelta.phi -= angle;\n\n\t\t}\n\n\t\tvar panLeft = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panLeft( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t\t\tv.multiplyScalar( - distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\tvar panUp = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panUp( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 1 ); // get Y column of objectMatrix\n\t\t\t\tv.multiplyScalar( distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tvar pan = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\treturn function pan ( deltaX, deltaY ) {\n\n\t\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\t\t// perspective\n\t\t\t\t\tvar position = scope.object.position;\n\t\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n\t\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\t\tscope.enablePan = false;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}();\n\n\t\tfunction dollyIn( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale /= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction dollyOut( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale *= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\n\t\tfunction handleMouseDownRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseDownRotate' );\n\n\t\t\trotateStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseDownDolly' );\n\n\t\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownPan( event ) {\n\n\t\t\t//console.log( 'handleMouseDownPan' );\n\n\t\t\tpanStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveRotate' );\n\n\t\t\trotateEnd.set( event.clientX, event.clientY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveDolly' );\n\n\t\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMovePan( event ) {\n\n\t\t\t//console.log( 'handleMouseMovePan' );\n\n\t\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseUp( event ) {\n\n\t\t\t//console.log( 'handleMouseUp' );\n\n\t\t}\n\n\t\tfunction handleMouseWheel( event ) {\n\n\t\t\t//console.log( 'handleMouseWheel' );\n\n\t\t\tif ( event.deltaY < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleKeyDown( event ) {\n\n\t\t\t//console.log( 'handleKeyDown' );\n\n\t\t\tswitch ( event.keyCode ) {\n\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction handleTouchStartRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchStartRotate' );\n\n\t\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchStartDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchStartDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyStart.set( 0, distance );\n\n\t\t}\n\n\t\tfunction handleTouchStartPan( event ) {\n\n\t\t\t//console.log( 'handleTouchStartPan' );\n\n\t\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveRotate' );\n\n\t\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyEnd.set( 0, distance );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMovePan( event ) {\n\n\t\t\t//console.log( 'handleTouchMovePan' );\n\n\t\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchEnd( event ) {\n\n\t\t\t//console.log( 'handleTouchEnd' );\n\n\t\t}\n\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\n\t\tfunction onMouseDown( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( event.button === scope.mouseButtons.ORBIT ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.ZOOM ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseDownDolly( event );\n\n\t\t\t\tstate = STATE.DOLLY;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\tstate = STATE.PAN;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseMoveRotate( event );\n\n\t\t\t} else if ( state === STATE.DOLLY ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseMoveDolly( event );\n\n\t\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseMovePan( event );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseUp( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleMouseUp( event );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onMouseWheel( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\thandleMouseWheel( event );\n\n\t\t\tscope.dispatchEvent( startEvent ); // not sure why these are here...\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t}\n\n\t\tfunction onKeyDown( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\t\thandleKeyDown( event );\n\n\t\t}\n\n\t\tfunction onTouchStart( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\t// two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\t\thandleTouchStartDolly( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleTouchStartPan( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2: // two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveDolly( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchEnd( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleTouchEnd( event );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onContextMenu( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t}\n\n\t\t//\n\n\t\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\t\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.addEventListener( 'wheel', onMouseWheel, false );\n\n\t\tscope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\t\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t\t// force an update at start\n\n\t\tthis.update();\n\n\t};\n\n\tOrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\n\tOrbitControls.prototype.constructor = OrbitControls;\n\n\tObject.defineProperties( OrbitControls.prototype, {\n\n\t\tcenter: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .center has been renamed to .target' );\n\t\t\t\treturn this.target;\n\n\t\t\t}\n\n\t\t},\n\n\t\t// backward compatibility\n\n\t\tnoZoom: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\treturn ! this.enableZoom;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\tthis.enableZoom = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoRotate: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\treturn ! this.enableRotate;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\tthis.enableRotate = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoPan: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\treturn ! this.enablePan;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\tthis.enablePan = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoKeys: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\treturn ! this.enableKeys;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\tthis.enableKeys = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tstaticMoving : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\treturn ! this.enableDamping;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\tthis.enableDamping = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tdynamicDampingFactor : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\treturn this.dampingFactor;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\tthis.dampingFactor = value;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\treturn OrbitControls;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-orbit-controls/index.js\n// module id = 12\n// module chunks = 0","'use strict';\n\nmodule.exports = function (THREE) {\n\n /**\n * @author mrdoob / http://mrdoob.com/\n */\n THREE.OBJLoader = function (manager) {\n\n this.manager = manager !== undefined ? manager : THREE.DefaultLoadingManager;\n };\n\n THREE.OBJLoader.prototype = {\n\n constructor: THREE.OBJLoader,\n\n load: function load(url, onLoad, onProgress, onError) {\n\n var scope = this;\n\n var loader = new THREE.XHRLoader(scope.manager);\n loader.load(url, function (text) {\n\n onLoad(scope.parse(text));\n }, onProgress, onError);\n },\n\n parse: function parse(text) {\n\n console.time('OBJLoader');\n\n var object,\n objects = [];\n var geometry, material;\n\n function parseVertexIndex(value) {\n\n var index = parseInt(value);\n\n return (index >= 0 ? index - 1 : index + vertices.length / 3) * 3;\n }\n\n function parseNormalIndex(value) {\n\n var index = parseInt(value);\n\n return (index >= 0 ? index - 1 : index + normals.length / 3) * 3;\n }\n\n function parseUVIndex(value) {\n\n var index = parseInt(value);\n\n return (index >= 0 ? index - 1 : index + uvs.length / 2) * 2;\n }\n\n function addVertex(a, b, c) {\n\n geometry.vertices.push(vertices[a], vertices[a + 1], vertices[a + 2], vertices[b], vertices[b + 1], vertices[b + 2], vertices[c], vertices[c + 1], vertices[c + 2]);\n }\n\n function addNormal(a, b, c) {\n\n geometry.normals.push(normals[a], normals[a + 1], normals[a + 2], normals[b], normals[b + 1], normals[b + 2], normals[c], normals[c + 1], normals[c + 2]);\n }\n\n function addUV(a, b, c) {\n\n geometry.uvs.push(uvs[a], uvs[a + 1], uvs[b], uvs[b + 1], uvs[c], uvs[c + 1]);\n }\n\n function addFace(a, b, c, d, ua, ub, uc, ud, na, nb, nc, nd) {\n\n var ia = parseVertexIndex(a);\n var ib = parseVertexIndex(b);\n var ic = parseVertexIndex(c);\n var id;\n\n if (d === undefined) {\n\n addVertex(ia, ib, ic);\n } else {\n\n id = parseVertexIndex(d);\n\n addVertex(ia, ib, id);\n addVertex(ib, ic, id);\n }\n\n if (ua !== undefined) {\n\n ia = parseUVIndex(ua);\n ib = parseUVIndex(ub);\n ic = parseUVIndex(uc);\n\n if (d === undefined) {\n\n addUV(ia, ib, ic);\n } else {\n\n id = parseUVIndex(ud);\n\n addUV(ia, ib, id);\n addUV(ib, ic, id);\n }\n }\n\n if (na !== undefined) {\n\n ia = parseNormalIndex(na);\n ib = parseNormalIndex(nb);\n ic = parseNormalIndex(nc);\n\n if (d === undefined) {\n\n addNormal(ia, ib, ic);\n } else {\n\n id = parseNormalIndex(nd);\n\n addNormal(ia, ib, id);\n addNormal(ib, ic, id);\n }\n }\n }\n\n // create mesh if no objects in text\n\n if (/^o /gm.test(text) === false) {\n\n geometry = {\n vertices: [],\n normals: [],\n uvs: []\n };\n\n material = {\n name: ''\n };\n\n object = {\n name: '',\n geometry: geometry,\n material: material\n };\n\n objects.push(object);\n }\n\n var vertices = [];\n var normals = [];\n var uvs = [];\n\n // v float float float\n\n var vertex_pattern = /v( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)/;\n\n // vn float float float\n\n var normal_pattern = /vn( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)/;\n\n // vt float float\n\n var uv_pattern = /vt( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)/;\n\n // f vertex vertex vertex ...\n\n var face_pattern1 = /f( +-?\\d+)( +-?\\d+)( +-?\\d+)( +-?\\d+)?/;\n\n // f vertex/uv vertex/uv vertex/uv ...\n\n var face_pattern2 = /f( +(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+))?/;\n\n // f vertex/uv/normal vertex/uv/normal vertex/uv/normal ...\n\n var face_pattern3 = /f( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))?/;\n\n // f vertex//normal vertex//normal vertex//normal ...\n\n var face_pattern4 = /f( +(-?\\d+)\\/\\/(-?\\d+))( +(-?\\d+)\\/\\/(-?\\d+))( +(-?\\d+)\\/\\/(-?\\d+))( +(-?\\d+)\\/\\/(-?\\d+))?/;\n\n //\n\n var lines = text.split('\\n');\n\n for (var i = 0; i < lines.length; i++) {\n\n var line = lines[i];\n line = line.trim();\n\n var result;\n\n if (line.length === 0 || line.charAt(0) === '#') {\n\n continue;\n } else if ((result = vertex_pattern.exec(line)) !== null) {\n\n // [\"v 1.0 2.0 3.0\", \"1.0\", \"2.0\", \"3.0\"]\n\n vertices.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3]));\n } else if ((result = normal_pattern.exec(line)) !== null) {\n\n // [\"vn 1.0 2.0 3.0\", \"1.0\", \"2.0\", \"3.0\"]\n\n normals.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3]));\n } else if ((result = uv_pattern.exec(line)) !== null) {\n\n // [\"vt 0.1 0.2\", \"0.1\", \"0.2\"]\n\n uvs.push(parseFloat(result[1]), parseFloat(result[2]));\n } else if ((result = face_pattern1.exec(line)) !== null) {\n\n // [\"f 1 2 3\", \"1\", \"2\", \"3\", undefined]\n\n addFace(result[1], result[2], result[3], result[4]);\n } else if ((result = face_pattern2.exec(line)) !== null) {\n\n // [\"f 1/1 2/2 3/3\", \" 1/1\", \"1\", \"1\", \" 2/2\", \"2\", \"2\", \" 3/3\", \"3\", \"3\", undefined, undefined, undefined]\n\n addFace(result[2], result[5], result[8], result[11], result[3], result[6], result[9], result[12]);\n } else if ((result = face_pattern3.exec(line)) !== null) {\n\n // [\"f 1/1/1 2/2/2 3/3/3\", \" 1/1/1\", \"1\", \"1\", \"1\", \" 2/2/2\", \"2\", \"2\", \"2\", \" 3/3/3\", \"3\", \"3\", \"3\", undefined, undefined, undefined, undefined]\n\n addFace(result[2], result[6], result[10], result[14], result[3], result[7], result[11], result[15], result[4], result[8], result[12], result[16]);\n } else if ((result = face_pattern4.exec(line)) !== null) {\n\n // [\"f 1//1 2//2 3//3\", \" 1//1\", \"1\", \"1\", \" 2//2\", \"2\", \"2\", \" 3//3\", \"3\", \"3\", undefined, undefined, undefined]\n\n addFace(result[2], result[5], result[8], result[11], undefined, undefined, undefined, undefined, result[3], result[6], result[9], result[12]);\n } else if (/^o /.test(line)) {\n\n geometry = {\n vertices: [],\n normals: [],\n uvs: []\n };\n\n material = {\n name: ''\n };\n\n object = {\n name: line.substring(2).trim(),\n geometry: geometry,\n material: material\n };\n\n objects.push(object);\n } else if (/^g /.test(line)) {\n\n // group\n\n } else if (/^usemtl /.test(line)) {\n\n // material\n\n material.name = line.substring(7).trim();\n } else if (/^mtllib /.test(line)) {\n\n // mtl file\n\n } else if (/^s /.test(line)) {\n\n // smooth shading\n\n } else {\n\n // console.log( \"THREE.OBJLoader: Unhandled line \" + line );\n\n }\n }\n\n var container = new THREE.Object3D();\n var l;\n\n for (i = 0, l = objects.length; i < l; i++) {\n\n object = objects[i];\n geometry = object.geometry;\n\n var buffergeometry = new THREE.BufferGeometry();\n\n buffergeometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array(geometry.vertices), 3));\n\n if (geometry.normals.length > 0) {\n\n buffergeometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(geometry.normals), 3));\n }\n\n if (geometry.uvs.length > 0) {\n\n buffergeometry.addAttribute('uv', new THREE.BufferAttribute(new Float32Array(geometry.uvs), 2));\n }\n\n material = new THREE.MeshLambertMaterial({\n color: 0xff0000\n });\n material.name = object.material.name;\n\n var mesh = new THREE.Mesh(buffergeometry, material);\n mesh.name = object.name;\n\n container.add(mesh);\n }\n\n console.timeEnd('OBJLoader');\n\n return container;\n }\n\n };\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-obj-loader/dist/index.js\n// module id = 13\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file From 46d8ebe7911345e617de5275a94dc4e81aac74b1 Mon Sep 17 00:00:00 2001 From: Joseph Gao Date: Wed, 29 Mar 2017 07:17:09 -0400 Subject: [PATCH 05/12] still buggy af --- src/crowd.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/crowd.js b/src/crowd.js index 6deca3cd..0ae36927 100644 --- a/src/crowd.js +++ b/src/crowd.js @@ -34,7 +34,7 @@ export default class Crowd { populate_board() { for (var i = 0; i < this.agents.length; i++) { var agent = this.agents[i]; - var gs = this.board.find_nearest_grid(agent.position.x, agent.position.z); + var gs = this.board.find_absolute_grid(agent.position.x, agent.position.z); this.board.grid[gs.z][gs.x].add(agent); } } @@ -133,22 +133,24 @@ export default class Crowd { for (var i = 0; i < this.agents.length; i++) { var agent = this.agents[i]; if (agent.position.distanceTo(agent.goal) > 2.0) { - var old_gs = this.board.find_nearest_grid(agent.position.x, agent.position.z); + var old_gs = this.board.find_absolute_grid(agent.position.x, agent.position.z); // computing total marker influence - var G = new THREE.Vector3(agent.goal.x - agent.position.x, 0, agent.goal.z - agent.position.z); + var G = new THREE.Vector3().subVectors(agent.goal, agent.position) var total_weight = 0.0; var total_velocity = new THREE.Vector3(0, 0, 0); for (var j = 0; j < agent.markers.length; j++) { var marker = agent.markers[j]; - var m = new THREE.Vector3(marker.position.x - agent.position.x, 0, marker.position.z - agent.position.z); - var weight = (1.0 + Math.cos(m.angleTo(G))) / (1.0 + m.length()); + var m = new THREE.Vector3().subVectors(marker.position, agent.position); + m.y = 0.0; + var weight = (1.0 + m.dot(G) / (m.length() * G.length())) / (1.0 + m.length()); total_weight += weight; } for (var j = 0; j < agent.markers.length; j++) { var marker = agent.markers[j]; - var m = new THREE.Vector3(marker.position.x - agent.position.x, 0, marker.position.z - agent.position.z); - var weight = (1.0 + Math.cos(m.angleTo(G))) / (1.0 + m.length()); + var m = new THREE.Vector3().subVectors(marker.position, agent.position); + m.y = 0.0; + var weight = (1.0 + m.dot(G) / (m.length() * G.length())) / (1.0 + m.length()); total_velocity.add(m.multiplyScalar(weight / total_weight)); } if (i === 1) { @@ -157,7 +159,7 @@ export default class Crowd { agent.position.add(total_velocity.multiplyScalar(time).normalize()); // agent.position.add(G.divideScalar(100.0)); // check if the movement of this agent causes it to leave its current grid - var agent_gs = this.board.find_nearest_grid(agent.position.x, agent.position.z); + var agent_gs = this.board.find_absolute_grid(agent.position.x, agent.position.z); if (old_gs.x !== agent_gs.x || old_gs.z !== agent_gs.z) { this.board.grid[old_gs.z][old_gs.x].delete(agent); this.board.grid[agent_gs.z][agent_gs.x].add(agent); From fc1b4d7412b614ea88184641ef9e12eda3e635af Mon Sep 17 00:00:00 2001 From: Joseph Gao Date: Wed, 29 Mar 2017 07:17:38 -0400 Subject: [PATCH 06/12] deploying --- bundle.js | 18 ++++++++++-------- bundle.js.map | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/bundle.js b/bundle.js index ecefda2d..4ef7447a 100644 --- a/bundle.js +++ b/bundle.js @@ -42622,7 +42622,7 @@ value: function populate_board() { for (var i = 0; i < this.agents.length; i++) { var agent = this.agents[i]; - var gs = this.board.find_nearest_grid(agent.position.x, agent.position.z); + var gs = this.board.find_absolute_grid(agent.position.x, agent.position.z); this.board.grid[gs.z][gs.x].add(agent); } } @@ -42729,22 +42729,24 @@ for (var i = 0; i < this.agents.length; i++) { var agent = this.agents[i]; if (agent.position.distanceTo(agent.goal) > 2.0) { - var old_gs = this.board.find_nearest_grid(agent.position.x, agent.position.z); + var old_gs = this.board.find_absolute_grid(agent.position.x, agent.position.z); // computing total marker influence - var G = new THREE.Vector3(agent.goal.x - agent.position.x, 0, agent.goal.z - agent.position.z); + var G = new THREE.Vector3().subVectors(agent.goal, agent.position); var total_weight = 0.0; var total_velocity = new THREE.Vector3(0, 0, 0); for (var j = 0; j < agent.markers.length; j++) { var marker = agent.markers[j]; - var m = new THREE.Vector3(marker.position.x - agent.position.x, 0, marker.position.z - agent.position.z); - var weight = (1.0 + Math.cos(m.angleTo(G))) / (1.0 + m.length()); + var m = new THREE.Vector3().subVectors(marker.position, agent.position); + m.y = 0.0; + var weight = (1.0 + m.dot(G) / (m.length() * G.length())) / (1.0 + m.length()); total_weight += weight; } for (var j = 0; j < agent.markers.length; j++) { var marker = agent.markers[j]; - var m = new THREE.Vector3(marker.position.x - agent.position.x, 0, marker.position.z - agent.position.z); - var weight = (1.0 + Math.cos(m.angleTo(G))) / (1.0 + m.length()); + var m = new THREE.Vector3().subVectors(marker.position, agent.position); + m.y = 0.0; + var weight = (1.0 + m.dot(G) / (m.length() * G.length())) / (1.0 + m.length()); total_velocity.add(m.multiplyScalar(weight / total_weight)); } if (i === 1) {} @@ -42752,7 +42754,7 @@ agent.position.add(total_velocity.multiplyScalar(time).normalize()); // agent.position.add(G.divideScalar(100.0)); // check if the movement of this agent causes it to leave its current grid - var agent_gs = this.board.find_nearest_grid(agent.position.x, agent.position.z); + var agent_gs = this.board.find_absolute_grid(agent.position.x, agent.position.z); if (old_gs.x !== agent_gs.x || old_gs.z !== agent_gs.z) { this.board.grid[old_gs.z][old_gs.x].delete(agent); this.board.grid[agent_gs.z][agent_gs.x].add(agent); diff --git a/bundle.js.map b/bundle.js.map index c1e78ac7..3cac6978 100644 --- a/bundle.js.map +++ b/bundle.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap c90c41d011d962588db1","webpack:///./src/main.js","webpack:///./src/grid.js","webpack:///./~/three/build/three.js","webpack:///./src/agent.js","webpack:///./src/marker.js","webpack:///./src/crowd.js","webpack:///./src/renderengine.js","webpack:///./src/framework.js","webpack:///./~/stats-js/build/stats.min.js","webpack:///./~/dat-gui/index.js","webpack:///./~/dat-gui/vendor/dat.gui.js","webpack:///./~/dat-gui/vendor/dat.color.js","webpack:///./~/three-orbit-controls/index.js","webpack:///./~/three-obj-loader/dist/index.js"],"names":["THREE","require","OBJLoader","crowd","renderengine","time","onLoad","framework","scene","camera","renderer","gui","stats","directionalLight","DirectionalLight","color","setHSL","position","set","multiplyScalar","add","ambientLight","AmbientLight","lookAt","Vector3","onChange","newVal","updateProjectionMatrix","onUpdate","update","init","Grid","cell_size","plane_size","grid_cell_size","grid_len","grid","push","Array","i","j","Set","ws_x","ws_z","tgs","ws_to_tgs","gs_z","Math","round","z","gs_x","x","floor","tgs_x","tgs_z","Agent","id","pos","vel","goal","size","col","velocity","markers","mesh","Marker","owned","agent","Crowd","agents","board","create_agents","populate_board","create_markers","render_plane","render_agents","render_markers","agent_1_pos","agent_2_pos","agent_1_goal","agent_2_goal","zero","agent_1","agent_2","length","gs","find_nearest_grid","random","marker","update_marker_ownership","update_agent_velocities","update_agents","update_markers","reset_ownership","ngs","top_left","top","left","eligible_agents","forEach","assign_marker_to_agent","closest","dist","distanceTo","test_dist","old_gs","G","total_weight","total_velocity","m","weight","cos","angleTo","normalize","agent_gs","delete","RenderEngine","plane_geo","PlaneGeometry","plane_mesh","Mesh","MeshBasicMaterial","side","DoubleSide","rotation","PI","cylinder_geo","CylinderGeometry","y","cube_geo","BoxGeometry","geometry","verticesNeedUpdate","material","setHex","OrbitControls","callback","setMode","domElement","style","document","body","appendChild","GUI","window","addEventListener","Scene","PerspectiveCamera","innerWidth","innerHeight","WebGLRenderer","antialias","setPixelRatio","devicePixelRatio","setSize","setClearColor","controls","enableDamping","enableZoom","target","rotateSpeed","zoomSpeed","panSpeed","aspect","tick","begin","render","end","requestAnimationFrame"],"mappings":"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AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,qBAAoB,QAAQ;;AAE5B;;AAEA;;AAEA,OAAM;;AAEN;;AAEA,OAAM;;AAEN;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4BAA2B;AAC3B,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AA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AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA,oEAAmE;;AAEnE;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;A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;;AAE7zB,wCAAuC,sBAAsB,8KAA8K,wKAAwK,mCAAmC,gJAAgJ;;AAEtkB,2CAA0C,yKAAyK,+EAA+E,GAAG;;AAErS,oEAAmE,wHAAwH;;AAE3L;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;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EA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA,+CAA8C;;AAE9C;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AA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AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,uCAAsC,2BAA2B;;AAEjE;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,sC;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,qBAAoB,sBAAsB;;AAE1C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,4BAA2B,gBAAgB;;AAE3C;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,qBAAoB,sBAAsB;;AAE1C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,4BAA2B,kBAAkB;;AAE7C;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,8CAA6C,OAAO;;AAEpD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH,0BAAyB;;AAEzB;;AAEA;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAmB;AACnB,mBAAkB;AAClB,kBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,gDAA+C;AAC/C;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB,0BAA0B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,qBAAoB,4BAA4B;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA,8BAA6B,kBAAkB;;AAE/C;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA,qBAAoB,qBAAqB;;AAEzC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,sDAAqD,QAAQ;;AAE7D;;AAEA;;AAEA,qDAAoD,QAAQ;;AAE5D;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;;AAErC;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,uBAAsB;;AAEtB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,uCAAsC,OAAO;;AAE7C;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,uCAAsC,OAAO;;AAE7C;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,wCAAuC,OAAO;;AAE9C;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,wCAAuC,OAAO;;AAE9C;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,wCAAuC,OAAO;;AAE9C;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,wCAAuC,OAAO;;AAE9C;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,uCAAsC,2BAA2B;;AAEjE;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,+CAA8C,QAAQ;;AAEtD;AACA;;AAEA;;AAEA,4CAA2C,QAAQ;;AAEnD;AACA;;AAEA,qDAAoD,QAAQ;;AAE5D;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,2BAA0B,sBAAsB;;AAEhD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,sBAAqB,mBAAmB;;AAExC;;AAEA;AACA;;AAEA,+CAA8C,QAAQ;;AAEtD;;AAEA;;AAEA;;AAEA,MAAK;;AAEL,sBAAqB,oBAAoB;;AAEzC;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ,qBAAoB,0BAA0B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4CAA2C,QAAQ;;AAEnD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,2CAA0C,QAAQ;;AAElD;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,yCAAwC,QAAQ;;AAEhD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,yCAAwC,QAAQ;;AAEhD;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,2CAA0C,QAAQ;;AAElD;;AAEA;;AAEA,wCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,wCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA,wCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,iDAAgD,QAAQ;;AAExD;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,+CAA8C,QAAQ;;AAEtD;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,0CAAyC,QAAQ;;AAEjD;AACA,wBAAuB;;AAEvB;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,yCAAwC,QAAQ;;AAEhD;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,wCAAuC,QAAQ;;AAE/C;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,0CAAyC,QAAQ;;AAEjD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,2CAA0C,QAAQ;;AAElD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yCAAwC,QAAQ;;AAEhD;;AAEA;;AAEA;;AAEA,oCAAmC,QAAQ;;AAE3C;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,oDAAmD,QAAQ;;AAE3D;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mDAAkD,QAAQ;;AAE1D;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,kCAAiC,QAAQ;;AAEzC;;AAEA;;AAEA;;AAEA;;AAEA,qCAAoC,QAAQ;;AAE5C;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA,yBAAwB;AACxB;;AAEA;AACA,4BAA2B;AAC3B;AACA;AACA;;AAEA,2CAA0C,QAAQ;;AAElD;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;;AAGA;AACA;AACA;;AAEA,wCAAuC,QAAQ;;AAE/C;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,qBAAoB,OAAO;;AAE3B;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,6CAA4C,QAAQ;;AAEpD;;AAEA;;AAEA,iDAAgD,QAAQ;;AAExD;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,oBAAmB,YAAY;;AAE/B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,oBAAmB,YAAY;;AAE/B;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,0BAA0B;;AAE7C;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAmB,uBAAuB;;AAE1C;;AAEA;AACA,2BAA0B;AAC1B;AACA;AACA;AACA;AACA;;AAEA;;AAEA,yCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,kDAAiD;AACjD;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,0CAAyC,QAAQ;;AAEjD;;AAEA;;AAEA;;AAEA,wCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;;AAEA,uCAAsC,QAAQ;;AAE9C;;AAEA;;AAEA,sDAAqD,QAAQ;;AAE7D;;AAEA;;AAEA;;AAEA;;AAEA,gDAA+C,QAAQ;;AAEvD;;AAEA,uCAAsC,QAAQ;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,yBAAwB,kBAAkB;;AAE1C;;AAEA,GAAE;;AAEF;AACA,8BAA6B,kBAAkB;;AAE/C;AACA;AACA;;AAEA;;AAEA,uCAAsC,2BAA2B;;AAEjE;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,oBAAmB,kBAAkB;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB,wBAAwB;;AAE5C;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB,wBAAwB;;AAE5C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,oBAAmB,kBAAkB;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB,wBAAwB;;AAE5C;;AAEA;;AAEA;;AAEA,qBAAoB,wBAAwB;;AAE5C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,yBAAwB,kBAAkB;;AAE1C;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;;AAEA;;AAEA,uCAAsC,2BAA2B;;AAEjE;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,qBAAoB;;AAEpB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,8CAA6C,OAAO;;AAEpD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,yCAAwC,QAAQ;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,yCAAwC,QAAQ;;AAEhD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,0CAAyC,QAAQ;;AAEjD;;AAEA;AACA;;AAEA,+CAA8C,QAAQ;;AAEtD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,6CAA4C,QAAQ;;AAEpD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,iDAAgD,4BAA4B;;AAE5E;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,yCAAwC,QAAQ;;AAEhD;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;;AAEA,sBAAqB,cAAc;;AAEnC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,iBAAgB,eAAe;;AAE/B;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,uCAAsC,OAAO;;AAE7C;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,yBAAwB,kBAAkB;;AAE1C;;AAEA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,+EAA8E,kCAAkC;;AAEhH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA,+CAA8C,QAAQ;;AAEtD;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,2CAA0C,OAAO;;AAEjD;AACA;AACA;;AAEA;;AAEA;;AAEA,sDAAqD;AACrD;;AAEA;;AAEA;;AAEA,OAAM;;;AAGN,6CAA4C,OAAO;;AAEnD;AACA;AACA;;AAEA;;AAEA;;AAEA,gCAA+B;AAC/B;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yCAAwC,QAAQ;;AAEhD;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,kDAAiD,QAAQ;;AAEzD;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,oGAAmG;AACnG,oGAAmG;AACnG,oGAAmG;AACnG,oGAAmG;AACnG,oGAAmG;AACnG,oGAAmG;;AAEnG;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,sCAAqC;AACrC,sCAAqC;AACrC,sCAAqC;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;AACA,uBAAsB;AACtB,uBAAsB;AACtB,uBAAsB;;AAEtB,qBAAoB;;AAEpB;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,qBAAoB,aAAa;;AAEjC;;AAEA,sBAAqB,aAAa;;AAElC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,iBAAgB,YAAY;;AAE5B,kBAAiB,YAAY;;AAE7B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,oBAAmB,aAAa;;AAEhC;;AAEA,qBAAoB,aAAa;;AAEjC;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,YAAY;;AAE/B,qBAAoB,YAAY;;AAEhC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,uBAAsB;AACtB,uBAAsB;;AAEtB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,+DAA8D;;AAE9D;AACA;;AAEA;;AAEA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,kEAAiE;;AAEjE;AACA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,+DAA8D;;AAE9D;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kEAAiE;;AAEjE;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB,kBAAkB;;AAEpC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,oDAAmD,+DAA+D,EAAE;;AAEpH;;AAEA;;AAEA;AACA,oDAAmD,0DAA0D,EAAE;;AAE/G;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,oDAAmD,oDAAoD,EAAE;;AAEzG;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB,OAAO;;AAEzB;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yCAAwC,YAAY,aAAa,eAAe,GAAG;;AAEnF;;AAEA;;AAEA,oCAAmC,qBAAqB;;AAExD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,mDAAkD;AAClD,iDAAgD;;AAEhD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,+BAA8B;AAC9B,mCAAkC;AAClC,oCAAmC;AACnC,8BAA6B;AAC7B,gCAA+B;AAC/B,kCAAiC;;AAEjC,8BAA6B;AAC7B,4BAA2B;AAC3B,wBAAuB;;AAEvB;;AAEA,4BAA2B;;AAE3B;;AAEA;;AAEA,mCAAkC;AAClC,mCAAkC;AAClC,mCAAkC;AAClC,mCAAkC;;AAElC;;AAEA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA;;AAEA;;AAEA,gCAA+B;AAC/B,iCAAgC;;AAEhC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mDAAkD;AAClD,iDAAgD;;AAEhD;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,8BAA6B;AAC7B,kCAAiC;;AAEjC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,KAAI;;AAEJ;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAG;;;AAGH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,oBAAmB,2BAA2B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,0CAAyC,QAAQ;;AAEjD;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uCAAsC,OAAO;;AAE7C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;AACA;;AAEA,gCAA+B;;AAE/B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,uCAAsC,OAAO;;AAE7C;AACA;AACA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,mDAAkD,OAAO;;AAEzD;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB,OAAO;;AAE3B;AACA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;;;AAIA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,sBAAqB,OAAO;;AAE5B;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,sBAAqB,OAAO;;AAE5B;;AAEA;;AAEA;;AAEA,SAAQ;;AAER;;AAEA;;AAEA,QAAO;;AAEP;;AAEA,6CAA4C,QAAQ;;AAEpD;;AAEA;;AAEA;;AAEA;;AAEA,WAAU;;AAEV;;AAEA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA,2CAA0C,QAAQ;;AAElD;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,KAAI;;AAEJ,0CAAyC,QAAQ;;AAEjD;;AAEA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;;AAEA;;AAEA,2CAA0C,QAAQ;;AAElD;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,sBAAqB,OAAO;;AAE5B;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB,OAAO;;AAE3B;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,qBAAoB,OAAO;;AAE3B;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,mCAAkC;AAClC;;AAEA;AACA;AACA;;AAEA,oBAAmB,WAAW;;AAE9B;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,8CAA6C,OAAO;;AAEpD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,kDAAiD,SAAS;;AAE1D;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,sBAAqB,oBAAoB;;AAEzC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB;AACpB;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,8BAA8B;;AAEjD;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA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;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,oEAAmE;;AAEnE;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA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A;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,eAAc,sBAAsB;;AAEpC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,gBAAe,qBAAqB;;AAEpC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,sBAAsB;;AAEpC,gBAAe,qBAAqB;;AAEpC;AACA;AACA;AACA;AACA;;AAEA;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,eAAc,qBAAqB;;AAEnC,gBAAe,sBAAsB;;AAErC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,qBAAqB;;AAEnC,gBAAe,sBAAsB;;AAErC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,+BAA8B,OAAO;;AAErC;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,kBAAiB;AACjB,kBAAiB;AACjB,kBAAiB;;AAEjB,iBAAgB,OAAO;;AAEvB;AACA;;AAEA;AACA;AACA;;AAEA,oBAAmB;AACnB,oBAAmB;AACnB,oBAAmB;;AAEnB;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,kBAAiB,OAAO;;AAExB,MAAK;;AAEL,kBAAiB,OAAO;;AAExB;;AAEA;;AAEA;;AAEA,wBAAuB;;AAEvB,sBAAqB,QAAQ;;AAE7B;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,YAAW,yBAAyB;AACpC,gBAAe,uBAAuB;AACtC,gBAAe,uBAAuB;;AAEtC;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;;AAGA;;AAEA;;AAEA,8BAA6B,QAAQ;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,OAAM;;AAEN;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAe;AACf,+CAA8C;;AAE9C,MAAK;;AAEL;AACA;AACA;;AAEA;AACA,4DAA2D;AAC3D,4DAA2D;AAC3D;AACA;;AAEA;AACA,sDAAqD;AACrD,4BAA2B;;AAE3B;AACA;AACA;;AAEA,wFAAuF;AACvF;;AAEA;AACA;AACA;;AAEA,wFAAuF;AACvF;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,4BAA2B;AAC3B,4BAA2B;;AAE3B,QAAO;;AAEP,4BAA2B;AAC3B,4BAA2B;;AAE3B;AACA;;AAEA,4BAA2B;AAC3B,4BAA2B;;AAE3B,QAAO;;AAEP,4BAA2B;AAC3B,4BAA2B;;AAE3B;;AAEA,OAAM;;AAEN;AACA;;AAEA,4BAA2B;AAC3B,4BAA2B;;AAE3B,QAAO;;AAEP,4BAA2B;AAC3B,4BAA2B;;AAE3B;AACA;;AAEA,4BAA2B;AAC3B,4BAA2B;;AAE3B,QAAO;;AAEP,4BAA2B;AAC3B,4BAA2B;;AAE3B;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,kCAAiC,aAAa;AAC9C;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;;AAGA;;AAEA,kCAAiC;AACjC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,qBAAoB,qBAAqB;;AAEzC,0BAAyB;AACzB;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,sBAAqB,2BAA2B;;AAEhD;AACA,sBAAqB,uBAAuB;;AAE5C,2BAA0B;AAC1B;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,wCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,uCAAsC,2BAA2B;;AAEjE;AACA;;AAEA;AACA,uBAAsB,uBAAuB;;AAE7C;;AAEA;AACA;AACA;;AAEA;AACA,yBAAwB,kBAAkB;;AAE1C;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,oCAAmC;;AAEnC,oCAAmC;;AAEnC;AACA,mCAAkC;;AAElC;;AAEA;;AAEA,kBAAiB;;AAEjB;;;AAGA;AACA;AACA;;AAEA;;AAEA;;AAEA,uCAAsC,QAAQ;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA,uCAAsC,QAAQ;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,uEAAsE;AACtE;;AAEA;;AAEA,uCAAsC,QAAQ;;AAE9C;;AAEA,iBAAgB,OAAO;;AAEvB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB,QAAQ;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,0FAAyF;AACzF,4FAA2F;AAC3F;;AAEA,uFAAsF;;AAEtF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,yBAAwB;;AAExB;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,oBAAmB;AACnB;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mCAAkC,QAAQ;;AAE1C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB;;AAEnB;;;AAGA;;AAEA;;AAEA,0BAAyB;;AAEzB,kCAAiC,QAAQ;;AAEzC;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;;AAGA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,4CAA2C;;AAE3C;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,8BAA6B;AAC7B;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA,+DAA8D,QAAQ;;AAEtE;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,kCAAiC,QAAQ;;AAEzC;;AAEA;;AAEA,0DAAyD,QAAQ;;AAEjE;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA,eAAc,mBAAmB;;AAEjC,8BAA6B,OAAO;;AAEpC;AACA;AACA;;AAEA;;AAEA,qCAAoC,QAAQ;;AAE5C;;AAEA;;AAEA;;AAEA;;AAEA,mCAAkC,QAAQ;;AAE1C;AACA;;AAEA,oCAAmC,QAAQ;;AAE3C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,UAAU;;AAExB;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,eAAc,YAAY;;AAE1B,gBAAe,UAAU;;AAEzB;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA,iBAAgB,oBAAoB;AACpC,+BAA8B,QAAQ;;AAEtC;AACA;AACA;;AAEA;;AAEA,qCAAoC,QAAQ;;AAE5C;AACA;;AAEA;;AAEA;;AAEA,mCAAkC,QAAQ;;AAE1C;AACA;;AAEA,oCAAmC,QAAQ;;AAE3C;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA,mBAAkB;AAClB;;AAEA;;AAEA,iBAAgB,UAAU;;AAE1B;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,iBAAgB,UAAU;;AAE1B;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,iBAAgB,UAAU;;AAE1B;AACA;;AAEA;;AAEA;;AAEA,iBAAgB,UAAU;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,mCAAkC,QAAQ;;AAE1C;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,iBAAgB,QAAQ;;AAExB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,mBAAkB,qBAAqB;;AAEvC;;AAEA;;AAEA,oBAAmB,oBAAoB;;AAEvC;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB,oBAAoB;;AAEtC,oBAAmB,mBAAmB;;AAEtC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,eAAc,kBAAkB;;AAEhC,gBAAe,oBAAoB;;AAEnC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,eAAc,iBAAiB;;AAE/B;;AAEA,gBAAe,mBAAmB;;AAElC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,eAAc,eAAe;;AAE7B;;AAEA;AACA;;AAEA,gBAAe,4BAA4B;;AAE3C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,cAAc;;AAE5B,gBAAe,2BAA2B;;AAE1C;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,sBAAqB,mBAAmB;;AAExC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,sCAAqC,OAAO;;AAE5C;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,kCAAiC,OAAO;;AAExC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,iCAAgC,OAAO;;AAEvC;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,eAAc,UAAU;;AAExB;;AAEA;;AAEA;;AAEA,eAAc,UAAU;;AAExB;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,qCAAoC,OAAO;;AAE3C;;AAEA,oBAAmB,OAAO;;AAE1B;AACA;AACA;;AAEA;;AAEA;;AAEA,qBAAoB;;AAEpB,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;;AAEA;AACA;;AAEA,iBAAgB,qBAAqB;;AAErC;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,oBAAoB;;AAEnC,iBAAgB,oBAAoB;;AAEpC;AACA;AACA;AACA;AACA;;AAEA;AACA,sCAAqC;AACrC,sCAAqC;AACrC,sCAAqC;;AAErC;AACA,sCAAqC;AACrC,sCAAqC;AACrC,sCAAqC;;AAErC;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,gBAAe,qBAAqB;;AAEpC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,oBAAoB;;AAEnC;AACA;;AAEA;;AAEA;AACA,qCAAoC;AACpC,yCAAwC;AACxC,qCAAoC;;AAEpC,MAAK;;AAEL;AACA,yCAAwC;AACxC,qCAAoC;AACpC,qCAAoC;;AAEpC;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,mCAAkC,eAAe;;AAEjD;;AAEA;AACA;;AAEA,yBAAwB;;AAExB;AACA;;AAEA;;AAEA;;AAEA,mBAAkB,eAAe;;AAEjC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA,0CAAyC,OAAO;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,2BAA2B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,2BAA0B;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;;AAErC;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA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ACA;AACA,0FAAyF,4CAA4C;AACrI;;AAEA;AACA;AACA,8FAA6F,4CAA4C;AACzI;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AA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MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,QAAQ;AAC7B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,qBAAoB;AACpB;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,gBAAgB;AAC7B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,gCAA+B;AAC/B,QAAO;AACP;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;A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AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA,cAAa,QAAQ;AACrB,cAAa,YAAY;AACzB,cAAa,QAAQ;AACrB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;AACA;;AAEA,MAAK;;AAEL,sBAAqB;;AAErB;;AAEA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;;AAGA,QAAO;;;AAGP;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;AACA;;AAEA;;AAEA,4CAA2C,mBAAmB;AAC9D,4DAA2D,kBAAkB,EAAE;AAC/E,sDAAqD,mBAAmB;AACxE,uDAAsD,mBAAmB;AACzE;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,gCAAgC;AACrD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,sBAAqB,YAAY;AACjC,qBAAoB,MAAM;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAgC;;AAEhC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,yCAAwC;;AAExC;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAa;AACb;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,UAAU;AAC7B,qBAAoB,MAAM;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA,sBAAqB,YAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,YAAW;;AAEX;AACA;AACA,YAAW;;AAEX;AACA;AACA;;;AAGA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,QAAO;;AAEP;AACA;AACA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AEA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;AAGL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,8BAA6B;AAC7B;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,2BAA0B;AAC1B;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,yGAAwG;AACxG,MAAK;AACL;;AAEA;AACA;AACA,8JAA6J;AAC7J,2JAA0J;AAC1J,sJAAqJ;AACrJ,uJAAsJ;AACtJ,mJAAkJ;AAClJ;;;AAGA;;AAEA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;AAGL;AACA;;AAEA;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;;AAEA;;;;AAIA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA,mB;;;;;;AC3kHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,W;;AAEA,cAAa;;AAEb;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA,6CAA4C,QAAQ;AACpD;AACA;AACA;AACA;AACA,MAAK;;AAEL;;;AAGA,kD;;AAEA;;AAEA,QAAO,0CAA0C;;AAEjD,0CAAyC,SAAS;AAClD;AACA;;AAEA,QAAO;;AAEP;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAC;;AAED;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA,oDAAmD,EAAE;AACrD;;AAEA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA,mB;;;;;;AClvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,0BAAyB;AACzB,gCAA+B;;AAE/B;AACA;AACA,qCAAoC;AACpC,mCAAkC;;AAElC;AACA;AACA;AACA;;AAEA,uDAAsD;AACtD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,0BAAyB;;AAEzB;AACA;AACA;AACA,8BAA6B;;AAE7B;AACA;;AAEA;AACA,gBAAe;;AAEf;AACA,wBAAuB;;AAEvB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AA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","file":"./bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap c90c41d011d962588db1","\nconst THREE = require('three'); // older modules are imported like this. You shouldn't have to worry about this much\nconst OBJLoader = require('three-obj-loader')(THREE)\nimport Grid from './grid.js'\nimport Agent from './agent.js'\nimport Marker from './marker.js'\nimport Crowd from './crowd.js'\nimport RenderEngine from './renderengine.js'\nimport Framework from './framework'\n\nvar crowd, renderengine;\nvar time = 0.0;\n// called after the scene loads\nfunction onLoad(framework) {\n var scene = framework.scene;\n var camera = framework.camera;\n var renderer = framework.renderer;\n var gui = framework.gui;\n var stats = framework.stats;\n\n // initialize a simple box and material\n var directionalLight = new THREE.DirectionalLight( 0xffffff, 1.25 );\n directionalLight.color.setHSL(0.1, 1, 0.95);\n directionalLight.position.set(1, 3, 2);\n directionalLight.position.multiplyScalar(10);\n scene.add(directionalLight);\n\n var ambientLight = new THREE.AmbientLight(0x404040);\n scene.add(ambientLight);\n\n // set camera position\n camera.position.set(50, 50, 100);\n camera.lookAt(new THREE.Vector3(0,0,0));\n\n gui.add(camera, 'fov', 0, 180).onChange(function(newVal) {\n camera.updateProjectionMatrix();\n });\n\n renderengine = new RenderEngine(scene);\n crowd = new Crowd(renderengine);\n}\n\n// called on frame updates\nfunction onUpdate(framework) {\n time += 1.0;\n if (crowd) {\n crowd.update(time);\n }\n}\n\n// when the scene is done initializing, it will call onLoad, then on frame updates, call onUpdate\nFramework.init(onLoad, onUpdate);\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.js","const THREE = require('three');\n\n// GRID IS ASSUMED TO BE A SQUARE\nexport default class Grid {\n\tconstructor(cell_size, plane_size) {\n\t\tthis.plane_size = plane_size;\n\t\tthis.grid_cell_size = cell_size;\n\t\tthis.grid_len = plane_size / cell_size;\n\t\tthis.grid = [];\n\t\twhile(this.grid.push(new Array(this.grid_len)) < this.grid_len);\n\t\tfor (var i = 0; i < this.grid_len; i++) {\n\t\t\tfor (var j = 0; j < this.grid_len; j++) {\n\t\t\t\tthis.grid[i][j] = new Set();\n\t\t\t}\n\t\t}\n\t}\n\n\t// find_nearest_grid will be used by marker to ultimately find nearest 4 grid\n\tfind_nearest_grid(ws_x, ws_z) {\n\t\tvar tgs = this.ws_to_tgs(ws_x, ws_z);\n\t\tvar gs_z = Math.round(tgs.z / this.grid_cell_size);\n\t\tvar gs_x = Math.round(tgs.x / this.grid_cell_size);\n\t\tif (gs_z === 10.0) {\n\t\t\tgs_z = 9.0;\n\t\t}\n\t\tif (gs_x === 10.0) {\n\t\t\tgs_x = 9.0;\n\t\t}\n\t\treturn {z: gs_z, x: gs_x};\n\t}\n\n\t// find_absolute_grid will be used by agent to demarcate it's exact grid location\n\tfind_absolute_grid(ws_x, ws_z) {\n\t\tvar tgs = this.ws_to_tgs(ws_x, ws_z);\n\t\t// console.log('tgs:', tgs);\n\t\tvar gs_z = Math.floor(tgs.z / this.grid_cell_size);\n\t\tvar gs_x = Math.floor(tgs.x / this.grid_cell_size);\n\t\treturn {z: gs_z, x: gs_x};\n\t}\n\n\t// convert from world space to uniform grid space\n\tws_to_tgs(ws_x, ws_z) {\n\t\t// perform translation\n\t\tvar tgs_x = ws_x + 50.0;\n\t\tvar tgs_z = ws_z + 50.0;\n\t\treturn {x: tgs_x, z: tgs_z};\n\t}\n}\n\n\n// WEBPACK FOOTER //\n// ./src/grid.js","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.THREE = global.THREE || {})));\n}(this, (function (exports) { 'use strict';\n\n\t// Polyfills\n\n\tif ( Number.EPSILON === undefined ) {\n\n\t\tNumber.EPSILON = Math.pow( 2, - 52 );\n\n\t}\n\n\t//\n\n\tif ( Math.sign === undefined ) {\n\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign\n\n\t\tMath.sign = function ( x ) {\n\n\t\t\treturn ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;\n\n\t\t};\n\n\t}\n\n\tif ( Function.prototype.name === undefined ) {\n\n\t\t// Missing in IE9-11.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\n\n\t\tObject.defineProperty( Function.prototype, 'name', {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.toString().match( /^\\s*function\\s*(\\S*)\\s*\\(/ )[ 1 ];\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tif ( Object.assign === undefined ) {\n\n\t\t// Missing in IE.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n\n\t\t( function () {\n\n\t\t\tObject.assign = function ( target ) {\n\n\t\t\t\t'use strict';\n\n\t\t\t\tif ( target === undefined || target === null ) {\n\n\t\t\t\t\tthrow new TypeError( 'Cannot convert undefined or null to object' );\n\n\t\t\t\t}\n\n\t\t\t\tvar output = Object( target );\n\n\t\t\t\tfor ( var index = 1; index < arguments.length; index ++ ) {\n\n\t\t\t\t\tvar source = arguments[ index ];\n\n\t\t\t\t\tif ( source !== undefined && source !== null ) {\n\n\t\t\t\t\t\tfor ( var nextKey in source ) {\n\n\t\t\t\t\t\t\tif ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {\n\n\t\t\t\t\t\t\t\toutput[ nextKey ] = source[ nextKey ];\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\treturn output;\n\n\t\t\t};\n\n\t\t} )();\n\n\t}\n\n\t/**\n\t * https://github.com/mrdoob/eventdispatcher.js/\n\t */\n\n\tfunction EventDispatcher() {}\n\n\tObject.assign( EventDispatcher.prototype, {\n\n\t\taddEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\t\tlisteners[ type ] = [];\n\n\t\t\t}\n\n\t\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\t\tlisteners[ type ].push( listener );\n\n\t\t\t}\n\n\t\t},\n\n\t\thasEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return false;\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\tif ( listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tremoveEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tvar index = listenerArray.indexOf( listener );\n\n\t\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tdispatchEvent: function ( event ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ event.type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tevent.target = this;\n\n\t\t\t\tvar array = [], i = 0;\n\t\t\t\tvar length = listenerArray.length;\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ] = listenerArray[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\tvar REVISION = '82';\n\tvar MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };\n\tvar CullFaceNone = 0;\n\tvar CullFaceBack = 1;\n\tvar CullFaceFront = 2;\n\tvar CullFaceFrontBack = 3;\n\tvar FrontFaceDirectionCW = 0;\n\tvar FrontFaceDirectionCCW = 1;\n\tvar BasicShadowMap = 0;\n\tvar PCFShadowMap = 1;\n\tvar PCFSoftShadowMap = 2;\n\tvar FrontSide = 0;\n\tvar BackSide = 1;\n\tvar DoubleSide = 2;\n\tvar FlatShading = 1;\n\tvar SmoothShading = 2;\n\tvar NoColors = 0;\n\tvar FaceColors = 1;\n\tvar VertexColors = 2;\n\tvar NoBlending = 0;\n\tvar NormalBlending = 1;\n\tvar AdditiveBlending = 2;\n\tvar SubtractiveBlending = 3;\n\tvar MultiplyBlending = 4;\n\tvar CustomBlending = 5;\n\tvar BlendingMode = {\n\t\tNoBlending: NoBlending,\n\t\tNormalBlending: NormalBlending,\n\t\tAdditiveBlending: AdditiveBlending,\n\t\tSubtractiveBlending: SubtractiveBlending,\n\t\tMultiplyBlending: MultiplyBlending,\n\t\tCustomBlending: CustomBlending\n\t};\n\tvar AddEquation = 100;\n\tvar SubtractEquation = 101;\n\tvar ReverseSubtractEquation = 102;\n\tvar MinEquation = 103;\n\tvar MaxEquation = 104;\n\tvar ZeroFactor = 200;\n\tvar OneFactor = 201;\n\tvar SrcColorFactor = 202;\n\tvar OneMinusSrcColorFactor = 203;\n\tvar SrcAlphaFactor = 204;\n\tvar OneMinusSrcAlphaFactor = 205;\n\tvar DstAlphaFactor = 206;\n\tvar OneMinusDstAlphaFactor = 207;\n\tvar DstColorFactor = 208;\n\tvar OneMinusDstColorFactor = 209;\n\tvar SrcAlphaSaturateFactor = 210;\n\tvar NeverDepth = 0;\n\tvar AlwaysDepth = 1;\n\tvar LessDepth = 2;\n\tvar LessEqualDepth = 3;\n\tvar EqualDepth = 4;\n\tvar GreaterEqualDepth = 5;\n\tvar GreaterDepth = 6;\n\tvar NotEqualDepth = 7;\n\tvar MultiplyOperation = 0;\n\tvar MixOperation = 1;\n\tvar AddOperation = 2;\n\tvar NoToneMapping = 0;\n\tvar LinearToneMapping = 1;\n\tvar ReinhardToneMapping = 2;\n\tvar Uncharted2ToneMapping = 3;\n\tvar CineonToneMapping = 4;\n\tvar UVMapping = 300;\n\tvar CubeReflectionMapping = 301;\n\tvar CubeRefractionMapping = 302;\n\tvar EquirectangularReflectionMapping = 303;\n\tvar EquirectangularRefractionMapping = 304;\n\tvar SphericalReflectionMapping = 305;\n\tvar CubeUVReflectionMapping = 306;\n\tvar CubeUVRefractionMapping = 307;\n\tvar TextureMapping = {\n\t\tUVMapping: UVMapping,\n\t\tCubeReflectionMapping: CubeReflectionMapping,\n\t\tCubeRefractionMapping: CubeRefractionMapping,\n\t\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\t\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\t\tSphericalReflectionMapping: SphericalReflectionMapping,\n\t\tCubeUVReflectionMapping: CubeUVReflectionMapping,\n\t\tCubeUVRefractionMapping: CubeUVRefractionMapping\n\t};\n\tvar RepeatWrapping = 1000;\n\tvar ClampToEdgeWrapping = 1001;\n\tvar MirroredRepeatWrapping = 1002;\n\tvar TextureWrapping = {\n\t\tRepeatWrapping: RepeatWrapping,\n\t\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\t\tMirroredRepeatWrapping: MirroredRepeatWrapping\n\t};\n\tvar NearestFilter = 1003;\n\tvar NearestMipMapNearestFilter = 1004;\n\tvar NearestMipMapLinearFilter = 1005;\n\tvar LinearFilter = 1006;\n\tvar LinearMipMapNearestFilter = 1007;\n\tvar LinearMipMapLinearFilter = 1008;\n\tvar TextureFilter = {\n\t\tNearestFilter: NearestFilter,\n\t\tNearestMipMapNearestFilter: NearestMipMapNearestFilter,\n\t\tNearestMipMapLinearFilter: NearestMipMapLinearFilter,\n\t\tLinearFilter: LinearFilter,\n\t\tLinearMipMapNearestFilter: LinearMipMapNearestFilter,\n\t\tLinearMipMapLinearFilter: LinearMipMapLinearFilter\n\t};\n\tvar UnsignedByteType = 1009;\n\tvar ByteType = 1010;\n\tvar ShortType = 1011;\n\tvar UnsignedShortType = 1012;\n\tvar IntType = 1013;\n\tvar UnsignedIntType = 1014;\n\tvar FloatType = 1015;\n\tvar HalfFloatType = 1016;\n\tvar UnsignedShort4444Type = 1017;\n\tvar UnsignedShort5551Type = 1018;\n\tvar UnsignedShort565Type = 1019;\n\tvar UnsignedInt248Type = 1020;\n\tvar AlphaFormat = 1021;\n\tvar RGBFormat = 1022;\n\tvar RGBAFormat = 1023;\n\tvar LuminanceFormat = 1024;\n\tvar LuminanceAlphaFormat = 1025;\n\tvar RGBEFormat = RGBAFormat;\n\tvar DepthFormat = 1026;\n\tvar DepthStencilFormat = 1027;\n\tvar RGB_S3TC_DXT1_Format = 2001;\n\tvar RGBA_S3TC_DXT1_Format = 2002;\n\tvar RGBA_S3TC_DXT3_Format = 2003;\n\tvar RGBA_S3TC_DXT5_Format = 2004;\n\tvar RGB_PVRTC_4BPPV1_Format = 2100;\n\tvar RGB_PVRTC_2BPPV1_Format = 2101;\n\tvar RGBA_PVRTC_4BPPV1_Format = 2102;\n\tvar RGBA_PVRTC_2BPPV1_Format = 2103;\n\tvar RGB_ETC1_Format = 2151;\n\tvar LoopOnce = 2200;\n\tvar LoopRepeat = 2201;\n\tvar LoopPingPong = 2202;\n\tvar InterpolateDiscrete = 2300;\n\tvar InterpolateLinear = 2301;\n\tvar InterpolateSmooth = 2302;\n\tvar ZeroCurvatureEnding = 2400;\n\tvar ZeroSlopeEnding = 2401;\n\tvar WrapAroundEnding = 2402;\n\tvar TrianglesDrawMode = 0;\n\tvar TriangleStripDrawMode = 1;\n\tvar TriangleFanDrawMode = 2;\n\tvar LinearEncoding = 3000;\n\tvar sRGBEncoding = 3001;\n\tvar GammaEncoding = 3007;\n\tvar RGBEEncoding = 3002;\n\tvar LogLuvEncoding = 3003;\n\tvar RGBM7Encoding = 3004;\n\tvar RGBM16Encoding = 3005;\n\tvar RGBDEncoding = 3006;\n\tvar BasicDepthPacking = 3200;\n\tvar RGBADepthPacking = 3201;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar _Math = {\n\n\t\tDEG2RAD: Math.PI / 180,\n\t\tRAD2DEG: 180 / Math.PI,\n\n\t\tgenerateUUID: function () {\n\n\t\t\t// http://www.broofa.com/Tools/Math.uuid.htm\n\n\t\t\tvar chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' );\n\t\t\tvar uuid = new Array( 36 );\n\t\t\tvar rnd = 0, r;\n\n\t\t\treturn function generateUUID() {\n\n\t\t\t\tfor ( var i = 0; i < 36; i ++ ) {\n\n\t\t\t\t\tif ( i === 8 || i === 13 || i === 18 || i === 23 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '-';\n\n\t\t\t\t\t} else if ( i === 14 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '4';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0;\n\t\t\t\t\t\tr = rnd & 0xf;\n\t\t\t\t\t\trnd = rnd >> 4;\n\t\t\t\t\t\tuuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn uuid.join( '' );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclamp: function ( value, min, max ) {\n\n\t\t\treturn Math.max( min, Math.min( max, value ) );\n\n\t\t},\n\n\t\t// compute euclidian modulo of m % n\n\t\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\t\teuclideanModulo: function ( n, m ) {\n\n\t\t\treturn ( ( n % m ) + m ) % m;\n\n\t\t},\n\n\t\t// Linear mapping from range to range \n\n\t\tmapLinear: function ( x, a1, a2, b1, b2 ) {\n\n\t\t\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n\t\t},\n\n\t\t// https://en.wikipedia.org/wiki/Linear_interpolation\n\n\t\tlerp: function ( x, y, t ) {\n\n\t\t\treturn ( 1 - t ) * x + t * y;\n\n\t\t},\n\n\t\t// http://en.wikipedia.org/wiki/Smoothstep\n\n\t\tsmoothstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * ( 3 - 2 * x );\n\n\t\t},\n\n\t\tsmootherstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n\t\t},\n\n\t\trandom16: function () {\n\n\t\t\tconsole.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' );\n\t\t\treturn Math.random();\n\n\t\t},\n\n\t\t// Random integer from interval\n\n\t\trandInt: function ( low, high ) {\n\n\t\t\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n\t\t},\n\n\t\t// Random float from interval\n\n\t\trandFloat: function ( low, high ) {\n\n\t\t\treturn low + Math.random() * ( high - low );\n\n\t\t},\n\n\t\t// Random float from <-range/2, range/2> interval\n\n\t\trandFloatSpread: function ( range ) {\n\n\t\t\treturn range * ( 0.5 - Math.random() );\n\n\t\t},\n\n\t\tdegToRad: function ( degrees ) {\n\n\t\t\treturn degrees * _Math.DEG2RAD;\n\n\t\t},\n\n\t\tradToDeg: function ( radians ) {\n\n\t\t\treturn radians * _Math.RAD2DEG;\n\n\t\t},\n\n\t\tisPowerOfTwo: function ( value ) {\n\n\t\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t\t},\n\n\t\tnearestPowerOfTwo: function ( value ) {\n\n\t\t\treturn Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) );\n\n\t\t},\n\n\t\tnextPowerOfTwo: function ( value ) {\n\n\t\t\tvalue --;\n\t\t\tvalue |= value >> 1;\n\t\t\tvalue |= value >> 2;\n\t\t\tvalue |= value >> 4;\n\t\t\tvalue |= value >> 8;\n\t\t\tvalue |= value >> 16;\n\t\t\tvalue ++;\n\n\t\t\treturn value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author egraether / http://egraether.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tfunction Vector2( x, y ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\n\t}\n\n\tVector2.prototype = {\n\n\t\tconstructor: Vector2,\n\n\t\tisVector2: true,\n\n\t\tget width() {\n\n\t\t\treturn this.x;\n\n\t\t},\n\n\t\tset width( value ) {\n\n\t\t\tthis.x = value;\n\n\t\t},\n\n\t\tget height() {\n\n\t\t\treturn this.y;\n\n\t\t},\n\n\t\tset height( value ) {\n\n\t\t\tthis.y = value;\n\n\t\t},\n\n\t\t//\n\n\t\tset: function ( x, y ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\t\t\t\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v ) {\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector2();\n\t\t\t\t\tmax = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t\t},\n\n\t\tlengthManhattan: function() {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tangle: function () {\n\n\t\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\t\tvar angle = Math.atan2( this.y, this.x );\n\n\t\t\tif ( angle < 0 ) angle += 2 * Math.PI;\n\n\t\t\treturn angle;\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y;\n\t\t\treturn dx * dx + dy * dy;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tindex = index * attribute.itemSize + offset;\n\n\t\t\tthis.x = attribute.array[ index ];\n\t\t\tthis.y = attribute.array[ index + 1 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateAround: function ( center, angle ) {\n\n\t\t\tvar c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\t\tvar x = this.x - center.x;\n\t\t\tvar y = this.y - center.y;\n\n\t\t\tthis.x = x * c - y * s + center.x;\n\t\t\tthis.y = x * s + y * c + center.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t */\n\n\tfunction Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\tObject.defineProperty( this, 'id', { value: TextureIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.sourceFile = '';\n\n\t\tthis.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;\n\n\t\tthis.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;\n\t\tthis.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter;\n\n\t\tthis.anisotropy = anisotropy !== undefined ? anisotropy : 1;\n\n\t\tthis.format = format !== undefined ? format : RGBAFormat;\n\t\tthis.type = type !== undefined ? type : UnsignedByteType;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\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\n\t\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t\t//\n\t\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\t\tthis.encoding = encoding !== undefined ? encoding : LinearEncoding;\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t}\n\n\tTexture.DEFAULT_IMAGE = undefined;\n\tTexture.DEFAULT_MAPPING = UVMapping;\n\n\tTexture.prototype = {\n\n\t\tconstructor: Texture,\n\n\t\tisTexture: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.image = source.image;\n\t\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\t\tthis.mapping = source.mapping;\n\n\t\t\tthis.wrapS = source.wrapS;\n\t\t\tthis.wrapT = source.wrapT;\n\n\t\t\tthis.magFilter = source.magFilter;\n\t\t\tthis.minFilter = source.minFilter;\n\n\t\t\tthis.anisotropy = source.anisotropy;\n\n\t\t\tthis.format = source.format;\n\t\t\tthis.type = source.type;\n\n\t\t\tthis.offset.copy( source.offset );\n\t\t\tthis.repeat.copy( source.repeat );\n\n\t\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\t\tthis.flipY = source.flipY;\n\t\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\t\tthis.encoding = source.encoding;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tif ( meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t\t}\n\n\t\t\tfunction getDataURL( image ) {\n\n\t\t\t\tvar canvas;\n\n\t\t\t\tif ( image.toDataURL !== undefined ) {\n\n\t\t\t\t\tcanvas = image;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcanvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\t\tcanvas.width = image.width;\n\t\t\t\t\tcanvas.height = image.height;\n\n\t\t\t\t\tcanvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Texture',\n\t\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t\t},\n\n\t\t\t\tuuid: this.uuid,\n\t\t\t\tname: this.name,\n\n\t\t\t\tmapping: this.mapping,\n\n\t\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\t\tminFilter: this.minFilter,\n\t\t\t\tmagFilter: this.magFilter,\n\t\t\t\tanisotropy: this.anisotropy,\n\n\t\t\t\tflipY: this.flipY\n\t\t\t};\n\n\t\t\tif ( this.image !== undefined ) {\n\n\t\t\t\t// TODO: Move to THREE.Image\n\n\t\t\t\tvar image = this.image;\n\n\t\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\t\timage.uuid = _Math.generateUUID(); // UGH\n\n\t\t\t\t}\n\n\t\t\t\tif ( meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\t\turl: getDataURL( image )\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\toutput.image = image.uuid;\n\n\t\t\t}\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t},\n\n\t\ttransformUv: function ( uv ) {\n\n\t\t\tif ( this.mapping !== UVMapping ) return;\n\n\t\t\tuv.multiply( this.repeat );\n\t\t\tuv.add( this.offset );\n\n\t\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.flipY ) {\n\n\t\t\t\tuv.y = 1 - uv.y;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tObject.assign( Texture.prototype, EventDispatcher.prototype );\n\n\tvar count = 0;\n\tfunction TextureIdCount() { return count++; }\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector4( x, y, z, w ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\t\tthis.w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tVector4.prototype = {\n\n\t\tconstructor: Vector4,\n\n\t\tisVector4: true,\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\t\t\tthis.w = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( w ) {\n\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tcase 3: this.w = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\t\t\t\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tcase 3: return this.w;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\t\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\t\t\tthis.w += v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\t\t\tthis.w += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\t\t\tthis.w = a.w + b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\t\t\tthis.w += v.w * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\t\t\tthis.w -= v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\t\t\tthis.w -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\t\t\tthis.w = a.w - b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\t\t\t\tthis.w *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\t\t\t\tthis.w = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z, w = this.w;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tsetAxisAngleFromQuaternion: function ( q ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t\t// q is assumed to be normalized\n\n\t\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\t\tvar s = Math.sqrt( 1 - q.w * q.w );\n\n\t\t\tif ( s < 0.0001 ) {\n\n\t\t\t\t this.x = 1;\n\t\t\t\t this.y = 0;\n\t\t\t\t this.z = 0;\n\n\t\t\t} else {\n\n\t\t\t\t this.x = q.x / s;\n\t\t\t\t this.y = q.y / s;\n\t\t\t\t this.z = q.z / s;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetAxisAngleFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar angle, x, y, z,\t\t// variables for result\n\t\t\t\tepsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\t\tte = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t\t// singularity found\n\t\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t\t}\n\n\t\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\t\tangle = Math.PI;\n\n\t\t\t\tvar xx = ( m11 + 1 ) / 2;\n\t\t\t\tvar yy = ( m22 + 1 ) / 2;\n\t\t\t\tvar zz = ( m33 + 1 ) / 2;\n\t\t\t\tvar xy = ( m12 + m21 ) / 4;\n\t\t\t\tvar xz = ( m13 + m31 ) / 4;\n\t\t\t\tvar yz = ( m23 + m32 ) / 4;\n\n\t\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\t\tx = 0;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\t\ty = xy / x;\n\t\t\t\t\t\tz = xz / x;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\t\tx = xy / y;\n\t\t\t\t\t\tz = yz / y;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\t\tx = xz / z;\n\t\t\t\t\t\ty = yz / z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.set( x, y, z, angle );\n\n\t\t\t\treturn this; // return 180 deg rotation\n\n\t\t\t}\n\n\t\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\t\tvar 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\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t\t// caught by singularity test above, but I've left it in just in case\n\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\t\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\t\t\tthis.w = Math.min( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\t\t\tthis.w = Math.max( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector4();\n\t\t\t\t\tmax = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\t\t\tthis.w = Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\t\t\tthis.w = Math.ceil( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\t\t\tthis.w = Math.round( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\t\t\tthis.w = - this.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\t\t\tthis.w = array[ offset + 3 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\t\t\tarray[ offset + 3 ] = this.w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tindex = index * attribute.itemSize + offset;\n\n\t\t\tthis.x = attribute.array[ index ];\n\t\t\tthis.y = attribute.array[ index + 1 ];\n\t\t\tthis.z = attribute.array[ index + 2 ];\n\t\t\tthis.w = attribute.array[ index + 3 ];\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author szimek / https://github.com/szimek/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Marius Kintel / https://github.com/kintel\n\t */\n\n\t/*\n\t In options, we can specify:\n\t * Texture parameters for an auto-generated target texture\n\t * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n\t*/\n\tfunction WebGLRenderTarget( width, height, options ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\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\toptions = options || {};\n\n\t\tif ( options.minFilter === undefined ) options.minFilter = LinearFilter;\n\n\t\tthis.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\t\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\t\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;\n\t\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n\t}\n\n\tObject.assign( WebGLRenderTarget.prototype, EventDispatcher.prototype, {\n\n\t\tisWebGLRenderTarget: true,\n\n\t\tsetSize: function ( width, height ) {\n\n\t\t\tif ( this.width !== width || this.height !== height ) {\n\n\t\t\t\tthis.width = width;\n\t\t\t\tthis.height = height;\n\n\t\t\t\tthis.dispose();\n\n\t\t\t}\n\n\t\t\tthis.viewport.set( 0, 0, width, height );\n\t\t\tthis.scissor.set( 0, 0, width, height );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\tthis.viewport.copy( source.viewport );\n\n\t\t\tthis.texture = source.texture.clone();\n\n\t\t\tthis.depthBuffer = source.depthBuffer;\n\t\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\t\tthis.depthTexture = source.depthTexture;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com\n\t */\n\n\tfunction WebGLRenderTargetCube( width, height, options ) {\n\n\t\tWebGLRenderTarget.call( this, width, height, options );\n\n\t\tthis.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5\n\t\tthis.activeMipMapLevel = 0;\n\n\t}\n\n\tWebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype );\n\tWebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube;\n\n\tWebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true;\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Quaternion( x, y, z, w ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tQuaternion.prototype = {\n\n\t\tconstructor: Quaternion,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget w () {\n\n\t\t\treturn this._w;\n\n\t\t},\n\n\t\tset w ( value ) {\n\n\t\t\tthis._w = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._w = w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t\t},\n\n\t\tcopy: function ( quaternion ) {\n\n\t\t\tthis._x = quaternion.x;\n\t\t\tthis._y = quaternion.y;\n\t\t\tthis._z = quaternion.z;\n\t\t\tthis._w = quaternion.w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromEuler: function ( euler, update ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t\t//\tcontent/SpinCalc.m\n\n\t\t\tvar c1 = Math.cos( euler._x / 2 );\n\t\t\tvar c2 = Math.cos( euler._y / 2 );\n\t\t\tvar c3 = Math.cos( euler._z / 2 );\n\t\t\tvar s1 = Math.sin( euler._x / 2 );\n\t\t\tvar s2 = Math.sin( euler._y / 2 );\n\t\t\tvar s3 = Math.sin( euler._z / 2 );\n\n\t\t\tvar order = euler.order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\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\n\t\t\t} else if ( order === 'YXZ' ) {\n\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\n\t\t\t} else if ( order === 'ZXY' ) {\n\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\n\t\t\t} else if ( order === 'ZYX' ) {\n\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\n\t\t\t} else if ( order === 'YZX' ) {\n\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\n\t\t\t} else if ( order === 'XZY' ) {\n\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\n\t\t\t}\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tvar halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\t\tthis._x = axis.x * s;\n\t\t\tthis._y = axis.y * s;\n\t\t\tthis._z = axis.z * s;\n\t\t\tthis._w = Math.cos( halfAngle );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\t\ttrace = m11 + m22 + m33,\n\t\t\t\ts;\n\n\t\t\tif ( trace > 0 ) {\n\n\t\t\t\ts = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\t\tthis._w = 0.25 / s;\n\t\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\t\tthis._x = 0.25 * s;\n\t\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t\t} else if ( m22 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\t\tthis._y = 0.25 * s;\n\t\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t\t} else {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\t\tthis._z = 0.25 * s;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromUnitVectors: function () {\n\n\t\t\t// http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n\n\t\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\t\tvar v1, r;\n\n\t\t\tvar EPS = 0.000001;\n\n\t\t\treturn function setFromUnitVectors( vFrom, vTo ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tr = vFrom.dot( vTo ) + 1;\n\n\t\t\t\tif ( r < EPS ) {\n\n\t\t\t\t\tr = 0;\n\n\t\t\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\t\t\tv1.set( - vFrom.y, vFrom.x, 0 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv1.set( 0, - vFrom.z, vFrom.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv1.crossVectors( vFrom, vTo );\n\n\t\t\t\t}\n\n\t\t\t\tthis._x = v1.x;\n\t\t\t\tthis._y = v1.y;\n\t\t\t\tthis._z = v1.z;\n\t\t\t\tthis._w = r;\n\n\t\t\t\treturn this.normalize();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tinverse: function () {\n\n\t\t\treturn this.conjugate().normalize();\n\n\t\t},\n\n\t\tconjugate: function () {\n\n\t\t\tthis._x *= - 1;\n\t\t\tthis._y *= - 1;\n\t\t\tthis._z *= - 1;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tvar l = this.length();\n\n\t\t\tif ( l === 0 ) {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = 0;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = 1;\n\n\t\t\t} else {\n\n\t\t\t\tl = 1 / l;\n\n\t\t\t\tthis._x = this._x * l;\n\t\t\t\tthis._y = this._y * l;\n\t\t\t\tthis._z = this._z * l;\n\t\t\t\tthis._w = this._w * l;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( q, p ) {\n\n\t\t\tif ( p !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyQuaternions( this, q );\n\n\t\t},\n\n\t\tpremultiply: function ( q ) {\n\n\t\t\treturn this.multiplyQuaternions( q, this );\n\n\t\t},\n\n\t\tmultiplyQuaternions: function ( a, b ) {\n\n\t\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\t\tvar qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\t\tvar qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tslerp: function ( qb, t ) {\n\n\t\t\tif ( t === 0 ) return this;\n\t\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\t\tvar x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\t\tvar cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\t\tthis._w = - qb._w;\n\t\t\t\tthis._x = - qb._x;\n\t\t\t\tthis._y = - qb._y;\n\t\t\t\tthis._z = - qb._z;\n\n\t\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t\t} else {\n\n\t\t\t\tthis.copy( qb );\n\n\t\t\t}\n\n\t\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\t\tthis._w = w;\n\t\t\t\tthis._x = x;\n\t\t\t\tthis._y = y;\n\t\t\t\tthis._z = z;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n\t\t\tif ( Math.abs( sinHalfTheta ) < 0.001 ) {\n\n\t\t\t\tthis._w = 0.5 * ( w + this._w );\n\t\t\t\tthis._x = 0.5 * ( x + this._x );\n\t\t\t\tthis._y = 0.5 * ( y + this._y );\n\t\t\t\tthis._z = 0.5 * ( z + this._z );\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\t\tvar ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( quaternion ) {\n\n\t\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis._x = array[ offset ];\n\t\t\tthis._y = array[ offset + 1 ];\n\t\t\tthis._z = array[ offset + 2 ];\n\t\t\tthis._w = array[ offset + 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\tObject.assign( Quaternion, {\n\n\t\tslerp: function( qa, qb, qm, t ) {\n\n\t\t\treturn qm.copy( qa ).slerp( qb, t );\n\n\t\t},\n\n\t\tslerpFlat: function(\n\t\t\t\tdst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\t\tvar x0 = src0[ srcOffset0 + 0 ],\n\t\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\t\tw0 = src0[ srcOffset0 + 3 ],\n\n\t\t\t\tx1 = src1[ srcOffset1 + 0 ],\n\t\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\t\tvar s = 1 - t,\n\n\t\t\t\t\tcos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\n\t\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\t\tvar sin = Math.sqrt( sqrSin ),\n\t\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t\t}\n\n\t\t\t\tvar tDir = t * dir;\n\n\t\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t\t// Normalize in case we just did a lerp:\n\t\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\t\tvar f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\t\tx0 *= f;\n\t\t\t\t\ty0 *= f;\n\t\t\t\t\tz0 *= f;\n\t\t\t\t\tw0 *= f;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdst[ dstOffset ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author *kile / http://kile.stravaganza.org/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector3( x, y, z ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\n\t}\n\n\tVector3.prototype = {\n\n\t\tconstructor: Vector3,\n\n\t\tisVector3: true,\n\n\t\tset: function ( x, y, z ) {\n\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\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\t\t\t\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\t\t\tthis.z *= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x * b.x;\n\t\t\tthis.y = a.y * b.y;\n\t\t\tthis.z = a.z * b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyEuler: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyEuler( euler ) {\n\n\t\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromEuler( euler ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyAxisAngle: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyAxisAngle( axis, angle ) {\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix3: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 affine matrix\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ];\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ];\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyProjection: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 projection matrix\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\t\t\tvar d = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); // perspective divide\n\n\t\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * d;\n\t\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * d;\n\t\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * d;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyQuaternion: function ( q ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t\t// calculate quat * vector\n\n\t\t\tvar ix = qw * x + qy * z - qz * y;\n\t\t\tvar iy = qw * y + qz * x - qx * z;\n\t\t\tvar iz = qw * z + qx * y - qy * x;\n\t\t\tvar iw = - qx * x - qy * y - qz * z;\n\n\t\t\t// calculate result * inverse quat\n\n\t\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function project( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );\n\t\t\t\treturn this.applyProjection( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tunproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function unproject( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );\n\t\t\t\treturn this.applyProjection( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttransformDirection: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 affine matrix\n\t\t\t// vector interpreted as a direction\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\t\treturn this.normalize();\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\t\t\tthis.z /= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector3();\n\t\t\t\t\tmax = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tcross: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\t\treturn this.crossVectors( v, w );\n\n\t\t\t}\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\n\t\t\tthis.x = y * v.z - z * v.y;\n\t\t\tthis.y = z * v.x - x * v.z;\n\t\t\tthis.z = x * v.y - y * v.x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossVectors: function ( a, b ) {\n\n\t\t\tvar ax = a.x, ay = a.y, az = a.z;\n\t\t\tvar bx = b.x, by = b.y, bz = b.z;\n\n\t\t\tthis.x = ay * bz - az * by;\n\t\t\tthis.y = az * bx - ax * bz;\n\t\t\tthis.z = ax * by - ay * bx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tprojectOnVector: function ( vector ) {\n\n\t\t\tvar scalar = vector.dot( this ) / vector.lengthSq();\n\n\t\t\treturn this.copy( vector ).multiplyScalar( scalar );\n\n\t\t},\n\n\t\tprojectOnPlane: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function projectOnPlane( planeNormal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tv1.copy( this ).projectOnVector( planeNormal );\n\n\t\t\t\treturn this.sub( v1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\treflect: function () {\n\n\t\t\t// reflect incident vector off plane orthogonal to normal\n\t\t\t// normal is assumed to have unit length\n\n\t\t\tvar v1;\n\n\t\t\treturn function reflect( normal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\treturn this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tangleTo: function ( v ) {\n\n\t\t\tvar theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );\n\n\t\t\t// clamp, to handle numerical problems\n\n\t\t\treturn Math.acos( _Math.clamp( theta, - 1, 1 ) );\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t\t},\n\n\t\tsetFromSpherical: function( s ) {\n\n\t\t\tvar sinPhiRadius = Math.sin( s.phi ) * s.radius;\n\n\t\t\tthis.x = sinPhiRadius * Math.sin( s.theta );\n\t\t\tthis.y = Math.cos( s.phi ) * s.radius;\n\t\t\tthis.z = sinPhiRadius * Math.cos( s.theta );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixPosition: function ( m ) {\n\n\t\t\treturn this.setFromMatrixColumn( m, 3 );\n\n\t\t},\n\n\t\tsetFromMatrixScale: function ( m ) {\n\n\t\t\tvar sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\t\tvar sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\t\tvar sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\tthis.x = sx;\n\t\t\tthis.y = sy;\n\t\t\tthis.z = sz;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixColumn: function ( m, index ) {\n\n\t\t\tif ( typeof m === 'number' ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: setFromMatrixColumn now expects ( matrix, index ).' );\n\t\t\t\tvar temp = m;\n\t\t\t\tm = index;\n\t\t\t\tindex = temp;\n\n\t\t\t}\n\n\t\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tindex = index * attribute.itemSize + offset;\n\n\t\t\tthis.x = attribute.array[ index ];\n\t\t\tthis.y = attribute.array[ index + 1 ];\n\t\t\tthis.z = attribute.array[ index + 2 ];\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author jordi_ros / http://plattsoft.com\n\t * @author D1plo1d / http://github.com/D1plo1d\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author timknip / http://www.floorplanner.com/\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Matrix4() {\n\n\t\tthis.elements = new Float32Array( [\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 ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix4.prototype = {\n\n\t\tconstructor: Matrix4,\n\n\t\tisMatrix4: true,\n\n\t\tset: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, 1, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new Matrix4().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tthis.elements.set( m.elements );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyPosition: function ( m ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = m.elements;\n\n\t\t\tte[ 12 ] = me[ 12 ];\n\t\t\tte[ 13 ] = me[ 13 ];\n\t\t\tte[ 14 ] = me[ 14 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\tthis.set(\n\t\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractRotation: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function extractRotation( m ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tvar te = this.elements;\n\t\t\t\tvar me = m.elements;\n\n\t\t\t\tvar scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length();\n\t\t\t\tvar scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length();\n\t\t\t\tvar scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\t\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\t\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\n\t\t\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\t\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\t\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\n\t\t\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\t\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\t\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakeRotationFromEuler: function ( euler ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = euler.x, y = euler.y, z = euler.z;\n\t\t\tvar a = Math.cos( x ), b = Math.sin( x );\n\t\t\tvar c = Math.cos( y ), d = Math.sin( y );\n\t\t\tvar e = Math.cos( z ), f = Math.sin( z );\n\n\t\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - c * f;\n\t\t\t\tte[ 8 ] = d;\n\n\t\t\t\tte[ 1 ] = af + be * d;\n\t\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\t\tte[ 9 ] = - b * c;\n\n\t\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\t\tte[ 6 ] = be + af * d;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce + df * b;\n\t\t\t\tte[ 4 ] = de * b - cf;\n\t\t\t\tte[ 8 ] = a * d;\n\n\t\t\t\tte[ 1 ] = a * f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b;\n\n\t\t\t\tte[ 2 ] = cf * b - de;\n\t\t\t\tte[ 6 ] = df + ce * b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce - df * b;\n\t\t\t\tte[ 4 ] = - a * f;\n\t\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\t\tte[ 1 ] = cf + de * b;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\t\tte[ 2 ] = - a * d;\n\t\t\t\tte[ 6 ] = b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = be * d - af;\n\t\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\t\tte[ 1 ] = c * f;\n\t\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\t\tte[ 2 ] = - d;\n\t\t\t\tte[ 6 ] = b * c;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\t\tte[ 1 ] = f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b * e;\n\n\t\t\t\tte[ 2 ] = - d * e;\n\t\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - f;\n\t\t\t\tte[ 8 ] = d * e;\n\n\t\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\t\tte[ 6 ] = b * e;\n\t\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t\t}\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationFromQuaternion: function ( q ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = q.x, y = q.y, z = q.z, w = q.w;\n\t\t\tvar x2 = x + x, y2 = y + y, z2 = z + z;\n\t\t\tvar xx = x * x2, xy = x * y2, xz = x * z2;\n\t\t\tvar yy = y * y2, yz = y * z2, zz = z * z2;\n\t\t\tvar wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\t\tte[ 0 ] = 1 - ( yy + zz );\n\t\t\tte[ 4 ] = xy - wz;\n\t\t\tte[ 8 ] = xz + wy;\n\n\t\t\tte[ 1 ] = xy + wz;\n\t\t\tte[ 5 ] = 1 - ( xx + zz );\n\t\t\tte[ 9 ] = yz - wx;\n\n\t\t\tte[ 2 ] = xz - wy;\n\t\t\tte[ 6 ] = yz + wx;\n\t\t\tte[ 10 ] = 1 - ( xx + yy );\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlookAt: function () {\n\n\t\t\tvar x, y, z;\n\n\t\t\treturn function lookAt( eye, target, up ) {\n\n\t\t\t\tif ( x === undefined ) {\n\n\t\t\t\t\tx = new Vector3();\n\t\t\t\t\ty = new Vector3();\n\t\t\t\t\tz = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tz.subVectors( eye, target ).normalize();\n\n\t\t\t\tif ( z.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z = 1;\n\n\t\t\t\t}\n\n\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\tif ( x.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z += 0.0001;\n\t\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\ty.crossVectors( z, x );\n\n\n\t\t\t\tte[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;\n\t\t\t\tte[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;\n\t\t\t\tte[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiply: function ( m, n ) {\n\n\t\t\tif ( n !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyMatrices( this, m );\n\n\t\t},\n\n\t\tpremultiply: function ( m ) {\n\n\t\t\treturn this.multiplyMatrices( m, this );\n\n\t\t},\n\n\t\tmultiplyMatrices: function ( a, b ) {\n\n\t\t\tvar ae = a.elements;\n\t\t\tvar be = b.elements;\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\t\tvar a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\t\tvar a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\t\tvar a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\t\tvar b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\t\tvar b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\t\tvar b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\t\tvar b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyToArray: function ( a, b, r ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tthis.multiplyMatrices( a, b );\n\n\t\t\tr[ 0 ] = te[ 0 ]; r[ 1 ] = te[ 1 ]; r[ 2 ] = te[ 2 ]; r[ 3 ] = te[ 3 ];\n\t\t\tr[ 4 ] = te[ 4 ]; r[ 5 ] = te[ 5 ]; r[ 6 ] = te[ 6 ]; r[ 7 ] = te[ 7 ];\n\t\t\tr[ 8 ] = te[ 8 ]; r[ 9 ] = te[ 9 ]; r[ 10 ] = te[ 10 ]; r[ 11 ] = te[ 11 ];\n\t\t\tr[ 12 ] = te[ 12 ]; r[ 13 ] = te[ 13 ]; r[ 14 ] = te[ 14 ]; r[ 15 ] = te[ 15 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToVector3Array: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToVector3Array( array, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = array.length;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i += 3, j += 3 ) {\n\n\t\t\t\t\tv1.fromArray( array, j );\n\t\t\t\t\tv1.applyMatrix4( this );\n\t\t\t\t\tv1.toArray( array, j );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyToBuffer: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBuffer( buffer, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = buffer.length / buffer.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i ++, j ++ ) {\n\n\t\t\t\t\tv1.x = buffer.getX( j );\n\t\t\t\t\tv1.y = buffer.getY( j );\n\t\t\t\t\tv1.z = buffer.getZ( j );\n\n\t\t\t\t\tv1.applyMatrix4( this );\n\n\t\t\t\t\tbuffer.setXYZ( j, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn buffer;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\t\tvar n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\t\tvar n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\t\tvar n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t\t//TODO: make this more efficient\n\t\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\t\treturn (\n\t\t\t\tn41 * (\n\t\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t\t - n13 * n24 * n32\n\t\t\t\t\t - n14 * n22 * n33\n\t\t\t\t\t + n12 * n24 * n33\n\t\t\t\t\t + n13 * n22 * n34\n\t\t\t\t\t - n12 * n23 * n34\n\t\t\t\t) +\n\t\t\t\tn42 * (\n\t\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t\t - n11 * n24 * n33\n\t\t\t\t\t + n14 * n21 * n33\n\t\t\t\t\t - n13 * n21 * n34\n\t\t\t\t\t + n13 * n24 * n31\n\t\t\t\t\t - n14 * n23 * n31\n\t\t\t\t) +\n\t\t\t\tn43 * (\n\t\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t\t - n11 * n22 * n34\n\t\t\t\t\t - n14 * n21 * n32\n\t\t\t\t\t + n12 * n21 * n34\n\t\t\t\t\t + n14 * n22 * n31\n\t\t\t\t\t - n12 * n24 * n31\n\t\t\t\t) +\n\t\t\t\tn44 * (\n\t\t\t\t\t- n13 * n22 * n31\n\t\t\t\t\t - n11 * n23 * n32\n\t\t\t\t\t + n11 * n22 * n33\n\t\t\t\t\t + n13 * n21 * n32\n\t\t\t\t\t - n12 * n21 * n33\n\t\t\t\t\t + n12 * n23 * n31\n\t\t\t\t)\n\n\t\t\t);\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar tmp;\n\n\t\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset is deprecated \" +\n\t\t\t\t\t\"- just use .toArray instead.\" );\n\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\n\t\tgetPosition: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function getPosition() {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\n\n\t\t\t\treturn v1.setFromMatrixColumn( this, 3 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetPosition: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 12 ] = v.x;\n\t\t\tte[ 13 ] = v.y;\n\t\t\tte[ 14 ] = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetInverse: function ( m, throwOnDegenerate ) {\n\n\t\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\t\tvar te = this.elements,\n\t\t\t\tme = m.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],\n\t\t\t\tn12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],\n\t\t\t\tn13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],\n\t\t\t\tn14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],\n\n\t\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\t\tvar det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\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\t\tte[ 4 ] = t12 * detInv;\n\t\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\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\t\tte[ 8 ] = t13 * detInv;\n\t\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\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\t\tte[ 12 ] = t14 * detInv;\n\t\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\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\t\treturn this;\n\n\t\t},\n\n\t\tscale: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = v.x, y = v.y, z = v.z;\n\n\t\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetMaxScaleOnAxis: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\t\tvar scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\t\tvar scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t\t},\n\n\t\tmakeTranslation: function ( x, y, z ) {\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\treturn this;\n\n\t\t},\n\n\t\tmakeRotationX: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, c, - s, 0,\n\t\t\t\t0, s, c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationY: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t c, 0, s, 0,\n\t\t\t\t 0, 1, 0, 0,\n\t\t\t\t- s, 0, c, 0,\n\t\t\t\t 0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationZ: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\tc, - s, 0, 0,\n\t\t\t\ts, c, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationAxis: function ( axis, angle ) {\n\n\t\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\t\tvar c = Math.cos( angle );\n\t\t\tvar s = Math.sin( angle );\n\t\t\tvar t = 1 - c;\n\t\t\tvar x = axis.x, y = axis.y, z = axis.z;\n\t\t\tvar tx = t * x, ty = t * y;\n\n\t\t\tthis.set(\n\n\t\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\t return this;\n\n\t\t},\n\n\t\tmakeScale: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\tx, 0, 0, 0,\n\t\t\t\t0, y, 0, 0,\n\t\t\t\t0, 0, z, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcompose: function ( position, quaternion, scale ) {\n\n\t\t\tthis.makeRotationFromQuaternion( quaternion );\n\t\t\tthis.scale( scale );\n\t\t\tthis.setPosition( position );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdecompose: function () {\n\n\t\t\tvar vector, matrix;\n\n\t\t\treturn function decompose( position, quaternion, scale ) {\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tvector = new Vector3();\n\t\t\t\t\tmatrix = new Matrix4();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tvar sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\t\t\tvar sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\t\t\tvar sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t\t\t// if determine is negative, we need to invert one scale\n\t\t\t\tvar det = this.determinant();\n\t\t\t\tif ( det < 0 ) {\n\n\t\t\t\t\tsx = - sx;\n\n\t\t\t\t}\n\n\t\t\t\tposition.x = te[ 12 ];\n\t\t\t\tposition.y = te[ 13 ];\n\t\t\t\tposition.z = te[ 14 ];\n\n\t\t\t\t// scale the rotation part\n\n\t\t\t\tmatrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy()\n\n\t\t\t\tvar invSX = 1 / sx;\n\t\t\t\tvar invSY = 1 / sy;\n\t\t\t\tvar invSZ = 1 / sz;\n\n\t\t\t\tmatrix.elements[ 0 ] *= invSX;\n\t\t\t\tmatrix.elements[ 1 ] *= invSX;\n\t\t\t\tmatrix.elements[ 2 ] *= invSX;\n\n\t\t\t\tmatrix.elements[ 4 ] *= invSY;\n\t\t\t\tmatrix.elements[ 5 ] *= invSY;\n\t\t\t\tmatrix.elements[ 6 ] *= invSY;\n\n\t\t\t\tmatrix.elements[ 8 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 9 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 10 ] *= invSZ;\n\n\t\t\t\tquaternion.setFromRotationMatrix( matrix );\n\n\t\t\t\tscale.x = sx;\n\t\t\t\tscale.y = sy;\n\t\t\t\tscale.z = sz;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakeFrustum: function ( left, right, bottom, top, near, far ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = 2 * near / ( right - left );\n\t\t\tvar y = 2 * near / ( top - bottom );\n\n\t\t\tvar a = ( right + left ) / ( right - left );\n\t\t\tvar b = ( top + bottom ) / ( top - bottom );\n\t\t\tvar c = - ( far + near ) / ( far - near );\n\t\t\tvar d = - 2 * far * near / ( far - near );\n\n\t\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakePerspective: function ( fov, aspect, near, far ) {\n\n\t\t\tvar ymax = near * Math.tan( _Math.DEG2RAD * fov * 0.5 );\n\t\t\tvar ymin = - ymax;\n\t\t\tvar xmin = ymin * aspect;\n\t\t\tvar xmax = ymax * aspect;\n\n\t\t\treturn this.makeFrustum( xmin, xmax, ymin, ymax, near, far );\n\n\t\t},\n\n\t\tmakeOrthographic: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar w = 1.0 / ( right - left );\n\t\t\tvar h = 1.0 / ( top - bottom );\n\t\t\tvar p = 1.0 / ( far - near );\n\n\t\t\tvar x = ( right + left ) * w;\n\t\t\tvar y = ( top + bottom ) * h;\n\t\t\tvar z = ( far + near ) * p;\n\n\t\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( matrix ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = matrix.elements;\n\n\t\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tTexture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tCubeTexture.prototype = Object.create( Texture.prototype );\n\tCubeTexture.prototype.constructor = CubeTexture;\n\n\tCubeTexture.prototype.isCubeTexture = true;\n\n\tObject.defineProperty( CubeTexture.prototype, 'images', {\n\n\t\tget: function () {\n\n\t\t\treturn this.image;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.image = value;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t *\n\t * Uniforms of a program.\n\t * Those form a tree structure with a special top-level container for the root,\n\t * which you get by calling 'new WebGLUniforms( gl, program, renderer )'.\n\t *\n\t *\n\t * Properties of inner nodes including the top-level container:\n\t *\n\t * .seq - array of nested uniforms\n\t * .map - nested uniforms by name\n\t *\n\t *\n\t * Methods of all nodes except the top-level container:\n\t *\n\t * .setValue( gl, value, [renderer] )\n\t *\n\t * \t\tuploads a uniform value(s)\n\t * \tthe 'renderer' parameter is needed for sampler uniforms\n\t *\n\t *\n\t * Static methods of the top-level container (renderer factorizations):\n\t *\n\t * .upload( gl, seq, values, renderer )\n\t *\n\t * \t\tsets uniforms in 'seq' to 'values[id].value'\n\t *\n\t * .seqWithValue( seq, values ) : filteredSeq\n\t *\n\t * \t\tfilters 'seq' entries with corresponding entry in values\n\t *\n\t *\n\t * Methods of the top-level container (renderer factorizations):\n\t *\n\t * .setValue( gl, name, value )\n\t *\n\t * \t\tsets uniform with name 'name' to 'value'\n\t *\n\t * .set( gl, obj, prop )\n\t *\n\t * \t\tsets uniform from object and property with same name than uniform\n\t *\n\t * .setOptional( gl, obj, prop )\n\t *\n\t * \t\tlike .set for an optional property of the object\n\t *\n\t */\n\n\tvar emptyTexture = new Texture();\n\tvar emptyCubeTexture = new CubeTexture();\n\n\t// --- Base for inner nodes (including the root) ---\n\n\tfunction UniformContainer() {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\t// --- Utilities ---\n\n\t// Array Caches (provide typed arrays for temporary by size)\n\n\tvar arrayCacheF32 = [];\n\tvar arrayCacheI32 = [];\n\n\t// Flattening for arrays of vectors and matrices\n\n\tfunction flatten( array, nBlocks, blockSize ) {\n\n\t\tvar firstElem = array[ 0 ];\n\n\t\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t\t// unoptimized: ! isNaN( firstElem )\n\t\t// see http://jacksondunstan.com/articles/983\n\n\t\tvar n = nBlocks * blockSize,\n\t\t\tr = arrayCacheF32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Float32Array( n );\n\t\t\tarrayCacheF32[ n ] = r;\n\n\t\t}\n\n\t\tif ( nBlocks !== 0 ) {\n\n\t\t\tfirstElem.toArray( r, 0 );\n\n\t\t\tfor ( var i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\t\toffset += blockSize;\n\t\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n\t// Texture unit allocation\n\n\tfunction allocTexUnits( renderer, n ) {\n\n\t\tvar r = arrayCacheI32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Int32Array( n );\n\t\t\tarrayCacheI32[ n ] = r;\n\n\t\t}\n\n\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\tr[ i ] = renderer.allocTextureUnit();\n\n\t\treturn r;\n\n\t}\n\n\t// --- Setters ---\n\n\t// Note: Defining these methods externally, because they come in a bunch\n\t// and this way their names minify.\n\n\t// Single scalar\n\n\tfunction setValue1f( gl, v ) { gl.uniform1f( this.addr, v ); }\n\tfunction setValue1i( gl, v ) { gl.uniform1i( this.addr, v ); }\n\n\t// Single float vector (from flat array or THREE.VectorN)\n\n\tfunction setValue2fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform2fv( this.addr, v );\n\t\telse gl.uniform2f( this.addr, v.x, v.y );\n\n\t}\n\n\tfunction setValue3fv( gl, v ) {\n\n\t\tif ( v.x !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\t\telse if ( v.r !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\t\telse\n\t\t\tgl.uniform3fv( this.addr, v );\n\n\t}\n\n\tfunction setValue4fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform4fv( this.addr, v );\n\t\telse gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t}\n\n\t// Single matrix (from flat array or MatrixN)\n\n\tfunction setValue2fm( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue3fm( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue4fm( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v.elements || v );\n\n\t}\n\n\t// Single texture (2D / Cube)\n\n\tfunction setValueT1( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTexture2D( v || emptyTexture, unit );\n\n\t}\n\n\tfunction setValueT6( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTextureCube( v || emptyCubeTexture, unit );\n\n\t}\n\n\t// Integer / Boolean vectors or arrays thereof (always flat arrays)\n\n\tfunction setValue2iv( gl, v ) { gl.uniform2iv( this.addr, v ); }\n\tfunction setValue3iv( gl, v ) { gl.uniform3iv( this.addr, v ); }\n\tfunction setValue4iv( gl, v ) { gl.uniform4iv( this.addr, v ); }\n\n\t// Helper to pick the right setter for the singular case\n\n\tfunction getSingularSetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1f; // FLOAT\n\t\t\tcase 0x8b50: return setValue2fv; // _VEC2\n\t\t\tcase 0x8b51: return setValue3fv; // _VEC3\n\t\t\tcase 0x8b52: return setValue4fv; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValue2fm; // _MAT2\n\t\t\tcase 0x8b5b: return setValue3fm; // _MAT3\n\t\t\tcase 0x8b5c: return setValue4fm; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1i; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// Array of scalars\n\n\tfunction setValue1fv( gl, v ) { gl.uniform1fv( this.addr, v ); }\n\tfunction setValue1iv( gl, v ) { gl.uniform1iv( this.addr, v ); }\n\n\t// Array of vectors (flat or from THREE classes)\n\n\tfunction setValueV2a( gl, v ) {\n\n\t\tgl.uniform2fv( this.addr, flatten( v, this.size, 2 ) );\n\n\t}\n\n\tfunction setValueV3a( gl, v ) {\n\n\t\tgl.uniform3fv( this.addr, flatten( v, this.size, 3 ) );\n\n\t}\n\n\tfunction setValueV4a( gl, v ) {\n\n\t\tgl.uniform4fv( this.addr, flatten( v, this.size, 4 ) );\n\n\t}\n\n\t// Array of matrices (flat or from THREE clases)\n\n\tfunction setValueM2a( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) );\n\n\t}\n\n\tfunction setValueM3a( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) );\n\n\t}\n\n\tfunction setValueM4a( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) );\n\n\t}\n\n\t// Array of textures (2D / Cube)\n\n\tfunction setValueT1a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\tfunction setValueT6a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\t// Helper to pick the right setter for a pure (bottom-level) array\n\n\tfunction getPureArraySetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1fv; // FLOAT\n\t\t\tcase 0x8b50: return setValueV2a; // _VEC2\n\t\t\tcase 0x8b51: return setValueV3a; // _VEC3\n\t\t\tcase 0x8b52: return setValueV4a; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValueM2a; // _MAT2\n\t\t\tcase 0x8b5b: return setValueM3a; // _MAT3\n\t\t\tcase 0x8b5c: return setValueM4a; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1a; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6a; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// --- Uniform Classes ---\n\n\tfunction SingleUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\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\tfunction StructuredUniform( id ) {\n\n\t\tthis.id = id;\n\n\t\tUniformContainer.call( this ); // mix-in\n\n\t}\n\n\tStructuredUniform.prototype.setValue = function( gl, value ) {\n\n\t\t// Note: Don't need an extra 'renderer' parameter, since samplers\n\t\t// are not allowed in structured uniforms.\n\n\t\tvar seq = this.seq;\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ] );\n\n\t\t}\n\n\t};\n\n\t// --- Top-level ---\n\n\t// Parser - builds up the property tree from the path strings\n\n\tvar RePathPart = /([\\w\\d_]+)(\\])?(\\[|\\.)?/g;\n\n\t// extracts\n\t// \t- the identifier (member name or array index)\n\t// - followed by an optional right bracket (found when array index)\n\t// - followed by an optional left bracket or dot (type of subscript)\n\t//\n\t// Note: These portions can be read in a non-overlapping fashion and\n\t// allow straightforward parsing of the hierarchy that WebGL encodes\n\t// in the uniform names.\n\n\tfunction addUniform( container, uniformObject ) {\n\n\t\tcontainer.seq.push( uniformObject );\n\t\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n\t}\n\n\tfunction parseUniform( activeInfo, addr, container ) {\n\n\t\tvar path = activeInfo.name,\n\t\t\tpathLength = path.length;\n\n\t\t// reset RegExp object, because of the early exit of a previous run\n\t\tRePathPart.lastIndex = 0;\n\n\t\tfor (; ;) {\n\n\t\t\tvar match = RePathPart.exec( path ),\n\t\t\t\tmatchEnd = RePathPart.lastIndex,\n\n\t\t\t\tid = match[ 1 ],\n\t\t\t\tidIsIndex = match[ 2 ] === ']',\n\t\t\t\tsubscript = match[ 3 ];\n\n\t\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\t\tif ( subscript === undefined ||\n\t\t\t\t\tsubscript === '[' && matchEnd + 2 === pathLength ) {\n\t\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\t\tbreak;\n\n\t\t\t} else {\n\t\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\t\tvar map = container.map,\n\t\t\t\t\tnext = map[ id ];\n\n\t\t\t\tif ( next === undefined ) {\n\n\t\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\t\taddUniform( container, next );\n\n\t\t\t\t}\n\n\t\t\t\tcontainer = next;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Root Container\n\n\tfunction WebGLUniforms( gl, program, renderer ) {\n\n\t\tUniformContainer.call( this );\n\n\t\tthis.renderer = renderer;\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\tvar info = gl.getActiveUniform( program, i ),\n\t\t\t\tpath = info.name,\n\t\t\t\taddr = gl.getUniformLocation( program, path );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tWebGLUniforms.prototype.setValue = function( gl, name, value ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.set = function( gl, object, name ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, object[ name ], this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.setOptional = function( gl, object, name ) {\n\n\t\tvar v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t};\n\n\n\t// Static interface\n\n\tWebGLUniforms.upload = function( gl, seq, values, renderer ) {\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\n\t\t\t\tu.setValue( gl, v.value, renderer );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tWebGLUniforms.seqWithValue = function( seq, values ) {\n\n\t\tvar r = [];\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar 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\t/**\n\t * Uniform Utilities\n\t */\n\n\tvar UniformsUtils = {\n\n\t\tmerge: function ( uniforms ) {\n\n\t\t\tvar merged = {};\n\n\t\t\tfor ( var u = 0; u < uniforms.length; u ++ ) {\n\n\t\t\t\tvar tmp = this.clone( uniforms[ u ] );\n\n\t\t\t\tfor ( var p in tmp ) {\n\n\t\t\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn merged;\n\n\t\t},\n\n\t\tclone: function ( uniforms_src ) {\n\n\t\t\tvar uniforms_dst = {};\n\n\t\t\tfor ( var u in uniforms_src ) {\n\n\t\t\t\tuniforms_dst[ u ] = {};\n\n\t\t\t\tfor ( var p in uniforms_src[ u ] ) {\n\n\t\t\t\t\tvar parameter_src = uniforms_src[ u ][ p ];\n\n\t\t\t\t\tif ( parameter_src && ( parameter_src.isColor ||\n\t\t\t\t\t\tparameter_src.isMatrix3 || parameter_src.isMatrix4 ||\n\t\t\t\t\t\tparameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 ||\n\t\t\t\t\t\tparameter_src.isTexture ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.clone();\n\n\t\t\t\t\t} else if ( Array.isArray( parameter_src ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.slice();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn uniforms_dst;\n\n\t\t}\n\n\t};\n\n\tvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\\n\";\n\n\tvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\\n\";\n\n\tvar alphatest_fragment = \"#ifdef ALPHATEST\\n\\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\\n\";\n\n\tvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\\n\\t#endif\\n#endif\\n\";\n\n\tvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\n\tvar begin_vertex = \"\\nvec3 transformed = vec3( position );\\n\";\n\n\tvar beginnormal_vertex = \"\\nvec3 objectNormal = vec3( normal );\\n\";\n\n\tvar bsdfs = \"bool testLightInRange( const in float lightDistance, const in float cutoffDistance ) {\\n\\treturn any( bvec2( cutoffDistance == 0.0, lightDistance < cutoffDistance ) );\\n}\\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\t\\tif( decayExponent > 0.0 ) {\\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\\n\\t\\t\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\t\\t\\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t\\t\\treturn distanceFalloff * maxDistanceCutoffFactor;\\n#else\\n\\t\\t\\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\\n#endif\\n\\t\\t}\\n\\t\\treturn 1.0;\\n}\\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\\n\\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\\n\\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\\n}\\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\treturn 1.0 / ( gl * gv );\\n}\\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\tfloat D = D_GGX( alpha, dotNH );\\n\\treturn F * ( G * D );\\n}\\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\\n\\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\\n\\tvec4 r = roughness * c0 + c1;\\n\\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\\n\\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\\n\\treturn specularColor * AB.x + AB.y;\\n}\\nfloat G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n}\\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\\n\\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\\n}\\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\\n\\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\\n}\\n\";\n\n\tvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vUv );\\n\\t\\tvec2 dSTdy = dFdy( vUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\\n\\t\\tvec3 vSigmaX = dFdx( surf_pos );\\n\\t\\tvec3 vSigmaY = dFdy( surf_pos );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 );\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\\n\";\n\n\tvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\\n\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t\\t\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\\n\\t\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\tif ( clipped ) discard;\\n\\t\\n\\t#endif\\n#endif\\n\";\n\n\tvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\t\\tvarying vec3 vViewPosition;\\n\\t#endif\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\\n\";\n\n\tvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n\";\n\n\tvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n\";\n\n\tvar color_fragment = \"#ifdef USE_COLOR\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\n\tvar color_pars_fragment = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\\n\";\n\n\tvar color_pars_vertex = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\";\n\n\tvar color_vertex = \"#ifdef USE_COLOR\\n\\tvColor.xyz = color.xyz;\\n#endif\";\n\n\tvar common = \"#define PI 3.14159265359\\n#define PI2 6.28318530718\\n#define RECIPROCAL_PI 0.31830988618\\n#define RECIPROCAL_PI2 0.15915494\\n#define LOG2 1.442695\\n#define EPSILON 1e-6\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract(sin(sn) * c);\\n}\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\tfloat distance = dot( planeNormal, point - pointOnPlane );\\n\\treturn - distance * planeNormal + point;\\n}\\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn sign( dot( point - pointOnPlane, planeNormal ) );\\n}\\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\\n}\\n\";\n\n\tvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n#define cubeUV_textureSize (1024.0)\\nint getFaceFromDirection(vec3 direction) {\\n\\tvec3 absDirection = abs(direction);\\n\\tint face = -1;\\n\\tif( absDirection.x > absDirection.z ) {\\n\\t\\tif(absDirection.x > absDirection.y )\\n\\t\\t\\tface = direction.x > 0.0 ? 0 : 3;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\telse {\\n\\t\\tif(absDirection.z > absDirection.y )\\n\\t\\t\\tface = direction.z > 0.0 ? 2 : 5;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\treturn face;\\n}\\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\\n\\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\\n\\tfloat dxRoughness = dFdx(roughness);\\n\\tfloat dyRoughness = dFdy(roughness);\\n\\tvec3 dx = dFdx( vec * scale * dxRoughness );\\n\\tvec3 dy = dFdy( vec * scale * dyRoughness );\\n\\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\\n\\td = clamp(d, 1.0, cubeUV_rangeClamp);\\n\\tfloat mipLevel = 0.5 * log2(d);\\n\\treturn vec2(floor(mipLevel), fract(mipLevel));\\n}\\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\\n\\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\\n\\tfloat a = 16.0 * cubeUV_rcpTextureSize;\\n\\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\\n\\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\\n\\tfloat powScale = exp2_packed.x * exp2_packed.y;\\n\\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\\n\\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\\n\\tbool bRes = mipLevel == 0.0;\\n\\tscale = bRes && (scale < a) ? a : scale;\\n\\tvec3 r;\\n\\tvec2 offset;\\n\\tint face = getFaceFromDirection(direction);\\n\\tfloat rcpPowScale = 1.0 / powScale;\\n\\tif( face == 0) {\\n\\t\\tr = vec3(direction.x, -direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 1) {\\n\\t\\tr = vec3(direction.y, direction.x, direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 2) {\\n\\t\\tr = vec3(direction.z, direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 3) {\\n\\t\\tr = vec3(direction.x, direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse if( face == 4) {\\n\\t\\tr = vec3(direction.y, direction.x, -direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse {\\n\\t\\tr = vec3(direction.z, -direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\tr = normalize(r);\\n\\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\\n\\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\\n\\tvec2 base = offset + vec2( texelOffset );\\n\\treturn base + s * ( scale - 2.0 * texelOffset );\\n}\\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\\n\\tfloat roughnessVal = roughness* cubeUV_maxLods3;\\n\\tfloat r1 = floor(roughnessVal);\\n\\tfloat r2 = r1 + 1.0;\\n\\tfloat t = fract(roughnessVal);\\n\\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\\n\\tfloat s = mipInfo.y;\\n\\tfloat level0 = mipInfo.x;\\n\\tfloat level1 = level0 + 1.0;\\n\\tlevel1 = level1 > 5.0 ? 5.0 : level1;\\n\\tlevel0 += min( floor( s + 0.5 ), 5.0 );\\n\\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\\n\\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\\n\\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\\n\\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\\n\\tvec4 result = mix(color10, color20, t);\\n\\treturn vec4(result.rgb, 1.0);\\n}\\n#endif\\n\";\n\n\tvar defaultnormal_vertex = \"#ifdef FLIP_SIDED\\n\\tobjectNormal = -objectNormal;\\n#endif\\nvec3 transformedNormal = normalMatrix * objectNormal;\\n\";\n\n\tvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\\n\";\n\n\tvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\\n#endif\\n\";\n\n\tvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\\n\";\n\n\tvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\\n\";\n\n\tvar encodings_fragment = \" gl_FragColor = linearToOutputTexel( gl_FragColor );\\n\";\n\n\tvar encodings_pars_fragment = \"\\nvec4 LinearToLinear( in vec4 value ) {\\n return value;\\n}\\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\\n return vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\\n}\\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\\n return vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n return vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\\n}\\nvec4 RGBEToLinear( in vec4 value ) {\\n return vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n float maxComponent = max( max( value.r, value.g ), value.b );\\n float fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n return vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n return vec4( value.xyz * value.w * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n float maxRGB = max( value.x, max( value.g, value.b ) );\\n float M = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n M = ceil( M * 255.0 ) / 255.0;\\n return vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n return vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n float maxRGB = max( value.x, max( value.g, value.b ) );\\n float D = max( maxRange / maxRGB, 1.0 );\\n D = min( floor( D ) / 255.0, 1.0 );\\n return vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\\n}\\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\\nvec4 LinearToLogLuv( in vec4 value ) {\\n vec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\\n Xp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\\n vec4 vResult;\\n vResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n float Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n vResult.w = fract(Le);\\n vResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\\n return vResult;\\n}\\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\\nvec4 LogLuvToLinear( in vec4 value ) {\\n float Le = value.z * 255.0 + value.w;\\n vec3 Xp_Y_XYZp;\\n Xp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\\n Xp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n Xp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n vec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\\n return vec4( max(vRGB, 0.0), 1.0 );\\n}\\n\";\n\n\tvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\tvec2 sampleUV;\\n\\t\\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\\n\\t\\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\tvec4 envColor = texture2D( envMap, sampleUV );\\n\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\\n\\t\\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\tenvColor = envMapTexelToLinear( envColor );\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_pars_fragment = \"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\\n\\tuniform float reflectivity;\\n\\tuniform float envMapIntenstiy;\\n#endif\\n#ifdef USE_ENVMAP\\n\\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\tuniform float flipEnvMap;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\\n\";\n\n\tvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tfloat depth = gl_FragDepthEXT / gl_FragCoord.w;\\n\\t#else\\n\\t\\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\n\\t#endif\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, depth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\\n\";\n\n\tvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\n\tvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n#endif\\n\";\n\n\tvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\n\tvar lights_lambert_vertex = \"vec3 diffuse = vec3( 1.0 );\\nGeometricContext geometry;\\ngeometry.position = mvPosition.xyz;\\ngeometry.normal = normalize( transformedNormal );\\ngeometry.viewDir = normalize( -mvPosition.xyz );\\nGeometricContext backGeometry;\\nbackGeometry.position = geometry.position;\\nbackGeometry.normal = -geometry.normal;\\nbackGeometry.viewDir = geometry.viewDir;\\nvLightFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\n\\tvLightBack = vec3( 0.0 );\\n#endif\\nIncidentLight directLight;\\nfloat dotNL;\\nvec3 directLightColor_Diffuse;\\n#if NUM_POINT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_DIR_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar lights_pars = \"uniform vec3 ambientLightColor;\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treturn irradiance;\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tdirectLight.color = directionalLight.color;\\n\\t\\tdirectLight.direction = directionalLight.direction;\\n\\t\\tdirectLight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = pointLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tif ( testLightInRange( lightDistance, pointLight.distance ) ) {\\n\\t\\t\\tdirectLight.color = pointLight.color;\\n\\t\\t\\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tfloat angleCos = dot( directLight.direction, spotLight.direction );\\n\\t\\tif ( all( bvec2( angleCos > spotLight.coneCos, testLightInRange( lightDistance, spotLight.distance ) ) ) ) {\\n\\t\\t\\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\t\\tdirectLight.color = spotLight.color;\\n\\t\\t\\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\\n\\t\\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tirradiance *= PI;\\n\\t\\t#endif\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\\t\\t#include \\n\\t\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\\n\\t\\t#else\\n\\t\\t\\tvec4 envMapColor = vec4( 0.0 );\\n\\t\\t#endif\\n\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t}\\n\\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\tfloat maxMIPLevelScalar = float( maxMIPLevel );\\n\\t\\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\\n\\t\\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\\n\\t}\\n\\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\\n\\t\\t#endif\\n\\t\\t#include \\n\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\\n\\t\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\t\\tvec2 sampleUV;\\n\\t\\t\\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\\n\\t\\t\\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\t\\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#endif\\n\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t}\\n#endif\\n\";\n\n\tvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\\n\";\n\n\tvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\nstruct BlinnPhongMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tvec3\\tspecularColor;\\n\\tfloat\\tspecularShininess;\\n\\tfloat\\tspecularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\\n\";\n\n\tvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\\n#ifdef STANDARD\\n\\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.clearCoat = saturate( clearCoat );\\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\\n#endif\\n\";\n\n\tvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tfloat\\tspecularRoughness;\\n\\tvec3\\tspecularColor;\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoat;\\n\\t\\tfloat clearCoatRoughness;\\n\\t#endif\\n};\\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\\n\\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\\n}\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\\n\\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifndef STANDARD\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\tfloat dotNL = dotNV;\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\\n\";\n\n\tvar lights_template = \"\\nGeometricContext geometry;\\ngeometry.position = - vViewPosition;\\ngeometry.normal = normal;\\ngeometry.viewDir = normalize( vViewPosition );\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tlightMapIrradiance *= PI;\\n\\t\\t#endif\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t}\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t \\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\\n\\t#endif\\n\\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\\n\\t#ifndef STANDARD\\n\\t\\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\\n\\t#else\\n\\t\\tvec3 clearCoatRadiance = vec3( 0.0 );\\n\\t#endif\\n\\t\\t\\n\\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\\n#endif\\n\";\n\n\tvar logdepthbuf_fragment = \"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\\n\\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\\n#endif\";\n\n\tvar logdepthbuf_pars_fragment = \"#ifdef USE_LOGDEPTHBUF\\n\\tuniform float logDepthBufFC;\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n#endif\\n\";\n\n\tvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n\\tuniform float logDepthBufFC;\\n#endif\";\n\n\tvar logdepthbuf_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvFragDepth = 1.0 + gl_Position.w;\\n\\t#else\\n\\t\\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\\n\\t#endif\\n#endif\\n\";\n\n\tvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\ttexelColor = mapTexelToLinear( texelColor );\\n\\tdiffuseColor *= texelColor;\\n#endif\\n\";\n\n\tvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar map_particle_fragment = \"#ifdef USE_MAP\\n\\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\\n\\tdiffuseColor *= mapTexelToLinear( mapTexel );\\n#endif\\n\";\n\n\tvar map_particle_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform vec4 offsetRepeat;\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.r;\\n#endif\\n\";\n\n\tvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\n\tvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\n\\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\n\\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\n\\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\n#endif\\n\";\n\n\tvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_MORPHNORMALS\\n\\tuniform float morphTargetInfluences[ 8 ];\\n\\t#else\\n\\tuniform float morphTargetInfluences[ 4 ];\\n\\t#endif\\n#endif\";\n\n\tvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\n\\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\n\\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\n\\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n\\t#ifndef USE_MORPHNORMALS\\n\\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\n\\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\n\\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\n\\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n\\t#endif\\n#endif\\n\";\n\n\tvar normal_flip = \"#ifdef DOUBLE_SIDED\\n\\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n#else\\n\\tfloat flipNormal = 1.0;\\n#endif\\n\";\n\n\tvar normal_fragment = \"#ifdef FLAT_SHADED\\n\\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\\n\\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal ) * flipNormal;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tnormal = perturbNormal2Arb( -vViewPosition, normal );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\\n#endif\\n\";\n\n\tvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n\\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\\n\\t\\tvec3 q0 = dFdx( eye_pos.xyz );\\n\\t\\tvec3 q1 = dFdy( eye_pos.xyz );\\n\\t\\tvec2 st0 = dFdx( vUv.st );\\n\\t\\tvec2 st1 = dFdy( vUv.st );\\n\\t\\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\\n\\t\\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\\n\\t\\tvec3 N = normalize( surf_norm );\\n\\t\\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t\\tmapN.xy = normalScale * mapN.xy;\\n\\t\\tmat3 tsn = mat3( S, T, N );\\n\\t\\treturn normalize( tsn * mapN );\\n\\t}\\n#endif\\n\";\n\n\tvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n return normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n return 1.0 - 2.0 * rgb.xyz;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n return ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n return linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n return (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n return ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\\n\";\n\n\tvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\\n\";\n\n\tvar project_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 mvPosition = modelViewMatrix * skinned;\\n#else\\n\\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\\n#endif\\ngl_Position = projectionMatrix * mvPosition;\\n\";\n\n\tvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.r;\\n#endif\\n\";\n\n\tvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\n\tvar shadowmap_pars_fragment = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\\n\\t\\tconst vec2 offset = vec2( 0.0, 1.0 );\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / size;\\n\\t\\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\\n\\t\\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\\n\\t\\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\\n\\t\\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\\n\\t\\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\\n\\t\\tvec2 f = fract( uv * size + 0.5 );\\n\\t\\tfloat a = mix( lb, lt, f.y );\\n\\t\\tfloat b = mix( rb, rt, f.y );\\n\\t\\tfloat c = mix( a, b, f.x );\\n\\t\\treturn c;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\n\\t\\tbool inFrustum = all( inFrustumVec );\\n\\t\\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n\\t\\tbool frustumTest = all( frustumTestVec );\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn 1.0;\\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 ) {\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar shadowmap_pars_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n#endif\\n\";\n\n\tvar shadowmap_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n#endif\\n\";\n\n\tvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\tDirectionalLight directionalLight;\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\tSpotLight spotLight;\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\tPointLight pointLight;\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\\n\";\n\n\tvar 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\n\tvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\t#ifdef BONE_TEXTURE\\n\\t\\tuniform sampler2D boneTexture;\\n\\t\\tuniform int boneTextureWidth;\\n\\t\\tuniform int boneTextureHeight;\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tfloat j = i * 4.0;\\n\\t\\t\\tfloat x = mod( j, float( boneTextureWidth ) );\\n\\t\\t\\tfloat y = floor( j / float( boneTextureWidth ) );\\n\\t\\t\\tfloat dx = 1.0 / float( boneTextureWidth );\\n\\t\\t\\tfloat dy = 1.0 / float( boneTextureHeight );\\n\\t\\t\\ty = dy * ( y + 0.5 );\\n\\t\\t\\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n\\t\\t\\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n\\t\\t\\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n\\t\\t\\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n\\t\\t\\tmat4 bone = mat4( v1, v2, v3, v4 );\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#else\\n\\t\\tuniform mat4 boneMatrices[ MAX_BONES ];\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tmat4 bone = boneMatrices[ int(i) ];\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#endif\\n#endif\\n\";\n\n\tvar 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\\tskinned = bindMatrixInverse * skinned;\\n#endif\\n\";\n\n\tvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n#endif\\n\";\n\n\tvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\n\tvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\n\tvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\\n\";\n\n\tvar tonemapping_pars_fragment = \"#define saturate(a) clamp( a, 0.0, 1.0 )\\nuniform float toneMappingExposure;\\nuniform float toneMappingWhitePoint;\\nvec3 LinearToneMapping( vec3 color ) {\\n return toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n color *= toneMappingExposure;\\n return saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\\nvec3 Uncharted2ToneMapping( vec3 color ) {\\n color *= toneMappingExposure;\\n return saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n color *= toneMappingExposure;\\n color = max( vec3( 0.0 ), color - 0.004 );\\n return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\n\";\n\n\tvar uv_pars_fragment = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n#endif\";\n\n\tvar uv_pars_vertex = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n\\tuniform vec4 offsetRepeat;\\n#endif\\n\";\n\n\tvar uv_vertex = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\\n#endif\";\n\n\tvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = uv2;\\n#endif\";\n\n\tvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\\n\\t#ifdef USE_SKINNING\\n\\t\\tvec4 worldPosition = modelMatrix * skinned;\\n\\t#else\\n\\t\\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\\n\\t#endif\\n#endif\\n\";\n\n\tvar cube_frag = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\\n\\tgl_FragColor.a *= opacity;\\n}\\n\";\n\n\tvar cube_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar depth_frag = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\\n\\t#endif\\n}\\n\";\n\n\tvar depth_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar distanceRGBA_frag = \"uniform vec3 lightPos;\\nvarying vec4 vWorldPosition;\\n#include \\n#include \\n#include \\nvoid main () {\\n\\t#include \\n\\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\\n}\\n\";\n\n\tvar distanceRGBA_vert = \"varying vec4 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvWorldPosition = worldPosition;\\n}\\n\";\n\n\tvar equirect_frag = \"uniform sampler2D tEquirect;\\nuniform float tFlip;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvec3 direction = normalize( vWorldPosition );\\n\\tvec2 sampleUV;\\n\\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\\n\\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n}\\n\";\n\n\tvar equirect_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar linedashed_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar linedashed_vert = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvLineDistance = scale * lineDistance;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight;\\n\\treflectedLight.directDiffuse = vec3( 0.0 );\\n\\treflectedLight.directSpecular = vec3( 0.0 );\\n\\treflectedLight.indirectDiffuse = diffuseColor.rgb;\\n\\treflectedLight.indirectSpecular = vec3( 0.0 );\\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_ENVMAP\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshlambert_frag = \"uniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\\n\\t#else\\n\\t\\treflectedLight.directDiffuse = vLightFront;\\n\\t#endif\\n\\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshlambert_vert = \"#define LAMBERT\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphong_frag = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphong_vert = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphysical_frag = \"#define PHYSICAL\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifndef STANDARD\\n\\tuniform float clearCoat;\\n\\tuniform float clearCoatRoughness;\\n#endif\\nuniform float envMapIntensity;\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphysical_vert = \"#define PHYSICAL\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar normal_frag = \"uniform float opacity;\\nvarying vec3 vNormal;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( vNormal ), opacity );\\n\\t#include \\n}\\n\";\n\n\tvar normal_vert = \"varying vec3 vNormal;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvNormal = normalize( normalMatrix * normal );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar points_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar points_vert = \"uniform float size;\\nuniform float scale;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tgl_PointSize = size * ( scale / - mvPosition.z );\\n\\t#else\\n\\t\\tgl_PointSize = size;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar shadow_frag = \"uniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\\n}\\n\";\n\n\tvar shadow_vert = \"#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar ShaderChunk = {\n\t\talphamap_fragment: alphamap_fragment,\n\t\talphamap_pars_fragment: alphamap_pars_fragment,\n\t\talphatest_fragment: alphatest_fragment,\n\t\taomap_fragment: aomap_fragment,\n\t\taomap_pars_fragment: aomap_pars_fragment,\n\t\tbegin_vertex: begin_vertex,\n\t\tbeginnormal_vertex: beginnormal_vertex,\n\t\tbsdfs: bsdfs,\n\t\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\t\tclipping_planes_fragment: clipping_planes_fragment,\n\t\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\t\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\t\tclipping_planes_vertex: clipping_planes_vertex,\n\t\tcolor_fragment: color_fragment,\n\t\tcolor_pars_fragment: color_pars_fragment,\n\t\tcolor_pars_vertex: color_pars_vertex,\n\t\tcolor_vertex: color_vertex,\n\t\tcommon: common,\n\t\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\t\tdefaultnormal_vertex: defaultnormal_vertex,\n\t\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\t\tdisplacementmap_vertex: displacementmap_vertex,\n\t\temissivemap_fragment: emissivemap_fragment,\n\t\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\t\tencodings_fragment: encodings_fragment,\n\t\tencodings_pars_fragment: encodings_pars_fragment,\n\t\tenvmap_fragment: envmap_fragment,\n\t\tenvmap_pars_fragment: envmap_pars_fragment,\n\t\tenvmap_pars_vertex: envmap_pars_vertex,\n\t\tenvmap_vertex: envmap_vertex,\n\t\tfog_fragment: fog_fragment,\n\t\tfog_pars_fragment: fog_pars_fragment,\n\t\tlightmap_fragment: lightmap_fragment,\n\t\tlightmap_pars_fragment: lightmap_pars_fragment,\n\t\tlights_lambert_vertex: lights_lambert_vertex,\n\t\tlights_pars: lights_pars,\n\t\tlights_phong_fragment: lights_phong_fragment,\n\t\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\t\tlights_physical_fragment: lights_physical_fragment,\n\t\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\t\tlights_template: lights_template,\n\t\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\t\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\t\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\t\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\t\tmap_fragment: map_fragment,\n\t\tmap_pars_fragment: map_pars_fragment,\n\t\tmap_particle_fragment: map_particle_fragment,\n\t\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\t\tmetalnessmap_fragment: metalnessmap_fragment,\n\t\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\t\tmorphnormal_vertex: morphnormal_vertex,\n\t\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\t\tmorphtarget_vertex: morphtarget_vertex,\n\t\tnormal_flip: normal_flip,\n\t\tnormal_fragment: normal_fragment,\n\t\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\t\tpacking: packing,\n\t\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\t\tproject_vertex: project_vertex,\n\t\troughnessmap_fragment: roughnessmap_fragment,\n\t\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\t\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\t\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\t\tshadowmap_vertex: shadowmap_vertex,\n\t\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\t\tskinbase_vertex: skinbase_vertex,\n\t\tskinning_pars_vertex: skinning_pars_vertex,\n\t\tskinning_vertex: skinning_vertex,\n\t\tskinnormal_vertex: skinnormal_vertex,\n\t\tspecularmap_fragment: specularmap_fragment,\n\t\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\t\ttonemapping_fragment: tonemapping_fragment,\n\t\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\t\tuv_pars_fragment: uv_pars_fragment,\n\t\tuv_pars_vertex: uv_pars_vertex,\n\t\tuv_vertex: uv_vertex,\n\t\tuv2_pars_fragment: uv2_pars_fragment,\n\t\tuv2_pars_vertex: uv2_pars_vertex,\n\t\tuv2_vertex: uv2_vertex,\n\t\tworldpos_vertex: worldpos_vertex,\n\n\t\tcube_frag: cube_frag,\n\t\tcube_vert: cube_vert,\n\t\tdepth_frag: depth_frag,\n\t\tdepth_vert: depth_vert,\n\t\tdistanceRGBA_frag: distanceRGBA_frag,\n\t\tdistanceRGBA_vert: distanceRGBA_vert,\n\t\tequirect_frag: equirect_frag,\n\t\tequirect_vert: equirect_vert,\n\t\tlinedashed_frag: linedashed_frag,\n\t\tlinedashed_vert: linedashed_vert,\n\t\tmeshbasic_frag: meshbasic_frag,\n\t\tmeshbasic_vert: meshbasic_vert,\n\t\tmeshlambert_frag: meshlambert_frag,\n\t\tmeshlambert_vert: meshlambert_vert,\n\t\tmeshphong_frag: meshphong_frag,\n\t\tmeshphong_vert: meshphong_vert,\n\t\tmeshphysical_frag: meshphysical_frag,\n\t\tmeshphysical_vert: meshphysical_vert,\n\t\tnormal_frag: normal_frag,\n\t\tnormal_vert: normal_vert,\n\t\tpoints_frag: points_frag,\n\t\tpoints_vert: points_vert,\n\t\tshadow_frag: shadow_frag,\n\t\tshadow_vert: shadow_vert\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Color( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\t\t\treturn this.set( r );\n\n\t\t}\n\n\t\treturn this.setRGB( r, g, b );\n\n\t}\n\n\tColor.prototype = {\n\n\t\tconstructor: Color,\n\n\t\tisColor: true,\n\n\t\tr: 1, g: 1, b: 1,\n\n\t\tset: function ( value ) {\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\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.r = scalar;\n\t\t\tthis.g = scalar;\n\t\t\tthis.b = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHex: function ( hex ) {\n\n\t\t\thex = Math.floor( hex );\n\n\t\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetRGB: function ( r, g, b ) {\n\n\t\t\tthis.r = r;\n\t\t\tthis.g = g;\n\t\t\tthis.b = b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHSL: function () {\n\n\t\t\tfunction hue2rgb( p, q, t ) {\n\n\t\t\t\tif ( t < 0 ) t += 1;\n\t\t\t\tif ( t > 1 ) t -= 1;\n\t\t\t\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\t\t\t\tif ( t < 1 / 2 ) return q;\n\t\t\t\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\t\t\t\treturn p;\n\n\t\t\t}\n\n\t\t\treturn function setHSL( h, s, l ) {\n\n\t\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\t\t\th = _Math.euclideanModulo( h, 1 );\n\t\t\t\ts = _Math.clamp( s, 0, 1 );\n\t\t\t\tl = _Math.clamp( l, 0, 1 );\n\n\t\t\t\tif ( s === 0 ) {\n\n\t\t\t\t\tthis.r = this.g = this.b = l;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\t\t\tvar q = ( 2 * l ) - p;\n\n\t\t\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetStyle: function ( style ) {\n\n\t\t\tfunction handleAlpha( string ) {\n\n\t\t\t\tif ( string === undefined ) return;\n\n\t\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tvar m;\n\n\t\t\tif ( m = /^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t\t// rgb / hsl\n\n\t\t\t\tvar color;\n\t\t\t\tvar name = m[ 1 ];\n\t\t\t\tvar components = m[ 2 ];\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'rgb':\n\t\t\t\t\tcase 'rgba':\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'hsl':\n\t\t\t\t\tcase 'hsla':\n\n\t\t\t\t\t\tif ( color = /^([0-9]*\\.?[0-9]+)\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\t\tvar h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\t\tvar s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\t\tvar l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( m = /^\\#([A-Fa-f0-9]+)$/.exec( style ) ) {\n\n\t\t\t\t// hex color\n\n\t\t\t\tvar hex = m[ 1 ];\n\t\t\t\tvar size = hex.length;\n\n\t\t\t\tif ( size === 3 ) {\n\n\t\t\t\t\t// #ff0\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t\t// #ff0000\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( style && style.length > 0 ) {\n\n\t\t\t\t// color keywords\n\t\t\t\tvar hex = ColorKeywords[ style ];\n\n\t\t\t\tif ( hex !== undefined ) {\n\n\t\t\t\t\t// red\n\t\t\t\t\tthis.setHex( hex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// unknown color\n\t\t\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t\t},\n\n\t\tcopy: function ( color ) {\n\n\t\t\tthis.r = color.r;\n\t\t\tthis.g = color.g;\n\t\t\tthis.b = color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyGammaToLinear: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tthis.r = Math.pow( color.r, gammaFactor );\n\t\t\tthis.g = Math.pow( color.g, gammaFactor );\n\t\t\tthis.b = Math.pow( color.b, gammaFactor );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyLinearToGamma: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tvar safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;\n\n\t\t\tthis.r = Math.pow( color.r, safeInverse );\n\t\t\tthis.g = Math.pow( color.g, safeInverse );\n\t\t\tthis.b = Math.pow( color.b, safeInverse );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertGammaToLinear: function () {\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tthis.r = r * r;\n\t\t\tthis.g = g * g;\n\t\t\tthis.b = b * b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertLinearToGamma: function () {\n\n\t\t\tthis.r = Math.sqrt( this.r );\n\t\t\tthis.g = Math.sqrt( this.g );\n\t\t\tthis.b = Math.sqrt( this.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetHex: function () {\n\n\t\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t\t},\n\n\t\tgetHexString: function () {\n\n\t\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t\t},\n\n\t\tgetHSL: function ( optionalTarget ) {\n\n\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\t\tvar hsl = optionalTarget || { h: 0, s: 0, l: 0 };\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tvar max = Math.max( r, g, b );\n\t\t\tvar min = Math.min( r, g, b );\n\n\t\t\tvar hue, saturation;\n\t\t\tvar lightness = ( min + max ) / 2.0;\n\n\t\t\tif ( min === max ) {\n\n\t\t\t\thue = 0;\n\t\t\t\tsaturation = 0;\n\n\t\t\t} else {\n\n\t\t\t\tvar delta = max - min;\n\n\t\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\t\tswitch ( max ) {\n\n\t\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t\t}\n\n\t\t\t\thue /= 6;\n\n\t\t\t}\n\n\t\t\thsl.h = hue;\n\t\t\thsl.s = saturation;\n\t\t\thsl.l = lightness;\n\n\t\t\treturn hsl;\n\n\t\t},\n\n\t\tgetStyle: function () {\n\n\t\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t\t},\n\n\t\toffsetHSL: function ( h, s, l ) {\n\n\t\t\tvar hsl = this.getHSL();\n\n\t\t\thsl.h += h; hsl.s += s; hsl.l += l;\n\n\t\t\tthis.setHSL( hsl.h, hsl.s, hsl.l );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( color ) {\n\n\t\t\tthis.r += color.r;\n\t\t\tthis.g += color.g;\n\t\t\tthis.b += color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddColors: function ( color1, color2 ) {\n\n\t\t\tthis.r = color1.r + color2.r;\n\t\t\tthis.g = color1.g + color2.g;\n\t\t\tthis.b = color1.b + color2.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.r += s;\n\t\t\tthis.g += s;\n\t\t\tthis.b += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function( color ) {\n\n\t\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( color ) {\n\n\t\t\tthis.r *= color.r;\n\t\t\tthis.g *= color.g;\n\t\t\tthis.b *= color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tthis.r *= s;\n\t\t\tthis.g *= s;\n\t\t\tthis.b *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerp: function ( color, alpha ) {\n\n\t\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( c ) {\n\n\t\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.r = array[ offset ];\n\t\t\tthis.g = array[ offset + 1 ];\n\t\t\tthis.b = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.r;\n\t\t\tarray[ offset + 1 ] = this.g;\n\t\t\tarray[ offset + 2 ] = this.b;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\treturn this.getHex();\n\n\t\t}\n\n\t};\n\n\tvar 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, '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\n\t/**\n\t * Uniforms library for shared webgl shaders\n\t */\n\n\tvar UniformsLib = {\n\n\t\tcommon: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) },\n\n\t\t\tspecularMap: { value: null },\n\t\t\talphaMap: { value: null },\n\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: - 1 },\n\t\t\treflectivity: { value: 1.0 },\n\t\t\trefractionRatio: { value: 0.98 }\n\n\t\t},\n\n\t\taomap: {\n\n\t\t\taoMap: { value: null },\n\t\t\taoMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\tlightmap: {\n\n\t\t\tlightMap: { value: null },\n\t\t\tlightMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\temissivemap: {\n\n\t\t\temissiveMap: { value: null }\n\n\t\t},\n\n\t\tbumpmap: {\n\n\t\t\tbumpMap: { value: null },\n\t\t\tbumpScale: { value: 1 }\n\n\t\t},\n\n\t\tnormalmap: {\n\n\t\t\tnormalMap: { value: null },\n\t\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t\t},\n\n\t\tdisplacementmap: {\n\n\t\t\tdisplacementMap: { value: null },\n\t\t\tdisplacementScale: { value: 1 },\n\t\t\tdisplacementBias: { value: 0 }\n\n\t\t},\n\n\t\troughnessmap: {\n\n\t\t\troughnessMap: { value: null }\n\n\t\t},\n\n\t\tmetalnessmap: {\n\n\t\t\tmetalnessMap: { value: null }\n\n\t\t},\n\n\t\tfog: {\n\n\t\t\tfogDensity: { value: 0.00025 },\n\t\t\tfogNear: { value: 1 },\n\t\t\tfogFar: { value: 2000 },\n\t\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t\t},\n\n\t\tlights: {\n\n\t\t\tambientLightColor: { value: [] },\n\n\t\t\tdirectionalLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tcolor: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tdirectionalShadowMap: { value: [] },\n\t\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\t\tspotLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdirection: {},\n\t\t\t\tdistance: {},\n\t\t\t\tconeCos: {},\n\t\t\t\tpenumbraCos: {},\n\t\t\t\tdecay: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tspotShadowMap: { value: [] },\n\t\t\tspotShadowMatrix: { value: [] },\n\n\t\t\tpointLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdecay: {},\n\t\t\t\tdistance: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tpointShadowMap: { value: [] },\n\t\t\tpointShadowMatrix: { value: [] },\n\n\t\t\themisphereLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tskyColor: {},\n\t\t\t\tgroundColor: {}\n\t\t\t} }\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\t\t\tsize: { value: 1.0 },\n\t\t\tscale: { value: 1.0 },\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) }\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t */\n\n\tvar ShaderLib = {\n\n\t\tbasic: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.fog\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t\t},\n\n\t\tlambert: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\n\t\t\t\t{\n\t\t\t\t\temissive : { value: new Color( 0x000000 ) }\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t\t},\n\n\t\tphong: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\n\t\t\t\t{\n\t\t\t\t\temissive : { value: new Color( 0x000000 ) },\n\t\t\t\t\tspecular : { value: new Color( 0x111111 ) },\n\t\t\t\t\tshininess: { value: 30 }\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t\t},\n\n\t\tstandard: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.roughnessmap,\n\t\t\t\tUniformsLib.metalnessmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\n\t\t\t\t{\n\t\t\t\t\temissive : { value: new Color( 0x000000 ) },\n\t\t\t\t\troughness: { value: 0.5 },\n\t\t\t\t\tmetalness: { value: 0 },\n\t\t\t\t\tenvMapIntensity : { value: 1 }, // temporary\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.points,\n\t\t\t\tUniformsLib.fog\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.points_vert,\n\t\t\tfragmentShader: ShaderChunk.points_frag\n\n\t\t},\n\n\t\tdashed: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.fog,\n\n\t\t\t\t{\n\t\t\t\t\tscale : { value: 1 },\n\t\t\t\t\tdashSize : { value: 1 },\n\t\t\t\t\ttotalSize: { value: 2 }\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t\t},\n\n\t\tdepth: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.displacementmap\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.depth_vert,\n\t\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t\t},\n\n\t\tnormal: {\n\n\t\t\tuniforms: {\n\n\t\t\t\topacity : { value: 1.0 }\n\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.normal_vert,\n\t\t\tfragmentShader: ShaderChunk.normal_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tcube: {\n\n\t\t\tuniforms: {\n\t\t\t\ttCube: { value: null },\n\t\t\t\ttFlip: { value: - 1 },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.cube_vert,\n\t\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tequirect: {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t\ttFlip: { value: - 1 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t\t},\n\n\t\tdistanceRGBA: {\n\n\t\t\tuniforms: {\n\n\t\t\t\tlightPos: { value: new Vector3() }\n\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t\t}\n\n\t};\n\n\tShaderLib.physical = {\n\n\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\tShaderLib.standard.uniforms,\n\n\t\t\t{\n\t\t\t\tclearCoat: { value: 0 },\n\t\t\t\tclearCoatRoughness: { value: 0 }\n\t\t\t}\n\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Box2( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );\n\n\t}\n\n\tBox2.prototype = {\n\n\t\tconstructor: Box2,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = + Infinity;\n\t\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\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\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tif ( point.x < this.min.x || point.x > this.max.x ||\n\t\t\t point.y < this.min.y || point.y > this.max.y ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\tif ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) &&\n\t\t\t ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\n\t\t\tif ( box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t box.max.y < this.min.y || box.min.y > this.max.y ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlarePlugin( renderer, flares ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar shader, program, attributes, uniforms;\n\n\t\tvar tempTexture, occlusionTexture;\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 1, - 1, 0, 0,\n\t\t\t\t 1, - 1, 1, 0,\n\t\t\t\t 1, 1, 1, 1,\n\t\t\t\t- 1, 1, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\t// buffers\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\t// textures\n\n\t\t\ttempTexture = gl.createTexture();\n\t\t\tocclusionTexture = gl.createTexture();\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tshader = {\n\n\t\t\t\tvertexShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform vec3 screenPosition;\",\n\t\t\t\t\t\"uniform vec2 scale;\",\n\t\t\t\t\t\"uniform float rotation;\",\n\n\t\t\t\t\t\"uniform sampler2D occlusionMap;\",\n\n\t\t\t\t\t\"attribute vec2 position;\",\n\t\t\t\t\t\"attribute vec2 uv;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t\"vUV = uv;\",\n\n\t\t\t\t\t\t\"vec2 pos = position;\",\n\n\t\t\t\t\t\t\"if ( renderType == 2 ) {\",\n\n\t\t\t\t\t\t\t\"vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\",\n\n\t\t\t\t\t\t\t\"vVisibility = visibility.r / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.g / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= visibility.b / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.a / 9.0;\",\n\n\t\t\t\t\t\t\t\"pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\",\n\t\t\t\t\t\t\t\"pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\t\"gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" ),\n\n\t\t\t\tfragmentShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform sampler2D map;\",\n\t\t\t\t\t\"uniform float opacity;\",\n\t\t\t\t\t\"uniform vec3 color;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t// pink square\n\n\t\t\t\t\t\t\"if ( renderType == 0 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\",\n\n\t\t\t\t\t\t// restore\n\n\t\t\t\t\t\t\"} else if ( renderType == 1 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = texture2D( map, vUV );\",\n\n\t\t\t\t\t\t// flare\n\n\t\t\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\t\t\"vec4 texture = texture2D( map, vUV );\",\n\t\t\t\t\t\t\t\"texture.a *= opacity * vVisibility;\",\n\t\t\t\t\t\t\t\"gl_FragColor = texture;\",\n\t\t\t\t\t\t\t\"gl_FragColor.rgb *= color;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" )\n\n\t\t\t};\n\n\t\t\tprogram = createProgram( shader );\n\n\t\t\tattributes = {\n\t\t\t\tvertex: gl.getAttribLocation ( program, \"position\" ),\n\t\t\t\tuv: gl.getAttribLocation ( program, \"uv\" )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\trenderType: gl.getUniformLocation( program, \"renderType\" ),\n\t\t\t\tmap: gl.getUniformLocation( program, \"map\" ),\n\t\t\t\tocclusionMap: gl.getUniformLocation( program, \"occlusionMap\" ),\n\t\t\t\topacity: gl.getUniformLocation( program, \"opacity\" ),\n\t\t\t\tcolor: gl.getUniformLocation( program, \"color\" ),\n\t\t\t\tscale: gl.getUniformLocation( program, \"scale\" ),\n\t\t\t\trotation: gl.getUniformLocation( program, \"rotation\" ),\n\t\t\t\tscreenPosition: gl.getUniformLocation( program, \"screenPosition\" )\n\t\t\t};\n\n\t\t}\n\n\t\t/*\n\t\t * Render lens flares\n\t\t * Method: renders 16x16 0xff00ff-colored points scattered over the light source area,\n\t\t * reads these back and calculates occlusion.\n\t\t */\n\n\t\tthis.render = function ( scene, camera, viewport ) {\n\n\t\t\tif ( flares.length === 0 ) return;\n\n\t\t\tvar tempPosition = new Vector3();\n\n\t\t\tvar invAspect = viewport.w / viewport.z,\n\t\t\t\thalfViewportWidth = viewport.z * 0.5,\n\t\t\t\thalfViewportHeight = viewport.w * 0.5;\n\n\t\t\tvar size = 16 / viewport.w,\n\t\t\t\tscale = new Vector2( size * invAspect, size );\n\n\t\t\tvar screenPosition = new Vector3( 1, 1, 0 ),\n\t\t\t\tscreenPositionPixels = new Vector2( 1, 1 );\n\n\t\t\tvar validArea = new Box2();\n\n\t\t\tvalidArea.min.set( viewport.x, viewport.y );\n\t\t\tvalidArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) );\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.vertex );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t// loop through all lens flares to update their occlusion and positions\n\t\t\t// setup gl and common used attribs/uniforms\n\n\t\t\tgl.uniform1i( uniforms.occlusionMap, 0 );\n\t\t\tgl.uniform1i( uniforms.map, 1 );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.setDepthWrite( false );\n\n\t\t\tfor ( var i = 0, l = flares.length; i < l; i ++ ) {\n\n\t\t\t\tsize = 16 / viewport.w;\n\t\t\t\tscale.set( size * invAspect, size );\n\n\t\t\t\t// calc object screen position\n\n\t\t\t\tvar flare = flares[ i ];\n\n\t\t\t\ttempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] );\n\n\t\t\t\ttempPosition.applyMatrix4( camera.matrixWorldInverse );\n\t\t\t\ttempPosition.applyProjection( camera.projectionMatrix );\n\n\t\t\t\t// setup arrays for gl programs\n\n\t\t\t\tscreenPosition.copy( tempPosition );\n\n\t\t\t\t// horizontal and vertical coordinate of the lower left corner of the pixels to copy\n\n\t\t\t\tscreenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8;\n\t\t\t\tscreenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8;\n\n\t\t\t\t// screen cull\n\n\t\t\t\tif ( validArea.containsPoint( screenPositionPixels ) === true ) {\n\n\t\t\t\t\t// save current RGB to temp texture\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, null );\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// render pink quad\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\n\t\t\t\t\tstate.disable( gl.BLEND );\n\t\t\t\t\tstate.enable( gl.DEPTH_TEST );\n\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// copy result to occlusionMap\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// restore graphics\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 1 );\n\t\t\t\t\tstate.disable( gl.DEPTH_TEST );\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// update object positions\n\n\t\t\t\t\tflare.positionScreen.copy( screenPosition );\n\n\t\t\t\t\tif ( flare.customUpdateCallback ) {\n\n\t\t\t\t\t\tflare.customUpdateCallback( flare );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tflare.updateLensFlares();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// render flares\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 2 );\n\t\t\t\t\tstate.enable( gl.BLEND );\n\n\t\t\t\t\tfor ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar sprite = flare.lensFlares[ j ];\n\n\t\t\t\t\t\tif ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) {\n\n\t\t\t\t\t\t\tscreenPosition.x = sprite.x;\n\t\t\t\t\t\t\tscreenPosition.y = sprite.y;\n\t\t\t\t\t\t\tscreenPosition.z = sprite.z;\n\n\t\t\t\t\t\t\tsize = sprite.size * sprite.scale / viewport.w;\n\n\t\t\t\t\t\t\tscale.x = size * invAspect;\n\t\t\t\t\t\t\tscale.y = size;\n\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\t\t\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.rotation, sprite.rotation );\n\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.opacity, sprite.opacity );\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b );\n\n\t\t\t\t\t\t\tstate.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst );\n\t\t\t\t\t\t\trenderer.setTexture2D( sprite.texture, 1 );\n\n\t\t\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\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// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.DEPTH_TEST );\n\t\t\tstate.setDepthWrite( true );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram( shader ) {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\n\t\t\tvar prefix = \"precision \" + renderer.getPrecision() + \" float;\\n\";\n\n\t\t\tgl.shaderSource( fragmentShader, prefix + shader.fragmentShader );\n\t\t\tgl.shaderSource( vertexShader, prefix + shader.vertexShader );\n\n\t\t\tgl.compileShader( fragmentShader );\n\t\t\tgl.compileShader( vertexShader );\n\n\t\t\tgl.attachShader( program, fragmentShader );\n\t\t\tgl.attachShader( program, vertexShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpritePlugin( renderer, sprites ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar program, attributes, uniforms;\n\n\t\tvar texture;\n\n\t\t// decompose matrixWorld\n\n\t\tvar spritePosition = new Vector3();\n\t\tvar spriteRotation = new Quaternion();\n\t\tvar spriteScale = new Vector3();\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 0.5, - 0.5, 0, 0,\n\t\t\t\t 0.5, - 0.5, 1, 0,\n\t\t\t\t 0.5, 0.5, 1, 1,\n\t\t\t\t- 0.5, 0.5, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\tprogram = createProgram();\n\n\t\t\tattributes = {\n\t\t\t\tposition:\t\t\tgl.getAttribLocation ( program, 'position' ),\n\t\t\t\tuv:\t\t\t\t\tgl.getAttribLocation ( program, 'uv' )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\tuvOffset:\t\t\tgl.getUniformLocation( program, 'uvOffset' ),\n\t\t\t\tuvScale:\t\t\tgl.getUniformLocation( program, 'uvScale' ),\n\n\t\t\t\trotation:\t\t\tgl.getUniformLocation( program, 'rotation' ),\n\t\t\t\tscale:\t\t\t\tgl.getUniformLocation( program, 'scale' ),\n\n\t\t\t\tcolor:\t\t\t\tgl.getUniformLocation( program, 'color' ),\n\t\t\t\tmap:\t\t\t\tgl.getUniformLocation( program, 'map' ),\n\t\t\t\topacity:\t\t\tgl.getUniformLocation( program, 'opacity' ),\n\n\t\t\t\tmodelViewMatrix: \tgl.getUniformLocation( program, 'modelViewMatrix' ),\n\t\t\t\tprojectionMatrix:\tgl.getUniformLocation( program, 'projectionMatrix' ),\n\n\t\t\t\tfogType:\t\t\tgl.getUniformLocation( program, 'fogType' ),\n\t\t\t\tfogDensity:\t\t\tgl.getUniformLocation( program, 'fogDensity' ),\n\t\t\t\tfogNear:\t\t\tgl.getUniformLocation( program, 'fogNear' ),\n\t\t\t\tfogFar:\t\t\t\tgl.getUniformLocation( program, 'fogFar' ),\n\t\t\t\tfogColor:\t\t\tgl.getUniformLocation( program, 'fogColor' ),\n\n\t\t\t\talphaTest:\t\t\tgl.getUniformLocation( program, 'alphaTest' )\n\t\t\t};\n\n\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\tcanvas.width = 8;\n\t\t\tcanvas.height = 8;\n\n\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\tcontext.fillStyle = 'white';\n\t\t\tcontext.fillRect( 0, 0, 8, 8 );\n\n\t\t\ttexture = new Texture( canvas );\n\t\t\ttexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( sprites.length === 0 ) return;\n\n\t\t\t// setup gl\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.position );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.BLEND );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tgl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );\n\n\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\tgl.uniform1i( uniforms.map, 0 );\n\n\t\t\tvar oldFogType = 0;\n\t\t\tvar sceneFogType = 0;\n\t\t\tvar fog = scene.fog;\n\n\t\t\tif ( fog ) {\n\n\t\t\t\tgl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );\n\n\t\t\t\tif ( (fog && fog.isFog) ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogNear, fog.near );\n\t\t\t\t\tgl.uniform1f( uniforms.fogFar, fog.far );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 1 );\n\t\t\t\t\toldFogType = 1;\n\t\t\t\t\tsceneFogType = 1;\n\n\t\t\t\t} else if ( (fog && fog.isFogExp2) ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogDensity, fog.density );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 2 );\n\t\t\t\t\toldFogType = 2;\n\t\t\t\t\tsceneFogType = 2;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tgl.uniform1i( uniforms.fogType, 0 );\n\t\t\t\toldFogType = 0;\n\t\t\t\tsceneFogType = 0;\n\n\t\t\t}\n\n\n\t\t\t// update positions and sort\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\n\t\t\t\tsprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld );\n\t\t\t\tsprite.z = - sprite.modelViewMatrix.elements[ 14 ];\n\n\t\t\t}\n\n\t\t\tsprites.sort( painterSortStable );\n\n\t\t\t// render all sprites\n\n\t\t\tvar scale = [];\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\t\t\t\tvar material = sprite.material;\n\n\t\t\t\tif ( material.visible === false ) continue;\n\n\t\t\t\tgl.uniform1f( uniforms.alphaTest, material.alphaTest );\n\t\t\t\tgl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements );\n\n\t\t\t\tsprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale );\n\n\t\t\t\tscale[ 0 ] = spriteScale.x;\n\t\t\t\tscale[ 1 ] = spriteScale.y;\n\n\t\t\t\tvar fogType = 0;\n\n\t\t\t\tif ( scene.fog && material.fog ) {\n\n\t\t\t\t\tfogType = sceneFogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( oldFogType !== fogType ) {\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, fogType );\n\t\t\t\t\toldFogType = fogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.map !== null ) {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, 0, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, 1, 1 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.uniform1f( uniforms.opacity, material.opacity );\n\t\t\t\tgl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );\n\n\t\t\t\tgl.uniform1f( uniforms.rotation, material.rotation );\n\t\t\t\tgl.uniform2fv( uniforms.scale, scale );\n\n\t\t\t\tstate.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );\n\t\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\t\tstate.setDepthWrite( material.depthWrite );\n\n\t\t\t\tif ( material.map ) {\n\n\t\t\t\t\trenderer.setTexture2D( material.map, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setTexture2D( texture, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram() {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\n\t\t\tgl.shaderSource( vertexShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform float rotation;',\n\t\t\t\t'uniform vec2 scale;',\n\t\t\t\t'uniform vec2 uvOffset;',\n\t\t\t\t'uniform vec2 uvScale;',\n\n\t\t\t\t'attribute vec2 position;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vUV = uvOffset + uv * uvScale;',\n\n\t\t\t\t\t'vec2 alignedPosition = position * scale;',\n\n\t\t\t\t\t'vec2 rotatedPosition;',\n\t\t\t\t\t'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',\n\t\t\t\t\t'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',\n\n\t\t\t\t\t'vec4 finalPosition;',\n\n\t\t\t\t\t'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',\n\t\t\t\t\t'finalPosition.xy += rotatedPosition;',\n\t\t\t\t\t'finalPosition = projectionMatrix * finalPosition;',\n\n\t\t\t\t\t'gl_Position = finalPosition;',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.shaderSource( fragmentShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform vec3 color;',\n\t\t\t\t'uniform sampler2D map;',\n\t\t\t\t'uniform float opacity;',\n\n\t\t\t\t'uniform int fogType;',\n\t\t\t\t'uniform vec3 fogColor;',\n\t\t\t\t'uniform float fogDensity;',\n\t\t\t\t'uniform float fogNear;',\n\t\t\t\t'uniform float fogFar;',\n\t\t\t\t'uniform float alphaTest;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vec4 texture = texture2D( map, vUV );',\n\n\t\t\t\t\t'if ( texture.a < alphaTest ) discard;',\n\n\t\t\t\t\t'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',\n\n\t\t\t\t\t'if ( fogType > 0 ) {',\n\n\t\t\t\t\t\t'float depth = gl_FragCoord.z / gl_FragCoord.w;',\n\t\t\t\t\t\t'float fogFactor = 0.0;',\n\n\t\t\t\t\t\t'if ( fogType == 1 ) {',\n\n\t\t\t\t\t\t\t'fogFactor = smoothstep( fogNear, fogFar, depth );',\n\n\t\t\t\t\t\t'} else {',\n\n\t\t\t\t\t\t\t'const float LOG2 = 1.442695;',\n\t\t\t\t\t\t\t'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );',\n\t\t\t\t\t\t\t'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',\n\n\t\t\t\t\t\t'}',\n\n\t\t\t\t\t\t'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );',\n\n\t\t\t\t\t'}',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.compileShader( vertexShader );\n\t\t\tgl.compileShader( fragmentShader );\n\n\t\t\tgl.attachShader( program, vertexShader );\n\t\t\tgl.attachShader( program, fragmentShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\t\treturn a.renderOrder - b.renderOrder;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn b.id - a.id;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Material() {\n\n\t\tObject.defineProperty( this, 'id', { value: MaterialIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.fog = true;\n\t\tthis.lights = true;\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading\n\t\tthis.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = 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\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\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.alphaTest = 0;\n\t\tthis.premultipliedAlpha = false;\n\n\t\tthis.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer\n\n\t\tthis.visible = true;\n\n\t\tthis._needsUpdate = true;\n\n\t}\n\n\tMaterial.prototype = {\n\n\t\tconstructor: Material,\n\n\t\tisMaterial: true,\n\n\t\tget needsUpdate() {\n\n\t\t\treturn this._needsUpdate;\n\n\t\t},\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.update();\n\t\t\tthis._needsUpdate = value;\n\n\t\t},\n\n\t\tsetValues: function ( values ) {\n\n\t\t\tif ( values === undefined ) return;\n\n\t\t\tfor ( var key in values ) {\n\n\t\t\t\tvar newValue = values[ key ];\n\n\t\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.Material: '\" + key + \"' parameter is undefined.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar currentValue = this[ key ];\n\n\t\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.\" + this.type + \": '\" + key + \"' is not a property of this material.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tif ( (currentValue && currentValue.isColor) ) {\n\n\t\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t\t} else if ( (currentValue && currentValue.isVector3) && (newValue && newValue.isVector3) ) {\n\n\t\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t\t} else if ( key === 'overdraw' ) {\n\n\t\t\t\t\t// ensure overdraw is backwards-compatible with legacy boolean type\n\t\t\t\t\tthis[ key ] = Number( newValue );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar isRoot = meta === undefined;\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tmeta = {\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Material',\n\t\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Material serialization\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( (this.color && this.color.isColor) ) data.color = this.color.getHex();\n\n\t\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\t\tif ( (this.emissive && this.emissive.isColor) ) data.emissive = this.emissive.getHex();\n\t\t\tif ( (this.specular && this.specular.isColor) ) data.specular = this.specular.getHex();\n\t\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\n\t\t\tif ( (this.map && this.map.isTexture) ) data.map = this.map.toJSON( meta ).uuid;\n\t\t\tif ( (this.alphaMap && this.alphaMap.isTexture) ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.lightMap && this.lightMap.isTexture) ) data.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.bumpMap && this.bumpMap.isTexture) ) {\n\n\t\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t\t}\n\t\t\tif ( (this.normalMap && this.normalMap.isTexture) ) {\n\n\t\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t\t}\n\t\t\tif ( (this.displacementMap && this.displacementMap.isTexture) ) {\n\n\t\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t\t}\n\t\t\tif ( (this.roughnessMap && this.roughnessMap.isTexture) ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.metalnessMap && this.metalnessMap.isTexture) ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\t\tif ( (this.emissiveMap && this.emissiveMap.isTexture) ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.specularMap && this.specularMap.isTexture) ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\n\t\t\tif ( (this.envMap && this.envMap.isTexture) ) {\n\n\t\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\t\t\t\tdata.reflectivity = this.reflectivity; // Scale behind envMap\n\n\t\t\t}\n\n\t\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\t\tif ( this.shading !== SmoothShading ) data.shading = this.shading;\n\t\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\t\tif ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors;\n\n\t\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\t\tdata.depthFunc = this.depthFunc;\n\t\t\tdata.depthTest = this.depthTest;\n\t\t\tdata.depthWrite = this.depthWrite;\n\n\t\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\t\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\t\tdata.skinning = this.skinning;\n\t\t\tdata.morphTargets = this.morphTargets;\n\n\t\t\t// TODO: Copied from Object3D.toJSON\n\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.fog = source.fog;\n\t\t\tthis.lights = source.lights;\n\n\t\t\tthis.blending = source.blending;\n\t\t\tthis.side = source.side;\n\t\t\tthis.shading = source.shading;\n\t\t\tthis.vertexColors = source.vertexColors;\n\n\t\t\tthis.opacity = source.opacity;\n\t\t\tthis.transparent = source.transparent;\n\n\t\t\tthis.blendSrc = source.blendSrc;\n\t\t\tthis.blendDst = source.blendDst;\n\t\t\tthis.blendEquation = source.blendEquation;\n\t\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\t\tthis.depthFunc = source.depthFunc;\n\t\t\tthis.depthTest = source.depthTest;\n\t\t\tthis.depthWrite = source.depthWrite;\n\n\t\t\tthis.colorWrite = source.colorWrite;\n\n\t\t\tthis.precision = source.precision;\n\n\t\t\tthis.polygonOffset = source.polygonOffset;\n\t\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\t\tthis.alphaTest = source.alphaTest;\n\n\t\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\t\tthis.overdraw = source.overdraw;\n\n\t\t\tthis.visible = source.visible;\n\t\t\tthis.clipShadows = source.clipShadows;\n\t\t\tthis.clipIntersection = source.clipIntersection;\n\n\t\t\tvar srcPlanes = source.clippingPlanes,\n\t\t\t\tdstPlanes = null;\n\n\t\t\tif ( srcPlanes !== null ) {\n\n\t\t\t\tvar n = srcPlanes.length;\n\t\t\t\tdstPlanes = new Array( n );\n\n\t\t\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t\tthis.clippingPlanes = dstPlanes;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdate: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'update' } );\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( Material.prototype, EventDispatcher.prototype );\n\n\tvar count$1 = 0;\n\tfunction MaterialIdCount() { return count$1++; }\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * defines: { \"label\" : \"value\" },\n\t * uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n\t *\n\t * fragmentShader: ,\n\t * vertexShader: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * lights: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction ShaderMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\n\t\tthis.vertexShader = 'void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}';\n\t\tthis.fragmentShader = 'void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}';\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.skinning = false; // set to use skinning attribute streams\n\t\tthis.morphTargets = false; // set to use morph targets\n\t\tthis.morphNormals = false; // set to use morph normals\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'uv2': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tShaderMaterial.prototype = Object.create( Material.prototype );\n\tShaderMaterial.prototype.constructor = ShaderMaterial;\n\n\tShaderMaterial.prototype.isShaderMaterial = true;\n\n\tShaderMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = UniformsUtils.clone( source.uniforms );\n\n\t\tthis.defines = source.defines;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.skinning = source.skinning;\n\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\tthis.extensions = source.extensions;\n\n\t\treturn this;\n\n\t};\n\n\tShaderMaterial.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Material.prototype.toJSON.call( this, meta );\n\n\t\tdata.uniforms = this.uniforms;\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / https://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t *\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t * }\n\t */\n\n\tfunction MeshDepthMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\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.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshDepthMaterial.prototype = Object.create( Material.prototype );\n\tMeshDepthMaterial.prototype.constructor = MeshDepthMaterial;\n\n\tMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\n\tMeshDepthMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\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\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Box3( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );\n\n\t}\n\n\tBox3.prototype = {\n\n\t\tconstructor: Box3,\n\n\t\tisBox3: true,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromArray: function ( array ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tvar x = array[ i ];\n\t\t\t\tvar y = array[ i + 1 ];\n\t\t\t\tvar z = array[ i + 2 ];\n\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\t\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromObject: function () {\n\n\t\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t\t// accounting for both the object's, and children's, world transforms\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function setFromObject( object ) {\n\n\t\t\t\tvar scope = this;\n\n\t\t\t\tobject.updateMatrixWorld( true );\n\n\t\t\t\tthis.makeEmpty();\n\n\t\t\t\tobject.traverse( function ( node ) {\n\n\t\t\t\t\tvar geometry = node.geometry;\n\n\t\t\t\t\tif ( geometry !== undefined ) {\n\n\t\t\t\t\t\tif ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\tv1.copy( vertices[ i ] );\n\t\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\t\t\tvar attribute = geometry.attributes.position;\n\n\t\t\t\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\t\t\t\tvar array, offset, stride;\n\n\t\t\t\t\t\t\t\tif ( (attribute && attribute.isInterleavedBufferAttribute) ) {\n\n\t\t\t\t\t\t\t\t\tarray = attribute.data.array;\n\t\t\t\t\t\t\t\t\toffset = attribute.offset;\n\t\t\t\t\t\t\t\t\tstride = attribute.data.stride;\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tarray = attribute.array;\n\t\t\t\t\t\t\t\t\toffset = 0;\n\t\t\t\t\t\t\t\t\tstride = 3;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tfor ( var i = offset, il = array.length; i < il; i += stride ) {\n\n\t\t\t\t\t\t\t\t\tv1.fromArray( array, i );\n\t\t\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\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} );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\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\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tif ( point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\t\t point.y < this.min.y || point.y > this.max.y ||\n\t\t\t\t\t point.z < this.min.z || point.z > this.max.z ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\tif ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) &&\n\t\t\t\t ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) &&\n\t\t\t\t ( this.min.z <= box.min.z ) && ( box.max.z <= this.max.z ) ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\n\t\t\tif ( box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\t\t box.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\t\t\t box.max.z < this.min.z || box.min.z > this.max.z ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tintersectsSphere: ( function () {\n\n\t\t\tvar closestPoint;\n\n\t\t\treturn function intersectsSphere( sphere ) {\n\n\t\t\t\tif ( closestPoint === undefined ) closestPoint = new Vector3();\n\n\t\t\t\t// Find the point on the AABB closest to the sphere center.\n\t\t\t\tthis.clampPoint( sphere.center, closestPoint );\n\n\t\t\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\t\t\treturn closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\t\tvar min, max;\n\n\t\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t\t} else {\n\n\t\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t\t}\n\n\t\t\treturn ( min <= plane.constant && max >= plane.constant );\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetBoundingSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function getBoundingSphere( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Sphere();\n\n\t\t\t\tthis.getCenter( result.center );\n\n\t\t\t\tresult.radius = this.getSize( v1 ).length() * 0.5;\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\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\t\tif( this.isEmpty() ) this.makeEmpty();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar points = [\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3()\n\t\t\t];\n\n\t\t\treturn function applyMatrix4( matrix ) {\n\n\t\t\t\t// transform of empty box is an empty box.\n\t\t\t\tif( this.isEmpty() ) return this;\n\n\t\t\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t\t\tpoints[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t\t\tpoints[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t\t\tpoints[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t\t\tpoints[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t\t\tpoints[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t\t\tpoints[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t\t\tpoints[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t\t\tpoints[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix );\t// 111\n\n\t\t\t\tthis.setFromPoints( points );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Sphere( center, radius ) {\n\n\t\tthis.center = ( center !== undefined ) ? center : new Vector3();\n\t\tthis.radius = ( radius !== undefined ) ? radius : 0;\n\n\t}\n\n\tSphere.prototype = {\n\n\t\tconstructor: Sphere,\n\n\t\tset: function ( center, radius ) {\n\n\t\t\tthis.center.copy( center );\n\t\t\tthis.radius = radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function () {\n\n\t\t\tvar box = new Box3();\n\n\t\t\treturn function setFromPoints( points, optionalCenter ) {\n\n\t\t\t\tvar center = this.center;\n\n\t\t\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\t\t\tcenter.copy( optionalCenter );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbox.setFromPoints( points ).getCenter( center );\n\n\t\t\t\t}\n\n\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( sphere ) {\n\n\t\t\tthis.center.copy( sphere.center );\n\t\t\tthis.radius = sphere.radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tempty: function () {\n\n\t\t\treturn ( this.radius <= 0 );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar radiusSum = this.radius + sphere.radius;\n\n\t\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsSphere( this );\n\n\t\t},\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We use the following equation to compute the signed distance from\n\t\t\t// the center of the sphere to the plane.\n\t\t\t//\n\t\t\t// distance = q * n - d\n\t\t\t//\n\t\t\t// If this distance is greater than the radius of the sphere,\n\t\t\t// then there is no intersection.\n\n\t\t\treturn Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.copy( point );\n\n\t\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t\tresult.sub( this.center ).normalize();\n\t\t\t\tresult.multiplyScalar( this.radius ).add( this.center );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\tgetBoundingBox: function ( optionalTarget ) {\n\n\t\t\tvar box = optionalTarget || new Box3();\n\n\t\t\tbox.set( this.center, this.center );\n\t\t\tbox.expandByScalar( this.radius );\n\n\t\t\treturn box;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.center.applyMatrix4( matrix );\n\t\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.center.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( sphere ) {\n\n\t\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t * @author tschw\n\t */\n\n\tfunction Matrix3() {\n\n\t\tthis.elements = new Float32Array( [\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 ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix3.prototype = {\n\n\t\tconstructor: Matrix3,\n\n\t\tisMatrix3: true,\n\n\t\tset: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0,\n\t\t\t\t0, 1, 0,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 3 ], me[ 6 ],\n\t\t\t\tme[ 1 ], me[ 4 ], me[ 7 ],\n\t\t\t\tme[ 2 ], me[ 5 ], me[ 8 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix4: function( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToVector3Array: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToVector3Array( array, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = array.length;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i += 3, j += 3 ) {\n\n\t\t\t\t\tv1.fromArray( array, j );\n\t\t\t\t\tv1.applyMatrix3( this );\n\t\t\t\t\tv1.toArray( array, j );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyToBuffer: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBuffer( buffer, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = buffer.length / buffer.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i ++, j ++ ) {\n\n\t\t\t\t\tv1.x = buffer.getX( j );\n\t\t\t\t\tv1.y = buffer.getY( j );\n\t\t\t\t\tv1.z = buffer.getZ( j );\n\n\t\t\t\t\tv1.applyMatrix3( this );\n\n\t\t\t\t\tbuffer.setXYZ( j, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn buffer;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t\t},\n\n\t\tgetInverse: function ( matrix, throwOnDegenerate ) {\n\n\t\t\tif ( (matrix && matrix.isMatrix4) ) {\n\n\t\t\t\tconsole.error( \"THREE.Matrix3.getInverse no longer takes a Matrix4 argument.\" );\n\n\t\t\t}\n\n\t\t\tvar me = matrix.elements,\n\t\t\t\tte = this.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],\n\t\t\t\tn12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],\n\t\t\t\tn13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],\n\n\t\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\t\tte[ 3 ] = t12 * detInv;\n\t\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\t\tte[ 6 ] = t13 * detInv;\n\t\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar tmp, m = this.elements;\n\n\t\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset is deprecated \" +\n\t\t\t\t\t\"- just use .toArray instead.\" );\n\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\n\t\tgetNormalMatrix: function ( matrix4 ) {\n\n\t\t\treturn this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();\n\n\t\t},\n\n\t\ttransposeIntoArray: function ( r ) {\n\n\t\t\tvar m = this.elements;\n\n\t\t\tr[ 0 ] = m[ 0 ];\n\t\t\tr[ 1 ] = m[ 3 ];\n\t\t\tr[ 2 ] = m[ 6 ];\n\t\t\tr[ 3 ] = m[ 1 ];\n\t\t\tr[ 4 ] = m[ 4 ];\n\t\t\tr[ 5 ] = m[ 7 ];\n\t\t\tr[ 6 ] = m[ 2 ];\n\t\t\tr[ 7 ] = m[ 5 ];\n\t\t\tr[ 8 ] = m[ 8 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 9; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Plane( normal, constant ) {\n\n\t\tthis.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );\n\t\tthis.constant = ( constant !== undefined ) ? constant : 0;\n\n\t}\n\n\tPlane.prototype = {\n\n\t\tconstructor: Plane,\n\n\t\tset: function ( normal, constant ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponents: function ( x, y, z, w ) {\n\n\t\t\tthis.normal.set( x, y, z );\n\t\t\tthis.constant = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromNormalAndCoplanarPoint: function ( normal, point ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = - point.dot( this.normal );\t// must be this.normal, not normal, as this.normal is normalized\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCoplanarPoints: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function setFromCoplanarPoints( a, b, c ) {\n\n\t\t\t\tvar normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();\n\n\t\t\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\t\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( plane ) {\n\n\t\t\tthis.normal.copy( plane.normal );\n\t\t\tthis.constant = plane.constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\t\tvar inverseNormalLength = 1.0 / this.normal.length();\n\t\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\t\tthis.constant *= inverseNormalLength;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.constant *= - 1;\n\t\t\tthis.normal.negate();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn this.normal.dot( point ) + this.constant;\n\n\t\t},\n\n\t\tdistanceToSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t\t},\n\n\t\tprojectPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn this.orthoPoint( point, optionalTarget ).sub( point ).negate();\n\n\t\t},\n\n\t\torthoPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar perpendicularMagnitude = this.distanceToPoint( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( perpendicularMagnitude );\n\n\t\t},\n\n\t\tintersectLine: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectLine( line, optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tvar direction = line.delta( v1 );\n\n\t\t\t\tvar denominator = this.normal.dot( direction );\n\n\t\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t\t// line is coplanar, return origin\n\t\t\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\t\t\treturn result.copy( line.start );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\tvar t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\t\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\treturn result.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsLine: function ( line ) {\n\n\t\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\t\tvar startSign = this.distanceToPoint( line.start );\n\t\t\tvar endSign = this.distanceToPoint( line.end );\n\n\t\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsPlane( this );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn sphere.intersectsPlane( this );\n\n\t\t},\n\n\t\tcoplanarPoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar m1 = new Matrix3();\n\n\t\t\treturn function applyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\t\t\tvar referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix );\n\n\t\t\t\t// transform normal based on theory here:\n\t\t\t\t// http://www.songho.ca/opengl/gl_normaltransform.html\n\t\t\t\tvar normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix );\n\t\t\t\tvar normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t// recalculate constant (like in setFromNormalAndCoplanarPoint)\n\t\t\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.constant = this.constant - offset.dot( this.normal );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( plane ) {\n\n\t\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Frustum( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tthis.planes = [\n\n\t\t\t( p0 !== undefined ) ? p0 : new Plane(),\n\t\t\t( p1 !== undefined ) ? p1 : new Plane(),\n\t\t\t( p2 !== undefined ) ? p2 : new Plane(),\n\t\t\t( p3 !== undefined ) ? p3 : new Plane(),\n\t\t\t( p4 !== undefined ) ? p4 : new Plane(),\n\t\t\t( p5 !== undefined ) ? p5 : new Plane()\n\n\t\t];\n\n\t}\n\n\tFrustum.prototype = {\n\n\t\tconstructor: Frustum,\n\n\t\tset: function ( p0, p1, p2, p3, p4, p5 ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tplanes[ 0 ].copy( p0 );\n\t\t\tplanes[ 1 ].copy( p1 );\n\t\t\tplanes[ 2 ].copy( p2 );\n\t\t\tplanes[ 3 ].copy( p3 );\n\t\t\tplanes[ 4 ].copy( p4 );\n\t\t\tplanes[ 5 ].copy( p5 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( frustum ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix: function ( m ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar me = m.elements;\n\t\t\tvar me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\t\tvar me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\t\tvar me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\t\tvar me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tintersectsObject: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsObject( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere )\n\t\t\t\t\t.applyMatrix4( object.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSprite: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsSprite( sprite ) {\n\n\t\t\t\tsphere.center.set( 0, 0, 0 );\n\t\t\t\tsphere.radius = 0.7071067811865476;\n\t\t\t\tsphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar center = sphere.center;\n\t\t\tvar negRadius = - sphere.radius;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tvar distance = planes[ i ].distanceToPoint( center );\n\n\t\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tintersectsBox: function () {\n\n\t\t\tvar p1 = new Vector3(),\n\t\t\t\tp2 = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\tvar planes = this.planes;\n\n\t\t\t\tfor ( var i = 0; i < 6 ; i ++ ) {\n\n\t\t\t\t\tvar plane = planes[ i ];\n\n\t\t\t\t\tp1.x = plane.normal.x > 0 ? box.min.x : box.max.x;\n\t\t\t\t\tp2.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t\t\tp1.y = plane.normal.y > 0 ? box.min.y : box.max.y;\n\t\t\t\t\tp2.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t\t\tp1.z = plane.normal.z > 0 ? box.min.z : box.max.z;\n\t\t\t\t\tp2.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\t\t\tvar d1 = plane.distanceToPoint( p1 );\n\t\t\t\t\tvar d2 = plane.distanceToPoint( p2 );\n\n\t\t\t\t\t// if both outside plane, no intersection\n\n\t\t\t\t\tif ( d1 < 0 && d2 < 0 ) {\n\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t};\n\n\t\t}(),\n\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {\n\n\t\tvar _gl = _renderer.context,\n\t\t_state = _renderer.state,\n\t\t_frustum = new Frustum(),\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_lightShadows = _lights.shadows,\n\n\t\t_shadowMapSize = new Vector2(),\n\t\t_maxShadowMapSize = new Vector2( capabilities.maxTextureSize, capabilities.maxTextureSize ),\n\n\t\t_lookTarget = new Vector3(),\n\t\t_lightPositionWorld = new Vector3(),\n\n\t\t_renderList = [],\n\n\t\t_MorphingFlag = 1,\n\t\t_SkinningFlag = 2,\n\n\t\t_NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1,\n\n\t\t_depthMaterials = new Array( _NumberOfMaterialVariants ),\n\t\t_distanceMaterials = new Array( _NumberOfMaterialVariants ),\n\n\t\t_materialCache = {};\n\n\t\tvar 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\tvar 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\tvar cube2DViewPorts = [\n\t\t\tnew Vector4(), new Vector4(), new Vector4(),\n\t\t\tnew Vector4(), new Vector4(), new Vector4()\n\t\t];\n\n\t\t// init\n\n\t\tvar depthMaterialTemplate = new MeshDepthMaterial();\n\t\tdepthMaterialTemplate.depthPacking = RGBADepthPacking;\n\t\tdepthMaterialTemplate.clipping = true;\n\n\t\tvar distanceShader = ShaderLib[ \"distanceRGBA\" ];\n\t\tvar distanceUniforms = UniformsUtils.clone( distanceShader.uniforms );\n\n\t\tfor ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {\n\n\t\t\tvar useMorphing = ( i & _MorphingFlag ) !== 0;\n\t\t\tvar useSkinning = ( i & _SkinningFlag ) !== 0;\n\n\t\t\tvar depthMaterial = depthMaterialTemplate.clone();\n\t\t\tdepthMaterial.morphTargets = useMorphing;\n\t\t\tdepthMaterial.skinning = useSkinning;\n\n\t\t\t_depthMaterials[ i ] = depthMaterial;\n\n\t\t\tvar distanceMaterial = new ShaderMaterial( {\n\t\t\t\tdefines: {\n\t\t\t\t\t'USE_SHADOWMAP': ''\n\t\t\t\t},\n\t\t\t\tuniforms: distanceUniforms,\n\t\t\t\tvertexShader: distanceShader.vertexShader,\n\t\t\t\tfragmentShader: distanceShader.fragmentShader,\n\t\t\t\tmorphTargets: useMorphing,\n\t\t\t\tskinning: useSkinning,\n\t\t\t\tclipping: true\n\t\t\t} );\n\n\t\t\t_distanceMaterials[ i ] = distanceMaterial;\n\n\t\t}\n\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tthis.enabled = false;\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis.type = PCFShadowMap;\n\n\t\tthis.renderReverseSided = true;\n\t\tthis.renderSingleSided = true;\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\t\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\t\tif ( _lightShadows.length === 0 ) return;\n\n\t\t\t// Set GL state for depth map.\n\t\t\t_state.clearColor( 1, 1, 1, 1 );\n\t\t\t_state.disable( _gl.BLEND );\n\t\t\t_state.setDepthTest( true );\n\t\t\t_state.setScissorTest( false );\n\n\t\t\t// render depth map\n\n\t\t\tvar faceCount, isPointLight;\n\n\t\t\tfor ( var i = 0, il = _lightShadows.length; i < il; i ++ ) {\n\n\t\t\t\tvar light = _lightShadows[ i ];\n\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowCamera = shadow.camera;\n\n\t\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\t\t\t\t_shadowMapSize.min( _maxShadowMapSize );\n\n\t\t\t\tif ( (light && light.isPointLight) ) {\n\n\t\t\t\t\tfaceCount = 6;\n\t\t\t\t\tisPointLight = true;\n\n\t\t\t\t\tvar vpWidth = _shadowMapSize.x;\n\t\t\t\t\tvar vpHeight = _shadowMapSize.y;\n\n\t\t\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t\t\t// following orientation:\n\t\t\t\t\t//\n\t\t\t\t\t// xzXZ\n\t\t\t\t\t// y Y\n\t\t\t\t\t//\n\t\t\t\t\t// X - Positive x direction\n\t\t\t\t\t// x - Negative x direction\n\t\t\t\t\t// Y - Positive y direction\n\t\t\t\t\t// y - Negative y direction\n\t\t\t\t\t// Z - Positive z direction\n\t\t\t\t\t// z - Negative z direction\n\n\t\t\t\t\t// positive X\n\t\t\t\t\tcube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative X\n\t\t\t\t\tcube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Z\n\t\t\t\t\tcube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative Z\n\t\t\t\t\tcube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Y\n\t\t\t\t\tcube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight );\n\t\t\t\t\t// negative Y\n\t\t\t\t\tcube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight );\n\n\t\t\t\t\t_shadowMapSize.x *= 4.0;\n\t\t\t\t\t_shadowMapSize.y *= 2.0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfaceCount = 1;\n\t\t\t\t\tisPointLight = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\t\tvar pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\n\t\t\t\t\tshadowCamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tif ( (shadow && shadow.isSpotLightShadow) ) {\n\n\t\t\t\t\tshadow.update( light );\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowMap = shadow.map;\n\t\t\t\tvar shadowMatrix = shadow.matrix;\n\n\t\t\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tshadowCamera.position.copy( _lightPositionWorld );\n\n\t\t\t\t_renderer.setRenderTarget( shadowMap );\n\t\t\t\t_renderer.clear();\n\n\t\t\t\t// render shadow map for each cube face (if omni-directional) or\n\t\t\t\t// run a single pass if not\n\n\t\t\t\tfor ( var face = 0; face < faceCount; face ++ ) {\n\n\t\t\t\t\tif ( isPointLight ) {\n\n\t\t\t\t\t\t_lookTarget.copy( shadowCamera.position );\n\t\t\t\t\t\t_lookTarget.add( cubeDirections[ face ] );\n\t\t\t\t\t\tshadowCamera.up.copy( cubeUps[ face ] );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t\tvar vpDimensions = cube2DViewPorts[ face ];\n\t\t\t\t\t\t_state.viewport( vpDimensions );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_lookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tshadowCamera.updateMatrixWorld();\n\t\t\t\t\tshadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld );\n\n\t\t\t\t\t// compute shadow matrix\n\n\t\t\t\t\tshadowMatrix.set(\n\t\t\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t\t\t);\n\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t\t\t\t\t// update camera matrices and frustum\n\n\t\t\t\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\t\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\t\t\t// set object matrices & frustum culling\n\n\t\t\t\t\t_renderList.length = 0;\n\n\t\t\t\t\tprojectObject( scene, camera, shadowCamera );\n\n\t\t\t\t\t// render shadow map\n\t\t\t\t\t// render regular objects\n\n\t\t\t\t\tfor ( var j = 0, jl = _renderList.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar object = _renderList[ j ];\n\t\t\t\t\t\tvar geometry = _objects.update( object );\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( (material && material.isMultiMaterial) ) {\n\n\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\tfor ( var k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\t\t\tvar group = groups[ k ];\n\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, 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 {\n\n\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, 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\t// Restore GL state.\n\t\t\tvar clearColor = _renderer.getClearColor(),\n\t\t\tclearAlpha = _renderer.getClearAlpha();\n\t\t\t_renderer.setClearColor( clearColor, clearAlpha );\n\n\t\t\tscope.needsUpdate = false;\n\n\t\t};\n\n\t\tfunction getDepthMaterial( object, material, isPointLight, lightPositionWorld ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tvar result = null;\n\n\t\t\tvar materialVariants = _depthMaterials;\n\t\t\tvar customMaterial = object.customDepthMaterial;\n\n\t\t\tif ( isPointLight ) {\n\n\t\t\t\tmaterialVariants = _distanceMaterials;\n\t\t\t\tcustomMaterial = object.customDistanceMaterial;\n\n\t\t\t}\n\n\t\t\tif ( ! customMaterial ) {\n\n\t\t\t\tvar useMorphing = false;\n\n\t\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;\n\n\t\t\t\t\t} else if ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphTargets && geometry.morphTargets.length > 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar useSkinning = object.isSkinnedMesh && material.skinning;\n\n\t\t\t\tvar variantIndex = 0;\n\n\t\t\t\tif ( useMorphing ) variantIndex |= _MorphingFlag;\n\t\t\t\tif ( useSkinning ) variantIndex |= _SkinningFlag;\n\n\t\t\t\tresult = materialVariants[ variantIndex ];\n\n\t\t\t} else {\n\n\t\t\t\tresult = customMaterial;\n\n\t\t\t}\n\n\t\t\tif ( _renderer.localClippingEnabled &&\n\t\t\t\t material.clipShadows === true &&\n\t\t\t\t\tmaterial.clippingPlanes.length !== 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\tvar keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tvar 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\tvar 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\tresult.visible = material.visible;\n\t\t\tresult.wireframe = material.wireframe;\n\n\t\t\tvar side = material.side;\n\n\t\t\tif ( scope.renderSingleSided && side == DoubleSide ) {\n\n\t\t\t\tside = FrontSide;\n\n\t\t\t}\n\n\t\t\tif ( scope.renderReverseSided ) {\n\n\t\t\t\tif ( side === FrontSide ) side = BackSide;\n\t\t\t\telse if ( side === BackSide ) side = FrontSide;\n\n\t\t\t}\n\n\t\t\tresult.side = side;\n\n\t\t\tresult.clipShadows = material.clipShadows;\n\t\t\tresult.clippingPlanes = material.clippingPlanes;\n\n\t\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\t\tresult.linewidth = material.linewidth;\n\n\t\t\tif ( isPointLight && result.uniforms.lightPos !== undefined ) {\n\n\t\t\t\tresult.uniforms.lightPos.value.copy( lightPositionWorld );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera, shadowCamera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\t\tif ( object.castShadow && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) {\n\n\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\t\t\t_renderList.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, shadowCamera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Ray( origin, direction ) {\n\n\t\tthis.origin = ( origin !== undefined ) ? origin : new Vector3();\n\t\tthis.direction = ( direction !== undefined ) ? direction : new Vector3();\n\n\t}\n\n\tRay.prototype = {\n\n\t\tconstructor: Ray,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\tthis.origin.copy( origin );\n\t\t\tthis.direction.copy( direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( ray ) {\n\n\t\t\tthis.origin.copy( ray.origin );\n\t\t\tthis.direction.copy( ray.direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t\t},\n\n\t\tlookAt: function ( v ) {\n\n\t\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trecast: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function recast( t ) {\n\n\t\t\t\tthis.origin.copy( this.at( t, v1 ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\tresult.subVectors( point, this.origin );\n\t\t\tvar directionDistance = result.dot( this.direction );\n\n\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\treturn result.copy( this.origin );\n\n\t\t\t}\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t\t},\n\n\t\tdistanceSqToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceSqToPoint( point ) {\n\n\t\t\t\tvar directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t\t\t// point behind the ray\n\n\t\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t\t\t}\n\n\t\t\t\tv1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t\t\treturn v1.distanceToSquared( point );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdistanceSqToSegment: function () {\n\n\t\t\tvar segCenter = new Vector3();\n\t\t\tvar segDir = new Vector3();\n\t\t\tvar diff = new Vector3();\n\n\t\t\treturn function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t\t\t// It returns the min distance between the ray and the segment\n\t\t\t\t// defined by v0 and v1\n\t\t\t\t// It can also set two optional targets :\n\t\t\t\t// - The closest point on the ray\n\t\t\t\t// - The closest point on the segment\n\n\t\t\t\tsegCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t\t\tsegDir.copy( v1 ).sub( v0 ).normalize();\n\t\t\t\tdiff.copy( this.origin ).sub( segCenter );\n\n\t\t\t\tvar segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\t\t\tvar a01 = - this.direction.dot( segDir );\n\t\t\t\tvar b0 = diff.dot( this.direction );\n\t\t\t\tvar b1 = - diff.dot( segDir );\n\t\t\t\tvar c = diff.lengthSq();\n\t\t\t\tvar det = Math.abs( 1 - a01 * a01 );\n\t\t\t\tvar s0, s1, sqrDist, extDet;\n\n\t\t\t\tif ( det > 0 ) {\n\n\t\t\t\t\t// The ray and segment are not parallel.\n\n\t\t\t\t\ts0 = a01 * b1 - b0;\n\t\t\t\t\ts1 = a01 * b0 - b1;\n\t\t\t\t\textDet = segExtent * det;\n\n\t\t\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\t\t\tvar invDet = 1 / det;\n\t\t\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\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\t// region 5\n\n\t\t\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t\t\t// region 4\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t// region 3\n\n\t\t\t\t\t\t\ts0 = 0;\n\t\t\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 2\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Ray and segment are parallel.\n\n\t\t\t\t\ts1 = ( a01 > 0 ) ? - segExtent : 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\tif ( optionalPointOnRay ) {\n\n\t\t\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnSegment ) {\n\n\t\t\t\t\toptionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter );\n\n\t\t\t\t}\n\n\t\t\t\treturn sqrDist;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectSphere( sphere, optionalTarget ) {\n\n\t\t\t\tv1.subVectors( sphere.center, this.origin );\n\t\t\t\tvar tca = v1.dot( this.direction );\n\t\t\t\tvar d2 = v1.dot( v1 ) - tca * tca;\n\t\t\t\tvar radius2 = sphere.radius * sphere.radius;\n\n\t\t\t\tif ( d2 > radius2 ) return null;\n\n\t\t\t\tvar thc = Math.sqrt( radius2 - d2 );\n\n\t\t\t\t// t0 = first intersect point - entrance on front of sphere\n\t\t\t\tvar t0 = tca - thc;\n\n\t\t\t\t// t1 = second intersect point - exit point on back of sphere\n\t\t\t\tvar t1 = tca + thc;\n\n\t\t\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\t\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t\t\t// test to see if t0 is behind the ray:\n\t\t\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t\t\t// in order to always return an intersect point that is in front of the ray.\n\t\t\t\tif ( t0 < 0 ) return this.at( t1, optionalTarget );\n\n\t\t\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\t\t\treturn this.at( t0, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) <= sphere.radius;\n\n\t\t},\n\n\t\tdistanceToPlane: function ( plane ) {\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t// line is coplanar, return origin\n\t\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\t\treturn 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t\t// Return if the ray never intersects the plane\n\n\t\t\treturn t >= 0 ? t : null;\n\n\t\t},\n\n\t\tintersectPlane: function ( plane, optionalTarget ) {\n\n\t\t\tvar t = this.distanceToPlane( plane );\n\n\t\t\tif ( t === null ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\treturn this.at( t, optionalTarget );\n\n\t\t},\n\n\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// check if the ray lies on the plane first\n\n\t\t\tvar distToPoint = plane.distanceToPoint( this.origin );\n\n\t\t\tif ( distToPoint === 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tintersectBox: function ( box, optionalTarget ) {\n\n\t\t\tvar tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\t\tvar invdirx = 1 / this.direction.x,\n\t\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\t\tvar origin = this.origin;\n\n\t\t\tif ( invdirx >= 0 ) {\n\n\t\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t\t} else {\n\n\t\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t\t}\n\n\t\t\tif ( invdiry >= 0 ) {\n\n\t\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t\t} else {\n\n\t\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\t\tif ( invdirz >= 0 ) {\n\n\t\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t\t} else {\n\n\t\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t\t//return point closest to the ray (positive side)\n\n\t\t\tif ( tmax < 0 ) return null;\n\n\t\t\treturn this.at( tmin >= 0 ? tmin : tmax, optionalTarget );\n\n\t\t},\n\n\t\tintersectsBox: ( function () {\n\n\t\t\tvar v = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\treturn this.intersectBox( box, v ) !== null;\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectTriangle: function () {\n\n\t\t\t// Compute the offset origin, edges, and normal.\n\t\t\tvar diff = new Vector3();\n\t\t\tvar edge1 = new Vector3();\n\t\t\tvar edge2 = new Vector3();\n\t\t\tvar normal = new Vector3();\n\n\t\t\treturn function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t\t\tedge1.subVectors( b, a );\n\t\t\t\tedge2.subVectors( c, a );\n\t\t\t\tnormal.crossVectors( edge1, edge2 );\n\n\t\t\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\t\t\tvar DdN = this.direction.dot( normal );\n\t\t\t\tvar sign;\n\n\t\t\t\tif ( DdN > 0 ) {\n\n\t\t\t\t\tif ( backfaceCulling ) return null;\n\t\t\t\t\tsign = 1;\n\n\t\t\t\t} else if ( DdN < 0 ) {\n\n\t\t\t\t\tsign = - 1;\n\t\t\t\t\tDdN = - DdN;\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\tdiff.subVectors( this.origin, a );\n\t\t\t\tvar DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) );\n\n\t\t\t\t// b1 < 0, no intersection\n\t\t\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tvar DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) );\n\n\t\t\t\t// b2 < 0, no intersection\n\t\t\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// b1+b2 > 1, no intersection\n\t\t\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Line intersects triangle, check if ray does.\n\t\t\t\tvar QdN = - sign * diff.dot( normal );\n\n\t\t\t\t// t < 0, no intersection\n\t\t\t\tif ( QdN < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Ray intersects triangle.\n\t\t\t\treturn this.at( QdN / DdN, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix4: function ( matrix4 ) {\n\n\t\t\tthis.direction.add( this.origin ).applyMatrix4( matrix4 );\n\t\t\tthis.origin.applyMatrix4( matrix4 );\n\t\t\tthis.direction.sub( this.origin );\n\t\t\tthis.direction.normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( ray ) {\n\n\t\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Euler( x, y, z, order ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._order = order || Euler.DefaultOrder;\n\n\t}\n\n\tEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\n\tEuler.DefaultOrder = 'XYZ';\n\n\tEuler.prototype = {\n\n\t\tconstructor: Euler,\n\n\t\tisEuler: true,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget order () {\n\n\t\t\treturn this._order;\n\n\t\t},\n\n\t\tset order ( value ) {\n\n\t\t\tthis._order = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, order ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._order = order || this._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t\t},\n\n\t\tcopy: function ( euler ) {\n\n\t\t\tthis._x = euler._x;\n\t\t\tthis._y = euler._y;\n\t\t\tthis._z = euler._z;\n\t\t\tthis._order = euler._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m, order, update ) {\n\n\t\t\tvar clamp = _Math.clamp;\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements;\n\t\t\tvar m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\t\tvar m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\t\tvar m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\torder = order || this._order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.99999 ) {\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} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.99999 ) {\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} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.99999 ) {\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} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.99999 ) {\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} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.99999 ) {\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} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.99999 ) {\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} else {\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order );\n\n\t\t\t}\n\n\t\t\tthis._order = order;\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromQuaternion: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function setFromQuaternion( q, order, update ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.makeRotationFromQuaternion( q );\n\n\t\t\t\treturn this.setFromRotationMatrix( matrix, order, update );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromVector3: function ( v, order ) {\n\n\t\t\treturn this.set( v.x, v.y, v.z, order || this._order );\n\n\t\t},\n\n\t\treorder: function () {\n\n\t\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t\tvar q = new Quaternion();\n\n\t\t\treturn function reorder( newOrder ) {\n\n\t\t\t\tq.setFromEuler( this );\n\n\t\t\t\treturn this.setFromQuaternion( q, newOrder );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( euler ) {\n\n\t\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t\t},\n\n\t\tfromArray: function ( array ) {\n\n\t\t\tthis._x = array[ 0 ];\n\t\t\tthis._y = array[ 1 ];\n\t\t\tthis._z = array[ 2 ];\n\t\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._order;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoVector3: function ( optionalResult ) {\n\n\t\t\tif ( optionalResult ) {\n\n\t\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t\t} else {\n\n\t\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t\t}\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Layers() {\n\n\t\tthis.mask = 1;\n\n\t}\n\n\tLayers.prototype = {\n\n\t\tconstructor: Layers,\n\n\t\tset: function ( channel ) {\n\n\t\t\tthis.mask = 1 << channel;\n\n\t\t},\n\n\t\tenable: function ( channel ) {\n\n\t\t\tthis.mask |= 1 << channel;\n\n\t\t},\n\n\t\ttoggle: function ( channel ) {\n\n\t\t\tthis.mask ^= 1 << channel;\n\n\t\t},\n\n\t\tdisable: function ( channel ) {\n\n\t\t\tthis.mask &= ~ ( 1 << channel );\n\n\t\t},\n\n\t\ttest: function ( layers ) {\n\n\t\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author elephantatwork / www.elephantatwork.ch\n\t */\n\n\tfunction Object3D() {\n\n\t\tObject.defineProperty( this, 'id', { value: Object3DIdCount() } );\n\n\t\tthis.uuid = _Math.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.DefaultUp.clone();\n\n\t\tvar position = new Vector3();\n\t\tvar rotation = new Euler();\n\t\tvar quaternion = new Quaternion();\n\t\tvar 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\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\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.DefaultMatrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = false;\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.userData = {};\n\n\t\tthis.onBeforeRender = function(){}; \n\t\tthis.onAfterRender = function(){};\n\n\t}\n\n\tObject3D.DefaultUp = new Vector3( 0, 1, 0 );\n\tObject3D.DefaultMatrixAutoUpdate = true;\n\n\tObject.assign( Object3D.prototype, EventDispatcher.prototype, {\n\n\t\tisObject3D: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tthis.matrix.multiplyMatrices( matrix, this.matrix );\n\n\t\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t\t},\n\n\t\tsetRotationFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t\t},\n\n\t\tsetRotationFromEuler: function ( euler ) {\n\n\t\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t\t},\n\n\t\tsetRotationFromMatrix: function ( m ) {\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t\t},\n\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\t// assumes q is normalized\n\n\t\t\tthis.quaternion.copy( q );\n\n\t\t},\n\n\t\trotateOnAxis: function () {\n\n\t\t\t// rotate object on axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar q1 = new Quaternion();\n\n\t\t\treturn function rotateOnAxis( axis, angle ) {\n\n\t\t\t\tq1.setFromAxisAngle( axis, angle );\n\n\t\t\t\tthis.quaternion.multiply( q1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateOnAxis: function () {\n\n\t\t\t// translate object by distance along axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function translateOnAxis( axis, distance ) {\n\n\t\t\t\tv1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\t\t\tthis.position.add( v1.multiplyScalar( distance ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function translateX( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function translateY( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function translateZ( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlocalToWorld: function ( vector ) {\n\n\t\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t\t},\n\n\t\tworldToLocal: function () {\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function worldToLocal( vector ) {\n\n\t\t\t\treturn vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\t// This routine does not support objects with rotated and/or translated parent(s)\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tm1.lookAt( vector, this.position, this.up );\n\n\t\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tadd: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( object === this ) {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object can't be added as a child of itself.\", object );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( (object && object.isObject3D) ) {\n\n\t\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\t\tobject.parent.remove( object );\n\n\t\t\t\t}\n\n\t\t\t\tobject.parent = this;\n\t\t\t\tobject.dispatchEvent( { type: 'added' } );\n\n\t\t\t\tthis.children.push( object );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object not an instance of THREE.Object3D.\", object );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tremove: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar index = this.children.indexOf( object );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tobject.parent = null;\n\n\t\t\t\tobject.dispatchEvent( { type: 'removed' } );\n\n\t\t\t\tthis.children.splice( index, 1 );\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetObjectById: function ( id ) {\n\n\t\t\treturn this.getObjectByProperty( 'id', id );\n\n\t\t},\n\n\t\tgetObjectByName: function ( name ) {\n\n\t\t\treturn this.getObjectByProperty( 'name', name );\n\n\t\t},\n\n\t\tgetObjectByProperty: function ( name, value ) {\n\n\t\t\tif ( this[ name ] === value ) return this;\n\n\t\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = this.children[ i ];\n\t\t\t\tvar object = child.getObjectByProperty( name, value );\n\n\t\t\t\tif ( object !== undefined ) {\n\n\t\t\t\t\treturn object;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\n\t\t},\n\n\t\tgetWorldPosition: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\treturn result.setFromMatrixPosition( this.matrixWorld );\n\n\t\t},\n\n\t\tgetWorldQuaternion: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar scale = new Vector3();\n\n\t\t\treturn function getWorldQuaternion( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Quaternion();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, result, scale );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldRotation: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldRotation( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Euler();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.setFromQuaternion( quaternion, this.rotation.order, false );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldScale: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldScale( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, result );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldDirection: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.set( 0, 0, 1 ).applyQuaternion( quaternion );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\traycast: function () {},\n\n\t\ttraverse: function ( callback ) {\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverse( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseVisible: function ( callback ) {\n\n\t\t\tif ( this.visible === false ) return;\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseAncestors: function ( callback ) {\n\n\t\t\tvar parent = this.parent;\n\n\t\t\tif ( parent !== null ) {\n\n\t\t\t\tcallback( parent );\n\n\t\t\t\tparent.traverseAncestors( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrix: function () {\n\n\t\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t\t},\n\n\t\tupdateMatrixWorld: function ( force ) {\n\n\t\t\tif ( this.matrixAutoUpdate === true ) this.updateMatrix();\n\n\t\t\tif ( this.matrixWorldNeedsUpdate === true || force === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\t\tforce = true;\n\n\t\t\t}\n\n\t\t\t// update children\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\t// meta is '' when called from JSON.stringify\n\t\t\tvar isRootObject = ( meta === undefined || meta === '' );\n\n\t\t\tvar output = {};\n\n\t\t\t// meta is a hash used to collect geometries, materials.\n\t\t\t// not providing it implies that this is the root object\n\t\t\t// being serialized.\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\t// initialize meta obj\n\t\t\t\tmeta = {\n\t\t\t\t\tgeometries: {},\n\t\t\t\t\tmaterials: {},\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t\toutput.metadata = {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Object',\n\t\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t// standard Object3D serialization\n\n\t\t\tvar object = {};\n\n\t\t\tobject.uuid = this.uuid;\n\t\t\tobject.type = this.type;\n\n\t\t\tif ( this.name !== '' ) object.name = this.name;\n\t\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\t\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\t\tif ( this.visible === false ) object.visible = false;\n\n\t\t\tobject.matrix = this.matrix.toArray();\n\n\t\t\t//\n\n\t\t\tif ( this.geometry !== undefined ) {\n\n\t\t\t\tif ( meta.geometries[ this.geometry.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.geometries[ this.geometry.uuid ] = this.geometry.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.geometry = this.geometry.uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.material !== undefined ) {\n\n\t\t\t\tif ( meta.materials[ this.material.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.materials[ this.material.uuid ] = this.material.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = this.material.uuid;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( this.children.length > 0 ) {\n\n\t\t\t\tobject.children = [];\n\n\t\t\t\tfor ( var i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\tvar geometries = extractFromCache( meta.geometries );\n\t\t\t\tvar materials = extractFromCache( meta.materials );\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\t\tif ( images.length > 0 ) output.images = images;\n\n\t\t\t}\n\n\t\t\toutput.object = object;\n\n\t\t\treturn output;\n\n\t\t\t// extract data from the cache hash\n\t\t\t// remove metadata on each item\n\t\t\t// and return as array\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function ( recursive ) {\n\n\t\t\treturn new this.constructor().copy( this, recursive );\n\n\t\t},\n\n\t\tcopy: function ( source, recursive ) {\n\n\t\t\tif ( recursive === undefined ) recursive = true;\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.up.copy( source.up );\n\n\t\t\tthis.position.copy( source.position );\n\t\t\tthis.quaternion.copy( source.quaternion );\n\t\t\tthis.scale.copy( source.scale );\n\n\t\t\tthis.matrix.copy( source.matrix );\n\t\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\t\tthis.visible = source.visible;\n\n\t\t\tthis.castShadow = source.castShadow;\n\t\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\t\tthis.frustumCulled = source.frustumCulled;\n\t\t\tthis.renderOrder = source.renderOrder;\n\n\t\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\t\tif ( recursive === true ) {\n\n\t\t\t\tfor ( var i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\t\tvar child = source.children[ i ];\n\t\t\t\t\tthis.add( child.clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\tvar count$2 = 0;\n\tfunction Object3DIdCount() { return count$2++; }\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Line3( start, end ) {\n\n\t\tthis.start = ( start !== undefined ) ? start : new Vector3();\n\t\tthis.end = ( end !== undefined ) ? end : new Vector3();\n\n\t}\n\n\tLine3.prototype = {\n\n\t\tconstructor: Line3,\n\n\t\tset: function ( start, end ) {\n\n\t\t\tthis.start.copy( start );\n\t\t\tthis.end.copy( end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( line ) {\n\n\t\t\tthis.start.copy( line.start );\n\t\t\tthis.end.copy( line.end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tdelta: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.subVectors( this.end, this.start );\n\n\t\t},\n\n\t\tdistanceSq: function () {\n\n\t\t\treturn this.start.distanceToSquared( this.end );\n\n\t\t},\n\n\t\tdistance: function () {\n\n\t\t\treturn this.start.distanceTo( this.end );\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tclosestPointToPointParameter: function () {\n\n\t\t\tvar startP = new Vector3();\n\t\t\tvar startEnd = new Vector3();\n\n\t\t\treturn function closestPointToPointParameter( point, clampToLine ) {\n\n\t\t\t\tstartP.subVectors( point, this.start );\n\t\t\t\tstartEnd.subVectors( this.end, this.start );\n\n\t\t\t\tvar startEnd2 = startEnd.dot( startEnd );\n\t\t\t\tvar startEnd_startP = startEnd.dot( startP );\n\n\t\t\t\tvar t = startEnd_startP / startEnd2;\n\n\t\t\t\tif ( clampToLine ) {\n\n\t\t\t\t\tt = _Math.clamp( t, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t\treturn t;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, clampToLine, optionalTarget ) {\n\n\t\t\tvar t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.start.applyMatrix4( matrix );\n\t\t\tthis.end.applyMatrix4( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( line ) {\n\n\t\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Triangle( a, b, c ) {\n\n\t\tthis.a = ( a !== undefined ) ? a : new Vector3();\n\t\tthis.b = ( b !== undefined ) ? b : new Vector3();\n\t\tthis.c = ( c !== undefined ) ? c : new Vector3();\n\n\t}\n\n\tTriangle.normal = function () {\n\n\t\tvar v0 = new Vector3();\n\n\t\treturn function normal( a, b, c, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.subVectors( c, b );\n\t\t\tv0.subVectors( a, b );\n\t\t\tresult.cross( v0 );\n\n\t\t\tvar resultLengthSq = result.lengthSq();\n\t\t\tif ( resultLengthSq > 0 ) {\n\n\t\t\t\treturn result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) );\n\n\t\t\t}\n\n\t\t\treturn result.set( 0, 0, 0 );\n\n\t\t};\n\n\t}();\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tTriangle.barycoordFromPoint = function () {\n\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function barycoordFromPoint( point, a, b, c, optionalTarget ) {\n\n\t\t\tv0.subVectors( c, a );\n\t\t\tv1.subVectors( b, a );\n\t\t\tv2.subVectors( point, a );\n\n\t\t\tvar dot00 = v0.dot( v0 );\n\t\t\tvar dot01 = v0.dot( v1 );\n\t\t\tvar dot02 = v0.dot( v2 );\n\t\t\tvar dot11 = v1.dot( v1 );\n\t\t\tvar dot12 = v1.dot( v2 );\n\n\t\t\tvar denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t// collinear or singular triangle\n\t\t\tif ( denom === 0 ) {\n\n\t\t\t\t// arbitrary location outside of triangle?\n\t\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\t\treturn result.set( - 2, - 1, - 1 );\n\n\t\t\t}\n\n\t\t\tvar invDenom = 1 / denom;\n\t\t\tvar u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\t\tvar v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t\t// barycentric coordinates must always sum to 1\n\t\t\treturn result.set( 1 - u - v, v, u );\n\n\t\t};\n\n\t}();\n\n\tTriangle.containsPoint = function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function containsPoint( point, a, b, c ) {\n\n\t\t\tvar result = Triangle.barycoordFromPoint( point, a, b, c, v1 );\n\n\t\t\treturn ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 );\n\n\t\t};\n\n\t}();\n\n\tTriangle.prototype = {\n\n\t\tconstructor: Triangle,\n\n\t\tset: function ( a, b, c ) {\n\n\t\t\tthis.a.copy( a );\n\t\t\tthis.b.copy( b );\n\t\t\tthis.c.copy( c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPointsAndIndices: function ( points, i0, i1, i2 ) {\n\n\t\t\tthis.a.copy( points[ i0 ] );\n\t\t\tthis.b.copy( points[ i1 ] );\n\t\t\tthis.c.copy( points[ i2 ] );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( triangle ) {\n\n\t\t\tthis.a.copy( triangle.a );\n\t\t\tthis.b.copy( triangle.b );\n\t\t\tthis.c.copy( triangle.c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tarea: function () {\n\n\t\t\tvar v0 = new Vector3();\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function area() {\n\n\t\t\t\tv0.subVectors( this.c, this.b );\n\t\t\t\tv1.subVectors( this.a, this.b );\n\n\t\t\t\treturn v0.cross( v1 ).length() * 0.5;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmidpoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t\t},\n\n\t\tnormal: function ( optionalTarget ) {\n\n\t\t\treturn Triangle.normal( this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tplane: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Plane();\n\n\t\t\treturn result.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t\t},\n\n\t\tbarycoordFromPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t\t},\n\n\t\tclosestPointToPoint: function () {\n\n\t\t\tvar plane, edgeList, projectedPoint, closestPoint;\n\n\t\t\treturn function closestPointToPoint( point, optionalTarget ) {\n\n\t\t\t\tif ( plane === undefined ) {\n\n\t\t\t\t\tplane = new Plane();\n\t\t\t\t\tedgeList = [ new Line3(), new Line3(), new Line3() ];\n\t\t\t\t\tprojectedPoint = new Vector3();\n\t\t\t\t\tclosestPoint = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\t\tvar minDistance = Infinity;\n\n\t\t\t\t// project the point onto the plane of the triangle\n\n\t\t\t\tplane.setFromCoplanarPoints( this.a, this.b, this.c );\n\t\t\t\tplane.projectPoint( point, projectedPoint );\n\n\t\t\t\t// check if the projection lies within the triangle\n\n\t\t\t\tif( this.containsPoint( projectedPoint ) === true ) {\n\n\t\t\t\t\t// if so, this is the closest point\n\n\t\t\t\t\tresult.copy( projectedPoint );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// if not, the point falls outside the triangle. the result is the closest point to the triangle's edges or vertices\n\n\t\t\t\t\tedgeList[ 0 ].set( this.a, this.b );\n\t\t\t\t\tedgeList[ 1 ].set( this.b, this.c );\n\t\t\t\t\tedgeList[ 2 ].set( this.c, this.a );\n\n\t\t\t\t\tfor( var i = 0; i < edgeList.length; i ++ ) {\n\n\t\t\t\t\t\tedgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint );\n\n\t\t\t\t\t\tvar distance = projectedPoint.distanceToSquared( closestPoint );\n\n\t\t\t\t\t\tif( distance < minDistance ) {\n\n\t\t\t\t\t\t\tminDistance = distance;\n\n\t\t\t\t\t\t\tresult.copy( closestPoint );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( triangle ) {\n\n\t\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Face3( a, b, c, normal, color, materialIndex ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t\tthis.normal = (normal && normal.isVector3) ? normal : new Vector3();\n\t\tthis.vertexNormals = Array.isArray( normal ) ? normal : [];\n\n\t\tthis.color = (color && color.isColor) ? color : new Color();\n\t\tthis.vertexColors = Array.isArray( color ) ? color : [];\n\n\t\tthis.materialIndex = materialIndex !== undefined ? materialIndex : 0;\n\n\t}\n\n\tFace3.prototype = {\n\n\t\tconstructor: Face3,\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.a = source.a;\n\t\t\tthis.b = source.b;\n\t\t\tthis.c = source.c;\n\n\t\t\tthis.normal.copy( source.normal );\n\t\t\tthis.color.copy( source.color );\n\n\t\t\tthis.materialIndex = source.materialIndex;\n\n\t\t\tfor ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexNormals[ i ] = source.vertexNormals[ i ].clone();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexColors[ i ] = source.vertexColors[ i ].clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * shading: THREE.SmoothShading,\n\t * depthTest: ,\n\t * depthWrite: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: \n\t * }\n\t */\n\n\tfunction MeshBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\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.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.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshBasicMaterial.prototype = Object.create( Material.prototype );\n\tMeshBasicMaterial.prototype.constructor = MeshBasicMaterial;\n\n\tMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\n\tMeshBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\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.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferAttribute( array, itemSize, normalized ) {\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.uuid = _Math.generateUUID();\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 === true;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t}\n\n\tBufferAttribute.prototype = {\n\n\t\tconstructor: BufferAttribute,\n\n\t\tisBufferAttribute: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.itemSize : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.itemSize = source.itemSize;\n\t\t\tthis.count = source.count;\n\t\t\tthis.normalized = source.normalized;\n\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.itemSize;\n\t\t\tindex2 *= attribute.itemSize;\n\n\t\t\tfor ( var i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyArray: function ( array ) {\n\n\t\t\tthis.array.set( array );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyColorsArray: function ( colors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\t\tvar color = colors[ i ];\n\n\t\t\t\tif ( color === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\t\tcolor = new Color();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = color.r;\n\t\t\t\tarray[ offset ++ ] = color.g;\n\t\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyIndicesArray: function ( indices ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tvar index = indices[ i ];\n\n\t\t\t\tarray[ offset ++ ] = index.a;\n\t\t\t\tarray[ offset ++ ] = index.b;\n\t\t\t\tarray[ offset ++ ] = index.c;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector2sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector3sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector4sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize ];\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\t\t\tthis.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Int8Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Int8Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint8Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint8Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint8ClampedAttribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint8ClampedArray( array ), itemSize );\n\n\t}\n\n\tfunction Int16Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Int16Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint16Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint16Array( array ), itemSize );\n\n\t}\n\n\tfunction Int32Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Int32Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint32Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint32Array( array ), itemSize );\n\n\t}\n\n\tfunction Float32Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Float32Array( array ), itemSize );\n\n\t}\n\n\tfunction Float64Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Float64Array( array ), itemSize );\n\n\t}\n\n\t// Deprecated\n\n\tfunction DynamicBufferAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' );\n\t\treturn new BufferAttribute( array, itemSize ).setDynamic( true );\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author kile / http://kile.stravaganza.org/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Geometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Geometry';\n\n\t\tthis.vertices = [];\n\t\tthis.colors = [];\n\t\tthis.faces = [];\n\t\tthis.faceVertexUvs = [ [] ];\n\n\t\tthis.morphTargets = [];\n\t\tthis.morphNormals = [];\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\tthis.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.elementsNeedUpdate = false;\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.lineDistancesNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tObject.assign( Geometry.prototype, EventDispatcher.prototype, {\n\n\t\tisGeometry: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tfor ( var i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertex.applyMatrix4( matrix );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\t\t\t\tface.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tface.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\tthis.verticesNeedUpdate = true;\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfromBufferGeometry: function ( geometry ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar indices = geometry.index !== null ? geometry.index.array : undefined;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tvar positions = attributes.position.array;\n\t\t\tvar normals = attributes.normal !== undefined ? attributes.normal.array : undefined;\n\t\t\tvar colors = attributes.color !== undefined ? attributes.color.array : undefined;\n\t\t\tvar uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;\n\t\t\tvar uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;\n\n\t\t\tif ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = [];\n\n\t\t\tvar tempNormals = [];\n\t\t\tvar tempUVs = [];\n\t\t\tvar tempUVs2 = [];\n\n\t\t\tfor ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {\n\n\t\t\t\tscope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) );\n\n\t\t\t\tif ( normals !== undefined ) {\n\n\t\t\t\t\ttempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( colors !== undefined ) {\n\n\t\t\t\t\tscope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\ttempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\ttempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction addFace( a, b, c, materialIndex ) {\n\n\t\t\t\tvar vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : [];\n\t\t\t\tvar vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : [];\n\n\t\t\t\tvar face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );\n\n\t\t\t\tscope.faces.push( face );\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( indices !== undefined ) {\n\n\t\t\t\tvar groups = geometry.groups;\n\n\t\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\t\tfor ( var i = 0; i < groups.length; i ++ ) {\n\n\t\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\taddFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t\t\taddFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( var i = 0; i < positions.length / 3; i += 3 ) {\n\n\t\t\t\t\taddFace( i, i + 1, i + 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t\tvar center = this.boundingSphere.center;\n\t\t\tvar radius = this.boundingSphere.radius;\n\n\t\t\tvar s = radius === 0 ? 1 : 1.0 / radius;\n\n\t\t\tvar matrix = new Matrix4();\n\t\t\tmatrix.set(\n\t\t\t\ts, 0, 0, - s * center.x,\n\t\t\t\t0, s, 0, - s * center.y,\n\t\t\t\t0, 0, s, - s * center.z,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\tthis.applyMatrix( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\tfor ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tvar face = this.faces[ f ];\n\n\t\t\t\tvar vA = this.vertices[ face.a ];\n\t\t\t\tvar vB = this.vertices[ face.b ];\n\t\t\t\tvar vC = this.vertices[ face.c ];\n\n\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\tcb.cross( ab );\n\n\t\t\t\tcb.normalize();\n\n\t\t\t\tface.normal.copy( cb );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeVertexNormals: function ( areaWeighted ) {\n\n\t\t\tif ( areaWeighted === undefined ) areaWeighted = true;\n\n\t\t\tvar v, vl, f, fl, face, vertices;\n\n\t\t\tvertices = new Array( this.vertices.length );\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ] = new Vector3();\n\n\t\t\t}\n\n\t\t\tif ( areaWeighted ) {\n\n\t\t\t\t// vertex normals weighted by triangle areas\n\t\t\t\t// http://www.iquilezles.org/www/articles/normals/normals.htm\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvA = this.vertices[ face.a ];\n\t\t\t\t\tvB = this.vertices[ face.b ];\n\t\t\t\t\tvC = this.vertices[ face.c ];\n\n\t\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tvertices[ face.a ].add( cb );\n\t\t\t\t\tvertices[ face.b ].add( cb );\n\t\t\t\t\tvertices[ face.c ].add( cb );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.computeFaceNormals();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvertices[ face.a ].add( face.normal );\n\t\t\t\t\tvertices[ face.b ].add( face.normal );\n\t\t\t\t\tvertices[ face.c ].add( face.normal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ].normalize();\n\n\t\t\t}\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( vertices[ face.a ] );\n\t\t\t\t\tvertexNormals[ 1 ].copy( vertices[ face.b ] );\n\t\t\t\t\tvertexNormals[ 2 ].copy( vertices[ face.c ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = vertices[ face.a ].clone();\n\t\t\t\t\tvertexNormals[ 1 ] = vertices[ face.b ].clone();\n\t\t\t\t\tvertexNormals[ 2 ] = vertices[ face.c ].clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeFlatVertexNormals: function () {\n\n\t\t\tvar f, fl, face;\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 1 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 2 ].copy( face.normal );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 1 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 2 ] = face.normal.clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeMorphNormals: function () {\n\n\t\t\tvar i, il, f, fl, face;\n\n\t\t\t// save original normals\n\t\t\t// - create temp variables on first access\n\t\t\t// otherwise just copy (for faster repeated calls)\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tif ( ! face.__originalFaceNormal ) {\n\n\t\t\t\t\tface.__originalFaceNormal = face.normal.clone();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface.__originalFaceNormal.copy( face.normal );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];\n\n\t\t\t\tfor ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\t\tif ( ! face.__originalVertexNormals[ i ] ) {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// use temp geometry to compute face and vertex normals for each morph\n\n\t\t\tvar tmpGeo = new Geometry();\n\t\t\ttmpGeo.faces = this.faces;\n\n\t\t\tfor ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\t// create on first access\n\n\t\t\t\tif ( ! this.morphNormals[ i ] ) {\n\n\t\t\t\t\tthis.morphNormals[ i ] = {};\n\t\t\t\t\tthis.morphNormals[ i ].faceNormals = [];\n\t\t\t\t\tthis.morphNormals[ i ].vertexNormals = [];\n\n\t\t\t\t\tvar dstNormalsFace = this.morphNormals[ i ].faceNormals;\n\t\t\t\t\tvar dstNormalsVertex = this.morphNormals[ i ].vertexNormals;\n\n\t\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tfaceNormal = new Vector3();\n\t\t\t\t\t\tvertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };\n\n\t\t\t\t\t\tdstNormalsFace.push( faceNormal );\n\t\t\t\t\t\tdstNormalsVertex.push( vertexNormals );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar morphNormals = this.morphNormals[ i ];\n\n\t\t\t\t// set vertices to morph target\n\n\t\t\t\ttmpGeo.vertices = this.morphTargets[ i ].vertices;\n\n\t\t\t\t// compute morph normals\n\n\t\t\t\ttmpGeo.computeFaceNormals();\n\t\t\t\ttmpGeo.computeVertexNormals();\n\n\t\t\t\t// store morph normals\n\n\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tfaceNormal = morphNormals.faceNormals[ f ];\n\t\t\t\t\tvertexNormals = morphNormals.vertexNormals[ f ];\n\n\t\t\t\t\tfaceNormal.copy( face.normal );\n\n\t\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\n\t\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\n\t\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore original normals\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tface.normal = face.__originalFaceNormal;\n\t\t\t\tface.vertexNormals = face.__originalVertexNormals;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeTangents: function () {\n\n\t\t\tconsole.warn( 'THREE.Geometry: .computeTangents() has been removed.' );\n\n\t\t},\n\n\t\tcomputeLineDistances: function () {\n\n\t\t\tvar d = 0;\n\t\t\tvar vertices = this.vertices;\n\n\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tif ( i > 0 ) {\n\n\t\t\t\t\td += vertices[ i ].distanceTo( vertices[ i - 1 ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.lineDistances[ i ] = d;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tthis.boundingBox.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tmerge: function ( geometry, matrix, materialIndexOffset ) {\n\n\t\t\tif ( (geometry && geometry.isGeometry) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar normalMatrix,\n\t\t\tvertexOffset = this.vertices.length,\n\t\t\tvertices1 = this.vertices,\n\t\t\tvertices2 = geometry.vertices,\n\t\t\tfaces1 = this.faces,\n\t\t\tfaces2 = geometry.faces,\n\t\t\tuvs1 = this.faceVertexUvs[ 0 ],\n\t\t\tuvs2 = geometry.faceVertexUvs[ 0 ],\n\t\t\tcolors1 = this.colors,\n\t\t\tcolors2 = geometry.colors;\n\n\t\t\tif ( materialIndexOffset === undefined ) materialIndexOffset = 0;\n\n\t\t\tif ( matrix !== undefined ) {\n\n\t\t\t\tnormalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t}\n\n\t\t\t// vertices\n\n\t\t\tfor ( var i = 0, il = vertices2.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = vertices2[ i ];\n\n\t\t\t\tvar vertexCopy = vertex.clone();\n\n\t\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\n\n\t\t\t\tvertices1.push( vertexCopy );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tfor ( var i = 0, il = colors2.length; i < il; i ++ ) {\n\n\t\t\t\tcolors1.push( colors2[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tfor ( i = 0, il = faces2.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = faces2[ i ], faceCopy, normal, color,\n\t\t\t\tfaceVertexNormals = face.vertexNormals,\n\t\t\t\tfaceVertexColors = face.vertexColors;\n\n\t\t\t\tfaceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );\n\t\t\t\tfaceCopy.normal.copy( face.normal );\n\n\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\tfaceCopy.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tnormal = faceVertexNormals[ j ].clone();\n\n\t\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCopy.vertexNormals.push( normal );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.color.copy( face.color );\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {\n\n\t\t\t\t\tcolor = faceVertexColors[ j ];\n\t\t\t\t\tfaceCopy.vertexColors.push( color.clone() );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\n\n\t\t\t\tfaces1.push( faceCopy );\n\n\t\t\t}\n\n\t\t\t// uvs\n\n\t\t\tfor ( i = 0, il = uvs2.length; i < il; i ++ ) {\n\n\t\t\t\tvar uv = uvs2[ i ], uvCopy = [];\n\n\t\t\t\tif ( uv === undefined ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = uv.length; j < jl; j ++ ) {\n\n\t\t\t\t\tuvCopy.push( uv[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tuvs1.push( uvCopy );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmergeMesh: function ( mesh ) {\n\n\t\t\tif ( (mesh && mesh.isMesh) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tmesh.matrixAutoUpdate && mesh.updateMatrix();\n\n\t\t\tthis.merge( mesh.geometry, mesh.matrix );\n\n\t\t},\n\n\t\t/*\n\t\t * Checks for duplicate vertices with hashmap.\n\t\t * Duplicated vertices are removed\n\t\t * and faces' vertices are updated.\n\t\t */\n\n\t\tmergeVertices: function () {\n\n\t\t\tvar verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n\t\t\tvar unique = [], changes = [];\n\n\t\t\tvar v, key;\n\t\t\tvar precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n\t\t\tvar precision = Math.pow( 10, precisionPoints );\n\t\t\tvar i, il, face;\n\t\t\tvar indices, j, jl;\n\n\t\t\tfor ( i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tv = this.vertices[ i ];\n\t\t\t\tkey = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );\n\n\t\t\t\tif ( verticesMap[ key ] === undefined ) {\n\n\t\t\t\t\tverticesMap[ key ] = i;\n\t\t\t\t\tunique.push( this.vertices[ i ] );\n\t\t\t\t\tchanges[ i ] = unique.length - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\n\t\t\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// if faces are completely degenerate after merging vertices, we\n\t\t\t// have to remove them from the geometry.\n\t\t\tvar faceIndicesToRemove = [];\n\n\t\t\tfor ( i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tface = this.faces[ i ];\n\n\t\t\t\tface.a = changes[ face.a ];\n\t\t\t\tface.b = changes[ face.b ];\n\t\t\t\tface.c = changes[ face.c ];\n\n\t\t\t\tindices = [ face.a, face.b, face.c ];\n\n\t\t\t\tvar dupIndex = - 1;\n\n\t\t\t\t// if any duplicate vertices are found in a Face3\n\t\t\t\t// we have to remove the face as nothing can be saved\n\t\t\t\tfor ( var n = 0; n < 3; n ++ ) {\n\n\t\t\t\t\tif ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {\n\n\t\t\t\t\t\tdupIndex = n;\n\t\t\t\t\t\tfaceIndicesToRemove.push( i );\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\tfor ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\n\n\t\t\t\tvar idx = faceIndicesToRemove[ i ];\n\n\t\t\t\tthis.faces.splice( idx, 1 );\n\n\t\t\t\tfor ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ j ].splice( idx, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Use unique set of vertices\n\n\t\t\tvar diff = this.vertices.length - unique.length;\n\t\t\tthis.vertices = unique;\n\t\t\treturn diff;\n\n\t\t},\n\n\t\tsortFacesByMaterialIndex: function () {\n\n\t\t\tvar faces = this.faces;\n\t\t\tvar length = faces.length;\n\n\t\t\t// tag faces\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tfaces[ i ]._id = i;\n\n\t\t\t}\n\n\t\t\t// sort faces\n\n\t\t\tfunction materialIndexSort( a, b ) {\n\n\t\t\t\treturn a.materialIndex - b.materialIndex;\n\n\t\t\t}\n\n\t\t\tfaces.sort( materialIndexSort );\n\n\t\t\t// sort uvs\n\n\t\t\tvar uvs1 = this.faceVertexUvs[ 0 ];\n\t\t\tvar uvs2 = this.faceVertexUvs[ 1 ];\n\n\t\t\tvar newUvs1, newUvs2;\n\n\t\t\tif ( uvs1 && uvs1.length === length ) newUvs1 = [];\n\t\t\tif ( uvs2 && uvs2.length === length ) newUvs2 = [];\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tvar id = faces[ i ]._id;\n\n\t\t\t\tif ( newUvs1 ) newUvs1.push( uvs1[ id ] );\n\t\t\t\tif ( newUvs2 ) newUvs2.push( uvs2[ id ] );\n\n\t\t\t}\n\n\t\t\tif ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;\n\t\t\tif ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Geometry',\n\t\t\t\t\tgenerator: 'Geometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Geometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tvar vertices = [];\n\n\t\t\tfor ( var i = 0; i < this.vertices.length; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t\tvar faces = [];\n\t\t\tvar normals = [];\n\t\t\tvar normalsHash = {};\n\t\t\tvar colors = [];\n\t\t\tvar colorsHash = {};\n\t\t\tvar uvs = [];\n\t\t\tvar uvsHash = {};\n\n\t\t\tfor ( var i = 0; i < this.faces.length; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\n\t\t\t\tvar hasMaterial = true;\n\t\t\t\tvar hasFaceUv = false; // deprecated\n\t\t\t\tvar hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;\n\t\t\t\tvar hasFaceNormal = face.normal.length() > 0;\n\t\t\t\tvar hasFaceVertexNormal = face.vertexNormals.length > 0;\n\t\t\t\tvar hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;\n\t\t\t\tvar hasFaceVertexColor = face.vertexColors.length > 0;\n\n\t\t\t\tvar faceType = 0;\n\n\t\t\t\tfaceType = setBit( faceType, 0, 0 ); // isQuad\n\t\t\t\tfaceType = setBit( faceType, 1, hasMaterial );\n\t\t\t\tfaceType = setBit( faceType, 2, hasFaceUv );\n\t\t\t\tfaceType = setBit( faceType, 3, hasFaceVertexUv );\n\t\t\t\tfaceType = setBit( faceType, 4, hasFaceNormal );\n\t\t\t\tfaceType = setBit( faceType, 5, hasFaceVertexNormal );\n\t\t\t\tfaceType = setBit( faceType, 6, hasFaceColor );\n\t\t\t\tfaceType = setBit( faceType, 7, hasFaceVertexColor );\n\n\t\t\t\tfaces.push( faceType );\n\t\t\t\tfaces.push( face.a, face.b, face.c );\n\t\t\t\tfaces.push( face.materialIndex );\n\n\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\tvar faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 0 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 1 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\tfaces.push( getNormalIndex( face.normal ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 0 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 1 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\tfaces.push( getColorIndex( face.color ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 0 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 1 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction setBit( value, position, enabled ) {\n\n\t\t\t\treturn enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );\n\n\t\t\t}\n\n\t\t\tfunction getNormalIndex( normal ) {\n\n\t\t\t\tvar hash = normal.x.toString() + normal.y.toString() + normal.z.toString();\n\n\t\t\t\tif ( normalsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tnormalsHash[ hash ] = normals.length / 3;\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getColorIndex( color ) {\n\n\t\t\t\tvar hash = color.r.toString() + color.g.toString() + color.b.toString();\n\n\t\t\t\tif ( colorsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tcolorsHash[ hash ] = colors.length;\n\t\t\t\tcolors.push( color.getHex() );\n\n\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getUvIndex( uv ) {\n\n\t\t\t\tvar hash = uv.x.toString() + uv.y.toString();\n\n\t\t\t\tif ( uvsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tuvsHash[ hash ] = uvs.length / 2;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tdata.data = {};\n\n\t\t\tdata.data.vertices = vertices;\n\t\t\tdata.data.normals = normals;\n\t\t\tif ( colors.length > 0 ) data.data.colors = colors;\n\t\t\tif ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility\n\t\t\tdata.data.faces = faces;\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new Geometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.vertices = [];\n\t\t\tthis.faces = [];\n\t\t\tthis.faceVertexUvs = [ [] ];\n\t\t\tthis.colors = [];\n\n\t\t\tvar vertices = source.vertices;\n\n\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertices.push( vertices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tvar colors = source.colors;\n\n\t\t\tfor ( var i = 0, il = colors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.colors.push( colors[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tvar faces = source.faces;\n\n\t\t\tfor ( var i = 0, il = faces.length; i < il; i ++ ) {\n\n\t\t\t\tthis.faces.push( faces[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\t\t\tvar faceVertexUvs = source.faceVertexUvs[ i ];\n\n\t\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar uvs = faceVertexUvs[ j ], uvsCopy = [];\n\n\t\t\t\t\tfor ( var k = 0, kl = uvs.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tvar uv = uvs[ k ];\n\n\t\t\t\t\t\tuvsCopy.push( uv.clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\tvar count$3 = 0;\n\tfunction GeometryIdCount() { return count$3++; }\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectGeometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'DirectGeometry';\n\n\t\tthis.indices = [];\n\t\tthis.vertices = [];\n\t\tthis.normals = [];\n\t\tthis.colors = [];\n\t\tthis.uvs = [];\n\t\tthis.uvs2 = [];\n\n\t\tthis.groups = [];\n\n\t\tthis.morphTargets = {};\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\t// this.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tObject.assign( DirectGeometry.prototype, EventDispatcher.prototype, {\n\n\t\tcomputeBoundingBox: Geometry.prototype.computeBoundingBox,\n\t\tcomputeBoundingSphere: Geometry.prototype.computeBoundingSphere,\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\tconsole.warn( 'THREE.DirectGeometry: computeFaceNormals() is not a method of this type of geometry.' );\n\n\t\t},\n\n\t\tcomputeVertexNormals: function () {\n\n\t\t\tconsole.warn( 'THREE.DirectGeometry: computeVertexNormals() is not a method of this type of geometry.' );\n\n\t\t},\n\n\t\tcomputeGroups: function ( geometry ) {\n\n\t\t\tvar group;\n\t\t\tvar groups = [];\n\t\t\tvar materialIndex;\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t// materials\n\n\t\t\t\tif ( face.materialIndex !== materialIndex ) {\n\n\t\t\t\t\tmaterialIndex = face.materialIndex;\n\n\t\t\t\t\tif ( group !== undefined ) {\n\n\t\t\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\t\t\tgroups.push( group );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgroup = {\n\t\t\t\t\t\tstart: i * 3,\n\t\t\t\t\t\tmaterialIndex: materialIndex\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( group !== undefined ) {\n\n\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\tgroups.push( group );\n\n\t\t\t}\n\n\t\t\tthis.groups = groups;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tvar faces = geometry.faces;\n\t\t\tvar vertices = geometry.vertices;\n\t\t\tvar faceVertexUvs = geometry.faceVertexUvs;\n\n\t\t\tvar hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;\n\t\t\tvar hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;\n\n\t\t\t// morphs\n\n\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\tvar morphTargetsLength = morphTargets.length;\n\n\t\t\tvar morphTargetsPosition;\n\n\t\t\tif ( morphTargetsLength > 0 ) {\n\n\t\t\t\tmorphTargetsPosition = [];\n\n\t\t\t\tfor ( var i = 0; i < morphTargetsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsPosition[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.position = morphTargetsPosition;\n\n\t\t\t}\n\n\t\t\tvar morphNormals = geometry.morphNormals;\n\t\t\tvar morphNormalsLength = morphNormals.length;\n\n\t\t\tvar morphTargetsNormal;\n\n\t\t\tif ( morphNormalsLength > 0 ) {\n\n\t\t\t\tmorphTargetsNormal = [];\n\n\t\t\t\tfor ( var i = 0; i < morphNormalsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsNormal[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.normal = morphTargetsNormal;\n\n\t\t\t}\n\n\t\t\t// skins\n\n\t\t\tvar skinIndices = geometry.skinIndices;\n\t\t\tvar skinWeights = geometry.skinWeights;\n\n\t\t\tvar hasSkinIndices = skinIndices.length === vertices.length;\n\t\t\tvar hasSkinWeights = skinWeights.length === vertices.length;\n\n\t\t\t//\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tthis.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tthis.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar normal = face.normal;\n\n\t\t\t\t\tthis.normals.push( normal, normal, normal );\n\n\t\t\t\t}\n\n\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\tif ( vertexColors.length === 3 ) {\n\n\t\t\t\t\tthis.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar color = face.color;\n\n\t\t\t\t\tthis.colors.push( color, color, color );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );\n\n\t\t\t\t\t\tthis.uvs.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv2 === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 1 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );\n\n\t\t\t\t\t\tthis.uvs2.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// morphs\n\n\t\t\t\tfor ( var j = 0; j < morphTargetsLength; j ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ j ].vertices;\n\n\t\t\t\t\tmorphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0; j < morphNormalsLength; j ++ ) {\n\n\t\t\t\t\tvar morphNormal = morphNormals[ j ].vertexNormals[ i ];\n\n\t\t\t\t\tmorphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );\n\n\t\t\t\t}\n\n\t\t\t\t// skins\n\n\t\t\t\tif ( hasSkinIndices ) {\n\n\t\t\t\t\tthis.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasSkinWeights ) {\n\n\t\t\t\t\tthis.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeGroups( geometry );\n\n\t\t\tthis.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.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\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}\n\n\tObject.assign( BufferGeometry.prototype, EventDispatcher.prototype, {\n\n\t\tisBufferGeometry: true,\n\n\t\tgetIndex: function () {\n\n\t\t\treturn this.index;\n\n\t\t},\n\n\t\tsetIndex: function ( index ) {\n\n\t\t\tthis.index = index;\n\n\t\t},\n\n\t\taddAttribute: function ( name, attribute ) {\n\n\t\t\tif ( (attribute && attribute.isBufferAttribute) === false && (attribute && attribute.isInterleavedBufferAttribute) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\n\n\t\t\t\tthis.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( name === 'index' ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\n\t\t\t\tthis.setIndex( attribute );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.attributes[ name ] = attribute;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetAttribute: function ( name ) {\n\n\t\t\treturn this.attributes[ name ];\n\n\t\t},\n\n\t\tremoveAttribute: function ( name ) {\n\n\t\t\tdelete this.attributes[ name ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddGroup: function ( start, count, materialIndex ) {\n\n\t\t\tthis.groups.push( {\n\n\t\t\t\tstart: start,\n\t\t\t\tcount: count,\n\t\t\t\tmaterialIndex: materialIndex !== undefined ? materialIndex : 0\n\n\t\t\t} );\n\n\t\t},\n\n\t\tclearGroups: function () {\n\n\t\t\tthis.groups = [];\n\n\t\t},\n\n\t\tsetDrawRange: function ( start, count ) {\n\n\t\t\tthis.drawRange.start = start;\n\t\t\tthis.drawRange.count = count;\n\n\t\t},\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tmatrix.applyToVector3Array( position.array );\n\t\t\t\tposition.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tvar normal = this.attributes.normal;\n\n\t\t\tif ( normal !== undefined ) {\n\n\t\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t\tnormalMatrix.applyToVector3Array( normal.array );\n\t\t\t\tnormal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\t// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( (object && object.isPoints) || (object && object.isLine) ) {\n\n\t\t\t\tvar positions = new Float32Attribute( geometry.vertices.length * 3, 3 );\n\t\t\t\tvar colors = new Float32Attribute( geometry.colors.length * 3, 3 );\n\n\t\t\t\tthis.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\n\t\t\t\tthis.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\n\n\t\t\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\n\n\t\t\t\t\tvar lineDistances = new Float32Attribute( geometry.lineDistances.length, 1 );\n\n\t\t\t\t\tthis.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( (object && object.isMesh) ) {\n\n\t\t\t\tif ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\tthis.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateFromObject: function ( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( (object && object.isMesh) ) {\n\n\t\t\t\tvar direct = geometry.__directGeometry;\n\n\t\t\t\tif ( geometry.elementsNeedUpdate === true ) {\n\n\t\t\t\t\tdirect = undefined;\n\t\t\t\t\tgeometry.elementsNeedUpdate = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( direct === undefined ) {\n\n\t\t\t\t\treturn this.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t\tdirect.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\t\tdirect.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\t\tdirect.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\t\tdirect.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\t\tdirect.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t\tgeometry = direct;\n\n\t\t\t}\n\n\t\t\tvar attribute;\n\n\t\t\tif ( geometry.verticesNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.position;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.vertices );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.normalsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.normal;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.normals );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.colorsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.color;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyColorsArray( geometry.colors );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvsNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.uv;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector2sArray( geometry.uvs );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.lineDistancesNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.lineDistance;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyArray( geometry.lineDistances );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.lineDistancesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.groupsNeedUpdate ) {\n\n\t\t\t\tgeometry.computeGroups( object.geometry );\n\t\t\t\tthis.groups = geometry.groups;\n\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tgeometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );\n\n\t\t\treturn this.fromDirectGeometry( geometry.__directGeometry );\n\n\t\t},\n\n\t\tfromDirectGeometry: function ( geometry ) {\n\n\t\t\tvar positions = new Float32Array( geometry.vertices.length * 3 );\n\t\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );\n\n\t\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\t\tvar normals = new Float32Array( geometry.normals.length * 3 );\n\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\t\tvar colors = new Float32Array( geometry.colors.length * 3 );\n\t\t\t\tthis.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs.length > 0 ) {\n\n\t\t\t\tvar uvs = new Float32Array( geometry.uvs.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs2.length > 0 ) {\n\n\t\t\t\tvar uvs2 = new Float32Array( geometry.uvs2.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.indices.length > 0 ) {\n\n\t\t\t\tvar TypeArray = geometry.vertices.length > 65535 ? Uint32Array : Uint16Array;\n\t\t\t\tvar indices = new TypeArray( geometry.indices.length * 3 );\n\t\t\t\tthis.setIndex( new BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) );\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tthis.groups = geometry.groups;\n\n\t\t\t// morphs\n\n\t\t\tfor ( var name in geometry.morphTargets ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphTargets = geometry.morphTargets[ name ];\n\n\t\t\t\tfor ( var i = 0, l = morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ i ];\n\n\t\t\t\t\tvar attribute = new Float32Attribute( morphTarget.length * 3, 3 );\n\n\t\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// skinning\n\n\t\t\tif ( geometry.skinIndices.length > 0 ) {\n\n\t\t\t\tvar skinIndices = new Float32Attribute( geometry.skinIndices.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.skinWeights.length > 0 ) {\n\n\t\t\t\tvar skinWeights = new Float32Attribute( geometry.skinWeights.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tvar positions = this.attributes.position.array;\n\n\t\t\tif ( positions !== undefined ) {\n\n\t\t\t\tthis.boundingBox.setFromArray( positions );\n\n\t\t\t} else {\n\n\t\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t\t}\n\n\t\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\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\t}\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tvar box = new Box3();\n\t\t\tvar vector = new Vector3();\n\n\t\t\treturn function computeBoundingSphere() {\n\n\t\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t\t}\n\n\t\t\t\tvar positions = this.attributes.position;\n\n\t\t\t\tif ( positions ) {\n\n\t\t\t\t\tvar array = positions.array;\n\t\t\t\t\tvar center = this.boundingSphere.center;\n\n\t\t\t\t\tbox.setFromArray( array );\n\t\t\t\t\tbox.getCenter( center );\n\n\t\t\t\t\t// hoping to find a boundingSphere with a radius smaller than the\n\t\t\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\t\tfor ( var i = 0, il = array.length; i < il; i += 3 ) {\n\n\t\t\t\t\t\tvector.fromArray( array, i );\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\t// backwards compatibility\n\n\t\t},\n\n\t\tcomputeVertexNormals: function () {\n\n\t\t\tvar index = this.index;\n\t\t\tvar attributes = this.attributes;\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( attributes.position ) {\n\n\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\tif ( attributes.normal === undefined ) {\n\n\t\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// reset existing normals to zero\n\n\t\t\t\t\tvar array = attributes.normal.array;\n\n\t\t\t\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tarray[ i ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar normals = attributes.normal.array;\n\n\t\t\t\tvar vA, vB, vC,\n\n\t\t\t\tpA = new Vector3(),\n\t\t\t\tpB = new Vector3(),\n\t\t\t\tpC = new Vector3(),\n\n\t\t\t\tcb = new Vector3(),\n\t\t\t\tab = new Vector3();\n\n\t\t\t\t// indexed elements\n\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\t\tthis.addGroup( 0, indices.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var j = 0, jl = groups.length; j < jl; ++ j ) {\n\n\t\t\t\t\t\tvar group = groups[ j ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\t\tvA = indices[ i + 0 ] * 3;\n\t\t\t\t\t\t\tvB = indices[ i + 1 ] * 3;\n\t\t\t\t\t\t\tvC = indices[ i + 2 ] * 3;\n\n\t\t\t\t\t\t\tpA.fromArray( positions, vA );\n\t\t\t\t\t\t\tpB.fromArray( positions, vB );\n\t\t\t\t\t\t\tpC.fromArray( positions, vC );\n\n\t\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\t\tnormals[ vA ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vA + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vA + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vB ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vB + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vB + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vC ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vC + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vC + 2 ] += cb.z;\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\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\t\tfor ( var i = 0, il = positions.length; i < il; i += 9 ) {\n\n\t\t\t\t\t\tpA.fromArray( positions, i );\n\t\t\t\t\t\tpB.fromArray( positions, i + 3 );\n\t\t\t\t\t\tpC.fromArray( positions, i + 6 );\n\n\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\tnormals[ i ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 1 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 2 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 3 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 4 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 5 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 6 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 7 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 8 ] = cb.z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.normalizeNormals();\n\n\t\t\t\tattributes.normal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tmerge: function ( geometry, offset ) {\n\n\t\t\tif ( (geometry && geometry.isBufferGeometry) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\t\tvar attribute1 = attributes[ key ];\n\t\t\t\tvar attributeArray1 = attribute1.array;\n\n\t\t\t\tvar attribute2 = geometry.attributes[ key ];\n\t\t\t\tvar attributeArray2 = attribute2.array;\n\n\t\t\t\tvar attributeSize = attribute2.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) {\n\n\t\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalizeNormals: function () {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\n\t\t\tvar x, y, z, n;\n\n\t\t\tfor ( var i = 0, il = normals.length; i < il; i += 3 ) {\n\n\t\t\t\tx = normals[ i ];\n\t\t\t\ty = normals[ i + 1 ];\n\t\t\t\tz = normals[ i + 2 ];\n\n\t\t\t\tn = 1.0 / Math.sqrt( x * x + y * y + z * z );\n\n\t\t\t\tnormals[ i ] *= n;\n\t\t\t\tnormals[ i + 1 ] *= n;\n\t\t\t\tnormals[ i + 2 ] *= n;\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoNonIndexed: function () {\n\n\t\t\tif ( this.index === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar geometry2 = new BufferGeometry();\n\n\t\t\tvar indices = this.index.array;\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\n\t\t\t\tvar array = attribute.array;\n\t\t\t\tvar itemSize = attribute.itemSize;\n\n\t\t\t\tvar array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\t\tvar index = 0, index2 = 0;\n\n\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t\tfor ( var j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) );\n\n\t\t\t}\n\n\t\t\treturn geometry2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard BufferGeometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tdata.data = { attributes: {} };\n\n\t\t\tvar index = this.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar array = Array.prototype.slice.call( index.array );\n\n\t\t\t\tdata.data.index = {\n\t\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\t\tarray: array\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\n\t\t\t\tvar array = Array.prototype.slice.call( attribute.array );\n\n\t\t\t\tdata.data.attributes[ key ] = {\n\t\t\t\t\titemSize: attribute.itemSize,\n\t\t\t\t\ttype: attribute.array.constructor.name,\n\t\t\t\t\tarray: array,\n\t\t\t\t\tnormalized: attribute.normalized\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = this.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tdata.data.boundingSphere = {\n\t\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\t\tradius: boundingSphere.radius\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new BufferGeometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar index = source.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tthis.setIndex( index.clone() );\n\n\t\t\t}\n\n\t\t\tvar attributes = source.attributes;\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\t\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t\t}\n\n\t\t\tvar groups = source.groups;\n\n\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\tvar group = groups[ i ];\n\t\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\tBufferGeometry.MaxIndex = 65535;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author jonobr1 / http://jonobr1.com/\n\t */\n\n\tfunction Mesh( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t\tthis.drawMode = TrianglesDrawMode;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tMesh.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Mesh,\n\n\t\tisMesh: true,\n\n\t\tsetDrawMode: function ( value ) {\n\n\t\t\tthis.drawMode = value;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.drawMode = source.drawMode;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateMorphTargets: function () {\n\n\t\t\tvar morphTargets = this.geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( var m = 0, ml = morphTargets.length; m < ml; m ++ ) {\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ morphTargets[ m ].name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\tvar vA = new Vector3();\n\t\t\tvar vB = new Vector3();\n\t\t\tvar vC = new Vector3();\n\n\t\t\tvar tempA = new Vector3();\n\t\t\tvar tempB = new Vector3();\n\t\t\tvar tempC = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tvar barycoord = new Vector3();\n\n\t\t\tvar intersectionPoint = new Vector3();\n\t\t\tvar intersectionPointWorld = new Vector3();\n\n\t\t\tfunction uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) {\n\n\t\t\t\tTriangle.barycoordFromPoint( point, p1, p2, p3, barycoord );\n\n\t\t\t\tuv1.multiplyScalar( barycoord.x );\n\t\t\t\tuv2.multiplyScalar( barycoord.y );\n\t\t\t\tuv3.multiplyScalar( barycoord.z );\n\n\t\t\t\tuv1.add( uv2 ).add( uv3 );\n\n\t\t\t\treturn uv1.clone();\n\n\t\t\t}\n\n\t\t\tfunction checkIntersection( object, raycaster, ray, pA, pB, pC, point ) {\n\n\t\t\t\tvar intersect;\n\t\t\t\tvar material = object.material;\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t\t\t\t}\n\n\t\t\t\tif ( intersect === null ) return null;\n\n\t\t\t\tintersectionPointWorld.copy( point );\n\t\t\t\tintersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\t\t\t\treturn {\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\tpoint: intersectionPointWorld.clone(),\n\t\t\t\t\tobject: object\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tfunction checkBufferGeometryIntersection( object, raycaster, ray, positions, uvs, a, b, c ) {\n\n\t\t\t\tvA.fromArray( positions, a * 3 );\n\t\t\t\tvB.fromArray( positions, b * 3 );\n\t\t\t\tvC.fromArray( positions, c * 3 );\n\n\t\t\t\tvar intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint );\n\n\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\t\tuvA.fromArray( uvs, a * 2 );\n\t\t\t\t\t\tuvB.fromArray( uvs, b * 2 );\n\t\t\t\t\t\tuvC.fromArray( uvs, c * 2 );\n\n\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tintersection.face = new Face3( a, b, c, Triangle.normal( vA, vB, vC ) );\n\t\t\t\t\tintersection.faceIndex = a;\n\n\t\t\t\t}\n\n\t\t\t\treturn intersection;\n\n\t\t\t}\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar material = this.material;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\tif ( material === undefined ) return;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\t// Check boundingBox before continuing\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tif ( ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t\t\t}\n\n\t\t\t\tvar uvs, intersection;\n\n\t\t\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\tvar a, b, c;\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( attributes.uv !== undefined ) {\n\n\t\t\t\t\t\tuvs = attributes.uv.array;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = indices[ i ];\n\t\t\t\t\t\t\tb = indices[ i + 1 ];\n\t\t\t\t\t\t\tc = indices[ i + 2 ];\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\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\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length; i < l; i += 9 ) {\n\n\t\t\t\t\t\t\ta = i / 3;\n\t\t\t\t\t\t\tb = a + 1;\n\t\t\t\t\t\t\tc = a + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.index = a; // triangle number in positions buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\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 if ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\tvar fvA, fvB, fvC;\n\t\t\t\t\tvar isFaceMaterial = (material && material.isMultiMaterial);\n\t\t\t\t\tvar materials = isFaceMaterial === true ? material.materials : null;\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar faceVertexUvs = geometry.faceVertexUvs[ 0 ];\n\t\t\t\t\tif ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;\n\n\t\t\t\t\tfor ( var f = 0, fl = faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tvar face = faces[ f ];\n\t\t\t\t\t\tvar faceMaterial = isFaceMaterial === true ? materials[ face.materialIndex ] : material;\n\n\t\t\t\t\t\tif ( faceMaterial === undefined ) continue;\n\n\t\t\t\t\t\tfvA = vertices[ face.a ];\n\t\t\t\t\t\tfvB = vertices[ face.b ];\n\t\t\t\t\t\tfvC = vertices[ face.c ];\n\n\t\t\t\t\t\tif ( faceMaterial.morphTargets === true ) {\n\n\t\t\t\t\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\t\t\t\t\tvar morphInfluences = this.morphTargetInfluences;\n\n\t\t\t\t\t\t\tvA.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvB.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvC.set( 0, 0, 0 );\n\n\t\t\t\t\t\t\tfor ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {\n\n\t\t\t\t\t\t\t\tvar influence = morphInfluences[ t ];\n\n\t\t\t\t\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t\t\t\t\tvar targets = morphTargets[ t ].vertices;\n\n\t\t\t\t\t\t\t\tvA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence );\n\t\t\t\t\t\t\t\tvB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence );\n\t\t\t\t\t\t\t\tvC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvA.add( fvA );\n\t\t\t\t\t\t\tvB.add( fvB );\n\t\t\t\t\t\t\tvC.add( fvC );\n\n\t\t\t\t\t\t\tfvA = vA;\n\t\t\t\t\t\t\tfvB = vB;\n\t\t\t\t\t\t\tfvC = vC;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tintersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\t\t\t\tvar uvs_f = uvs[ f ];\n\t\t\t\t\t\t\t\tuvA.copy( uvs_f[ 0 ] );\n\t\t\t\t\t\t\t\tuvB.copy( uvs_f[ 1 ] );\n\t\t\t\t\t\t\t\tuvC.copy( uvs_f[ 2 ] );\n\n\t\t\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tintersection.face = face;\n\t\t\t\t\t\t\tintersection.faceIndex = f;\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};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'BoxBufferGeometry';\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\tvar scope = this;\n\n\t\t// segments\n\t\twidthSegments = Math.floor( widthSegments ) || 1;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\t\tdepthSegments = Math.floor( depthSegments ) || 1;\n\n\t\t// these are used to calculate buffer length\n\t\tvar vertexCount = calculateVertexCount( widthSegments, heightSegments, depthSegments );\n\t\tvar indexCount = calculateIndexCount( widthSegments, heightSegments, depthSegments );\n\n\t\t// buffers\n\t\tvar indices = new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount );\n\t\tvar vertices = new Float32Array( vertexCount * 3 );\n\t\tvar normals = new Float32Array( vertexCount * 3 );\n\t\tvar uvs = new Float32Array( vertexCount * 2 );\n\n\t\t// offset variables\n\t\tvar vertexBufferOffset = 0;\n\t\tvar uvBufferOffset = 0;\n\t\tvar indexBufferOffset = 0;\n\t\tvar numberOfVertices = 0;\n\n\t\t// group variables\n\t\tvar groupStart = 0;\n\n\t\t// build each side of the box geometry\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\t\tthis.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t\t// helper functions\n\n\t\tfunction calculateVertexCount( w, h, d ) {\n\n\t\t\tvar vertices = 0;\n\n\t\t\t// calculate the amount of vertices for each side (plane)\n\t\t\tvertices += (w + 1) * (h + 1) * 2; // xy\n\t\t\tvertices += (w + 1) * (d + 1) * 2; // xz\n\t\t\tvertices += (d + 1) * (h + 1) * 2; // zy\n\n\t\t\treturn vertices;\n\n\t\t}\n\n\t\tfunction calculateIndexCount( w, h, d ) {\n\n\t\t\tvar index = 0;\n\n\t\t\t// calculate the amount of squares for each side\n\t\t\tindex += w * h * 2; // xy\n\t\t\tindex += w * d * 2; // xz\n\t\t\tindex += d * h * 2; // zy\n\n\t\t\treturn index * 6; // two triangles per square => six vertices per square\n\n\t\t}\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tvar segmentWidth\t= width / gridX;\n\t\t\tvar segmentHeight = height / gridY;\n\n\t\t\tvar widthHalf = width / 2;\n\t\t\tvar heightHalf = height / 2;\n\t\t\tvar depthHalf = depth / 2;\n\n\t\t\tvar gridX1 = gridX + 1;\n\t\t\tvar gridY1 = gridY + 1;\n\n\t\t\tvar vertexCounter = 0;\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( var iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tvar y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( var ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tvar x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\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\t\t\t\t\tvertices[ vertexBufferOffset ] = vector.x;\n\t\t\t\t\tvertices[ vertexBufferOffset + 1 ] = vector.y;\n\t\t\t\t\tvertices[ vertexBufferOffset + 2 ] = vector.z;\n\n\t\t\t\t\t// set values to correct vector component\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\t\t\t\t\tnormals[ vertexBufferOffset ] = vector.x;\n\t\t\t\t\tnormals[ vertexBufferOffset + 1 ] = vector.y;\n\t\t\t\t\tnormals[ vertexBufferOffset + 2 ] = vector.z;\n\n\t\t\t\t\t// uvs\n\t\t\t\t\tuvs[ uvBufferOffset ] = ix / gridX;\n\t\t\t\t\tuvs[ uvBufferOffset + 1 ] = 1 - ( iy / gridY );\n\n\t\t\t\t\t// update offsets and counters\n\t\t\t\t\tvertexBufferOffset += 3;\n\t\t\t\t\tuvBufferOffset += 2;\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\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 ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\t// indices\n\t\t\t\t\tvar a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tvar b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// face one\n\t\t\t\t\tindices[ indexBufferOffset ] = a;\n\t\t\t\t\tindices[ indexBufferOffset + 1 ] = b;\n\t\t\t\t\tindices[ indexBufferOffset + 2 ] = d;\n\n\t\t\t\t\t// face two\n\t\t\t\t\tindices[ indexBufferOffset + 3 ] = b;\n\t\t\t\t\tindices[ indexBufferOffset + 4 ] = c;\n\t\t\t\t\tindices[ indexBufferOffset + 5 ] = d;\n\n\t\t\t\t\t// update offsets and counters\n\t\t\t\t\tindexBufferOffset += 6;\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\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tBoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tBoxBufferGeometry.prototype.constructor = BoxBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PlaneBufferGeometry';\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\tvar width_half = width / 2;\n\t\tvar height_half = height / 2;\n\n\t\tvar gridX = Math.floor( widthSegments ) || 1;\n\t\tvar gridY = Math.floor( heightSegments ) || 1;\n\n\t\tvar gridX1 = gridX + 1;\n\t\tvar gridY1 = gridY + 1;\n\n\t\tvar segment_width = width / gridX;\n\t\tvar segment_height = height / gridY;\n\n\t\tvar vertices = new Float32Array( gridX1 * gridY1 * 3 );\n\t\tvar normals = new Float32Array( gridX1 * gridY1 * 3 );\n\t\tvar uvs = new Float32Array( gridX1 * gridY1 * 2 );\n\n\t\tvar offset = 0;\n\t\tvar offset2 = 0;\n\n\t\tfor ( var iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tvar y = iy * segment_height - height_half;\n\n\t\t\tfor ( var ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tvar x = ix * segment_width - width_half;\n\n\t\t\t\tvertices[ offset ] = x;\n\t\t\t\tvertices[ offset + 1 ] = - y;\n\n\t\t\t\tnormals[ offset + 2 ] = 1;\n\n\t\t\t\tuvs[ offset2 ] = ix / gridX;\n\t\t\t\tuvs[ offset2 + 1 ] = 1 - ( iy / gridY );\n\n\t\t\t\toffset += 3;\n\t\t\t\toffset2 += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\toffset = 0;\n\n\t\tvar indices = new ( ( vertices.length / 3 ) > 65535 ? Uint32Array : Uint16Array )( gridX * gridY * 6 );\n\n\t\tfor ( var iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( var ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tvar a = ix + gridX1 * iy;\n\t\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices[ offset ] = a;\n\t\t\t\tindices[ offset + 1 ] = b;\n\t\t\t\tindices[ offset + 2 ] = d;\n\n\t\t\t\tindices[ offset + 3 ] = b;\n\t\t\t\tindices[ offset + 4 ] = c;\n\t\t\t\tindices[ offset + 5 ] = d;\n\n\t\t\t\toffset += 6;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tPlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction Camera() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t}\n\n\tCamera.prototype = Object.create( Object3D.prototype );\n\tCamera.prototype.constructor = Camera;\n\n\tCamera.prototype.isCamera = true;\n\n\tCamera.prototype.getWorldDirection = function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\treturn result.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.lookAt = function () {\n\n\t\t// This routine does not support cameras with rotated and/or translated parent(s)\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function lookAt( vector ) {\n\n\t\t\tm1.lookAt( this.position, vector, this.up );\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.clone = function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t};\n\n\tCamera.prototype.copy = function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author greggman / http://games.greggman.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author tschw\n\t */\n\n\tfunction PerspectiveCamera( fov, aspect, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov !== undefined ? fov : 50;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near !== undefined ? near : 0.1;\n\t\tthis.far = far !== undefined ? far : 2000;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect !== undefined ? aspect : 1;\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\tPerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: PerspectiveCamera,\n\n\t\tisPerspectiveCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.fov = source.fov;\n\t\t\tthis.zoom = source.zoom;\n\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\t\t\tthis.focus = source.focus;\n\n\t\t\tthis.aspect = source.aspect;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\tthis.filmGauge = source.filmGauge;\n\t\t\tthis.filmOffset = source.filmOffset;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t\t *\n\t\t * The default film gauge is 35, so that the focal length can be specified for\n\t\t * a 35mm (full frame) camera.\n\t\t *\n\t\t * Values for focal length and film gauge must have the same unit.\n\t\t */\n\t\tsetFocalLength: function ( focalLength ) {\n\n\t\t\t// see http://www.bobatkins.com/photography/technical/field_of_view.html\n\t\t\tvar vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\t\tthis.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\t/**\n\t\t * Calculates the focal length from the current .fov and .filmGauge.\n\t\t */\n\t\tgetFocalLength: function () {\n\n\t\t\tvar vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov );\n\n\t\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t\t},\n\n\t\tgetEffectiveFOV: function () {\n\n\t\t\treturn _Math.RAD2DEG * 2 * Math.atan(\n\t\t\t\t\tMath.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t\t},\n\n\t\tgetFilmWidth: function () {\n\n\t\t\t// film not completely covered in portrait format (aspect < 1)\n\t\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t\t},\n\n\t\tgetFilmHeight: function () {\n\n\t\t\t// film not completely covered in landscape format (aspect > 1)\n\t\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t\t},\n\n\t\t/**\n\t\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t\t * multi-monitor/multi-machine setups.\n\t\t *\n\t\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t\t * the monitors are in grid like this\n\t\t *\n\t\t * +---+---+---+\n\t\t * | A | B | C |\n\t\t * +---+---+---+\n\t\t * | D | E | F |\n\t\t * +---+---+---+\n\t\t *\n\t\t * then for each monitor you would call it like this\n\t\t *\n\t\t * var w = 1920;\n\t\t * var h = 1080;\n\t\t * var fullWidth = w * 3;\n\t\t * var fullHeight = h * 2;\n\t\t *\n\t\t * --A--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t\t * --B--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t\t * --C--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t\t * --D--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t\t * --E--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t\t * --F--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t\t *\n\t\t * Note there is no reason monitors have to be the same size or in a grid.\n\t\t */\n\t\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar near = this.near,\n\t\t\t\ttop = near * Math.tan(\n\t\t\t\t\t\t_Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,\n\t\t\t\theight = 2 * top,\n\t\t\t\twidth = this.aspect * height,\n\t\t\t\tleft = - 0.5 * width,\n\t\t\t\tview = this.view;\n\n\t\t\tif ( view !== null ) {\n\n\t\t\t\tvar fullWidth = view.fullWidth,\n\t\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\t\twidth *= view.width / fullWidth;\n\t\t\t\theight *= view.height / fullHeight;\n\n\t\t\t}\n\n\t\t\tvar skew = this.filmOffset;\n\t\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\t\tthis.projectionMatrix.makeFrustum(\n\t\t\t\t\tleft, left + width, top - height, top, near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.fov = this.fov;\n\t\t\tdata.object.zoom = this.zoom;\n\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\t\t\tdata.object.focus = this.focus;\n\n\t\t\tdata.object.aspect = this.aspect;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\tdata.object.filmGauge = this.filmGauge;\n\t\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author arose / http://github.com/arose\n\t */\n\n\tfunction OrthographicCamera( left, right, top, bottom, near, far ) {\n\n\t\tCamera.call( this );\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 !== undefined ) ? near : 0.1;\n\t\tthis.far = ( far !== undefined ) ? far : 2000;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tOrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: OrthographicCamera,\n\n\t\tisOrthographicCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.left = source.left;\n\t\t\tthis.right = source.right;\n\t\t\tthis.top = source.top;\n\t\t\tthis.bottom = source.bottom;\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\n\t\t\tthis.zoom = source.zoom;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetViewOffset: function( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\t\tvar dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\t\tvar cx = ( this.right + this.left ) / 2;\n\t\t\tvar cy = ( this.top + this.bottom ) / 2;\n\n\t\t\tvar left = cx - dx;\n\t\t\tvar right = cx + dx;\n\t\t\tvar top = cy + dy;\n\t\t\tvar bottom = cy - dy;\n\n\t\t\tif ( this.view !== null ) {\n\n\t\t\t\tvar zoomW = this.zoom / ( this.view.width / this.view.fullWidth );\n\t\t\t\tvar zoomH = this.zoom / ( this.view.height / this.view.fullHeight );\n\t\t\t\tvar scaleW = ( this.right - this.left ) / this.view.width;\n\t\t\t\tvar scaleH = ( this.top - this.bottom ) / this.view.height;\n\n\t\t\t\tleft += scaleW * ( this.view.offsetX / zoomW );\n\t\t\t\tright = left + scaleW * ( this.view.width / zoomW );\n\t\t\t\ttop -= scaleH * ( this.view.offsetY / zoomH );\n\t\t\t\tbottom = top - scaleH * ( this.view.height / zoomH );\n\n\t\t\t}\n\n\t\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.zoom = this.zoom;\n\t\t\tdata.object.left = this.left;\n\t\t\tdata.object.right = this.right;\n\t\t\tdata.object.top = this.top;\n\t\t\tdata.object.bottom = this.bottom;\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLIndexedBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tvar type, size;\n\n\t\tfunction setIndex( index ) {\n\n\t\t\tif ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\t\ttype = gl.UNSIGNED_INT;\n\t\t\t\tsize = 4;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\t\t\t\tsize = 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawElements( mode, count, type, start * size );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry, start, count ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\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\textension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tsetMode: setMode,\n\t\t\tsetIndex: setIndex,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawArrays( mode, start, count );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\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\tvar position = geometry.attributes.position;\n\n\t\t\tvar count = 0;\n\n\t\t\tif ( (position && position.isInterleavedBufferAttribute) ) {\n\n\t\t\t\tcount = position.data.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t} else {\n\n\t\t\t\tcount = position.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t}\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\t\t\tsetMode: setMode,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLLights() {\n\n\t\tvar lights = {};\n\n\t\treturn {\n\n\t\t\tget: function ( light ) {\n\n\t\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\t\treturn lights[ light.id ];\n\n\t\t\t\t}\n\n\t\t\t\tvar uniforms;\n\n\t\t\t\tswitch ( light.type ) {\n\n\t\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\t\treturn uniforms;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction addLineNumbers( string ) {\n\n\t\tvar lines = string.split( '\\n' );\n\n\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t\t}\n\n\t\treturn lines.join( '\\n' );\n\n\t}\n\n\tfunction WebGLShader( gl, type, string ) {\n\n\t\tvar shader = gl.createShader( type );\n\n\t\tgl.shaderSource( shader, string );\n\t\tgl.compileShader( shader );\n\n\t\tif ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {\n\n\t\t\tconsole.error( 'THREE.WebGLShader: Shader couldn\\'t compile.' );\n\n\t\t}\n\n\t\tif ( gl.getShaderInfoLog( shader ) !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );\n\n\t\t}\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\treturn shader;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar programIdCount = 0;\n\n\tfunction getEncodingComponents( encoding ) {\n\n\t\tswitch ( encoding ) {\n\n\t\t\tcase LinearEncoding:\n\t\t\t\treturn [ 'Linear','( value )' ];\n\t\t\tcase sRGBEncoding:\n\t\t\t\treturn [ 'sRGB','( value )' ];\n\t\t\tcase RGBEEncoding:\n\t\t\t\treturn [ 'RGBE','( value )' ];\n\t\t\tcase RGBM7Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 7.0 )' ];\n\t\t\tcase RGBM16Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 16.0 )' ];\n\t\t\tcase RGBDEncoding:\n\t\t\t\treturn [ 'RGBD','( value, 256.0 )' ];\n\t\t\tcase GammaEncoding:\n\t\t\t\treturn [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ];\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported encoding: ' + encoding );\n\n\t\t}\n\n\t}\n\n\tfunction getTexelDecodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return \" + components[ 0 ] + \"ToLinear\" + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return LinearTo\" + components[ 0 ] + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\t\tvar toneMappingName;\n\n\t\tswitch ( toneMapping ) {\n\n\t\t\tcase LinearToneMapping:\n\t\t\t\ttoneMappingName = \"Linear\";\n\t\t\t\tbreak;\n\n\t\t\tcase ReinhardToneMapping:\n\t\t\t\ttoneMappingName = \"Reinhard\";\n\t\t\t\tbreak;\n\n\t\t\tcase Uncharted2ToneMapping:\n\t\t\t\ttoneMappingName = \"Uncharted2\";\n\t\t\t\tbreak;\n\n\t\t\tcase CineonToneMapping:\n\t\t\t\ttoneMappingName = \"OptimizedCineon\";\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported toneMapping: ' + toneMapping );\n\n\t\t}\n\n\t\treturn \"vec3 \" + functionName + \"( vec3 color ) { return \" + toneMappingName + \"ToneMapping( color ); }\";\n\n\t}\n\n\tfunction generateExtensions( extensions, parameters, rendererExtensions ) {\n\n\t\textensions = extensions || {};\n\n\t\tvar chunks = [\n\t\t\t( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t\t( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t\t( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t\t( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '',\n\t\t];\n\n\t\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tfunction generateDefines( defines ) {\n\n\t\tvar chunks = [];\n\n\t\tfor ( var name in defines ) {\n\n\t\t\tvar value = defines[ name ];\n\n\t\t\tif ( value === false ) continue;\n\n\t\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t\t}\n\n\t\treturn chunks.join( '\\n' );\n\n\t}\n\n\tfunction fetchAttributeLocations( gl, program, identifiers ) {\n\n\t\tvar attributes = {};\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\t\tfor ( var i = 0; i < n; i ++ ) {\n\n\t\t\tvar info = gl.getActiveAttrib( program, i );\n\t\t\tvar name = info.name;\n\n\t\t\t// console.log(\"THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:\", name, i );\n\n\t\t\tattributes[ name ] = gl.getAttribLocation( program, name );\n\n\t\t}\n\n\t\treturn attributes;\n\n\t}\n\n\tfunction filterEmptyLine( string ) {\n\n\t\treturn string !== '';\n\n\t}\n\n\tfunction replaceLightNums( string, parameters ) {\n\n\t\treturn string\n\t\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );\n\n\t}\n\n\tfunction parseIncludes( string ) {\n\n\t\tvar pattern = /#include +<([\\w\\d.]+)>/g;\n\n\t\tfunction replace( match, include ) {\n\n\t\t\tvar replace = ShaderChunk[ include ];\n\n\t\t\tif ( replace === undefined ) {\n\n\t\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t\t}\n\n\t\t\treturn parseIncludes( replace );\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction unrollLoops( string ) {\n\n\t\tvar pattern = /for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\n\n\t\tfunction replace( match, start, end, snippet ) {\n\n\t\t\tvar unroll = '';\n\n\t\t\tfor ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\t\t\tunroll += snippet.replace( /\\[ i \\]/g, '[ ' + i + ' ]' );\n\n\t\t\t}\n\n\t\t\treturn unroll;\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction WebGLProgram( renderer, code, material, parameters ) {\n\n\t\tvar gl = renderer.context;\n\n\t\tvar extensions = material.extensions;\n\t\tvar defines = material.defines;\n\n\t\tvar vertexShader = material.__webglShader.vertexShader;\n\t\tvar fragmentShader = material.__webglShader.fragmentShader;\n\n\t\tvar shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\t\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t\t}\n\n\t\tvar envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\tvar envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\t\tvar envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\n\t\tif ( parameters.envMap ) {\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeReflectionMapping:\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EquirectangularReflectionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SphericalReflectionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_SPHERE';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.combine ) {\n\n\t\t\t\tcase MultiplyOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MixOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AddOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;\n\n\t\t// console.log( 'building new program ' );\n\n\t\t//\n\n\t\tvar customExtensions = generateExtensions( extensions, parameters, renderer.extensions );\n\n\t\tvar customDefines = generateDefines( defines );\n\n\t\t//\n\n\t\tvar program = gl.createProgram();\n\n\t\tvar prefixVertex, prefixFragment;\n\n\t\tif ( material.isRawShaderMaterial ) {\n\n\t\t\tprefixVertex = [\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t} else {\n\n\t\t\tprefixVertex = [\n\n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t'attribute vec3 position;',\n\t\t\t\t'attribute vec3 normal;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'#ifdef USE_COLOR',\n\n\t\t\t\t'\tattribute vec3 color;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_MORPHTARGETS',\n\n\t\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t\t'\t#else',\n\n\t\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t\t'\t#endif',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\t\t\t\t'#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection),\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.premultipliedAlpha ? \"#define PREMULTIPLIED_ALPHA\" : '',\n\n\t\t\t\tparameters.physicallyCorrectLights ? \"#define PHYSICALLY_CORRECT_LIGHTS\" : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\tparameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? \"#define TONE_MAPPING\" : '',\n\t\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\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( \"toneMapping\", parameters.toneMapping ) : '',\n\n\t\t\t\t( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\t\tparameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',\n\t\t\t\tparameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',\n\t\t\t\tparameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',\n\t\t\t\tparameters.outputEncoding ? getTexelEncodingFunction( \"linearToOutputTexel\", parameters.outputEncoding ) : '',\n\n\t\t\t\tparameters.depthPacking ? \"#define DEPTH_PACKING \" + material.depthPacking : '',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t}\n\n\t\tvertexShader = parseIncludes( vertexShader, parameters );\n\t\tvertexShader = replaceLightNums( vertexShader, parameters );\n\n\t\tfragmentShader = parseIncludes( fragmentShader, parameters );\n\t\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\n\t\tif ( ! material.isShaderMaterial ) {\n\n\t\t\tvertexShader = unrollLoops( vertexShader );\n\t\t\tfragmentShader = unrollLoops( fragmentShader );\n\n\t\t}\n\n\t\tvar vertexGlsl = prefixVertex + vertexShader;\n\t\tvar fragmentGlsl = prefixFragment + fragmentShader;\n\n\t\t// console.log( '*VERTEX*', vertexGlsl );\n\t\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\t\tvar glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\t\tvar glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\t\tgl.attachShader( program, glVertexShader );\n\t\tgl.attachShader( program, glFragmentShader );\n\n\t\t// Force a particular attribute to index 0.\n\n\t\tif ( material.index0AttributeName !== undefined ) {\n\n\t\t\tgl.bindAttribLocation( program, 0, material.index0AttributeName );\n\n\t\t} else if ( parameters.morphTargets === true ) {\n\n\t\t\t// programs with morphTargets displace position out of attribute 0\n\t\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t\t}\n\n\t\tgl.linkProgram( program );\n\n\t\tvar programLog = gl.getProgramInfoLog( program );\n\t\tvar vertexLog = gl.getShaderInfoLog( glVertexShader );\n\t\tvar fragmentLog = gl.getShaderInfoLog( glFragmentShader );\n\n\t\tvar runnable = true;\n\t\tvar haveDiagnostics = true;\n\n\t\t// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );\n\t\t// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );\n\n\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\trunnable = false;\n\n\t\t\tconsole.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog );\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\t\t\t\tmaterial: material,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t// clean up\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\t// set up caching for uniform locations\n\n\t\tvar cachedUniforms;\n\n\t\tthis.getUniforms = function() {\n\n\t\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t\tcachedUniforms =\n\t\t\t\t\t\tnew WebGLUniforms( gl, program, renderer );\n\n\t\t\t}\n\n\t\t\treturn cachedUniforms;\n\n\t\t};\n\n\t\t// set up caching for attribute locations\n\n\t\tvar cachedAttributes;\n\n\t\tthis.getAttributes = function() {\n\n\t\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t\t}\n\n\t\t\treturn cachedAttributes;\n\n\t\t};\n\n\t\t// free resource\n\n\t\tthis.destroy = function() {\n\n\t\t\tgl.deleteProgram( program );\n\t\t\tthis.program = undefined;\n\n\t\t};\n\n\t\t// DEPRECATED\n\n\t\tObject.defineProperties( this, {\n\n\t\t\tuniforms: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );\n\t\t\t\t\treturn this.getUniforms();\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tattributes: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );\n\t\t\t\t\treturn this.getAttributes();\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t} );\n\n\n\t\t//\n\n\t\tthis.id = programIdCount ++;\n\t\tthis.code = code;\n\t\tthis.usedTimes = 1;\n\t\tthis.program = program;\n\t\tthis.vertexShader = glVertexShader;\n\t\tthis.fragmentShader = glFragmentShader;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLPrograms( renderer, capabilities ) {\n\n\t\tvar programs = [];\n\n\t\tvar shaderIDs = {\n\t\t\tMeshDepthMaterial: 'depth',\n\t\t\tMeshNormalMaterial: 'normal',\n\t\t\tMeshBasicMaterial: 'basic',\n\t\t\tMeshLambertMaterial: 'lambert',\n\t\t\tMeshPhongMaterial: 'phong',\n\t\t\tMeshStandardMaterial: 'physical',\n\t\t\tMeshPhysicalMaterial: 'physical',\n\t\t\tLineBasicMaterial: 'basic',\n\t\t\tLineDashedMaterial: 'dashed',\n\t\t\tPointsMaterial: 'points'\n\t\t};\n\n\t\tvar parameterNames = [\n\t\t\t\"precision\", \"supportsVertexTextures\", \"map\", \"mapEncoding\", \"envMap\", \"envMapMode\", \"envMapEncoding\",\n\t\t\t\"lightMap\", \"aoMap\", \"emissiveMap\", \"emissiveMapEncoding\", \"bumpMap\", \"normalMap\", \"displacementMap\", \"specularMap\",\n\t\t\t\"roughnessMap\", \"metalnessMap\",\n\t\t\t\"alphaMap\", \"combine\", \"vertexColors\", \"fog\", \"useFog\", \"fogExp\",\n\t\t\t\"flatShading\", \"sizeAttenuation\", \"logarithmicDepthBuffer\", \"skinning\",\n\t\t\t\"maxBones\", \"useVertexTexture\", \"morphTargets\", \"morphNormals\",\n\t\t\t\"maxMorphTargets\", \"maxMorphNormals\", \"premultipliedAlpha\",\n\t\t\t\"numDirLights\", \"numPointLights\", \"numSpotLights\", \"numHemiLights\",\n\t\t\t\"shadowMapEnabled\", \"shadowMapType\", \"toneMapping\", 'physicallyCorrectLights',\n\t\t\t\"alphaTest\", \"doubleSided\", \"flipSided\", \"numClippingPlanes\", \"numClipIntersection\", \"depthPacking\"\n\t\t];\n\n\n\t\tfunction allocateBones( object ) {\n\n\t\t\tif ( capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture ) {\n\n\t\t\t\treturn 1024;\n\n\t\t\t} else {\n\n\t\t\t\t// default for when object is not specified\n\t\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t\t//\n\t\t\t\t// - leave some extra space for other uniforms\n\t\t\t\t// - limit here is ANGLE's 254 max uniform vectors\n\t\t\t\t// (up to 54 should be safe)\n\n\t\t\t\tvar nVertexUniforms = capabilities.maxVertexUniforms;\n\t\t\t\tvar nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\t\tvar maxBones = nVertexMatrices;\n\n\t\t\t\tif ( object !== undefined && (object && object.isSkinnedMesh) ) {\n\n\t\t\t\t\tmaxBones = Math.min( object.skeleton.bones.length, maxBones );\n\n\t\t\t\t\tif ( maxBones < object.skeleton.bones.length ) {\n\n\t\t\t\t\t\tconsole.warn( 'WebGLRenderer: too many bones - ' + object.skeleton.bones.length + ', this GPU supports just ' + maxBones + ' (try OpenGL instead of ANGLE)' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn maxBones;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getTextureEncodingFromMap( map, gammaOverrideLinear ) {\n\n\t\t\tvar encoding;\n\n\t\t\tif ( ! map ) {\n\n\t\t\t\tencoding = LinearEncoding;\n\n\t\t\t} else if ( (map && map.isTexture) ) {\n\n\t\t\t\tencoding = map.encoding;\n\n\t\t\t} else if ( (map && map.isWebGLRenderTarget) ) {\n\n\t\t\t\tconsole.warn( \"THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\tencoding = map.texture.encoding;\n\n\t\t\t}\n\n\t\t\t// add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.\n\t\t\tif ( encoding === LinearEncoding && gammaOverrideLinear ) {\n\n\t\t\t\tencoding = GammaEncoding;\n\n\t\t\t}\n\n\t\t\treturn encoding;\n\n\t\t}\n\n\t\tthis.getParameters = function ( material, lights, fog, nClipPlanes, nClipIntersection, object ) {\n\n\t\t\tvar shaderID = shaderIDs[ material.type ];\n\n\t\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t\t// (not to blow over maxLights budget)\n\n\t\t\tvar maxBones = allocateBones( object );\n\t\t\tvar precision = renderer.getPrecision();\n\n\t\t\tif ( material.precision !== null ) {\n\n\t\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar currentRenderTarget = renderer.getCurrentRenderTarget();\n\n\t\t\tvar parameters = {\n\n\t\t\t\tshaderID: shaderID,\n\n\t\t\t\tprecision: precision,\n\t\t\t\tsupportsVertexTextures: capabilities.vertexTextures,\n\t\t\t\toutputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ),\n\t\t\t\tmap: !! material.map,\n\t\t\t\tmapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),\n\t\t\t\tenvMap: !! material.envMap,\n\t\t\t\tenvMapMode: material.envMap && material.envMap.mapping,\n\t\t\t\tenvMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),\n\t\t\t\tenvMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\t\tlightMap: !! material.lightMap,\n\t\t\t\taoMap: !! material.aoMap,\n\t\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\t\temissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),\n\t\t\t\tbumpMap: !! material.bumpMap,\n\t\t\t\tnormalMap: !! material.normalMap,\n\t\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\t\tspecularMap: !! material.specularMap,\n\t\t\t\talphaMap: !! material.alphaMap,\n\n\t\t\t\tcombine: material.combine,\n\n\t\t\t\tvertexColors: material.vertexColors,\n\n\t\t\t\tfog: !! fog,\n\t\t\t\tuseFog: material.fog,\n\t\t\t\tfogExp: (fog && fog.isFogExp2),\n\n\t\t\t\tflatShading: material.shading === FlatShading,\n\n\t\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\t\tlogarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,\n\n\t\t\t\tskinning: material.skinning,\n\t\t\t\tmaxBones: maxBones,\n\t\t\t\tuseVertexTexture: capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture,\n\n\t\t\t\tmorphTargets: material.morphTargets,\n\t\t\t\tmorphNormals: material.morphNormals,\n\t\t\t\tmaxMorphTargets: renderer.maxMorphTargets,\n\t\t\t\tmaxMorphNormals: renderer.maxMorphNormals,\n\n\t\t\t\tnumDirLights: lights.directional.length,\n\t\t\t\tnumPointLights: lights.point.length,\n\t\t\t\tnumSpotLights: lights.spot.length,\n\t\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\t\tnumClippingPlanes: nClipPlanes,\n\t\t\t\tnumClipIntersection: nClipIntersection,\n\n\t\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0,\n\t\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\t\ttoneMapping: renderer.toneMapping,\n\t\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\t\talphaTest: material.alphaTest,\n\t\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\t\tflipSided: material.side === BackSide,\n\n\t\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false\n\n\t\t\t};\n\n\t\t\treturn parameters;\n\n\t\t};\n\n\t\tthis.getProgramCode = function ( material, parameters ) {\n\n\t\t\tvar array = [];\n\n\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\tarray.push( parameters.shaderID );\n\n\t\t\t} else {\n\n\t\t\t\tarray.push( material.fragmentShader );\n\t\t\t\tarray.push( material.vertexShader );\n\n\t\t\t}\n\n\t\t\tif ( material.defines !== undefined ) {\n\n\t\t\t\tfor ( var name in material.defines ) {\n\n\t\t\t\t\tarray.push( name );\n\t\t\t\t\tarray.push( material.defines[ name ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < parameterNames.length; i ++ ) {\n\n\t\t\t\tarray.push( parameters[ parameterNames[ i ] ] );\n\n\t\t\t}\n\n\t\t\treturn array.join();\n\n\t\t};\n\n\t\tthis.acquireProgram = function ( material, parameters, code ) {\n\n\t\t\tvar program;\n\n\t\t\t// Check if code has been already compiled\n\t\t\tfor ( var p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\t\tvar programInfo = programs[ p ];\n\n\t\t\t\tif ( programInfo.code === code ) {\n\n\t\t\t\t\tprogram = programInfo;\n\t\t\t\t\t++ program.usedTimes;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tprogram = new WebGLProgram( renderer, code, material, parameters );\n\t\t\t\tprograms.push( program );\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t};\n\n\t\tthis.releaseProgram = function( program ) {\n\n\t\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t\t// Remove from unordered set\n\t\t\t\tvar i = programs.indexOf( program );\n\t\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\t\tprograms.pop();\n\n\t\t\t\t// Free WebGL resources\n\t\t\t\tprogram.destroy();\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tthis.programs = programs;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLGeometries( gl, properties, info ) {\n\n\t\tvar geometries = {};\n\n\t\tfunction onGeometryDispose( event ) {\n\n\t\t\tvar geometry = event.target;\n\t\t\tvar buffergeometry = geometries[ geometry.id ];\n\n\t\t\tif ( buffergeometry.index !== null ) {\n\n\t\t\t\tdeleteAttribute( buffergeometry.index );\n\n\t\t\t}\n\n\t\t\tdeleteAttributes( buffergeometry.attributes );\n\n\t\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\t\tdelete geometries[ geometry.id ];\n\n\t\t\t// TODO\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe ) {\n\n\t\t\t\tdeleteAttribute( property.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( geometry );\n\n\t\t\tvar bufferproperty = properties.get( buffergeometry );\n\n\t\t\tif ( bufferproperty.wireframe ) {\n\n\t\t\t\tdeleteAttribute( bufferproperty.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( buffergeometry );\n\n\t\t\t//\n\n\t\t\tinfo.memory.geometries --;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction deleteAttribute( attribute ) {\n\n\t\t\tvar buffer = getAttributeBuffer( attribute );\n\n\t\t\tif ( buffer !== undefined ) {\n\n\t\t\t\tgl.deleteBuffer( buffer );\n\t\t\t\tremoveAttributeBuffer( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction deleteAttributes( attributes ) {\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tdeleteAttribute( attributes[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction removeAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tproperties.delete( attribute.data );\n\n\t\t\t} else {\n\n\t\t\t\tproperties.delete( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometries[ geometry.id ] !== undefined ) {\n\n\t\t\t\t\treturn geometries[ geometry.id ];\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\t\t\tvar buffergeometry;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tbuffergeometry = geometry;\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tif ( geometry._bufferGeometry === undefined ) {\n\n\t\t\t\t\t\tgeometry._bufferGeometry = new BufferGeometry().setFromObject( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbuffergeometry = geometry._bufferGeometry;\n\n\t\t\t\t}\n\n\t\t\t\tgeometries[ geometry.id ] = buffergeometry;\n\n\t\t\t\tinfo.memory.geometries ++;\n\n\t\t\t\treturn buffergeometry;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLObjects( gl, properties, info ) {\n\n\t\tvar geometries = new WebGLGeometries( gl, properties, info );\n\n\t\t//\n\n\t\tfunction update( object ) {\n\n\t\t\t// TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter.\n\n\t\t\tvar geometry = geometries.get( object );\n\n\t\t\tif ( object.geometry.isGeometry ) {\n\n\t\t\t\tgeometry.updateFromObject( object );\n\n\t\t\t}\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tupdateAttribute( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tupdateAttribute( attributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\tfor ( var name in morphAttributes ) {\n\n\t\t\t\tvar array = morphAttributes[ name ];\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\t\tupdateAttribute( array[ i ], gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction updateAttribute( attribute, bufferType ) {\n\n\t\t\tvar data = ( attribute.isInterleavedBufferAttribute ) ? attribute.data : attribute;\n\n\t\t\tvar attributeProperties = properties.get( data );\n\n\t\t\tif ( attributeProperties.__webglBuffer === undefined ) {\n\n\t\t\t\tcreateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t} else if ( attributeProperties.version !== data.version ) {\n\n\t\t\t\tupdateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tattributeProperties.__webglBuffer = gl.createBuffer();\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tvar usage = data.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;\n\n\t\t\tgl.bufferData( bufferType, data.array, usage );\n\n\t\t\tattributeProperties.version = data.version;\n\n\t\t}\n\n\t\tfunction updateBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tif ( data.dynamic === false ) {\n\n\t\t\t\tgl.bufferData( bufferType, data.array, gl.STATIC_DRAW );\n\n\t\t\t} else if ( data.updateRange.count === - 1 ) {\n\n\t\t\t\t// Not using update ranges\n\n\t\t\t\tgl.bufferSubData( bufferType, 0, data.array );\n\n\t\t\t} else if ( data.updateRange.count === 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, data.updateRange.offset * data.array.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t data.array.subarray( data.updateRange.offset, data.updateRange.offset + data.updateRange.count ) );\n\n\t\t\t\tdata.updateRange.count = 0; // reset range\n\n\t\t\t}\n\n\t\t\tattributeProperties.version = data.version;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction getWireframeAttribute( geometry ) {\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe !== undefined ) {\n\n\t\t\t\treturn property.wireframe;\n\n\t\t\t}\n\n\t\t\tvar indices = [];\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\t\t\tvar position = attributes.position;\n\n\t\t\t// console.time( 'wireframe' );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar edges = {};\n\t\t\t\tvar array = index.array;\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = array[ i + 0 ];\n\t\t\t\t\tvar b = array[ i + 1 ];\n\t\t\t\t\tvar c = array[ i + 2 ];\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar array = attributes.position.array;\n\n\t\t\t\tfor ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = i + 0;\n\t\t\t\t\tvar b = i + 1;\n\t\t\t\t\tvar c = i + 2;\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// console.timeEnd( 'wireframe' );\n\n\t\t\tvar TypeArray = position.count > 65535 ? Uint32Array : Uint16Array;\n\t\t\tvar attribute = new BufferAttribute( new TypeArray( indices ), 1 );\n\n\t\t\tupdateAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\tproperty.wireframe = attribute;\n\n\t\t\treturn attribute;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tgetAttributeBuffer: getAttributeBuffer,\n\t\t\tgetWireframeAttribute: getWireframeAttribute,\n\n\t\t\tupdate: update\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, info ) {\n\n\t\tvar _infoMemory = info.memory;\n\t\tvar _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext );\n\n\t\t//\n\n\t\tfunction clampToMaxSize( image, maxSize ) {\n\n\t\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\t\t// Warning: Scaling through the canvas will only work with images that use\n\t\t\t\t// premultiplied alpha.\n\n\t\t\t\tvar scale = maxSize / Math.max( image.width, image.height );\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = Math.floor( image.width * scale );\n\t\t\t\tcanvas.height = Math.floor( image.height * scale );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction isPowerOfTwo( image ) {\n\n\t\t\treturn _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height );\n\n\t\t}\n\n\t\tfunction makePowerOfTwo( image ) {\n\n\t\t\tif ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) {\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = _Math.nearestPowerOfTwo( image.width );\n\t\t\t\tcanvas.height = _Math.nearestPowerOfTwo( image.height );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) return true;\n\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) return true;\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// Fallback filters for non-power-of-2 textures\n\n\t\tfunction filterFallback( f ) {\n\n\t\t\tif ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) {\n\n\t\t\t\treturn _gl.NEAREST;\n\n\t\t\t}\n\n\t\t\treturn _gl.LINEAR;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction onTextureDispose( event ) {\n\n\t\t\tvar texture = event.target;\n\n\t\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\t\tdeallocateTexture( texture );\n\n\t\t\t_infoMemory.textures --;\n\n\n\t\t}\n\n\t\tfunction onRenderTargetDispose( event ) {\n\n\t\t\tvar renderTarget = event.target;\n\n\t\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\tdeallocateRenderTarget( renderTarget );\n\n\t\t\t_infoMemory.textures --;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction deallocateTexture( texture ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image && textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__image__webglTextureCube );\n\n\t\t\t} else {\n\n\t\t\t\t// 2D texture\n\n\t\t\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\t// remove all webgl properties\n\t\t\tproperties.delete( texture );\n\n\t\t}\n\n\t\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\tif ( ! renderTarget ) return;\n\n\t\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\t}\n\n\t\t\tif ( (renderTarget && renderTarget.isWebGLRenderTargetCube) ) {\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\n\t\t\t}\n\n\t\t\tproperties.delete( renderTarget.texture );\n\t\t\tproperties.delete( renderTarget );\n\n\t\t}\n\n\t\t//\n\n\n\n\t\tfunction setTexture2D( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\tvar image = texture.image;\n\n\t\t\t\tif ( image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture );\n\n\t\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureCube( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image.length === 6 ) {\n\n\t\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\t\tif ( ! textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\ttextureProperties.__image__webglTextureCube = _gl.createTexture();\n\n\t\t\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\n\t\t\t\t\tvar isCompressed = (texture && texture.isCompressedTexture);\n\t\t\t\t\tvar isDataTexture = (texture.image[ 0 ] && texture.image[ 0 ].isDataTexture);\n\n\t\t\t\t\tvar cubeImage = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar image = cubeImage[ 0 ],\n\t\t\t\t\tisPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage );\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed ) {\n\n\t\t\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar mipmap, mipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\t\t\tfor ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\t\tmipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()\" );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\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\tif ( texture.generateMipmaps && isPowerOfTwoImage ) {\n\n\t\t\t\t\t\t_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setTextureCubeDynamic( texture, slot ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureParameters( textureType, texture, isPowerOfTwoImage ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( isPowerOfTwoImage ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) );\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\n\n\t\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );\n\n\t\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\textension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension ) {\n\n\t\t\t\tif ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;\n\t\t\t\tif ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return;\n\n\t\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\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\n\t\t\tvar image = clampToMaxSize( texture.image, capabilities.maxTextureSize );\n\n\t\t\tif ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) {\n\n\t\t\t\timage = makePowerOfTwo( image );\n\n\t\t\t}\n\n\t\t\tvar isPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage );\n\n\t\t\tvar mipmap, mipmaps = texture.mipmaps;\n\n\t\t\tif ( (texture && texture.isDepthTexture) ) {\n\n\t\t\t\t// populate depth texture with dummy data\n\n\t\t\t\tvar internalFormat = _gl.DEPTH_COMPONENT;\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tif ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0');\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t} else if ( _isWebGL2 ) {\n\n\t\t\t\t\t// WebGL 2.0 requires signed internalformat for glTexImage2D\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t\t}\n\n\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.format === DepthStencilFormat ) {\n\n\t\t\t\t\tinternalFormat = _gl.DEPTH_STENCIL;\n\n\t\t\t\t}\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t} else if ( (texture && 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 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( (texture && texture.isCompressedTexture) ) {\n\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\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}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\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 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );\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\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\n\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\t// Render targets\n\n\t\t// Setup storage for target texture and bind it to correct framebuffer\n\t\tfunction setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {\n\n\t\t\tvar glFormat = paramThreeToGL( renderTarget.texture.format );\n\t\t\tvar glType = paramThreeToGL( renderTarget.texture.type );\n\t\t\tstate.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\t\tfunction setupRenderBufferStorage( renderbuffer, renderTarget ) {\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else {\n\n\t\t\t\t// FIXME: We don't support !depth !stencil\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t}\n\n\t\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\t\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\t\tvar isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) );\n\t\t\tif ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!');\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( !( (renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture) ) ) {\n\n\t\t\t\tthrow new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture');\n\n\t\t\t}\n\n\t\t\t// upload an empty depth texture with framebuffer size\n\t\t\tif ( !properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\t\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\t\t\t}\n\n\t\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\t\tvar webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\n\t\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error('Unknown depthTexture format')\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup GL resources for a non-texture depth buffer\n\t\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\tvar isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) );\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\tif ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets');\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Set up GL resources for the render target\n\t\tfunction setupRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t_infoMemory.textures ++;\n\n\t\t\tvar isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) );\n\t\t\tvar isTargetPowerOfTwo = isPowerOfTwo( renderTarget );\n\n\t\t\t// Setup framebuffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _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\t// Setup color buffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, null );\n\n\t\t\t}\n\n\t\t\t// Setup depth and stencil buffers\n\n\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\t\tvar texture = renderTarget.texture;\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) &&\n\t\t\t\t\ttexture.minFilter !== NearestFilter &&\n\t\t\t\t\ttexture.minFilter !== LinearFilter ) {\n\n\t\t\t\tvar target = (renderTarget && renderTarget.isWebGLRenderTargetCube) ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\t\t\t\tvar webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\t_gl.generateMipmap( target );\n\t\t\t\tstate.bindTexture( target, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setTexture2D = setTexture2D;\n\t\tthis.setTextureCube = setTextureCube;\n\t\tthis.setTextureCubeDynamic = setTextureCubeDynamic;\n\t\tthis.setupRenderTarget = setupRenderTarget;\n\t\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\n\t}\n\n\t/**\n\t * @author fordacious / fordacious.github.io\n\t */\n\n\tfunction WebGLProperties() {\n\n\t\tvar properties = {};\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar uuid = object.uuid;\n\t\t\t\tvar map = properties[ uuid ];\n\n\t\t\t\tif ( map === undefined ) {\n\n\t\t\t\t\tmap = {};\n\t\t\t\t\tproperties[ uuid ] = map;\n\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\n\t\t\t},\n\n\t\t\tdelete: function ( object ) {\n\n\t\t\t\tdelete properties[ object.uuid ];\n\n\t\t\t},\n\n\t\t\tclear: function () {\n\n\t\t\t\tproperties = {};\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLState( gl, extensions, paramThreeToGL ) {\n\n\t\tfunction ColorBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar color = new Vector4();\n\t\t\tvar currentColorMask = null;\n\t\t\tvar currentColorClear = new Vector4();\n\n\t\t\treturn {\n\n\t\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( r, g, b, a ) {\n\n\t\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentColorMask = null;\n\t\t\t\t\tcurrentColorClear.set( 0, 0, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction DepthBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentDepthMask = null;\n\t\t\tvar currentDepthFunc = null;\n\t\t\tvar currentDepthClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\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\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentDepthMask = null;\n\t\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction StencilBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentStencilMask = null;\n\t\t\tvar currentStencilFunc = null;\n\t\t\tvar currentStencilRef = null;\n\t\t\tvar currentStencilFuncMask = null;\n\t\t\tvar currentStencilFail = null;\n\t\t\tvar currentStencilZFail = null;\n\t\t\tvar currentStencilZPass = null;\n\t\t\tvar currentStencilClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( stencilTest ) {\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\tsetMask: function ( stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t\t currentStencilRef \t!== stencilRef \t||\n\t\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\t\tif ( currentStencilFail\t !== stencilFail \t||\n\t\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentStencilMask = null;\n\t\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\t\tcurrentStencilRef = null;\n\t\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\t\tcurrentStencilFail = null;\n\t\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t//\n\n\t\tvar colorBuffer = new ColorBuffer();\n\t\tvar depthBuffer = new DepthBuffer();\n\t\tvar stencilBuffer = new StencilBuffer();\n\n\t\tvar maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar newAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar enabledAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar attributeDivisors = new Uint8Array( maxVertexAttributes );\n\n\t\tvar capabilities = {};\n\n\t\tvar compressedTextureFormats = null;\n\n\t\tvar currentBlending = null;\n\t\tvar currentBlendEquation = null;\n\t\tvar currentBlendSrc = null;\n\t\tvar currentBlendDst = null;\n\t\tvar currentBlendEquationAlpha = null;\n\t\tvar currentBlendSrcAlpha = null;\n\t\tvar currentBlendDstAlpha = null;\n\t\tvar currentPremultipledAlpha = false;\n\n\t\tvar currentFlipSided = null;\n\t\tvar currentCullFace = null;\n\n\t\tvar currentLineWidth = null;\n\n\t\tvar currentPolygonOffsetFactor = null;\n\t\tvar currentPolygonOffsetUnits = null;\n\n\t\tvar currentScissorTest = null;\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\n\t\tvar currentTextureSlot = null;\n\t\tvar currentBoundTextures = {};\n\n\t\tvar currentScissor = new Vector4();\n\t\tvar currentViewport = new Vector4();\n\n\t\tfunction createTexture( type, target, count ) {\n\n\t\t\tvar data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\t\tvar texture = gl.createTexture();\n\n\t\t\tgl.bindTexture( type, texture );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\t\tfor ( var i = 0; i < count; i ++ ) {\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\treturn texture;\n\n\t\t}\n\n\t\tvar emptyTextures = {};\n\t\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\t\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\n\t\t//\n\n\t\tfunction init() {\n\n\t\t\tclearColor( 0, 0, 0, 1 );\n\t\t\tclearDepth( 1 );\n\t\t\tclearStencil( 0 );\n\n\t\t\tenable( gl.DEPTH_TEST );\n\t\t\tsetDepthFunc( LessEqualDepth );\n\n\t\t\tsetFlipSided( false );\n\t\t\tsetCullFace( CullFaceBack );\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tenable( gl.BLEND );\n\t\t\tsetBlending( NormalBlending );\n\n\t\t}\n\n\t\tfunction initAttributes() {\n\n\t\t\tfor ( var i = 0, l = newAttributes.length; i < l; i ++ ) {\n\n\t\t\t\tnewAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttribute( attribute ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== 0 ) {\n\n\t\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, 0 );\n\t\t\t\tattributeDivisors[ attribute ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute, extension ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, meshPerAttribute );\n\t\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disableUnusedAttributes() {\n\n\t\t\tfor ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== true ) {\n\n\t\t\t\tgl.enable( id );\n\t\t\t\tcapabilities[ id ] = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== false ) {\n\n\t\t\t\tgl.disable( id );\n\t\t\t\tcapabilities[ id ] = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getCompressedTextureFormats() {\n\n\t\t\tif ( compressedTextureFormats === null ) {\n\n\t\t\t\tcompressedTextureFormats = [];\n\n\t\t\t\tif ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_s3tc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_etc1' ) ) {\n\n\t\t\t\t\tvar formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS );\n\n\t\t\t\t\tfor ( var i = 0; i < formats.length; i ++ ) {\n\n\t\t\t\t\t\tcompressedTextureFormats.push( formats[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn compressedTextureFormats;\n\n\t\t}\n\n\t\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\t\tif ( blending !== NoBlending ) {\n\n\t\t\t\tenable( gl.BLEND );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.BLEND );\n\n\t\t\t}\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( blending === AdditiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === SubtractiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === MultiplyBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\tif ( blending === CustomBlending ) {\n\n\t\t\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\t\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\t\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\t\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\t\t\tgl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) );\n\n\t\t\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t\t\t}\n\n\t\t\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\t\t\tgl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) );\n\n\t\t\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\t\t\tcurrentBlendDst = blendDst;\n\t\t\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tcurrentBlendEquation = null;\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendEquationAlpha = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Deprecate\n\n\t\tfunction setColorWrite( colorWrite ) {\n\n\t\t\tcolorBuffer.setMask( colorWrite );\n\n\t\t}\n\n\t\tfunction setDepthTest( depthTest ) {\n\n\t\t\tdepthBuffer.setTest( depthTest );\n\n\t\t}\n\n\t\tfunction setDepthWrite( depthWrite ) {\n\n\t\t\tdepthBuffer.setMask( depthWrite );\n\n\t\t}\n\n\t\tfunction setDepthFunc( depthFunc ) {\n\n\t\t\tdepthBuffer.setFunc( depthFunc );\n\n\t\t}\n\n\t\tfunction setStencilTest( stencilTest ) {\n\n\t\t\tstencilBuffer.setTest( stencilTest );\n\n\t\t}\n\n\t\tfunction setStencilWrite( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( stencilWrite );\n\n\t\t}\n\n\t\tfunction setStencilFunc( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\tstencilBuffer.setFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t}\n\n\t\tfunction setStencilOp( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\tstencilBuffer.setOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction setFlipSided( flipSided ) {\n\n\t\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\t\tif ( flipSided ) {\n\n\t\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t\t}\n\n\t\t\t\tcurrentFlipSided = flipSided;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setCullFace( cullFace ) {\n\n\t\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\t\tenable( gl.CULL_FACE );\n\n\t\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.CULL_FACE );\n\n\t\t\t}\n\n\t\t\tcurrentCullFace = cullFace;\n\n\t\t}\n\n\t\tfunction setLineWidth( width ) {\n\n\t\t\tif ( width !== currentLineWidth ) {\n\n\t\t\t\tgl.lineWidth( width );\n\n\t\t\t\tcurrentLineWidth = width;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\t\tif ( polygonOffset ) {\n\n\t\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getScissorTest() {\n\n\t\t\treturn currentScissorTest;\n\n\t\t}\n\n\t\tfunction setScissorTest( scissorTest ) {\n\n\t\t\tcurrentScissorTest = scissorTest;\n\n\t\t\tif ( scissorTest ) {\n\n\t\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// texture\n\n\t\tfunction activeTexture( webglSlot ) {\n\n\t\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\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}\n\n\t\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\tactiveTexture();\n\n\t\t\t}\n\n\t\t\tvar boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\t\tif ( boundTexture === undefined ) {\n\n\t\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t\t}\n\n\t\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\t\tboundTexture.type = webglType;\n\t\t\t\tboundTexture.texture = webglTexture;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction compressedTexImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction texImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Deprecate\n\n\t\tfunction clearColor( r, g, b, a ) {\n\n\t\t\tcolorBuffer.setClear( r, g, b, a );\n\n\t\t}\n\n\t\tfunction clearDepth( depth ) {\n\n\t\t\tdepthBuffer.setClear( depth );\n\n\t\t}\n\n\t\tfunction clearStencil( stencil ) {\n\n\t\t\tstencilBuffer.setClear( stencil );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction scissor( scissor ) {\n\n\t\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\t\tcurrentScissor.copy( scissor );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction viewport( viewport ) {\n\n\t\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\t\tcurrentViewport.copy( viewport );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction reset() {\n\n\t\t\tfor ( var i = 0; i < enabledAttributes.length; i ++ ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] === 1 ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcapabilities = {};\n\n\t\t\tcompressedTextureFormats = null;\n\n\t\t\tcurrentTextureSlot = null;\n\t\t\tcurrentBoundTextures = {};\n\n\t\t\tcurrentBlending = null;\n\n\t\t\tcurrentFlipSided = null;\n\t\t\tcurrentCullFace = null;\n\n\t\t\tcolorBuffer.reset();\n\t\t\tdepthBuffer.reset();\n\t\t\tstencilBuffer.reset();\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tbuffers: {\n\t\t\t\tcolor: colorBuffer,\n\t\t\t\tdepth: depthBuffer,\n\t\t\t\tstencil: stencilBuffer\n\t\t\t},\n\n\t\t\tinit: init,\n\t\t\tinitAttributes: initAttributes,\n\t\t\tenableAttribute: enableAttribute,\n\t\t\tenableAttributeAndDivisor: enableAttributeAndDivisor,\n\t\t\tdisableUnusedAttributes: disableUnusedAttributes,\n\t\t\tenable: enable,\n\t\t\tdisable: disable,\n\t\t\tgetCompressedTextureFormats: getCompressedTextureFormats,\n\n\t\t\tsetBlending: setBlending,\n\n\t\t\tsetColorWrite: setColorWrite,\n\t\t\tsetDepthTest: setDepthTest,\n\t\t\tsetDepthWrite: setDepthWrite,\n\t\t\tsetDepthFunc: setDepthFunc,\n\t\t\tsetStencilTest: setStencilTest,\n\t\t\tsetStencilWrite: setStencilWrite,\n\t\t\tsetStencilFunc: setStencilFunc,\n\t\t\tsetStencilOp: setStencilOp,\n\n\t\t\tsetFlipSided: setFlipSided,\n\t\t\tsetCullFace: setCullFace,\n\n\t\t\tsetLineWidth: setLineWidth,\n\t\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\t\tgetScissorTest: getScissorTest,\n\t\t\tsetScissorTest: setScissorTest,\n\n\t\t\tactiveTexture: activeTexture,\n\t\t\tbindTexture: bindTexture,\n\t\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\t\ttexImage2D: texImage2D,\n\n\t\t\tclearColor: clearColor,\n\t\t\tclearDepth: clearDepth,\n\t\t\tclearStencil: clearStencil,\n\n\t\t\tscissor: scissor,\n\t\t\tviewport: viewport,\n\n\t\t\treset: reset\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\t\tvar maxAnisotropy;\n\n\t\tfunction getMaxAnisotropy() {\n\n\t\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\t\tvar extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t\t} else {\n\n\t\t\t\tmaxAnisotropy = 0;\n\n\t\t\t}\n\n\t\t\treturn maxAnisotropy;\n\n\t\t}\n\n\t\tfunction getMaxPrecision( precision ) {\n\n\t\t\tif ( precision === 'highp' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'highp';\n\n\t\t\t\t}\n\n\t\t\t\tprecision = 'mediump';\n\n\t\t\t}\n\n\t\t\tif ( precision === 'mediump' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'mediump';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn 'lowp';\n\n\t\t}\n\n\t\tvar precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\t\tvar maxPrecision = getMaxPrecision( precision );\n\n\t\tif ( maxPrecision !== precision ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\t\tprecision = maxPrecision;\n\n\t\t}\n\n\t\tvar logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' );\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\t\tvar maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\t\tvar maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\t\tvar maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\t\tvar maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\t\tvar vertexTextures = maxVertexTextures > 0;\n\t\tvar floatFragmentTextures = !! extensions.get( 'OES_texture_float' );\n\t\tvar floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\t\treturn {\n\n\t\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\t\tprecision: precision,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tmaxTextures: maxTextures,\n\t\t\tmaxVertexTextures: maxVertexTextures,\n\t\t\tmaxTextureSize: maxTextureSize,\n\t\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\t\tmaxAttributes: maxAttributes,\n\t\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\t\tmaxVaryings: maxVaryings,\n\t\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\t\tvertexTextures: vertexTextures,\n\t\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\t\tfloatVertexTextures: floatVertexTextures\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLExtensions( gl ) {\n\n\t\tvar extensions = {};\n\n\t\treturn {\n\n\t\t\tget: function ( name ) {\n\n\t\t\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\t\t\treturn extensions[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tvar extension;\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_etc1':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_etc1' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\textension = gl.getExtension( name );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t\t}\n\n\t\t\t\textensions[ name ] = extension;\n\n\t\t\t\treturn extension;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction WebGLClipping() {\n\n\t\tvar scope = this,\n\n\t\t\tglobalState = null,\n\t\t\tnumGlobalPlanes = 0,\n\t\t\tlocalClippingEnabled = false,\n\t\t\trenderingShadows = false,\n\n\t\t\tplane = new Plane(),\n\t\t\tviewNormalMatrix = new Matrix3(),\n\n\t\t\tuniform = { value: null, needsUpdate: false };\n\n\t\tthis.uniform = uniform;\n\t\tthis.numPlanes = 0;\n\t\tthis.numIntersection = 0;\n\n\t\tthis.init = function( planes, enableLocalClipping, camera ) {\n\n\t\t\tvar enabled =\n\t\t\t\tplanes.length !== 0 ||\n\t\t\t\tenableLocalClipping ||\n\t\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t\t// run another frame in order to reset the state:\n\t\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\t\tlocalClippingEnabled;\n\n\t\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\t\tnumGlobalPlanes = planes.length;\n\n\t\t\treturn enabled;\n\n\t\t};\n\n\t\tthis.beginShadows = function() {\n\n\t\t\trenderingShadows = true;\n\t\t\tprojectPlanes( null );\n\n\t\t};\n\n\t\tthis.endShadows = function() {\n\n\t\t\trenderingShadows = false;\n\t\t\tresetGlobalState();\n\n\t\t};\n\n\t\tthis.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) {\n\n\t\t\tif ( ! localClippingEnabled ||\n\t\t\t\t\tplanes === null || planes.length === 0 ||\n\t\t\t\t\trenderingShadows && ! clipShadows ) {\n\t\t\t\t// there's no local clipping\n\n\t\t\t\tif ( renderingShadows ) {\n\t\t\t\t\t// there's no global clipping\n\n\t\t\t\t\tprojectPlanes( null );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tresetGlobalState();\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\t\tlGlobal = nGlobal * 4,\n\n\t\t\t\t\tdstArray = cache.clippingState || null;\n\n\t\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, fromCache );\n\n\t\t\t\tfor ( var i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcache.clippingState = dstArray;\n\t\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\t\tthis.numPlanes += nGlobal;\n\n\t\t\t}\n\n\n\t\t};\n\n\t\tfunction resetGlobalState() {\n\n\t\t\tif ( uniform.value !== globalState ) {\n\n\t\t\t\tuniform.value = globalState;\n\t\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = numGlobalPlanes;\n\t\t\tscope.numIntersection = 0;\n\n\t\t}\n\n\t\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\t\tvar nPlanes = planes !== null ? planes.length : 0,\n\t\t\t\tdstArray = null;\n\n\t\t\tif ( nPlanes !== 0 ) {\n\n\t\t\t\tdstArray = uniform.value;\n\n\t\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\t\tvar flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0, i4 = dstOffset;\n\t\t\t\t\t\t\t\t\t\ti !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\t\tplane.copy( planes[ i ] ).\n\t\t\t\t\t\t\t\tapplyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tuniform.value = dstArray;\n\t\t\t\tuniform.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = nPlanes;\n\t\t\t\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t * @author tschw\n\t */\n\n\tfunction WebGLRenderer( parameters ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer', REVISION );\n\n\t\tparameters = parameters || {};\n\n\t\tvar _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),\n\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;\n\n\t\tvar lights = [];\n\n\t\tvar opaqueObjects = [];\n\t\tvar opaqueObjectsLastIndex = - 1;\n\t\tvar transparentObjects = [];\n\t\tvar transparentObjectsLastIndex = - 1;\n\n\t\tvar morphInfluences = new Float32Array( 8 );\n\n\t\tvar sprites = [];\n\t\tvar lensFlares = [];\n\n\t\t// public properties\n\n\t\tthis.domElement = _canvas;\n\t\tthis.context = null;\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.gammaFactor = 2.0;\t// for backwards compatibility\n\t\tthis.gammaInput = false;\n\t\tthis.gammaOutput = false;\n\n\t\t// physical lights\n\n\t\tthis.physicallyCorrectLights = false;\n\n\t\t// tone mapping\n\n\t\tthis.toneMapping = LinearToneMapping;\n\t\tthis.toneMappingExposure = 1.0;\n\t\tthis.toneMappingWhitePoint = 1.0;\n\n\t\t// morphs\n\n\t\tthis.maxMorphTargets = 8;\n\t\tthis.maxMorphNormals = 4;\n\n\t\t// internal properties\n\n\t\tvar _this = this,\n\n\t\t// internal state cache\n\n\t\t_currentProgram = null,\n\t\t_currentRenderTarget = null,\n\t\t_currentFramebuffer = null,\n\t\t_currentMaterialId = - 1,\n\t\t_currentGeometryProgram = '',\n\t\t_currentCamera = null,\n\n\t\t_currentScissor = new Vector4(),\n\t\t_currentScissorTest = null,\n\n\t\t_currentViewport = new Vector4(),\n\n\t\t//\n\n\t\t_usedTextureUnits = 0,\n\n\t\t//\n\n\t\t_clearColor = new Color( 0x000000 ),\n\t\t_clearAlpha = 0,\n\n\t\t_width = _canvas.width,\n\t\t_height = _canvas.height,\n\n\t\t_pixelRatio = 1,\n\n\t\t_scissor = new Vector4( 0, 0, _width, _height ),\n\t\t_scissorTest = false,\n\n\t\t_viewport = new Vector4( 0, 0, _width, _height ),\n\n\t\t// frustum\n\n\t\t_frustum = new Frustum(),\n\n\t\t// clipping\n\n\t\t_clipping = new WebGLClipping(),\n\t\t_clippingEnabled = false,\n\t\t_localClippingEnabled = false,\n\n\t\t_sphere = new Sphere(),\n\n\t\t// camera matrices cache\n\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_vector3 = new Vector3(),\n\n\t\t// light arrays cache\n\n\t\t_lights = {\n\n\t\t\thash: '',\n\n\t\t\tambient: [ 0, 0, 0 ],\n\t\t\tdirectional: [],\n\t\t\tdirectionalShadowMap: [],\n\t\t\tdirectionalShadowMatrix: [],\n\t\t\tspot: [],\n\t\t\tspotShadowMap: [],\n\t\t\tspotShadowMatrix: [],\n\t\t\tpoint: [],\n\t\t\tpointShadowMap: [],\n\t\t\tpointShadowMatrix: [],\n\t\t\themi: [],\n\n\t\t\tshadows: []\n\n\t\t},\n\n\t\t// info\n\n\t\t_infoRender = {\n\n\t\t\tcalls: 0,\n\t\t\tvertices: 0,\n\t\t\tfaces: 0,\n\t\t\tpoints: 0\n\n\t\t};\n\n\t\tthis.info = {\n\n\t\t\trender: _infoRender,\n\t\t\tmemory: {\n\n\t\t\t\tgeometries: 0,\n\t\t\t\ttextures: 0\n\n\t\t\t},\n\t\t\tprograms: null\n\n\t\t};\n\n\n\t\t// initialize\n\n\t\tvar _gl;\n\n\t\ttry {\n\n\t\t\tvar attributes = {\n\t\t\t\talpha: _alpha,\n\t\t\t\tdepth: _depth,\n\t\t\t\tstencil: _stencil,\n\t\t\t\tantialias: _antialias,\n\t\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer\n\t\t\t};\n\n\t\t\t_gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( _canvas.getContext( 'webgl' ) !== null ) {\n\n\t\t\t\t\tthrow 'Error creating WebGL context with your selected attributes.';\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow 'Error creating WebGL context.';\n\n\t\t\t\t}\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\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: ' + error );\n\n\t\t}\n\n\t\tvar extensions = new WebGLExtensions( _gl );\n\n\t\textensions.get( 'WEBGL_depth_texture' );\n\t\textensions.get( 'OES_texture_float' );\n\t\textensions.get( 'OES_texture_float_linear' );\n\t\textensions.get( 'OES_texture_half_float' );\n\t\textensions.get( 'OES_texture_half_float_linear' );\n\t\textensions.get( 'OES_standard_derivatives' );\n\t\textensions.get( 'ANGLE_instanced_arrays' );\n\n\t\tif ( extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\tBufferGeometry.MaxIndex = 4294967296;\n\n\t\t}\n\n\t\tvar capabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\tvar state = new WebGLState( _gl, extensions, paramThreeToGL );\n\t\tvar properties = new WebGLProperties();\n\t\tvar textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, this.info );\n\t\tvar objects = new WebGLObjects( _gl, properties, this.info );\n\t\tvar programCache = new WebGLPrograms( this, capabilities );\n\t\tvar lightCache = new WebGLLights();\n\n\t\tthis.info.programs = programCache.programs;\n\n\t\tvar bufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender );\n\t\tvar indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );\n\n\t\t//\n\n\t\tvar backgroundCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\t\tvar backgroundCamera2 = new PerspectiveCamera();\n\t\tvar backgroundPlaneMesh = new Mesh(\n\t\t\tnew PlaneBufferGeometry( 2, 2 ),\n\t\t\tnew MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } )\n\t\t);\n\t\tvar backgroundBoxShader = ShaderLib[ 'cube' ];\n\t\tvar backgroundBoxMesh = new Mesh(\n\t\t\tnew BoxBufferGeometry( 5, 5, 5 ),\n\t\t\tnew ShaderMaterial( {\n\t\t\t\tuniforms: backgroundBoxShader.uniforms,\n\t\t\t\tvertexShader: backgroundBoxShader.vertexShader,\n\t\t\t\tfragmentShader: backgroundBoxShader.fragmentShader,\n\t\t\t\tside: BackSide,\n\t\t\t\tdepthTest: false,\n\t\t\t\tdepthWrite: false,\n\t\t\t\tfog: false\n\t\t\t} )\n\t\t);\n\n\t\t//\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\tfunction glClearColor( r, g, b, a ) {\n\n\t\t\tif ( _premultipliedAlpha === true ) {\n\n\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t}\n\n\t\t\tstate.clearColor( r, g, b, a );\n\n\t\t}\n\n\t\tfunction setDefaultGLState() {\n\n\t\t\tstate.init();\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );\n\n\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t}\n\n\t\tfunction resetGLState() {\n\n\t\t\t_currentProgram = null;\n\t\t\t_currentCamera = null;\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\n\t\t\tstate.reset();\n\n\t\t}\n\n\t\tsetDefaultGLState();\n\n\t\tthis.context = _gl;\n\t\tthis.capabilities = capabilities;\n\t\tthis.extensions = extensions;\n\t\tthis.properties = properties;\n\t\tthis.state = state;\n\n\t\t// shadow map\n\n\t\tvar shadowMap = new WebGLShadowMap( this, _lights, objects, capabilities );\n\n\t\tthis.shadowMap = shadowMap;\n\n\n\t\t// Plugins\n\n\t\tvar spritePlugin = new SpritePlugin( this, sprites );\n\t\tvar lensFlarePlugin = new LensFlarePlugin( this, lensFlares );\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\textensions.get( 'WEBGL_lose_context' ).loseContext();\n\n\t\t};\n\n\t\tthis.getMaxAnisotropy = function () {\n\n\t\t\treturn capabilities.getMaxAnisotropy();\n\n\t\t};\n\n\t\tthis.getPrecision = function () {\n\n\t\t\treturn capabilities.precision;\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( _viewport.z, _viewport.w, false );\n\n\t\t};\n\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_canvas.width = width * _pixelRatio;\n\t\t\t_canvas.height = height * _pixelRatio;\n\n\t\t\tif ( updateStyle !== false ) {\n\n\t\t\t\t_canvas.style.width = width + 'px';\n\t\t\t\t_canvas.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.setViewport = function ( x, y, width, height ) {\n\n\t\t\tstate.viewport( _viewport.set( x, y, width, height ) );\n\n\t\t};\n\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tstate.scissor( _scissor.set( x, y, width, height ) );\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\t// Clearing\n\n\t\tthis.getClearColor = function () {\n\n\t\t\treturn _clearColor;\n\n\t\t};\n\n\t\tthis.setClearColor = function ( color, alpha ) {\n\n\t\t\t_clearColor.set( color );\n\n\t\t\t_clearAlpha = alpha !== undefined ? alpha : 1;\n\n\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t};\n\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn _clearAlpha;\n\n\t\t};\n\n\t\tthis.setClearAlpha = function ( alpha ) {\n\n\t\t\t_clearAlpha = alpha;\n\n\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t};\n\n\t\tthis.clear = function ( color, depth, stencil ) {\n\n\t\t\tvar bits = 0;\n\n\t\t\tif ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;\n\t\t\tif ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\t\tif ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;\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\tthis.clearTarget = function ( renderTarget, color, depth, stencil ) {\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\t\t\tthis.clear( color, depth, stencil );\n\n\t\t};\n\n\t\t// Reset\n\n\t\tthis.resetGLState = resetGLState;\n\n\t\tthis.dispose = function() {\n\n\t\t\ttransparentObjects = [];\n\t\t\ttransparentObjectsLastIndex = -1;\n\t\t\topaqueObjects = [];\n\t\t\topaqueObjectsLastIndex = -1;\n\n\t\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\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\tresetGLState();\n\t\t\tsetDefaultGLState();\n\n\t\t\tproperties.clear();\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tvar 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\treleaseMaterialProgramReference( material );\n\n\t\t\tproperties.delete( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReference( material ) {\n\n\t\t\tvar programInfo = properties.get( material ).program;\n\n\t\t\tmaterial.program = undefined;\n\n\t\t\tif ( programInfo !== undefined ) {\n\n\t\t\t\tprogramCache.releaseProgram( programInfo );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferImmediate = function ( object, program, material ) {\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar buffers = properties.get( object );\n\n\t\t\tif ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();\n\t\t\tif ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();\n\t\t\tif ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();\n\t\t\tif ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( object.hasPositions ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.position );\n\t\t\t\t_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasNormals ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal );\n\n\t\t\t\tif ( ! material.isMeshPhongMaterial &&\n\t\t\t\t ! material.isMeshStandardMaterial &&\n\t\t\t\t material.shading === FlatShading ) {\n\n\t\t\t\t\tfor ( var i = 0, l = object.count * 3; i < l; i += 9 ) {\n\n\t\t\t\t\t\tvar array = object.normalArray;\n\n\t\t\t\t\t\tvar nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3;\n\t\t\t\t\t\tvar ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3;\n\t\t\t\t\t\tvar nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3;\n\n\t\t\t\t\t\tarray[ i + 0 ] = nx;\n\t\t\t\t\t\tarray[ i + 1 ] = ny;\n\t\t\t\t\t\tarray[ i + 2 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 3 ] = nx;\n\t\t\t\t\t\tarray[ i + 4 ] = ny;\n\t\t\t\t\t\tarray[ i + 5 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 6 ] = nx;\n\t\t\t\t\t\tarray[ i + 7 ] = ny;\n\t\t\t\t\t\tarray[ i + 8 ] = nz;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.normal );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasUvs && material.map ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.uv );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasColors && material.vertexColors !== NoColors ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.color );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t_gl.drawArrays( _gl.TRIANGLES, 0, object.count );\n\n\t\t\tobject.count = 0;\n\n\t\t};\n\n\t\tthis.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {\n\n\t\t\tsetMaterial( material );\n\n\t\t\tvar program = setProgram( camera, fog, material, object );\n\n\t\t\tvar updateBuffers = false;\n\t\t\tvar geometryProgram = geometry.id + '_' + program.id + '_' + material.wireframe;\n\n\t\t\tif ( geometryProgram !== _currentGeometryProgram ) {\n\n\t\t\t\t_currentGeometryProgram = geometryProgram;\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphTargetInfluences = object.morphTargetInfluences;\n\n\t\t\tif ( morphTargetInfluences !== undefined ) {\n\n\t\t\t\tvar activeInfluences = [];\n\n\t\t\t\tfor ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = morphTargetInfluences[ i ];\n\t\t\t\t\tactiveInfluences.push( [ influence, i ] );\n\n\t\t\t\t}\n\n\t\t\t\tactiveInfluences.sort( absNumericalSort );\n\n\t\t\t\tif ( activeInfluences.length > 8 ) {\n\n\t\t\t\t\tactiveInfluences.length = 8;\n\n\t\t\t\t}\n\n\t\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\t\tfor ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = activeInfluences[ i ];\n\t\t\t\t\tmorphInfluences[ i ] = influence[ 0 ];\n\n\t\t\t\t\tif ( influence[ 0 ] !== 0 ) {\n\n\t\t\t\t\t\tvar index = influence[ 1 ];\n\n\t\t\t\t\t\tif ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] );\n\t\t\t\t\t\tif ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i );\n\t\t\t\t\t\tif ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) {\n\n\t\t\t\t\tmorphInfluences[ i ] = 0.0;\n\n\t\t\t\t}\n\n\t\t\t\tprogram.getUniforms().setValue(\n\t\t\t\t\t\t_gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar position = geometry.attributes.position;\n\t\t\tvar rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = objects.getWireframeAttribute( geometry );\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\tvar renderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( index );\n\n\t\t\t} else {\n\n\t\t\t\trenderer = bufferRenderer;\n\n\t\t\t}\n\n\t\t\tif ( updateBuffers ) {\n\n\t\t\t\tsetupVertexAttributes( material, program, geometry );\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, objects.getAttributeBuffer( index ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar dataCount = 0;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdataCount = index.count;\n\n\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\tdataCount = position.count;\n\n\t\t\t}\n\n\t\t\tvar rangeStart = geometry.drawRange.start * rangeFactor;\n\t\t\tvar rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\t\tvar groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\t\tvar groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\t\tvar drawStart = Math.max( rangeStart, groupStart );\n\t\t\tvar drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\t\tvar drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\t\tif ( drawCount === 0 ) return;\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\tswitch ( object.drawMode ) {\n\n\t\t\t\t\t\tcase TrianglesDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleStripDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_STRIP );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleFanDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_FAN );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tvar 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 {\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}\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tif ( geometry.maxInstancedCount > 0 ) {\n\n\t\t\t\t\trenderer.renderInstances( geometry, drawStart, drawCount );\n\n\t\t\t\t}\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\tfunction setupVertexAttributes( material, program, geometry, startIndex ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( startIndex === undefined ) startIndex = 0;\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar geometryAttributes = geometry.attributes;\n\n\t\t\tvar programAttributes = program.getAttributes();\n\n\t\t\tvar materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\t\tfor ( var name in programAttributes ) {\n\n\t\t\t\tvar programAttribute = programAttributes[ name ];\n\n\t\t\t\tif ( programAttribute >= 0 ) {\n\n\t\t\t\t\tvar geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\t\tvar type = _gl.FLOAT;\n\t\t\t\t\t\tvar array = geometryAttribute.array;\n\t\t\t\t\t\tvar normalized = geometryAttribute.normalized;\n\n\t\t\t\t\t\tif ( array instanceof Float32Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.FLOAT;\n\n\t\t\t\t\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\t\t\t\t\tconsole.warn( \"Unsupported data buffer format: Float64Array\" );\n\n\t\t\t\t\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.UNSIGNED_SHORT;\n\n\t\t\t\t\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.SHORT;\n\n\t\t\t\t\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.UNSIGNED_INT;\n\n\t\t\t\t\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.INT;\n\n\t\t\t\t\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.BYTE;\n\n\t\t\t\t\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.UNSIGNED_BYTE;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar size = geometryAttribute.itemSize;\n\t\t\t\t\t\tvar buffer = objects.getAttributeBuffer( geometryAttribute );\n\n\t\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\t\tvar data = geometryAttribute.data;\n\t\t\t\t\t\t\tvar stride = data.stride;\n\t\t\t\t\t\t\tvar offset = geometryAttribute.offset;\n\n\t\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * data.array.BYTES_PER_ELEMENT, ( startIndex * stride + offset ) * data.array.BYTES_PER_ELEMENT );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * geometryAttribute.array.BYTES_PER_ELEMENT );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\t\tvar value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib2fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib3fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib4fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib1fv( programAttribute, value );\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\tstate.disableUnusedAttributes();\n\n\t\t}\n\n\t\t// Sorting\n\n\t\tfunction absNumericalSort( a, b ) {\n\n\t\t\treturn Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] );\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} else if ( a.material.program && b.material.program && a.material.program !== b.material.program ) {\n\n\t\t\t\treturn a.material.program.id - b.material.program.id;\n\n\t\t\t} else if ( a.material.id !== b.material.id ) {\n\n\t\t\t\treturn a.material.id - b.material.id;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn a.z - b.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction reversePainterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Rendering\n\n\t\tthis.render = function ( scene, camera, renderTarget, forceClear ) {\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\t// reset caching for this frame\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\t\t\t_currentCamera = null;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\tlights.length = 0;\n\n\t\t\topaqueObjectsLastIndex = - 1;\n\t\t\ttransparentObjectsLastIndex = - 1;\n\n\t\t\tsprites.length = 0;\n\t\t\tlensFlares.length = 0;\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\t\tprojectObject( scene, camera );\n\n\t\t\topaqueObjects.length = opaqueObjectsLastIndex + 1;\n\t\t\ttransparentObjects.length = transparentObjectsLastIndex + 1;\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\topaqueObjects.sort( painterSortStable );\n\t\t\t\ttransparentObjects.sort( reversePainterSortStable );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _clippingEnabled ) _clipping.beginShadows();\n\n\t\t\tsetupShadows( lights );\n\n\t\t\tshadowMap.render( scene, camera );\n\n\t\t\tsetupLights( lights, camera );\n\n\t\t\tif ( _clippingEnabled ) _clipping.endShadows();\n\n\t\t\t//\n\n\t\t\t_infoRender.calls = 0;\n\t\t\t_infoRender.vertices = 0;\n\t\t\t_infoRender.faces = 0;\n\t\t\t_infoRender.points = 0;\n\n\t\t\tif ( renderTarget === undefined ) {\n\n\t\t\t\trenderTarget = null;\n\n\t\t\t}\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\n\t\t\t//\n\n\t\t\tvar background = scene.background;\n\n\t\t\tif ( background === null ) {\n\n\t\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t\t} else if ( background && background.isColor ) {\n\n\t\t\t\tglClearColor( background.r, background.g, background.b, 1 );\n\t\t\t\tforceClear = true;\n\n\t\t\t}\n\n\t\t\tif ( this.autoClear || forceClear ) {\n\n\t\t\t\tthis.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil );\n\n\t\t\t}\n\n\t\t\tif ( background && background.isCubeTexture ) {\n\n\t\t\t\tbackgroundCamera2.projectionMatrix.copy( camera.projectionMatrix );\n\n\t\t\t\tbackgroundCamera2.matrixWorld.extractRotation( camera.matrixWorld );\n\t\t\t\tbackgroundCamera2.matrixWorldInverse.getInverse( backgroundCamera2.matrixWorld );\n\n\t\t\t\tbackgroundBoxMesh.material.uniforms[ \"tCube\" ].value = background;\n\t\t\t\tbackgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundCamera2.matrixWorldInverse, backgroundBoxMesh.matrixWorld );\n\n\t\t\t\tobjects.update( backgroundBoxMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundCamera2, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null );\n\n\t\t\t} else if ( background && background.isTexture ) {\n\n\t\t\t\tbackgroundPlaneMesh.material.map = background;\n\n\t\t\t\tobjects.update( backgroundPlaneMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.overrideMaterial ) {\n\n\t\t\t\tvar overrideMaterial = scene.overrideMaterial;\n\n\t\t\t\trenderObjects( opaqueObjects, scene, camera, overrideMaterial );\n\t\t\t\trenderObjects( transparentObjects, scene, camera, overrideMaterial );\n\n\t\t\t} else {\n\n\t\t\t\t// opaque pass (front-to-back order)\n\n\t\t\t\tstate.setBlending( NoBlending );\n\t\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\t\t// transparent pass (back-to-front order)\n\n\t\t\t\trenderObjects( transparentObjects, scene, camera );\n\n\t\t\t}\n\n\t\t\t// custom render plugins (post pass)\n\n\t\t\tspritePlugin.render( scene, camera );\n\t\t\tlensFlarePlugin.render( scene, camera, _currentViewport );\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\ttextures.updateRenderTargetMipmap( renderTarget );\n\n\t\t\t}\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.setDepthTest( true );\n\t\t\tstate.setDepthWrite( true );\n\t\t\tstate.setColorWrite( true );\n\n\t\t\t// _gl.finish();\n\n\t\t};\n\n\t\tfunction pushRenderItem( object, geometry, material, z, group ) {\n\n\t\t\tvar array, index;\n\n\t\t\t// allocate the next position in the appropriate array\n\n\t\t\tif ( material.transparent ) {\n\n\t\t\t\tarray = transparentObjects;\n\t\t\t\tindex = ++ transparentObjectsLastIndex;\n\n\t\t\t} else {\n\n\t\t\t\tarray = opaqueObjects;\n\t\t\t\tindex = ++ opaqueObjectsLastIndex;\n\n\t\t\t}\n\n\t\t\t// recycle existing render item or grow the array\n\n\t\t\tvar renderItem = array[ index ];\n\n\t\t\tif ( renderItem !== undefined ) {\n\n\t\t\t\trenderItem.id = object.id;\n\t\t\t\trenderItem.object = object;\n\t\t\t\trenderItem.geometry = geometry;\n\t\t\t\trenderItem.material = material;\n\t\t\t\trenderItem.z = _vector3.z;\n\t\t\t\trenderItem.group = group;\n\n\t\t\t} else {\n\n\t\t\t\trenderItem = {\n\t\t\t\t\tid: object.id,\n\t\t\t\t\tobject: object,\n\t\t\t\t\tgeometry: geometry,\n\t\t\t\t\tmaterial: material,\n\t\t\t\t\tz: _vector3.z,\n\t\t\t\t\tgroup: group\n\t\t\t\t};\n\n\t\t\t\t// assert( index === array.length );\n\t\t\t\tarray.push( renderItem );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Duplicated code (Frustum)\n\n\t\tfunction isObjectViewable( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t_sphere.copy( geometry.boundingSphere ).\n\t\t\t\tapplyMatrix4( object.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSpriteViewable( sprite ) {\n\n\t\t\t_sphere.center.set( 0, 0, 0 );\n\t\t\t_sphere.radius = 0.7071067811865476;\n\t\t\t_sphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSphereViewable( sphere ) {\n\n\t\t\tif ( ! _frustum.intersectsSphere( sphere ) ) return false;\n\n\t\t\tvar numPlanes = _clipping.numPlanes;\n\n\t\t\tif ( numPlanes === 0 ) return true;\n\n\t\t\tvar planes = _this.clippingPlanes,\n\n\t\t\t\tcenter = sphere.center,\n\t\t\t\tnegRad = - sphere.radius,\n\t\t\t\ti = 0;\n\n\t\t\tdo {\n\n\t\t\t\t// out when deeper than radius in the negative halfspace\n\t\t\t\tif ( planes[ i ].distanceToPoint( center ) < negRad ) return false;\n\n\t\t\t} while ( ++ i !== numPlanes );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isLight ) {\n\n\t\t\t\t\tlights.push( object );\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( object.frustumCulled === false || isSpriteViewable( object ) === true ) {\n\n\t\t\t\t\t\tsprites.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isLensFlare ) {\n\n\t\t\t\t\tlensFlares.push( object );\n\n\t\t\t\t} else if ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t_vector3.applyProjection( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpushRenderItem( object, null, object.material, _vector3.z, null );\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( object.frustumCulled === false || isObjectViewable( object ) === true ) {\n\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t\t\t_vector3.applyProjection( _projScreenMatrix );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar geometry = objects.update( object );\n\n\t\t\t\t\t\t\tif ( material.isMultiMaterial ) {\n\n\t\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tvar group = groups[ i ];\n\t\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, groupMaterial, _vector3.z, group );\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} else {\n\n\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, material, _vector3.z, null );\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\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera, overrideMaterial ) {\n\n\t\t\tfor ( var i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tvar renderItem = renderList[ i ];\n\n\t\t\t\tvar object = renderItem.object;\n\t\t\t\tvar geometry = renderItem.geometry;\n\t\t\t\tvar material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;\n\t\t\t\tvar group = renderItem.group;\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\t\tif ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tsetMaterial( material );\n\n\t\t\t\t\tvar program = setProgram( camera, scene.fog, material, object );\n\n\t\t\t\t\t_currentGeometryProgram = '';\n\n\t\t\t\t\tobject.render( function ( object ) {\n\n\t\t\t\t\t\t_this.renderBufferImmediate( object, program, material );\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );\n\n\t\t\t\t}\n\n\t\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction initMaterial( material, fog, object ) {\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tvar parameters = programCache.getParameters(\n\t\t\t\t\tmaterial, _lights, fog, _clipping.numPlanes, _clipping.numIntersection, object );\n\n\t\t\tvar code = programCache.getProgramCode( material, parameters );\n\n\t\t\tvar program = materialProperties.program;\n\t\t\tvar programChange = true;\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\t// new material\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t} else if ( program.code !== code ) {\n\n\t\t\t\t// changed glsl or parameters\n\t\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\t} else if ( parameters.shaderID !== undefined ) {\n\n\t\t\t\t// same glsl and uniform list\n\t\t\t\treturn;\n\n\t\t\t} else {\n\n\t\t\t\t// only rebuild uniform list\n\t\t\t\tprogramChange = false;\n\n\t\t\t}\n\n\t\t\tif ( programChange ) {\n\n\t\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\t\tvar shader = ShaderLib[ parameters.shaderID ];\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\t\t\tfragmentShader: shader.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: material.uniforms,\n\t\t\t\t\t\tvertexShader: material.vertexShader,\n\t\t\t\t\t\tfragmentShader: material.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.__webglShader = materialProperties.__webglShader;\n\n\t\t\t\tprogram = programCache.acquireProgram( material, parameters, code );\n\n\t\t\t\tmaterialProperties.program = program;\n\t\t\t\tmaterial.program = program;\n\n\t\t\t}\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\tmaterial.numSupportedMorphTargets = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphTargets; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphTarget' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphTargets ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.morphNormals ) {\n\n\t\t\t\tmaterial.numSupportedMorphNormals = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphNormals; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphNormal' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphNormals ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( ! material.isShaderMaterial &&\n\t\t\t ! material.isRawShaderMaterial ||\n\t\t\t material.clipping === true ) {\n\n\t\t\t\tmaterialProperties.numClippingPlanes = _clipping.numPlanes;\n\t\t\t\tmaterialProperties.numIntersection = _clipping.numIntersection;\n\t\t\t\tuniforms.clippingPlanes = _clipping.uniform;\n\n\t\t\t}\n\n\t\t\tmaterialProperties.fog = fog;\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.lightsHash = _lights.hash;\n\n\t\t\tif ( material.lights ) {\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.ambient;\n\t\t\t\tuniforms.directionalLights.value = _lights.directional;\n\t\t\t\tuniforms.spotLights.value = _lights.spot;\n\t\t\t\tuniforms.pointLights.value = _lights.point;\n\t\t\t\tuniforms.hemisphereLights.value = _lights.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = _lights.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = _lights.spotShadowMap;\n\t\t\t\tuniforms.spotShadowMatrix.value = _lights.spotShadowMatrix;\n\t\t\t\tuniforms.pointShadowMap.value = _lights.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = _lights.pointShadowMatrix;\n\n\t\t\t}\n\n\t\t\tvar progUniforms = materialProperties.program.getUniforms(),\n\t\t\t\tuniformsList =\n\t\t\t\t\t\tWebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t\t}\n\n\t\tfunction setMaterial( material ) {\n\n\t\t\tmaterial.side === DoubleSide\n\t\t\t\t? state.disable( _gl.CULL_FACE )\n\t\t\t\t: state.enable( _gl.CULL_FACE );\n\n\t\t\tstate.setFlipSided( material.side === BackSide );\n\n\t\t\tmaterial.transparent === true\n\t\t\t\t? state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )\n\t\t\t\t: state.setBlending( NoBlending );\n\n\t\t\tstate.setDepthFunc( material.depthFunc );\n\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\tstate.setDepthWrite( material.depthWrite );\n\t\t\tstate.setColorWrite( material.colorWrite );\n\t\t\tstate.setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\t}\n\n\t\tfunction setProgram( camera, fog, material, object ) {\n\n\t\t\t_usedTextureUnits = 0;\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tif ( _clippingEnabled ) {\n\n\t\t\t\tif ( _localClippingEnabled || camera !== _currentCamera ) {\n\n\t\t\t\t\tvar useCache =\n\t\t\t\t\t\t\tcamera === _currentCamera &&\n\t\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\t_clipping.setState(\n\t\t\t\t\t\t\tmaterial.clippingPlanes, material.clipIntersection, material.clipShadows,\n\t\t\t\t\t\t\tcamera, materialProperties, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate === false ) {\n\n\t\t\t\tif ( materialProperties.program === undefined ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.lights && materialProperties.lightsHash !== _lights.hash ) {\n\n\t\t\t\t\tmaterial.needsUpdate = 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\t materialProperties.numIntersection !== _clipping.numIntersection ) ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate ) {\n\n\t\t\t\tinitMaterial( material, fog, object );\n\t\t\t\tmaterial.needsUpdate = false;\n\n\t\t\t}\n\n\t\t\tvar refreshProgram = false;\n\t\t\tvar refreshMaterial = false;\n\t\t\tvar refreshLights = false;\n\n\t\t\tvar program = materialProperties.program,\n\t\t\t\tp_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( program.id !== _currentProgram ) {\n\n\t\t\t\t_gl.useProgram( program.program );\n\t\t\t\t_currentProgram = program.id;\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 || camera !== _currentCamera ) {\n\n\t\t\t\tp_uniforms.set( _gl, camera, 'projectionMatrix' );\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\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( camera !== _currentCamera ) {\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\t// load material specific uniforms\n\t\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\t material.isMeshPhongMaterial ||\n\t\t\t\t material.isMeshStandardMaterial ||\n\t\t\t\t material.envMap ) {\n\n\t\t\t\t\tvar uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t material.isMeshLambertMaterial ||\n\t\t\t\t material.isMeshBasicMaterial ||\n\t\t\t\t material.isMeshStandardMaterial ||\n\t\t\t\t material.isShaderMaterial ||\n\t\t\t\t material.skinning ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingExposure' );\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingWhitePoint' );\n\n\t\t\t}\n\n\t\t\t// skinning uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone texture must go before other textures\n\t\t\t// not sure why, but otherwise weird things happen\n\n\t\t\tif ( material.skinning ) {\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\tvar skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( capabilities.floatVertexTextures && skeleton.useVertexTexture ) {\n\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTexture' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureWidth' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureHeight' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tif ( material.lights ) {\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 ) {\n\n\t\t\t\t\trefreshUniformsFog( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshBasicMaterial ||\n\t\t\t\t material.isMeshLambertMaterial ||\n\t\t\t\t material.isMeshPhongMaterial ||\n\t\t\t\t material.isMeshStandardMaterial ||\n\t\t\t\t material.isMeshDepthMaterial ) {\n\n\t\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh single material specific uniforms\n\n\t\t\t\tif ( material.isLineBasicMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isLineDashedMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\t\t\t\t\trefreshUniformsDash( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\t\t\trefreshUniformsPoints( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\t\t\trefreshUniformsLambert( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhong( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhysical( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\t\t\trefreshUniformsStandard( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\t\t\tm_uniforms.displacementMap.value = material.displacementMap;\n\t\t\t\t\t\tm_uniforms.displacementScale.value = material.displacementScale;\n\t\t\t\t\t\tm_uniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\t\t\tm_uniforms.opacity.value = material.opacity;\n\n\t\t\t\t}\n\n\t\t\t\tWebGLUniforms.upload(\n\t\t\t\t\t\t_gl, materialProperties.uniformsList, m_uniforms, _this );\n\n\t\t\t}\n\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.set( _gl, object, 'modelViewMatrix' );\n\t\t\tp_uniforms.set( _gl, object, 'normalMatrix' );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// Uniforms (refresh uniforms objects)\n\n\t\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t\tuniforms.diffuse.value = material.color;\n\n\t\t\tif ( material.emissive ) {\n\n\t\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t\t}\n\n\t\t\tuniforms.map.value = material.map;\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\tif ( material.aoMap ) {\n\n\t\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\t}\n\n\t\t\t// uv repeat and offset setting priorities\n\t\t\t// 1. color map\n\t\t\t// 2. specular map\n\t\t\t// 3. normal map\n\t\t\t// 4. bump map\n\t\t\t// 5. alpha map\n\t\t\t// 6. emissive map\n\n\t\t\tvar uvScaleMap;\n\n\t\t\tif ( material.map ) {\n\n\t\t\t\tuvScaleMap = material.map;\n\n\t\t\t} else if ( material.specularMap ) {\n\n\t\t\t\tuvScaleMap = material.specularMap;\n\n\t\t\t} else if ( material.displacementMap ) {\n\n\t\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t\t} else if ( material.normalMap ) {\n\n\t\t\t\tuvScaleMap = material.normalMap;\n\n\t\t\t} else if ( material.bumpMap ) {\n\n\t\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t\t} else if ( material.roughnessMap ) {\n\n\t\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t\t} else if ( material.metalnessMap ) {\n\n\t\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t\t} else if ( material.alphaMap ) {\n\n\t\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t\t} else if ( material.emissiveMap ) {\n\n\t\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t\t// backwards compatibility\n\t\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t\t}\n\n\t\t\t\tvar offset = uvScaleMap.offset;\n\t\t\t\tvar repeat = uvScaleMap.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t\tuniforms.envMap.value = material.envMap;\n\n\t\t\t// don't flip CubeTexture envMaps, flip everything else:\n\t\t\t// WebGLRenderTargetCube will be flipped for backwards compatibility\n\t\t\t// WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture\n\t\t\t// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future\n\t\t\tuniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t}\n\n\t\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\t\tuniforms.dashSize.value = material.dashSize;\n\t\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\t\tuniforms.scale.value = material.scale;\n\n\t\t}\n\n\t\tfunction refreshUniformsPoints( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\t\t\tuniforms.size.value = material.size * _pixelRatio;\n\t\t\tuniforms.scale.value = _height * 0.5;\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\tif ( material.map !== null ) {\n\n\t\t\t\tvar offset = material.map.offset;\n\t\t\t\tvar repeat = material.map.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsFog( uniforms, fog ) {\n\n\t\t\tuniforms.fogColor.value = fog.color;\n\n\t\t\tif ( fog.isFog ) {\n\n\t\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\t\tuniforms.specular.value = material.specular;\n\t\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\t\tuniforms.roughness.value = material.roughness;\n\t\t\tuniforms.metalness.value = material.metalness;\n\n\t\t\tif ( material.roughnessMap ) {\n\n\t\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.metalnessMap ) {\n\n\t\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t\tif ( material.envMap ) {\n\n\t\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhysical( uniforms, material ) {\n\n\t\t\tuniforms.clearCoat.value = material.clearCoat;\n\t\t\tuniforms.clearCoatRoughness.value = material.clearCoatRoughness;\n\n\t\t\trefreshUniformsStandard( uniforms, material );\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\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\t// Lighting\n\n\t\tfunction setupShadows( lights ) {\n\n\t\t\tvar lightShadowsLength = 0;\n\n\t\t\tfor ( var i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\t\tvar light = lights[ i ];\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t_lights.shadows[ lightShadowsLength ++ ] = light;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.shadows.length = lightShadowsLength;\n\n\t\t}\n\n\t\tfunction setupLights( lights, camera ) {\n\n\t\t\tvar l, ll, light,\n\t\t\tr = 0, g = 0, b = 0,\n\t\t\tcolor,\n\t\t\tintensity,\n\t\t\tdistance,\n\t\t\tshadowMap,\n\n\t\t\tviewMatrix = camera.matrixWorldInverse,\n\n\t\t\tdirectionalLength = 0,\n\t\t\tpointLength = 0,\n\t\t\tspotLength = 0,\n\t\t\themiLength = 0;\n\n\t\t\tfor ( l = 0, ll = lights.length; l < ll; l ++ ) {\n\n\t\t\t\tlight = lights[ l ];\n\n\t\t\t\tcolor = light.color;\n\t\t\t\tintensity = light.intensity;\n\t\t\t\tdistance = light.distance;\n\n\t\t\t\tshadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\t\tr += color.r * intensity;\n\t\t\t\t\tg += color.g * intensity;\n\t\t\t\t\tb += color.b * intensity;\n\n\t\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\t_lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.directional[ directionalLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\t_lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.spot[ spotLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.pointShadowMap[ pointLength ] = shadowMap;\n\n\t\t\t\t\tif ( _lights.pointShadowMatrix[ pointLength ] === undefined ) {\n\n\t\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ] = new Matrix4();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// for point lights we set the shadow matrix to be a translation-only matrix\n\t\t\t\t\t// equal to inverse of the light's position\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.matrixWorld ).negate();\n\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ].identity().setPosition( _vector3 );\n\n\t\t\t\t\t_lights.point[ pointLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\t\t_lights.hemi[ hemiLength ++ ] = uniforms;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.ambient[ 0 ] = r;\n\t\t\t_lights.ambient[ 1 ] = g;\n\t\t\t_lights.ambient[ 2 ] = b;\n\n\t\t\t_lights.directional.length = directionalLength;\n\t\t\t_lights.spot.length = spotLength;\n\t\t\t_lights.point.length = pointLength;\n\t\t\t_lights.hemi.length = hemiLength;\n\n\t\t\t_lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + hemiLength + ',' + _lights.shadows.length;\n\n\t\t}\n\n\t\t// GL state setting\n\n\t\tthis.setFaceCulling = function ( cullFace, frontFaceDirection ) {\n\n\t\t\tstate.setCullFace( cullFace );\n\t\t\tstate.setFlipSided( frontFaceDirection === FrontFaceDirectionCW );\n\n\t\t};\n\n\t\t// Textures\n\n\t\tfunction allocTextureUnit() {\n\n\t\t\tvar textureUnit = _usedTextureUnits;\n\n\t\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\t\tconsole.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t\t}\n\n\t\t\t_usedTextureUnits += 1;\n\n\t\t\treturn textureUnit;\n\n\t\t}\n\n\t\tthis.allocTextureUnit = allocTextureUnit;\n\n\t\t// this.setTexture2D = setTexture2D;\n\t\tthis.setTexture2D = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\t// backwards compatibility: peel texture.texture\n\t\t\treturn function setTexture2D( texture, slot ) {\n\n\t\t\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTexture = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTexture( texture, slot ) {\n\n\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.\" );\n\t\t\t\t\twarned = true;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTextureCube = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTextureCube( texture, slot ) {\n\n\t\t\t\t// backwards compatibility: peel texture.texture\n\t\t\t\tif ( texture && texture.isWebGLRenderTargetCube ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\t// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture\n\t\t\t\t// TODO: unify these code paths\n\t\t\t\tif ( ( texture && texture.isCubeTexture ) ||\n\t\t\t\t\t ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {\n\n\t\t\t\t\t// CompressedTexture can have Array in image :/\n\n\t\t\t\t\t// this function alone should take care of cube textures\n\t\t\t\t\ttextures.setTextureCube( texture, slot );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assumed: texture property of THREE.WebGLRenderTargetCube\n\n\t\t\t\t\ttextures.setTextureCubeDynamic( texture, slot );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.getCurrentRenderTarget = function() {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTarget = function ( renderTarget ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\n\t\t\tif ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t}\n\n\t\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\t\tvar framebuffer;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer;\n\n\t\t\t\t}\n\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = null;\n\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );\n\n\t\t\t}\n\n\t\t\tif ( _currentFramebuffer !== framebuffer ) {\n\n\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t\t_currentFramebuffer = framebuffer;\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tstate.viewport( _currentViewport );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) {\n\n\t\t\tif ( ( renderTarget && renderTarget.isWebGLRenderTarget ) === false ) {\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\tvar framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tvar restore = false;\n\n\t\t\t\tif ( framebuffer !== _currentFramebuffer ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\trestore = true;\n\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar texture = renderTarget.texture;\n\t\t\t\t\tvar textureFormat = texture.format;\n\t\t\t\t\tvar textureType = texture.type;\n\n\t\t\t\t\tif ( textureFormat !== RGBAFormat && paramThreeToGL( 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\tif ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t ! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t ! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) {\n\n\t\t\t\t\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\tif ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {\n\n\t\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\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t\t_gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\tif ( restore ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );\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// Map three.js constants to WebGL constants\n\n\t\tfunction paramThreeToGL( p ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( p === RepeatWrapping ) return _gl.REPEAT;\n\t\t\tif ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE;\n\t\t\tif ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT;\n\n\t\t\tif ( p === NearestFilter ) return _gl.NEAREST;\n\t\t\tif ( p === NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST;\n\t\t\tif ( p === NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR;\n\n\t\t\tif ( p === LinearFilter ) return _gl.LINEAR;\n\t\t\tif ( p === LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST;\n\t\t\tif ( p === LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR;\n\n\t\t\tif ( p === UnsignedByteType ) return _gl.UNSIGNED_BYTE;\n\t\t\tif ( p === UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4;\n\t\t\tif ( p === UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1;\n\t\t\tif ( p === UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5;\n\n\t\t\tif ( p === ByteType ) return _gl.BYTE;\n\t\t\tif ( p === ShortType ) return _gl.SHORT;\n\t\t\tif ( p === UnsignedShortType ) return _gl.UNSIGNED_SHORT;\n\t\t\tif ( p === IntType ) return _gl.INT;\n\t\t\tif ( p === UnsignedIntType ) return _gl.UNSIGNED_INT;\n\t\t\tif ( p === FloatType ) return _gl.FLOAT;\n\n\t\t\tif ( p === HalfFloatType ) {\n\n\t\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\t\tif ( extension !== null ) return extension.HALF_FLOAT_OES;\n\n\t\t\t}\n\n\t\t\tif ( p === AlphaFormat ) return _gl.ALPHA;\n\t\t\tif ( p === RGBFormat ) return _gl.RGB;\n\t\t\tif ( p === RGBAFormat ) return _gl.RGBA;\n\t\t\tif ( p === LuminanceFormat ) return _gl.LUMINANCE;\n\t\t\tif ( p === LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA;\n\t\t\tif ( p === DepthFormat ) return _gl.DEPTH_COMPONENT;\n\t\t\tif ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL;\n\n\t\t\tif ( p === AddEquation ) return _gl.FUNC_ADD;\n\t\t\tif ( p === SubtractEquation ) return _gl.FUNC_SUBTRACT;\n\t\t\tif ( p === ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT;\n\n\t\t\tif ( p === ZeroFactor ) return _gl.ZERO;\n\t\t\tif ( p === OneFactor ) return _gl.ONE;\n\t\t\tif ( p === SrcColorFactor ) return _gl.SRC_COLOR;\n\t\t\tif ( p === OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR;\n\t\t\tif ( p === SrcAlphaFactor ) return _gl.SRC_ALPHA;\n\t\t\tif ( p === OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA;\n\t\t\tif ( p === DstAlphaFactor ) return _gl.DST_ALPHA;\n\t\t\tif ( p === OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA;\n\n\t\t\tif ( p === DstColorFactor ) return _gl.DST_COLOR;\n\t\t\tif ( p === OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR;\n\t\t\tif ( p === SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE;\n\n\t\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||\n\t\t\t\tp === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\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}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||\n\t\t\t\t p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\t\tif ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t}\n\n\t\t\tif ( p === MinEquation || p === MaxEquation ) {\n\n\t\t\t\textension = extensions.get( 'EXT_blend_minmax' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === MinEquation ) return extension.MIN_EXT;\n\t\t\t\t\tif ( p === MaxEquation ) return extension.MAX_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\t\tif ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t}\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction FogExp2 ( color, density ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = ( density !== undefined ) ? density : 0.00025;\n\n\t}\n\n\tFogExp2.prototype.isFogExp2 = true;\n\n\tFogExp2.prototype.clone = function () {\n\n\t\treturn new FogExp2( this.color.getHex(), this.density );\n\n\t};\n\n\tFogExp2.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Fog ( color, near, far ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = ( near !== undefined ) ? near : 1;\n\t\tthis.far = ( far !== undefined ) ? far : 1000;\n\n\t}\n\n\tFog.prototype.isFog = true;\n\n\tFog.prototype.clone = function () {\n\n\t\treturn new Fog( this.color.getHex(), this.near, this.far );\n\n\t};\n\n\tFog.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\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\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Scene () {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.fog = null;\n\t\tthis.overrideMaterial = null;\n\n\t\tthis.autoUpdate = true; // checked by the renderer\n\n\t}\n\n\tScene.prototype = Object.create( Object3D.prototype );\n\n\tScene.prototype.constructor = Scene;\n\n\tScene.prototype.copy = function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t};\n\n\tScene.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tif ( this.background !== null ) data.object.background = this.background.toJSON( meta );\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlare( texture, size, distance, blending, color ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.lensFlares = [];\n\n\t\tthis.positionScreen = new Vector3();\n\t\tthis.customUpdateCallback = undefined;\n\n\t\tif ( texture !== undefined ) {\n\n\t\t\tthis.add( texture, size, distance, blending, color );\n\n\t\t}\n\n\t}\n\n\tLensFlare.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LensFlare,\n\n\t\tisLensFlare: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.positionScreen.copy( source.positionScreen );\n\t\t\tthis.customUpdateCallback = source.customUpdateCallback;\n\n\t\t\tfor ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lensFlares.push( source.lensFlares[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( texture, size, distance, blending, color, opacity ) {\n\n\t\t\tif ( size === undefined ) size = - 1;\n\t\t\tif ( distance === undefined ) distance = 0;\n\t\t\tif ( opacity === undefined ) opacity = 1;\n\t\t\tif ( color === undefined ) color = new Color( 0xffffff );\n\t\t\tif ( blending === undefined ) blending = NormalBlending;\n\n\t\t\tdistance = Math.min( distance, Math.max( 0, distance ) );\n\n\t\t\tthis.lensFlares.push( {\n\t\t\t\ttexture: texture,\t// THREE.Texture\n\t\t\t\tsize: size, \t\t// size in pixels (-1 = use texture.width)\n\t\t\t\tdistance: distance, \t// distance (0-1) from light source (0=at light source)\n\t\t\t\tx: 0, y: 0, z: 0,\t// screen position (-1 => 1) z = 0 is in front z = 1 is back\n\t\t\t\tscale: 1, \t\t// scale\n\t\t\t\trotation: 0, \t\t// rotation\n\t\t\t\topacity: opacity,\t// opacity\n\t\t\t\tcolor: color,\t\t// color\n\t\t\t\tblending: blending\t// blending\n\t\t\t} );\n\n\t\t},\n\n\t\t/*\n\t\t * Update lens flares update positions on all flares based on the screen position\n\t\t * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way.\n\t\t */\n\n\t\tupdateLensFlares: function () {\n\n\t\t\tvar f, fl = this.lensFlares.length;\n\t\t\tvar flare;\n\t\t\tvar vecX = - this.positionScreen.x * 2;\n\t\t\tvar vecY = - this.positionScreen.y * 2;\n\n\t\t\tfor ( f = 0; f < fl; f ++ ) {\n\n\t\t\t\tflare = this.lensFlares[ f ];\n\n\t\t\t\tflare.x = this.positionScreen.x + vecX * flare.distance;\n\t\t\t\tflare.y = this.positionScreen.y + vecY * flare.distance;\n\n\t\t\t\tflare.wantedRotation = flare.x * Math.PI * 0.25;\n\t\t\t\tflare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t *\tuvOffset: new THREE.Vector2(),\n\t *\tuvScale: new THREE.Vector2()\n\t * }\n\t */\n\n\tfunction SpriteMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\t\tthis.map = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tSpriteMaterial.prototype = Object.create( Material.prototype );\n\tSpriteMaterial.prototype.constructor = SpriteMaterial;\n\n\tSpriteMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.map = source.map;\n\n\t\tthis.rotation = source.rotation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Sprite( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Sprite';\n\n\t\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\t}\n\n\tSprite.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Sprite,\n\n\t\tisSprite: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distanceSq = raycaster.ray.distanceSqToPoint( matrixPosition );\n\t\t\t\tvar guessSizeSq = this.scale.x * this.scale.y / 4;\n\n\t\t\t\tif ( distanceSq > guessSizeSq ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: Math.sqrt( distanceSq ),\n\t\t\t\t\tpoint: this.position,\n\t\t\t\t\tface: 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\tclone: function () {\n\n\t\t\treturn new this.constructor( this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LOD() {\n\n\t\tObject3D.call( this );\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} );\n\n\t}\n\n\n\tLOD.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LOD,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source, false );\n\n\t\t\tvar levels = source.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddLevel: function ( object, distance ) {\n\n\t\t\tif ( distance === undefined ) distance = 0;\n\n\t\t\tdistance = Math.abs( distance );\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\t\tthis.add( object );\n\n\t\t},\n\n\t\tgetObjectForDistance: function ( distance ) {\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance < levels[ i ].distance ) {\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\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( matrixPosition );\n\n\t\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tupdate: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar levels = this.levels;\n\n\t\t\t\tif ( levels.length > 1 ) {\n\n\t\t\t\t\tv1.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\t\tv2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\t\tvar distance = v1.distanceTo( v2 );\n\n\t\t\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t\t\t} else {\n\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\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\t\t\tlevels[ i ].object.visible = 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\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.levels = [];\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tdata.object.levels.push( {\n\t\t\t\t\tobject: level.object.uuid,\n\t\t\t\t\tdistance: level.distance\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { data: data, 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.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n\tDataTexture.prototype = Object.create( Texture.prototype );\n\tDataTexture.prototype.constructor = DataTexture;\n\n\tDataTexture.prototype.isDataTexture = true;\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author michael guerrero / http://realitymeltdown.com\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Skeleton( bones, boneInverses, useVertexTexture ) {\n\n\t\tthis.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true;\n\n\t\tthis.identityMatrix = new Matrix4();\n\n\t\t// copy the bone array\n\n\t\tbones = bones || [];\n\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t// create a bone texture or an array of floats\n\n\t\tif ( this.useVertexTexture ) {\n\n\t\t\t// layout (1 matrix = 4 pixels)\n\t\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\n\t\t\tvar size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\t\tsize = _Math.nextPowerOfTwo( Math.ceil( size ) );\n\t\t\tsize = Math.max( size, 4 );\n\n\t\t\tthis.boneTextureWidth = size;\n\t\t\tthis.boneTextureHeight = size;\n\n\t\t\tthis.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel\n\t\t\tthis.boneTexture = new DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, RGBAFormat, FloatType );\n\n\t\t} else {\n\n\t\t\tthis.boneMatrices = new Float32Array( 16 * this.bones.length );\n\n\t\t}\n\n\t\t// use the supplied bone inverses or calculate the inverses\n\n\t\tif ( boneInverses === undefined ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\tif ( this.bones.length === boneInverses.length ) {\n\n\t\t\t\tthis.boneInverses = boneInverses.slice( 0 );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton bonInverses is the wrong length.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\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\tObject.assign( Skeleton.prototype, {\n\n\t\tcalculateInverses: function () {\n\n\t\t\tthis.boneInverses = [];\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tvar inverse = new Matrix4();\n\n\t\t\t\tif ( this.bones[ b ] ) {\n\n\t\t\t\t\tinverse.getInverse( this.bones[ b ].matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tthis.boneInverses.push( inverse );\n\n\t\t\t}\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tvar bone;\n\n\t\t\t// recover the bind-time world matrices\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tbone.matrixWorld.getInverse( this.boneInverses[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// compute the local matrices, positions, rotations and scales\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tif ( (bone.parent && bone.parent.isBone) ) {\n\n\t\t\t\t\t\tbone.matrix.getInverse( bone.parent.matrixWorld );\n\t\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdate: ( function () {\n\n\t\t\tvar offsetMatrix = new Matrix4();\n\n\t\t\treturn function update() {\n\n\t\t\t\t// flatten bone matrices to array\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\t\t// compute the offset between the current and the original transform\n\n\t\t\t\t\tvar matrix = this.bones[ b ] ? this.bones[ b ].matrixWorld : this.identityMatrix;\n\n\t\t\t\t\toffsetMatrix.multiplyMatrices( matrix, this.boneInverses[ b ] );\n\t\t\t\t\toffsetMatrix.toArray( this.boneMatrices, b * 16 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.useVertexTexture ) {\n\n\t\t\t\t\tthis.boneTexture.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tclone: function () {\n\n\t\t\treturn new Skeleton( this.bones, this.boneInverses, this.useVertexTexture );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Bone( skin ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Bone';\n\n\t\tthis.skin = skin;\n\n\t}\n\n\tBone.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Bone,\n\n\t\tisBone: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.skin = source.skin;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction SkinnedMesh( geometry, material, useVertexTexture ) {\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\tthis.bindMode = \"attached\";\n\t\tthis.bindMatrix = new Matrix4();\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t// init bones\n\n\t\t// TODO: remove bone creation as there is no reason (other than\n\t\t// convenience) for THREE.SkinnedMesh to do this.\n\n\t\tvar bones = [];\n\n\t\tif ( this.geometry && this.geometry.bones !== undefined ) {\n\n\t\t\tvar bone, gbone;\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tbone = new Bone( this );\n\t\t\t\tbones.push( bone );\n\n\t\t\t\tbone.name = gbone.name;\n\t\t\t\tbone.position.fromArray( gbone.pos );\n\t\t\t\tbone.quaternion.fromArray( gbone.rotq );\n\t\t\t\tif ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );\n\n\t\t\t}\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tif ( gbone.parent !== - 1 && gbone.parent !== null &&\n\t\t\t\t\t\tbones[ gbone.parent ] !== undefined ) {\n\n\t\t\t\t\tbones[ gbone.parent ].add( bones[ b ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.add( bones[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.normalizeSkinWeights();\n\n\t\tthis.updateMatrixWorld( true );\n\t\tthis.bind( new Skeleton( bones, undefined, useVertexTexture ), this.matrixWorld );\n\n\t}\n\n\n\tSkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\t\tconstructor: SkinnedMesh,\n\n\t\tisSkinnedMesh: true,\n\n\t\tbind: function( skeleton, bindMatrix ) {\n\n\t\t\tthis.skeleton = skeleton;\n\n\t\t\tif ( bindMatrix === undefined ) {\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t\t}\n\n\t\t\tthis.bindMatrix.copy( bindMatrix );\n\t\t\tthis.bindMatrixInverse.getInverse( bindMatrix );\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tthis.skeleton.pose();\n\n\t\t},\n\n\t\tnormalizeSkinWeights: function () {\n\n\t\t\tif ( (this.geometry && this.geometry.isGeometry) ) {\n\n\t\t\t\tfor ( var i = 0; i < this.geometry.skinWeights.length; i ++ ) {\n\n\t\t\t\t\tvar sw = this.geometry.skinWeights[ i ];\n\n\t\t\t\t\tvar scale = 1.0 / sw.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tsw.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tsw.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( (this.geometry && this.geometry.isBufferGeometry) ) {\n\n\t\t\t\tvar vec = new Vector4();\n\n\t\t\t\tvar skinWeight = this.geometry.attributes.skinWeight;\n\n\t\t\t\tfor ( var i = 0; i < skinWeight.count; i ++ ) {\n\n\t\t\t\t\tvec.x = skinWeight.getX( i );\n\t\t\t\t\tvec.y = skinWeight.getY( i );\n\t\t\t\t\tvec.z = skinWeight.getZ( i );\n\t\t\t\t\tvec.w = skinWeight.getW( i );\n\n\t\t\t\t\tvar scale = 1.0 / vec.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tvec.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvec.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t\tskinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrixWorld: function( force ) {\n\n\t\t\tMesh.prototype.updateMatrixWorld.call( this, true );\n\n\t\t\tif ( this.bindMode === \"attached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.matrixWorld );\n\n\t\t\t} else if ( this.bindMode === \"detached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.bindMatrix );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.SkinnedMesh unrecognized bindMode: ' + this.bindMode );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function() {\n\n\t\t\treturn new this.constructor( this.geometry, this.material, this.skeleton.useVertexTexture ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t * linecap: \"round\",\n\t * linejoin: \"round\"\n\t * }\n\t */\n\n\tfunction LineBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\t\tthis.linecap = 'round';\n\t\tthis.linejoin = 'round';\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineBasicMaterial.prototype = Object.create( Material.prototype );\n\tLineBasicMaterial.prototype.constructor = LineBasicMaterial;\n\n\tLineBasicMaterial.prototype.isLineBasicMaterial = true;\n\n\tLineBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Line( geometry, material, mode ) {\n\n\t\tif ( mode === 1 ) {\n\n\t\t\tconsole.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' );\n\t\t\treturn new LineSegments( geometry, material );\n\n\t\t}\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tLine.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Line,\n\n\t\tisLine: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar precision = raycaster.linePrecision;\n\t\t\t\tvar precisionSq = precision * precision;\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar vStart = new Vector3();\n\t\t\t\tvar vEnd = new Vector3();\n\t\t\t\tvar interSegment = new Vector3();\n\t\t\t\tvar interRay = new Vector3();\n\t\t\t\tvar step = (this && this.isLineSegments) ? 2 : 1;\n\n\t\t\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, l = indices.length - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\t\t\t\t\t\t\tvar b = indices[ i + 1 ];\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, a * 3 );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, b * 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\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\tfor ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, 3 * i );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, 3 * i + 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\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 if ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar nbVertices = vertices.length;\n\n\t\t\t\t\tfor ( var i = 0; i < nbVertices - 1; i += step ) {\n\n\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );\n\n\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LineSegments( geometry, material ) {\n\n\t\tLine.call( this, geometry, material );\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tLineSegments.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\t\tconstructor: LineSegments,\n\n\t\tisLineSegments: true\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * size: ,\n\t * sizeAttenuation: \n\t * }\n\t */\n\n\tfunction PointsMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tPointsMaterial.prototype = Object.create( Material.prototype );\n\tPointsMaterial.prototype.constructor = PointsMaterial;\n\n\tPointsMaterial.prototype.isPointsMaterial = true;\n\n\tPointsMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Points( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tPoints.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Points,\n\n\t\tisPoints: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar object = this;\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\t\t\t\tvar threshold = raycaster.params.Points.threshold;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\t\t\tvar localThresholdSq = localThreshold * localThreshold;\n\t\t\t\tvar position = new Vector3();\n\n\t\t\t\tfunction testPoint( point, index ) {\n\n\t\t\t\t\tvar rayPointDistanceSq = ray.distanceSqToPoint( point );\n\n\t\t\t\t\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\t\t\t\t\tvar intersectPoint = ray.closestPointToPoint( point );\n\t\t\t\t\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\t\t\t\t\tpoint: intersectPoint.clone(),\n\t\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tobject: 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\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, il = indices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\n\t\t\t\t\t\t\tposition.fromArray( positions, a * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, a );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tposition.fromArray( positions, i * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, i );\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\tvar vertices = geometry.vertices;\n\n\t\t\t\t\tfor ( var i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\ttestPoint( vertices[ i ], i );\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\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Group() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Group';\n\n\t}\n\n\tGroup.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Group\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.generateMipmaps = false;\n\n\t\tvar scope = this;\n\n\t\tfunction update() {\n\n\t\t\trequestAnimationFrame( update );\n\n\t\t\tif ( video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\t\tscope.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tupdate();\n\n\t}\n\n\tVideoTexture.prototype = Object.create( Texture.prototype );\n\tVideoTexture.prototype.constructor = VideoTexture;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\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\tCompressedTexture.prototype = Object.create( Texture.prototype );\n\tCompressedTexture.prototype.constructor = CompressedTexture;\n\n\tCompressedTexture.prototype.isCompressedTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tCanvasTexture.prototype = Object.create( Texture.prototype );\n\tCanvasTexture.prototype.constructor = CanvasTexture;\n\n\t/**\n\t * @author Matt DesLauriers / @mattdesl\n\t * @author atix / arthursilber.de\n\t */\n\n\tfunction DepthTexture( 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\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.type = type !== undefined ? type : UnsignedShortType;\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\t= false;\n\n\t}\n\n\tDepthTexture.prototype = Object.create( Texture.prototype );\n\tDepthTexture.prototype.constructor = DepthTexture;\n\tDepthTexture.prototype.isDepthTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WireframeGeometry( geometry ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tvar edge = [ 0, 0 ], hash = {};\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\tif ( (geometry && geometry.isGeometry) ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\t\t\tvar faces = geometry.faces;\n\t\t\tvar numEdges = 0;\n\n\t\t\t// allocate maximal size\n\t\t\tvar edges = new Uint32Array( 6 * faces.length );\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\t\tvar key = edge.toString();\n\n\t\t\t\t\tif ( hash[ key ] === undefined ) {\n\n\t\t\t\t\t\tedges[ 2 * numEdges ] = edge[ 0 ];\n\t\t\t\t\t\tedges[ 2 * numEdges + 1 ] = edge[ 1 ];\n\t\t\t\t\t\thash[ key ] = true;\n\t\t\t\t\t\tnumEdges ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar coords = new Float32Array( numEdges * 2 * 3 );\n\n\t\t\tfor ( var i = 0, l = numEdges; i < l; i ++ ) {\n\n\t\t\t\tfor ( var j = 0; j < 2; j ++ ) {\n\n\t\t\t\t\tvar vertex = vertices[ edges [ 2 * i + j ] ];\n\n\t\t\t\t\tvar index = 6 * i + 3 * j;\n\t\t\t\t\tcoords[ index + 0 ] = vertex.x;\n\t\t\t\t\tcoords[ index + 1 ] = vertex.y;\n\t\t\t\t\tcoords[ index + 2 ] = vertex.z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.addAttribute( 'position', new BufferAttribute( coords, 3 ) );\n\n\t\t} else if ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// Indexed BufferGeometry\n\n\t\t\t\tvar indices = geometry.index.array;\n\t\t\t\tvar vertices = geometry.attributes.position;\n\t\t\t\tvar groups = geometry.groups;\n\t\t\t\tvar numEdges = 0;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgeometry.addGroup( 0, indices.length );\n\n\t\t\t\t}\n\n\t\t\t\t// allocate maximal size\n\t\t\t\tvar edges = new Uint32Array( 2 * indices.length );\n\n\t\t\t\tfor ( var o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tvar group = groups[ o ];\n\n\t\t\t\t\tvar start = group.start;\n\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tedge[ 0 ] = indices[ i + j ];\n\t\t\t\t\t\t\tedge[ 1 ] = indices[ i + ( j + 1 ) % 3 ];\n\t\t\t\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\t\t\t\tvar key = edge.toString();\n\n\t\t\t\t\t\t\tif ( hash[ key ] === undefined ) {\n\n\t\t\t\t\t\t\t\tedges[ 2 * numEdges ] = edge[ 0 ];\n\t\t\t\t\t\t\t\tedges[ 2 * numEdges + 1 ] = edge[ 1 ];\n\t\t\t\t\t\t\t\thash[ key ] = true;\n\t\t\t\t\t\t\t\tnumEdges ++;\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\tvar coords = new Float32Array( numEdges * 2 * 3 );\n\n\t\t\t\tfor ( var i = 0, l = numEdges; i < l; i ++ ) {\n\n\t\t\t\t\tfor ( var j = 0; j < 2; j ++ ) {\n\n\t\t\t\t\t\tvar index = 6 * i + 3 * j;\n\t\t\t\t\t\tvar index2 = edges[ 2 * i + j ];\n\n\t\t\t\t\t\tcoords[ index + 0 ] = vertices.getX( index2 );\n\t\t\t\t\t\tcoords[ index + 1 ] = vertices.getY( index2 );\n\t\t\t\t\t\tcoords[ index + 2 ] = vertices.getZ( index2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.addAttribute( 'position', new BufferAttribute( coords, 3 ) );\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tvar vertices = geometry.attributes.position.array;\n\t\t\t\tvar numEdges = vertices.length / 3;\n\t\t\t\tvar numTris = numEdges / 3;\n\n\t\t\t\tvar coords = new Float32Array( numEdges * 2 * 3 );\n\n\t\t\t\tfor ( var i = 0, l = numTris; i < l; i ++ ) {\n\n\t\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\tvar index = 18 * i + 6 * j;\n\n\t\t\t\t\t\tvar index1 = 9 * i + 3 * j;\n\t\t\t\t\t\tcoords[ index + 0 ] = vertices[ index1 ];\n\t\t\t\t\t\tcoords[ index + 1 ] = vertices[ index1 + 1 ];\n\t\t\t\t\t\tcoords[ index + 2 ] = vertices[ index1 + 2 ];\n\n\t\t\t\t\t\tvar index2 = 9 * i + 3 * ( ( j + 1 ) % 3 );\n\t\t\t\t\t\tcoords[ index + 3 ] = vertices[ index2 ];\n\t\t\t\t\t\tcoords[ index + 4 ] = vertices[ index2 + 1 ];\n\t\t\t\t\t\tcoords[ index + 5 ] = vertices[ index2 + 2 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.addAttribute( 'position', new BufferAttribute( coords, 3 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tWireframeGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tWireframeGeometry.prototype.constructor = WireframeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricBufferGeometry( func, slices, stacks ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ParametricBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\t// generate vertices and uvs\n\n\t\tvar vertices = [];\n\t\tvar uvs = [];\n\n\t\tvar i, j, p;\n\t\tvar u, v;\n\n\t\tvar sliceCount = slices + 1;\n\n\t\tfor ( i = 0; i <= stacks; i ++ ) {\n\n\t\t\tv = i / stacks;\n\n\t\t\tfor ( j = 0; j <= slices; j ++ ) {\n\n\t\t\t\tu = j / slices;\n\n\t\t\t\tp = func( u, v );\n\t\t\t\tvertices.push( p.x, p.y, p.z );\n\n\t\t\t\tuvs.push( u, v );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tvar indices = [];\n\t\tvar a, b, c, d;\n\n\t\tfor ( i = 0; i < stacks; i ++ ) {\n\n\t\t\tfor ( j = 0; j < slices; j ++ ) {\n\n\t\t\t\ta = i * sliceCount + j;\n\t\t\t\tb = i * sliceCount + j + 1;\n\t\t\t\tc = ( i + 1 ) * sliceCount + j + 1;\n\t\t\t\td = ( i + 1 ) * sliceCount + j;\n\n\t\t\t\t// faces one and two\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.length > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) );\n\t\tthis.addAttribute( 'position', Float32Attribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'uv', Float32Attribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t}\n\n\tParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;\n\n\t/**\n\t * @author zz85 / https://github.com/zz85\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricGeometry( func, slices, stacks ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ParametricGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tParametricGeometry.prototype = Object.create( Geometry.prototype );\n\tParametricGeometry.prototype.constructor = ParametricGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction PolyhedronBufferGeometry( vertices, indices, radius, detail ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronBufferGeometry';\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\tradius = radius || 1;\n\t\tdetail = detail || 0;\n\n\t\t// default buffer data\n\n\t\tvar vertexBuffer = [];\n\t\tvar 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\tappplyRadius( 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.addAttribute( 'position', Float32Attribute( vertexBuffer, 3 ) );\n\t\tthis.addAttribute( 'normal', Float32Attribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.addAttribute( 'uv', Float32Attribute( uvBuffer, 2 ) );\n\t\tthis.normalizeNormals();\n\n\t\tthis.boundingSphere = new Sphere( new Vector3(), radius );\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\t\tfor ( var 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\tvar cols = Math.pow( 2, detail );\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tvar v = [];\n\n\t\t\tvar i, j;\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( i = 0 ; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tvar aj = a.clone().lerp( c, i / cols );\n\t\t\t\tvar bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tvar rows = cols - i;\n\n\t\t\t\tfor ( 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 ( i = 0; i < cols ; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tvar 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 appplyRadius( radius ) {\n\n\t\t\tvar 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 ( var 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\tvar vertex = new Vector3();\n\n\t\t\tfor ( var 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\tvar u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tvar 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 ( var i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tvar x0 = uvBuffer[ i + 0 ];\n\t\t\t\tvar x1 = uvBuffer[ i + 2 ];\n\t\t\t\tvar x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tvar max = Math.max( x0, x1, x2 );\n\t\t\t\tvar 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\tvar 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\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\tvar centroid = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tfor ( var 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\tvar 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\tPolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TetrahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tTetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tTetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction TetrahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTetrahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tTetrahedronGeometry.prototype.constructor = TetrahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction OctahedronBufferGeometry( radius,detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tOctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tOctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction OctahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tOctahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tOctahedronGeometry.prototype.constructor = OctahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction IcosahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tvar vertices = [\n\t\t\t- 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0,\n\t\t\t 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t,\n\t\t\t t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11,\n\t\t\t 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8,\n\t\t\t 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9,\n\t\t\t 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tIcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tIcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction IcosahedronGeometry( radius, detail ) {\n\n\t \tGeometry.call( this );\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\tthis.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tIcosahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tIcosahedronGeometry.prototype.constructor = IcosahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction DodecahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tvar r = 1 / t;\n\n\t\tvar vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1, - 1, - 1, 1,\n\t\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t\t 1, - 1, - 1, 1, - 1, 1,\n\t\t\t 1, 1, - 1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t 0, - r, - t, 0, - r, t,\n\t\t\t 0, 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\t r, - 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\tvar indices = [\n\t\t\t 3, 11, 7, 3, 7, 15, 3, 15, 13,\n\t\t\t 7, 19, 17, 7, 17, 6, 7, 6, 15,\n\t\t\t17, 4, 8, 17, 8, 10, 17, 10, 6,\n\t\t\t 8, 0, 16, 8, 16, 2, 8, 2, 10,\n\t\t\t 0, 12, 1, 0, 1, 18, 0, 18, 16,\n\t\t\t 6, 10, 2, 6, 2, 13, 6, 13, 15,\n\t\t\t 2, 16, 18, 2, 18, 3, 2, 3, 13,\n\t\t\t18, 1, 9, 18, 9, 11, 18, 11, 3,\n\t\t\t 4, 14, 12, 4, 12, 0, 4, 0, 8,\n\t\t\t11, 9, 5, 11, 5, 19, 11, 19, 7,\n\t\t\t19, 5, 14, 19, 14, 4, 19, 4, 17,\n\t\t\t 1, 12, 14, 1, 14, 5, 1, 5, 9\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tDodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tDodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;\n\n\t/**\n\t * @author Abe Pazos / https://hamoid.com\n\t */\n\n\tfunction DodecahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tDodecahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tDodecahedronGeometry.prototype.constructor = DodecahedronGeometry;\n\n\t/**\n\t * @author clockworkgeek / https://github.com/clockworkgeek\n\t * @author timothypratley / https://github.com/timothypratley\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction PolyhedronGeometry( vertices, indices, radius, detail ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tPolyhedronGeometry.prototype = Object.create( Geometry.prototype );\n\tPolyhedronGeometry.prototype.constructor = PolyhedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Creates a tube which extrudes along a 3d spline.\n\t *\n\t */\n\n\tfunction TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TubeBufferGeometry';\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\ttubularSegments = tubularSegments || 64;\n\t\tradius = radius || 1;\n\t\tradialSegments = radialSegments || 8;\n\t\tclosed = closed || false;\n\n\t\tvar 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\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar i, j;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\t\tvar indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( ( indices.length > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) );\n\t\tthis.addAttribute( 'position', Float32Attribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', Float32Attribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', Float32Attribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( 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\tvar P = path.getPointAt( i / tubularSegments );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tvar N = frames.normals[ i ];\n\t\t\tvar B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tvar sin = Math.sin( v );\n\t\t\t\tvar 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 ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tvar 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 ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( 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\tTubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTubeBufferGeometry.prototype.constructor = TubeBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode / https://github.com/oosmoxiecode\n\t * @author WestLangley / https://github.com/WestLangley\n\t * @author zz85 / https://github.com/zz85\n\t * @author miningold / https://github.com/miningold\n\t * @author jonobr1 / https://github.com/jonobr1\n\t *\n\t * Creates a tube which extrudes along a 3d spline.\n\t */\n\n\tfunction TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) {\n\n\t\tGeometry.call( this );\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\tif ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );\n\n\t\tvar bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = bufferGeometry.tangents;\n\t\tthis.normals = bufferGeometry.normals;\n\t\tthis.binormals = bufferGeometry.binormals;\n\n\t\t// create geometry\n\n\t\tthis.fromBufferGeometry( bufferGeometry );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTubeGeometry.prototype = Object.create( Geometry.prototype );\n\tTubeGeometry.prototype.constructor = TubeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * see: http://www.blackpawn.com/texts/pqtorus/\n\t */\n\tfunction TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotBufferGeometry';\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\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 64;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\tp = p || 2;\n\t\tq = q || 3;\n\n\t\t// used to calculate buffer length\n\t\tvar vertexCount = ( ( radialSegments + 1 ) * ( tubularSegments + 1 ) );\n\t\tvar indexCount = radialSegments * tubularSegments * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// helper variables\n\t\tvar i, j, index = 0, indexOffset = 0;\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar P1 = new Vector3();\n\t\tvar P2 = new Vector3();\n\n\t\tvar B = new Vector3();\n\t\tvar T = new Vector3();\n\t\tvar N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( 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 segement\n\n\t\t\tvar 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 ( 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\tvar v = j / radialSegments * Math.PI * 2;\n\t\t\t\tvar cx = - tube * Math.cos( v );\n\t\t\t\tvar 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 vectos, 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\t// vertex\n\t\t\t\tvertices.setXYZ( index, 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\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\t\t\t\tnormals.setXYZ( index, normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\tuv.y = j / radialSegments;\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// face one\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t\t// face two\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\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\tvar cu = Math.cos( u );\n\t\t\tvar su = Math.sin( u );\n\t\t\tvar quOverP = q / p * u;\n\t\t\tvar 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\tTorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t */\n\n\tfunction TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {\n\n\t\tGeometry.call( this );\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\tif( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );\n\n\t\tthis.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTorusKnotGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusKnotGeometry.prototype.constructor = TorusKnotGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusBufferGeometry';\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\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 6;\n\t\tarc = arc || Math.PI * 2;\n\n\t\t// used to calculate buffer length\n\t\tvar vertexCount = ( ( radialSegments + 1 ) * ( tubularSegments + 1 ) );\n\t\tvar indexCount = radialSegments * tubularSegments * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount );\n\t\tvar vertices = new Float32Array( vertexCount * 3 );\n\t\tvar normals = new Float32Array( vertexCount * 3 );\n\t\tvar uvs = new Float32Array( vertexCount * 2 );\n\n\t\t// offset variables\n\t\tvar vertexBufferOffset = 0;\n\t\tvar uvBufferOffset = 0;\n\t\tvar indexBufferOffset = 0;\n\n\t\t// helper variables\n\t\tvar center = new Vector3();\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tvar u = i / tubularSegments * arc;\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\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[ vertexBufferOffset ] = vertex.x;\n\t\t\t\tvertices[ vertexBufferOffset + 1 ] = vertex.y;\n\t\t\t\tvertices[ vertexBufferOffset + 2 ] = vertex.z;\n\n\t\t\t\t// this vector is used to calculate the normal\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\n\t\t\t\t// normal\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals[ vertexBufferOffset ] = normal.x;\n\t\t\t\tnormals[ vertexBufferOffset + 1 ] = normal.y;\n\t\t\t\tnormals[ vertexBufferOffset + 2 ] = normal.z;\n\n\t\t\t\t// uv\n\t\t\t\tuvs[ uvBufferOffset ] = i / tubularSegments;\n\t\t\t\tuvs[ uvBufferOffset + 1 ] = j / radialSegments;\n\n\t\t\t\t// update offsets\n\t\t\t\tvertexBufferOffset += 3;\n\t\t\t\tuvBufferOffset += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\t\t\t\tvar a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tvar b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tvar c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tvar d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// face one\n\t\t\t\tindices[ indexBufferOffset ] = a;\n\t\t\t\tindices[ indexBufferOffset + 1 ] = b;\n\t\t\t\tindices[ indexBufferOffset + 2 ] = d;\n\n\t\t\t\t// face two\n\t\t\t\tindices[ indexBufferOffset + 3 ] = b;\n\t\t\t\tindices[ indexBufferOffset + 4 ] = c;\n\t\t\t\tindices[ indexBufferOffset + 5 ] = d;\n\n\t\t\t\t// update offset\n\t\t\t\tindexBufferOffset += 6;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\t\tthis.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tTorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusBufferGeometry.prototype.constructor = TorusBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888\n\t */\n\n\tfunction TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );\n\n\t}\n\n\tTorusGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusGeometry.prototype.constructor = TorusGeometry;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tvar ShapeUtils = {\n\n\t\t// calculate area of the contour polygon\n\n\t\tarea: function ( contour ) {\n\n\t\t\tvar n = contour.length;\n\t\t\tvar a = 0.0;\n\n\t\t\tfor ( var p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t\t}\n\n\t\t\treturn a * 0.5;\n\n\t\t},\n\n\t\ttriangulate: ( function () {\n\n\t\t\t/**\n\t\t\t * This code is a quick port of code written in C++ which was submitted to\n\t\t\t * flipcode.com by John W. Ratcliff // July 22, 2000\n\t\t\t * See original code and more information here:\n\t\t\t * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml\n\t\t\t *\n\t\t\t * ported to actionscript by Zevan Rosser\n\t\t\t * www.actionsnippet.com\n\t\t\t *\n\t\t\t * ported to javascript by Joshua Koo\n\t\t\t * http://www.lab4games.net/zz85/blog\n\t\t\t *\n\t\t\t */\n\n\t\t\tfunction snip( contour, u, v, w, n, verts ) {\n\n\t\t\t\tvar p;\n\t\t\t\tvar ax, ay, bx, by;\n\t\t\t\tvar cx, cy, px, py;\n\n\t\t\t\tax = contour[ verts[ u ] ].x;\n\t\t\t\tay = contour[ verts[ u ] ].y;\n\n\t\t\t\tbx = contour[ verts[ v ] ].x;\n\t\t\t\tby = contour[ verts[ v ] ].y;\n\n\t\t\t\tcx = contour[ verts[ w ] ].x;\n\t\t\t\tcy = contour[ verts[ w ] ].y;\n\n\t\t\t\tif ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false;\n\n\t\t\t\tvar aX, aY, bX, bY, cX, cY;\n\t\t\t\tvar apx, apy, bpx, bpy, cpx, cpy;\n\t\t\t\tvar cCROSSap, bCROSScp, aCROSSbp;\n\n\t\t\t\taX = cx - bx; aY = cy - by;\n\t\t\t\tbX = ax - cx; bY = ay - cy;\n\t\t\t\tcX = bx - ax; cY = by - ay;\n\n\t\t\t\tfor ( p = 0; p < n; p ++ ) {\n\n\t\t\t\t\tpx = contour[ verts[ p ] ].x;\n\t\t\t\t\tpy = contour[ verts[ p ] ].y;\n\n\t\t\t\t\tif ( ( ( px === ax ) && ( py === ay ) ) ||\n\t\t\t\t\t\t ( ( px === bx ) && ( py === by ) ) ||\n\t\t\t\t\t\t ( ( px === cx ) && ( py === cy ) ) )\tcontinue;\n\n\t\t\t\t\tapx = px - ax; apy = py - ay;\n\t\t\t\t\tbpx = px - bx; bpy = py - by;\n\t\t\t\t\tcpx = px - cx; cpy = py - cy;\n\n\t\t\t\t\t// see if p is inside triangle abc\n\n\t\t\t\t\taCROSSbp = aX * bpy - aY * bpx;\n\t\t\t\t\tcCROSSap = cX * apy - cY * apx;\n\t\t\t\t\tbCROSScp = bX * cpy - bY * cpx;\n\n\t\t\t\t\tif ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false;\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// takes in an contour array and returns\n\n\t\t\treturn function triangulate( contour, indices ) {\n\n\t\t\t\tvar n = contour.length;\n\n\t\t\t\tif ( n < 3 ) return null;\n\n\t\t\t\tvar result = [],\n\t\t\t\t\tverts = [],\n\t\t\t\t\tvertIndices = [];\n\n\t\t\t\t/* we want a counter-clockwise polygon in verts */\n\n\t\t\t\tvar u, v, w;\n\n\t\t\t\tif ( ShapeUtils.area( contour ) > 0.0 ) {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = v;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v;\n\n\t\t\t\t}\n\n\t\t\t\tvar nv = n;\n\n\t\t\t\t/* remove nv - 2 vertices, creating 1 triangle every time */\n\n\t\t\t\tvar count = 2 * nv; /* error detection */\n\n\t\t\t\tfor ( v = nv - 1; nv > 2; ) {\n\n\t\t\t\t\t/* if we loop, it is probably a non-simple polygon */\n\n\t\t\t\t\tif ( ( count -- ) <= 0 ) {\n\n\t\t\t\t\t\t//** Triangulate: ERROR - probable bad polygon!\n\n\t\t\t\t\t\t//throw ( \"Warning, unable to triangulate polygon!\" );\n\t\t\t\t\t\t//return null;\n\t\t\t\t\t\t// Sometimes warning is fine, especially polygons are triangulated in reverse.\n\t\t\t\t\t\tconsole.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' );\n\n\t\t\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t/* three consecutive vertices in current polygon, */\n\n\t\t\t\t\tu = v; \t \tif ( nv <= u ) u = 0; /* previous */\n\t\t\t\t\tv = u + 1; if ( nv <= v ) v = 0; /* new v */\n\t\t\t\t\tw = v + 1; if ( nv <= w ) w = 0; /* next */\n\n\t\t\t\t\tif ( snip( contour, u, v, w, nv, verts ) ) {\n\n\t\t\t\t\t\tvar a, b, c, s, t;\n\n\t\t\t\t\t\t/* true names of the vertices */\n\n\t\t\t\t\t\ta = verts[ u ];\n\t\t\t\t\t\tb = verts[ v ];\n\t\t\t\t\t\tc = verts[ w ];\n\n\t\t\t\t\t\t/* output Triangle */\n\n\t\t\t\t\t\tresult.push( [ contour[ a ],\n\t\t\t\t\t\t\tcontour[ b ],\n\t\t\t\t\t\t\tcontour[ c ] ] );\n\n\n\t\t\t\t\t\tvertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] );\n\n\t\t\t\t\t\t/* remove v from the remaining polygon */\n\n\t\t\t\t\t\tfor ( s = v, t = v + 1; t < nv; s ++, t ++ ) {\n\n\t\t\t\t\t\t\tverts[ s ] = verts[ t ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnv --;\n\n\t\t\t\t\t\t/* reset error detection counter */\n\n\t\t\t\t\t\tcount = 2 * nv;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\treturn result;\n\n\t\t\t}\n\n\t\t} )(),\n\n\t\ttriangulateShape: function ( contour, holes ) {\n\n\t\t\tfunction removeDupEndPts(points) {\n\n\t\t\t\tvar l = points.length;\n\n\t\t\t\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\t\tpoints.pop();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tremoveDupEndPts( contour );\n\t\t\tholes.forEach( removeDupEndPts );\n\n\t\t\tfunction point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) {\n\n\t\t\t\t// inOtherPt needs to be collinear to the inSegment\n\t\t\t\tif ( inSegPt1.x !== inSegPt2.x ) {\n\n\t\t\t\t\tif ( inSegPt1.x < inSegPt2.x ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( inSegPt1.y < inSegPt2.y ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) {\n\n\t\t\t\tvar seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y;\n\t\t\t\tvar seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y;\n\n\t\t\t\tvar seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x;\n\t\t\t\tvar seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y;\n\n\t\t\t\tvar limit\t\t= seg1dy * seg2dx - seg1dx * seg2dy;\n\t\t\t\tvar perpSeg1\t= seg1dy * seg1seg2dx - seg1dx * seg1seg2dy;\n\n\t\t\t\tif ( Math.abs( limit ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\n\t\t\t\t\tvar perpSeg2;\n\t\t\t\t\tif ( limit > 0 ) {\n\n\t\t\t\t\t\tif ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) \t\treturn [];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) \t\treturn [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// i.e. to reduce rounding errors\n\t\t\t\t\t// intersection at endpoint of segment#1?\n\t\t\t\t\tif ( perpSeg2 === 0 ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( perpSeg2 === limit ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt2 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// intersection at endpoint of segment#2?\n\t\t\t\t\tif ( perpSeg1 === 0 )\t\treturn [ inSeg2Pt1 ];\n\t\t\t\t\tif ( perpSeg1 === limit )\treturn [ inSeg2Pt2 ];\n\n\t\t\t\t\t// return real intersection point\n\t\t\t\t\tvar factorSeg1 = perpSeg2 / limit;\n\t\t\t\t\treturn\t[ { x: inSeg1Pt1.x + factorSeg1 * seg1dx,\n\t\t\t\t\t\t\t\ty: inSeg1Pt1.y + factorSeg1 * seg1dy } ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( ( perpSeg1 !== 0 ) ||\n\t\t\t\t\t\t ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) \t\t\treturn [];\n\n\t\t\t\t\t// they are collinear or degenerate\n\t\t\t\t\tvar seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) );\t// segment1 is just a point?\n\t\t\t\t\tvar seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) );\t// segment2 is just a point?\n\t\t\t\t\t// both segments are points\n\t\t\t\t\tif ( seg1Pt && seg2Pt ) {\n\n\t\t\t\t\t\tif ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) ||\n\t\t\t\t\t\t\t ( inSeg1Pt1.y !== inSeg2Pt1.y ) )\t\treturn [];\t// they are distinct points\n\t\t\t\t\t\treturn [ inSeg1Pt1 ]; \t\t\t\t\t\t// they are the same point\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#1 is a single point\n\t\t\t\t\tif ( seg1Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) )\t\treturn [];\t\t// but not in segment#2\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#2 is a single point\n\t\t\t\t\tif ( seg2Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) )\t\treturn [];\t\t// but not in segment#1\n\t\t\t\t\t\treturn [ inSeg2Pt1 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// they are collinear segments, which might overlap\n\t\t\t\t\tvar seg1min, seg1max, seg1minVal, seg1maxVal;\n\t\t\t\t\tvar seg2min, seg2max, seg2minVal, seg2maxVal;\n\t\t\t\t\tif ( seg1dx !== 0 ) {\n\n\t\t\t\t\t\t// the segments are NOT on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.x < inSeg1Pt2.x ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.x < inSeg2Pt2.x ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// the segments are on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.y < inSeg1Pt2.y ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.y < inSeg2Pt2.y ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( seg1minVal <= seg2minVal ) {\n\n\t\t\t\t\t\tif ( seg1maxVal < seg2minVal )\treturn [];\n\t\t\t\t\t\tif ( seg1maxVal === seg2minVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg2min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg2min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg2min, seg2max ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( seg1minVal > seg2maxVal )\treturn [];\n\t\t\t\t\t\tif ( seg1minVal === seg2maxVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg1min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg1min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg1min, seg2max ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) {\n\n\t\t\t\t// The order of legs is important\n\n\t\t\t\t// translation of all points, so that Vertex is at (0,0)\n\t\t\t\tvar legFromPtX\t= inLegFromPt.x - inVertex.x, legFromPtY\t= inLegFromPt.y - inVertex.y;\n\t\t\t\tvar legToPtX\t= inLegToPt.x\t- inVertex.x, legToPtY\t\t= inLegToPt.y\t- inVertex.y;\n\t\t\t\tvar otherPtX\t= inOtherPt.x\t- inVertex.x, otherPtY\t\t= inOtherPt.y\t- inVertex.y;\n\n\t\t\t\t// main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg.\n\t\t\t\tvar from2toAngle\t= legFromPtX * legToPtY - legFromPtY * legToPtX;\n\t\t\t\tvar from2otherAngle\t= legFromPtX * otherPtY - legFromPtY * otherPtX;\n\n\t\t\t\tif ( Math.abs( from2toAngle ) > Number.EPSILON ) {\n\n\t\t\t\t\t// angle != 180 deg.\n\n\t\t\t\t\tvar other2toAngle\t\t= otherPtX * legToPtY - otherPtY * legToPtX;\n\t\t\t\t\t// console.log( \"from2to: \" + from2toAngle + \", from2other: \" + from2otherAngle + \", other2to: \" + other2toAngle );\n\n\t\t\t\t\tif ( from2toAngle > 0 ) {\n\n\t\t\t\t\t\t// main angle < 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// main angle > 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// angle == 180 deg.\n\t\t\t\t\t// console.log( \"from2to: 180 deg., from2other: \" + from2otherAngle );\n\t\t\t\t\treturn\t( from2otherAngle > 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tfunction removeHoles( contour, holes ) {\n\n\t\t\t\tvar shape = contour.concat(); // work on this shape\n\t\t\t\tvar hole;\n\n\t\t\t\tfunction isCutLineInsideAngles( inShapeIdx, inHoleIdx ) {\n\n\t\t\t\t\t// Check if hole point lies within angle around shape point\n\t\t\t\t\tvar lastShapeIdx = shape.length - 1;\n\n\t\t\t\t\tvar prevShapeIdx = inShapeIdx - 1;\n\t\t\t\t\tif ( prevShapeIdx < 0 )\t\t\tprevShapeIdx = lastShapeIdx;\n\n\t\t\t\t\tvar nextShapeIdx = inShapeIdx + 1;\n\t\t\t\t\tif ( nextShapeIdx > lastShapeIdx )\tnextShapeIdx = 0;\n\n\t\t\t\t\tvar insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Shape): \" + inShapeIdx + \", Point: \" + hole[inHoleIdx].x + \"/\" + hole[inHoleIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check if shape point lies within angle around hole point\n\t\t\t\t\tvar lastHoleIdx = hole.length - 1;\n\n\t\t\t\t\tvar prevHoleIdx = inHoleIdx - 1;\n\t\t\t\t\tif ( prevHoleIdx < 0 )\t\t\tprevHoleIdx = lastHoleIdx;\n\n\t\t\t\t\tvar nextHoleIdx = inHoleIdx + 1;\n\t\t\t\t\tif ( nextHoleIdx > lastHoleIdx )\tnextHoleIdx = 0;\n\n\t\t\t\t\tinsideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Hole): \" + inHoleIdx + \", Point: \" + shape[inShapeIdx].x + \"/\" + shape[inShapeIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\ttrue;\n\n\t\t\t\t}\n\n\t\t\t\tfunction intersectsShapeEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with shape edges\n\t\t\t\t\tvar sIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( sIdx = 0; sIdx < shape.length; sIdx ++ ) {\n\n\t\t\t\t\t\tnextIdx = sIdx + 1; nextIdx %= shape.length;\n\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true );\n\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar indepHoles = [];\n\n\t\t\t\tfunction intersectsHoleEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with hole edges\n\t\t\t\t\tvar ihIdx, chkHole,\n\t\t\t\t\t\thIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) {\n\n\t\t\t\t\t\tchkHole = holes[ indepHoles[ ihIdx ]];\n\t\t\t\t\t\tfor ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) {\n\n\t\t\t\t\t\t\tnextIdx = hIdx + 1; nextIdx %= chkHole.length;\n\t\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true );\n\t\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar holeIndex, shapeIndex,\n\t\t\t\t\tshapePt, holePt,\n\t\t\t\t\tholeIdx, cutKey, failedCuts = [],\n\t\t\t\t\ttmpShape1, tmpShape2,\n\t\t\t\t\ttmpHole1, tmpHole2;\n\n\t\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tindepHoles.push( h );\n\n\t\t\t\t}\n\n\t\t\t\tvar minShapeIndex = 0;\n\t\t\t\tvar counter = indepHoles.length * 2;\n\t\t\t\twhile ( indepHoles.length > 0 ) {\n\n\t\t\t\t\tcounter --;\n\t\t\t\t\tif ( counter < 0 ) {\n\n\t\t\t\t\t\tconsole.log( \"Infinite Loop! Holes left:\" + indepHoles.length + \", Probably Hole outside Shape!\" );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// search for shape-vertex and hole-vertex,\n\t\t\t\t\t// which can be connected without intersections\n\t\t\t\t\tfor ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) {\n\n\t\t\t\t\t\tshapePt = shape[ shapeIndex ];\n\t\t\t\t\t\tholeIndex\t= - 1;\n\n\t\t\t\t\t\t// search for hole which can be reached without intersections\n\t\t\t\t\t\tfor ( var h = 0; h < indepHoles.length; h ++ ) {\n\n\t\t\t\t\t\t\tholeIdx = indepHoles[ h ];\n\n\t\t\t\t\t\t\t// prevent multiple checks\n\t\t\t\t\t\t\tcutKey = shapePt.x + \":\" + shapePt.y + \":\" + holeIdx;\n\t\t\t\t\t\t\tif ( failedCuts[ cutKey ] !== undefined )\t\t\tcontinue;\n\n\t\t\t\t\t\t\thole = holes[ holeIdx ];\n\t\t\t\t\t\t\tfor ( var h2 = 0; h2 < hole.length; h2 ++ ) {\n\n\t\t\t\t\t\t\t\tholePt = hole[ h2 ];\n\t\t\t\t\t\t\t\tif ( ! isCutLineInsideAngles( shapeIndex, h2 ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsShapeEdge( shapePt, holePt ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsHoleEdge( shapePt, holePt ) )\t\tcontinue;\n\n\t\t\t\t\t\t\t\tholeIndex = h2;\n\t\t\t\t\t\t\t\tindepHoles.splice( h, 1 );\n\n\t\t\t\t\t\t\t\ttmpShape1 = shape.slice( 0, shapeIndex + 1 );\n\t\t\t\t\t\t\t\ttmpShape2 = shape.slice( shapeIndex );\n\t\t\t\t\t\t\t\ttmpHole1 = hole.slice( holeIndex );\n\t\t\t\t\t\t\t\ttmpHole2 = hole.slice( 0, holeIndex + 1 );\n\n\t\t\t\t\t\t\t\tshape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 );\n\n\t\t\t\t\t\t\t\tminShapeIndex = shapeIndex;\n\n\t\t\t\t\t\t\t\t// Debug only, to show the selected cuts\n\t\t\t\t\t\t\t\t// glob_CutLines.push( [ shapePt, holePt ] );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t\t\tfailedCuts[ cutKey ] = true;\t\t\t// remember failure\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn shape; \t\t\t/* shape with no holes */\n\n\t\t\t}\n\n\n\t\t\tvar i, il, f, face,\n\t\t\t\tkey, index,\n\t\t\t\tallPointsMap = {};\n\n\t\t\t// To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first.\n\n\t\t\tvar allpoints = contour.concat();\n\n\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( allpoints, holes[ h ] );\n\n\t\t\t}\n\n\t\t\t//console.log( \"allpoints\",allpoints, allpoints.length );\n\n\t\t\t// prepare all points map\n\n\t\t\tfor ( i = 0, il = allpoints.length; i < il; i ++ ) {\n\n\t\t\t\tkey = allpoints[ i ].x + \":\" + allpoints[ i ].y;\n\n\t\t\t\tif ( allPointsMap[ key ] !== undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.ShapeUtils: Duplicate point\", key, i );\n\n\t\t\t\t}\n\n\t\t\t\tallPointsMap[ key ] = i;\n\n\t\t\t}\n\n\t\t\t// remove holes by cutting paths to holes and adding them to the shape\n\t\t\tvar shapeWithoutHoles = removeHoles( contour, holes );\n\n\t\t\tvar triangles = ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape\n\t\t\t//console.log( \"triangles\",triangles, triangles.length );\n\n\t\t\t// check all face vertices against all points map\n\n\t\t\tfor ( i = 0, il = triangles.length; i < il; i ++ ) {\n\n\t\t\t\tface = triangles[ i ];\n\n\t\t\t\tfor ( f = 0; f < 3; f ++ ) {\n\n\t\t\t\t\tkey = face[ f ].x + \":\" + face[ f ].y;\n\n\t\t\t\t\tindex = allPointsMap[ key ];\n\n\t\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\t\tface[ f ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn triangles.concat();\n\n\t\t},\n\n\t\tisClockWise: function ( pts ) {\n\n\t\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t\t},\n\n\t\t// Bezier Curves formulas obtained from\n\t\t// http://en.wikipedia.org/wiki/B%C3%A9zier_curve\n\n\t\t// Quad Bezier Functions\n\n\t\tb2: ( function () {\n\n\t\t\tfunction b2p0( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn k * k * p;\n\n\t\t\t}\n\n\t\t\tfunction b2p1( t, p ) {\n\n\t\t\t\treturn 2 * ( 1 - t ) * t * p;\n\n\t\t\t}\n\n\t\t\tfunction b2p2( t, p ) {\n\n\t\t\t\treturn t * t * p;\n\n\t\t\t}\n\n\t\t\treturn function b2( t, p0, p1, p2 ) {\n\n\t\t\t\treturn b2p0( t, p0 ) + b2p1( t, p1 ) + b2p2( t, p2 );\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\t// Cubic Bezier Functions\n\n\t\tb3: ( function () {\n\n\t\t\tfunction b3p0( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn k * k * k * p;\n\n\t\t\t}\n\n\t\t\tfunction b3p1( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn 3 * k * k * t * p;\n\n\t\t\t}\n\n\t\t\tfunction b3p2( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn 3 * k * t * t * p;\n\n\t\t\t}\n\n\t\t\tfunction b3p3( t, p ) {\n\n\t\t\t\treturn t * t * t * p;\n\n\t\t\t}\n\n\t\t\treturn function b3( t, p0, p1, p2, p3 ) {\n\n\t\t\t\treturn b3p0( t, p0 ) + b3p1( t, p1 ) + b3p2( t, p2 ) + b3p3( t, p3 );\n\n\t\t\t};\n\n\t\t} )()\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Creates extruded geometry from a path shape.\n\t *\n\t * parameters = {\n\t *\n\t * curveSegments: , // number of points on the curves\n\t * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n\t * amount: , // Depth to extrude the shape\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into the original shape bevel goes\n\t * bevelSize: , // how far from shape outline is bevel\n\t * bevelSegments: , // number of bevel layers\n\t *\n\t * extrudePath: // 3d spline path to extrude shape along. (creates Frames if .frames aren't defined)\n\t * frames: // containing arrays of tangents, normals, binormals\n\t *\n\t * uvGenerator: // object that provides UV generator functions\n\t *\n\t * }\n\t **/\n\n\tfunction ExtrudeGeometry( shapes, options ) {\n\n\t\tif ( typeof( shapes ) === \"undefined\" ) {\n\n\t\t\tshapes = [];\n\t\t\treturn;\n\n\t\t}\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tthis.addShapeList( shapes, options );\n\n\t\tthis.computeFaceNormals();\n\n\t\t// can't really use automatic vertex normals\n\t\t// as then front and back sides get smoothed too\n\t\t// should do separate smoothing just for sides\n\n\t\t//this.computeVertexNormals();\n\n\t\t//console.log( \"took\", ( Date.now() - startTime ) );\n\n\t}\n\n\tExtrudeGeometry.prototype = Object.create( Geometry.prototype );\n\tExtrudeGeometry.prototype.constructor = ExtrudeGeometry;\n\n\tExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) {\n\n\t\tvar sl = shapes.length;\n\n\t\tfor ( var s = 0; s < sl; s ++ ) {\n\n\t\t\tvar shape = shapes[ s ];\n\t\t\tthis.addShape( shape, options );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.prototype.addShape = function ( shape, options ) {\n\n\t\tvar amount = options.amount !== undefined ? options.amount : 100;\n\n\t\tvar bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10\n\t\tvar bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8\n\t\tvar bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\tvar bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false\n\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\n\t\tvar steps = options.steps !== undefined ? options.steps : 1;\n\n\t\tvar extrudePath = options.extrudePath;\n\t\tvar extrudePts, extrudeByPath = false;\n\n\t\t// Use default WorldUVGenerator if no UV generators are specified.\n\t\tvar uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator;\n\n\t\tvar splineTube, binormal, normal, position2;\n\t\tif ( extrudePath ) {\n\n\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\textrudeByPath = true;\n\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t// SETUP TNB variables\n\n\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\tsplineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\tbinormal = new Vector3();\n\t\t\tnormal = new Vector3();\n\t\t\tposition2 = new Vector3();\n\n\t\t}\n\n\t\t// Safeguards if bevels are not enabled\n\n\t\tif ( ! bevelEnabled ) {\n\n\t\t\tbevelSegments = 0;\n\t\t\tbevelThickness = 0;\n\t\t\tbevelSize = 0;\n\n\t\t}\n\n\t\t// Variables initialization\n\n\t\tvar ahole, h, hl; // looping of holes\n\t\tvar scope = this;\n\n\t\tvar shapesOffset = this.vertices.length;\n\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)!\n\n\t\t}\n\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t/* Vertices */\n\n\t\tvar contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\tvertices = vertices.concat( ahole );\n\n\t\t}\n\n\n\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\tif ( ! vec ) console.error( \"THREE.ExtrudeGeometry: vec does not exist\" );\n\n\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t}\n\n\t\tvar b, bs, t, z,\n\t\t\tvert, vlen = vertices.length,\n\t\t\tface, flen = faces.length;\n\n\n\t\t// Find directions for point movement\n\n\n\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t//\n\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\tvar v_trans_x, v_trans_y, shrink_by = 1;\t\t// resulting translation vector for inPt\n\n\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\tvar v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y;\n\t\t\tvar v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y;\n\n\t\t\tvar v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t// check for collinear edges\n\t\t\tvar collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t// not collinear\n\n\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\tvar v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\tvar v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\tvar ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\tvar ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\tvar ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\tvar ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\tvar sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\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// vector from inPt to intersection point\n\n\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t// but prevent crazy spikes\n\t\t\t\tvar v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\treturn\tnew Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\tvar direction_eq = false;\t\t// assumes: opposite\n\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tnew Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t}\n\n\n\t\tvar contourMovements = [];\n\n\t\tfor ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\tif ( j === il ) j = 0;\n\t\t\tif ( k === il ) k = 0;\n\n\t\t\t// (j)---(i)---(k)\n\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t}\n\n\t\tvar holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\toneHoleMovements = [];\n\n\t\t\tfor ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t}\n\n\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t}\n\n\n\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\tfor ( b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tbs = bevelSize;\n\n\t\t// Back facing vertices\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t} else {\n\n\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add stepped vertices...\n\t\t// Including front facing vertices\n\n\t\tvar s;\n\n\t\tfor ( s = 1; s <= steps; s ++ ) {\n\n\t\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, amount / steps * s );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// Add bevel segments planes\n\n\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\tfor ( b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos ( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/* Faces */\n\n\t\t// Top and bottom faces\n\n\t\tbuildLidFaces();\n\n\t\t// Sides faces\n\n\t\tbuildSideFaces();\n\n\n\t\t///// Internal functions\n\n\t\tfunction buildLidFaces() {\n\n\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\tvar layer = 0; // steps + 1\n\t\t\t\tvar offset = vlen * layer;\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Create faces for the z-sides of the shape\n\n\t\tfunction buildSideFaces() {\n\n\t\t\tvar layeroffset = 0;\n\t\t\tsidewalls( contour, layeroffset );\n\t\t\tlayeroffset += contour.length;\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t//, true\n\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\tvar j, k;\n\t\t\ti = contour.length;\n\n\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\tj = i;\n\t\t\t\tk = i - 1;\n\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\tvar s = 0, sl = steps + bevelSegments * 2;\n\n\t\t\t\tfor ( s = 0; s < sl; s ++ ) {\n\n\t\t\t\t\tvar slen1 = vlen * s;\n\t\t\t\t\tvar slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\tvar a = layeroffset + j + slen1,\n\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\tf4( a, b, c, d, contour, s, sl, j, k );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tfunction v( x, y, z ) {\n\n\t\t\tscope.vertices.push( new Vector3( x, y, z ) );\n\n\t\t}\n\n\t\tfunction f3( a, b, c ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, c, null, null, 0 ) );\n\n\t\t\tvar uvs = uvgen.generateTopUV( scope, a, b, c );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( uvs );\n\n\t\t}\n\n\t\tfunction f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\t\t\td += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, d, null, null, 1 ) );\n\t\t\tscope.faces.push( new Face3( b, c, d, null, null, 1 ) );\n\n\t\t\tvar uvs = uvgen.generateSideWallUV( scope, a, b, c, d );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ] );\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ] );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.WorldUVGenerator = {\n\n\t\tgenerateTopUV: function ( geometry, indexA, indexB, indexC ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a.x, a.y ),\n\t\t\t\tnew Vector2( b.x, b.y ),\n\t\t\t\tnew Vector2( c.x, c.y )\n\t\t\t];\n\n\t\t},\n\n\t\tgenerateSideWallUV: function ( geometry, indexA, indexB, indexC, indexD ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\t\t\tvar d = vertices[ indexD ];\n\n\t\t\tif ( Math.abs( a.y - b.y ) < 0.01 ) {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.x, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.x, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.x, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.x, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t} else {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.y, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.y, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.y, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.y, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t}\n\n\t\t}\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * Text = 3D Text\n\t *\n\t * parameters = {\n\t * font: , // font\n\t *\n\t * size: , // size of the text\n\t * height: , // thickness to extrude text\n\t * curveSegments: , // number of points on the curves\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into text bevel goes\n\t * bevelSize: // how far from text outline is bevel\n\t * }\n\t */\n\n\tfunction TextGeometry( text, parameters ) {\n\n\t\tparameters = parameters || {};\n\n\t\tvar font = parameters.font;\n\n\t\tif ( (font && font.isFont) === false ) {\n\n\t\t\tconsole.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );\n\t\t\treturn new Geometry();\n\n\t\t}\n\n\t\tvar shapes = font.generateShapes( text, parameters.size, parameters.curveSegments );\n\n\t\t// translate parameters to ExtrudeGeometry API\n\n\t\tparameters.amount = parameters.height !== undefined ? parameters.height : 50;\n\n\t\t// defaults\n\n\t\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\n\t\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\n\t\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\n\n\t\tExtrudeGeometry.call( this, shapes, parameters );\n\n\t\tthis.type = 'TextGeometry';\n\n\t}\n\n\tTextGeometry.prototype = Object.create( ExtrudeGeometry.prototype );\n\tTextGeometry.prototype.constructor = TextGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * based on THREE.SphereGeometry\n\t */\n\n\tfunction SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'SphereBufferGeometry';\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\tradius = radius || 50;\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );\n\n\t\tphiStart = phiStart !== undefined ? phiStart : 0;\n\t\tphiLength = phiLength !== undefined ? phiLength : Math.PI * 2;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI;\n\n\t\tvar thetaEnd = thetaStart + thetaLength;\n\n\t\tvar vertexCount = ( ( widthSegments + 1 ) * ( heightSegments + 1 ) );\n\n\t\tvar positions = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\tvar index = 0, vertices = [], normal = new Vector3();\n\n\t\tfor ( var y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\tvar verticesRow = [];\n\n\t\t\tvar v = y / heightSegments;\n\n\t\t\tfor ( var x = 0; x <= widthSegments; x ++ ) {\n\n\t\t\t\tvar u = x / widthSegments;\n\n\t\t\t\tvar px = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvar py = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvar pz = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tnormal.set( px, py, pz ).normalize();\n\n\t\t\t\tpositions.setXYZ( index, px, py, pz );\n\t\t\t\tnormals.setXYZ( index, normal.x, normal.y, normal.z );\n\t\t\t\tuvs.setXY( index, u, 1 - v );\n\n\t\t\t\tverticesRow.push( index );\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\tvertices.push( verticesRow );\n\n\t\t}\n\n\t\tvar indices = [];\n\n\t\tfor ( var y = 0; y < heightSegments; y ++ ) {\n\n\t\t\tfor ( var x = 0; x < widthSegments; x ++ ) {\n\n\t\t\t\tvar v1 = vertices[ y ][ x + 1 ];\n\t\t\t\tvar v2 = vertices[ y ][ x ];\n\t\t\t\tvar v3 = vertices[ y + 1 ][ x ];\n\t\t\t\tvar v4 = vertices[ y + 1 ][ x + 1 ];\n\n\t\t\t\tif ( y !== 0 || thetaStart > 0 ) indices.push( v1, v2, v4 );\n\t\t\t\tif ( y !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( v2, v3, v4 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( new ( positions.count > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) );\n\t\tthis.addAttribute( 'position', positions );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t\tthis.boundingSphere = new Sphere( new Vector3(), radius );\n\n\t}\n\n\tSphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tSphereBufferGeometry.prototype.constructor = SphereBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );\n\n\t}\n\n\tSphereGeometry.prototype = Object.create( Geometry.prototype );\n\tSphereGeometry.prototype.constructor = SphereGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'RingBufferGeometry';\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\tinnerRadius = innerRadius || 20;\n\t\touterRadius = outerRadius || 50;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\tthetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;\n\t\tphiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;\n\n\t\t// these are used to calculate buffer length\n\t\tvar vertexCount = ( thetaSegments + 1 ) * ( phiSegments + 1 );\n\t\tvar indexCount = thetaSegments * phiSegments * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// some helper variables\n\t\tvar index = 0, indexOffset = 0, segment;\n\t\tvar radius = innerRadius;\n\t\tvar radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\t// values are generate from the inside of the ring to the outside\n\n\t\tfor ( j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\tsegment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\t\t\t\tvertices.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\t\t\t\tnormals.setXYZ( index, 0, 0, 1 );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex++;\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tvar thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tsegment = i + thetaSegmentLevel;\n\n\t\t\t\t// indices\n\t\t\t\tvar a = segment;\n\t\t\t\tvar b = segment + thetaSegments + 1;\n\t\t\t\tvar c = segment + thetaSegments + 2;\n\t\t\t\tvar d = segment + 1;\n\n\t\t\t\t// face one\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\n\t\t\t\t// face two\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t}\n\n\tRingBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tRingBufferGeometry.prototype.constructor = RingBufferGeometry;\n\n\t/**\n\t * @author Kaleb Murphy\n\t */\n\n\tfunction RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );\n\n\t}\n\n\tRingGeometry.prototype = Object.create( Geometry.prototype );\n\tRingGeometry.prototype.constructor = RingGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );\n\n\t}\n\n\tPlaneGeometry.prototype = Object.create( Geometry.prototype );\n\tPlaneGeometry.prototype.constructor = PlaneGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\t // points - to create a closed torus, one must use a set of points\n\t // like so: [ a, b, c, d, a ], see first is the same as last.\n\t // segments - the number of circumference segments to create\n\t // phiStart - the starting radian\n\t // phiLength - the radian (0 to 2PI) range of the lathed section\n\t // 2PI is a closed lathe, less than 2PI is a portion.\n\n\tfunction LatheBufferGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'LatheBufferGeometry';\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 ) || 12;\n\t\tphiStart = phiStart || 0;\n\t\tphiLength = phiLength || Math.PI * 2;\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\t\tphiLength = _Math.clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// these are used to calculate buffer length\n\t\tvar vertexCount = ( segments + 1 ) * points.length;\n\t\tvar indexCount = segments * points.length * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// helper variables\n\t\tvar index = 0, indexOffset = 0, base;\n\t\tvar inverseSegments = 1.0 / segments;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar i, j;\n\n\t\t// generate vertices and uvs\n\n\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\tvar phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tvar sin = Math.sin( phi );\n\t\t\tvar cos = Math.cos( phi );\n\n\t\t\tfor ( j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\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\t\t\t\tvertices.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tbase = j + i * points.length;\n\n\t\t\t\t// indices\n\t\t\t\tvar a = base;\n\t\t\t\tvar b = base + points.length;\n\t\t\t\tvar c = base + points.length + 1;\n\t\t\t\tvar d = base + 1;\n\n\t\t\t\t// face one\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t\t// face two\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t\t// if the geometry is closed, we need to average the normals along the seam.\n\t\t// because the corresponding vertices are identical (but still have different UVs).\n\n\t\tif( phiLength === Math.PI * 2 ) {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\t\t\tvar n1 = new Vector3();\n\t\t\tvar n2 = new Vector3();\n\t\t\tvar n = new Vector3();\n\n\t\t\t// this is the buffer offset for the last line of vertices\n\t\t\tbase = segments * points.length * 3;\n\n\t\t\tfor( i = 0, j = 0; i < points.length; i ++, j += 3 ) {\n\n\t\t\t\t// select the normal of the vertex in the first line\n\t\t\t\tn1.x = normals[ j + 0 ];\n\t\t\t\tn1.y = normals[ j + 1 ];\n\t\t\t\tn1.z = normals[ j + 2 ];\n\n\t\t\t\t// select the normal of the vertex in the last line\n\t\t\t\tn2.x = normals[ base + j + 0 ];\n\t\t\t\tn2.y = normals[ base + j + 1 ];\n\t\t\t\tn2.z = normals[ base + j + 2 ];\n\n\t\t\t\t// average normals\n\t\t\t\tn.addVectors( n1, n2 ).normalize();\n\n\t\t\t\t// assign the new values to both normals\n\t\t\t\tnormals[ j + 0 ] = normals[ base + j + 0 ] = n.x;\n\t\t\t\tnormals[ j + 1 ] = normals[ base + j + 1 ] = n.y;\n\t\t\t\tnormals[ j + 2 ] = normals[ base + j + 2 ] = n.z;\n\n\t\t\t} // next row\n\n\t\t}\n\n\t}\n\n\tLatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tLatheBufferGeometry.prototype.constructor = LatheBufferGeometry;\n\n\t/**\n\t * @author astrodud / http://astrodud.isgreat.org/\n\t * @author zz85 / https://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t */\n\n\t// points - to create a closed torus, one must use a set of points\n\t// like so: [ a, b, c, d, a ], see first is the same as last.\n\t// segments - the number of circumference segments to create\n\t// phiStart - the starting radian\n\t// phiLength - the radian (0 to 2PI) range of the lathed section\n\t// 2PI is a closed lathe, less than 2PI is a portion.\n\n\tfunction LatheGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tLatheGeometry.prototype = Object.create( Geometry.prototype );\n\tLatheGeometry.prototype.constructor = LatheGeometry;\n\n\t/**\n\t * @author jonobr1 / http://jonobr1.com\n\t *\n\t * Creates a one-sided polygonal geometry from a path shape. Similar to\n\t * ExtrudeGeometry.\n\t *\n\t * parameters = {\n\t *\n\t *\tcurveSegments: , // number of points on the curves. NOT USED AT THE MOMENT.\n\t *\n\t *\tmaterial: // material index for front and back faces\n\t *\tuvGenerator: // object that provides UV generator functions\n\t *\n\t * }\n\t **/\n\n\tfunction ShapeGeometry( shapes, options ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tif ( Array.isArray( shapes ) === false ) shapes = [ shapes ];\n\n\t\tthis.addShapeList( shapes, options );\n\n\t\tthis.computeFaceNormals();\n\n\t}\n\n\tShapeGeometry.prototype = Object.create( Geometry.prototype );\n\tShapeGeometry.prototype.constructor = ShapeGeometry;\n\n\t/**\n\t * Add an array of shapes to THREE.ShapeGeometry.\n\t */\n\tShapeGeometry.prototype.addShapeList = function ( shapes, options ) {\n\n\t\tfor ( var i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tthis.addShape( shapes[ i ], options );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * Adds a shape to THREE.ShapeGeometry, based on THREE.ExtrudeGeometry.\n\t */\n\tShapeGeometry.prototype.addShape = function ( shape, options ) {\n\n\t\tif ( options === undefined ) options = {};\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\n\t\tvar material = options.material;\n\t\tvar uvgen = options.UVGenerator === undefined ? ExtrudeGeometry.WorldUVGenerator : options.UVGenerator;\n\n\t\t//\n\n\t\tvar i, l, hole;\n\n\t\tvar shapesOffset = this.vertices.length;\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe...\n\n\t\t\tfor ( i = 0, l = holes.length; i < l; i ++ ) {\n\n\t\t\t\thole = holes[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( hole ) ) {\n\n\t\t\t\t\tholes[ i ] = hole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treverse = false;\n\n\t\t}\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t// Vertices\n\n\t\tfor ( i = 0, l = holes.length; i < l; i ++ ) {\n\n\t\t\thole = holes[ i ];\n\t\t\tvertices = vertices.concat( hole );\n\n\t\t}\n\n\t\t//\n\n\t\tvar vert, vlen = vertices.length;\n\t\tvar face, flen = faces.length;\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = vertices[ i ];\n\n\t\t\tthis.vertices.push( new Vector3( vert.x, vert.y, 0 ) );\n\n\t\t}\n\n\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\tface = faces[ i ];\n\n\t\t\tvar a = face[ 0 ] + shapesOffset;\n\t\t\tvar b = face[ 1 ] + shapesOffset;\n\t\t\tvar c = face[ 2 ] + shapesOffset;\n\n\t\t\tthis.faces.push( new Face3( a, b, c, null, null, material ) );\n\t\t\tthis.faceVertexUvs[ 0 ].push( uvgen.generateTopUV( this, a, b, c ) );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction EdgesGeometry( geometry, thresholdAngle ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;\n\n\t\tvar thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle );\n\n\t\tvar edge = [ 0, 0 ], hash = {};\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\tvar geometry2;\n\n\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\tgeometry2 = new Geometry();\n\t\t\tgeometry2.fromBufferGeometry( geometry );\n\n\t\t} else {\n\n\t\t\tgeometry2 = geometry.clone();\n\n\t\t}\n\n\t\tgeometry2.mergeVertices();\n\t\tgeometry2.computeFaceNormals();\n\n\t\tvar vertices = geometry2.vertices;\n\t\tvar faces = geometry2.faces;\n\n\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\tvar key = edge.toString();\n\n\t\t\t\tif ( hash[ key ] === undefined ) {\n\n\t\t\t\t\thash[ key ] = { vert1: edge[ 0 ], vert2: edge[ 1 ], face1: i, face2: undefined };\n\n\t\t\t\t} else {\n\n\t\t\t\t\thash[ key ].face2 = i;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar coords = [];\n\n\t\tfor ( var key in hash ) {\n\n\t\t\tvar h = hash[ key ];\n\n\t\t\tif ( h.face2 === undefined || faces[ h.face1 ].normal.dot( faces[ h.face2 ].normal ) <= thresholdDot ) {\n\n\t\t\t\tvar vertex = vertices[ h.vert1 ];\n\t\t\t\tcoords.push( vertex.x );\n\t\t\t\tcoords.push( vertex.y );\n\t\t\t\tcoords.push( vertex.z );\n\n\t\t\t\tvertex = vertices[ h.vert2 ];\n\t\t\t\tcoords.push( vertex.x );\n\t\t\t\tcoords.push( vertex.y );\n\t\t\t\tcoords.push( vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.addAttribute( 'position', new BufferAttribute( new Float32Array( coords ), 3 ) );\n\n\t}\n\n\tEdgesGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tEdgesGeometry.prototype.constructor = EdgesGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CylinderBufferGeometry';\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\tvar scope = this;\n\n\t\tradiusTop = radiusTop !== undefined ? radiusTop : 20;\n\t\tradiusBottom = radiusBottom !== undefined ? radiusBottom : 20;\n\t\theight = height !== undefined ? height : 100;\n\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\n\t\topenEnded = openEnded !== undefined ? openEnded : false;\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0.0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI;\n\n\t\t// used to calculate buffer length\n\n\t\tvar nbCap = 0;\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) nbCap ++;\n\t\t\tif ( radiusBottom > 0 ) nbCap ++;\n\n\t\t}\n\n\t\tvar vertexCount = calculateVertexCount();\n\t\tvar indexCount = calculateIndexCount();\n\n\t\t// buffers\n\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ), 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// helper variables\n\n\t\tvar index = 0,\n\t\t indexOffset = 0,\n\t\t indexArray = [],\n\t\t halfHeight = height / 2;\n\n\t\t// group variables\n\t\tvar 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.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t\t// helper functions\n\n\t\tfunction calculateVertexCount() {\n\n\t\t\tvar count = ( radialSegments + 1 ) * ( heightSegments + 1 );\n\n\t\t\tif ( openEnded === false ) {\n\n\t\t\t\tcount += ( ( radialSegments + 1 ) * nbCap ) + ( radialSegments * nbCap );\n\n\t\t\t}\n\n\t\t\treturn count;\n\n\t\t}\n\n\t\tfunction calculateIndexCount() {\n\n\t\t\tvar count = radialSegments * heightSegments * 2 * 3;\n\n\t\t\tif ( openEnded === false ) {\n\n\t\t\t\tcount += radialSegments * nbCap * 3;\n\n\t\t\t}\n\n\t\t\treturn count;\n\n\t\t}\n\n\t\tfunction generateTorso() {\n\n\t\t\tvar x, y;\n\t\t\tvar normal = new Vector3();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tvar slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tvar indexRow = [];\n\n\t\t\t\tvar v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\t\t\t\tvar radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tvar u = x / radialSegments;\n\n\t\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tvar sinTheta = Math.sin( theta );\n\t\t\t\t\tvar cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\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.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.setXYZ( index, normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\t\t\t\t\tuvs.setXY( index, u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\t\t\t\t\tindexRow.push( index );\n\n\t\t\t\t\t// increase index\n\t\t\t\t\tindex ++;\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\t\t\t\t\tvar i1 = indexArray[ y ][ x ];\n\t\t\t\t\tvar i2 = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tvar i3 = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tvar i4 = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// face one\n\t\t\t\t\tindices.setX( indexOffset, i1 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i2 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i4 ); indexOffset ++;\n\n\t\t\t\t\t// face two\n\t\t\t\t\tindices.setX( indexOffset, i2 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i3 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i4 ); indexOffset ++;\n\n\t\t\t\t\t// update counters\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\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\tvar x, centerIndexStart, centerIndexEnd;\n\n\t\t\tvar uv = new Vector2();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tvar sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// save the index of the first center vertex\n\t\t\tcenterIndexStart = index;\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 ( x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\t\t\t\tvertices.setXYZ( index, 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\t\t\t\tnormals.setXYZ( index, 0, sign, 0 );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = 0.5;\n\t\t\t\tuv.y = 0.5;\n\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\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\tcenterIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tvar u = x / radialSegments;\n\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\tvar cosTheta = Math.cos( theta );\n\t\t\t\tvar sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\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.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\t\t\t\tnormals.setXYZ( index, 0, sign, 0 );\n\n\t\t\t\t// uv\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.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tvar c = centerIndexStart + x;\n\t\t\t\tvar i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\t\t\t\t\tindices.setX( indexOffset, i ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i + 1 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, c ); indexOffset ++;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\t\t\t\t\tindices.setX( indexOffset, i + 1 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, c ); indexOffset ++;\n\n\t\t\t\t}\n\n\t\t\t\t// update counters\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\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tCylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tCylinderGeometry.prototype = Object.create( Geometry.prototype );\n\tCylinderGeometry.prototype.constructor = CylinderGeometry;\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderGeometry.call( this, 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\tConeGeometry.prototype = Object.create( CylinderGeometry.prototype );\n\tConeGeometry.prototype.constructor = ConeGeometry;\n\n\t/**\n\t * @author: abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeBufferGeometry';\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\tConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype );\n\tConeBufferGeometry.prototype.constructor = ConeBufferGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CircleBufferGeometry';\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\tradius = radius || 50;\n\t\tsegments = segments !== undefined ? Math.max( 3, segments ) : 8;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\tvar vertices = segments + 2;\n\n\t\tvar positions = new Float32Array( vertices * 3 );\n\t\tvar normals = new Float32Array( vertices * 3 );\n\t\tvar uvs = new Float32Array( vertices * 2 );\n\n\t\t// center data is already zero, but need to set a few extras\n\t\tnormals[ 2 ] = 1.0;\n\t\tuvs[ 0 ] = 0.5;\n\t\tuvs[ 1 ] = 0.5;\n\n\t\tfor ( var s = 0, i = 3, ii = 2 ; s <= segments; s ++, i += 3, ii += 2 ) {\n\n\t\t\tvar segment = thetaStart + s / segments * thetaLength;\n\n\t\t\tpositions[ i ] = radius * Math.cos( segment );\n\t\t\tpositions[ i + 1 ] = radius * Math.sin( segment );\n\n\t\t\tnormals[ i + 2 ] = 1; // normal z\n\n\t\t\tuvs[ ii ] = ( positions[ i ] / radius + 1 ) / 2;\n\t\t\tuvs[ ii + 1 ] = ( positions[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t}\n\n\t\tvar indices = [];\n\n\t\tfor ( var i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\tthis.setIndex( new BufferAttribute( new Uint16Array( indices ), 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t\tthis.boundingSphere = new Sphere( new Vector3(), radius );\n\n\t}\n\n\tCircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCircleBufferGeometry.prototype.constructor = CircleBufferGeometry;\n\n\t/**\n\t * @author hughes\n\t */\n\n\tfunction CircleGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );\n\n\t}\n\n\tCircleGeometry.prototype = Object.create( Geometry.prototype );\n\tCircleGeometry.prototype.constructor = CircleGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as\n\t */\n\n\tfunction BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tBoxGeometry.prototype = Object.create( Geometry.prototype );\n\tBoxGeometry.prototype.constructor = BoxGeometry;\n\n\n\n\tvar Geometries = Object.freeze({\n\t\tWireframeGeometry: WireframeGeometry,\n\t\tParametricGeometry: ParametricGeometry,\n\t\tParametricBufferGeometry: ParametricBufferGeometry,\n\t\tTetrahedronGeometry: TetrahedronGeometry,\n\t\tTetrahedronBufferGeometry: TetrahedronBufferGeometry,\n\t\tOctahedronGeometry: OctahedronGeometry,\n\t\tOctahedronBufferGeometry: OctahedronBufferGeometry,\n\t\tIcosahedronGeometry: IcosahedronGeometry,\n\t\tIcosahedronBufferGeometry: IcosahedronBufferGeometry,\n\t\tDodecahedronGeometry: DodecahedronGeometry,\n\t\tDodecahedronBufferGeometry: DodecahedronBufferGeometry,\n\t\tPolyhedronGeometry: PolyhedronGeometry,\n\t\tPolyhedronBufferGeometry: PolyhedronBufferGeometry,\n\t\tTubeGeometry: TubeGeometry,\n\t\tTubeBufferGeometry: TubeBufferGeometry,\n\t\tTorusKnotGeometry: TorusKnotGeometry,\n\t\tTorusKnotBufferGeometry: TorusKnotBufferGeometry,\n\t\tTorusGeometry: TorusGeometry,\n\t\tTorusBufferGeometry: TorusBufferGeometry,\n\t\tTextGeometry: TextGeometry,\n\t\tSphereBufferGeometry: SphereBufferGeometry,\n\t\tSphereGeometry: SphereGeometry,\n\t\tRingGeometry: RingGeometry,\n\t\tRingBufferGeometry: RingBufferGeometry,\n\t\tPlaneBufferGeometry: PlaneBufferGeometry,\n\t\tPlaneGeometry: PlaneGeometry,\n\t\tLatheGeometry: LatheGeometry,\n\t\tLatheBufferGeometry: LatheBufferGeometry,\n\t\tShapeGeometry: ShapeGeometry,\n\t\tExtrudeGeometry: ExtrudeGeometry,\n\t\tEdgesGeometry: EdgesGeometry,\n\t\tConeGeometry: ConeGeometry,\n\t\tConeBufferGeometry: ConeBufferGeometry,\n\t\tCylinderGeometry: CylinderGeometry,\n\t\tCylinderBufferGeometry: CylinderBufferGeometry,\n\t\tCircleBufferGeometry: CircleBufferGeometry,\n\t\tCircleGeometry: CircleGeometry,\n\t\tBoxBufferGeometry: BoxBufferGeometry,\n\t\tBoxGeometry: BoxGeometry\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ShadowMaterial() {\n\n\t\tShaderMaterial.call( this, {\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib[ \"lights\" ],\n\t\t\t\t{\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t}\n\t\t\t] ),\n\t\t\tvertexShader: ShaderChunk[ 'shadow_vert' ],\n\t\t\tfragmentShader: ShaderChunk[ 'shadow_frag' ]\n\t\t} );\n\n\t\tthis.lights = true;\n\t\tthis.transparent = true;\n\n\t\tObject.defineProperties( this, {\n\t\t\topacity: {\n\t\t\t\tenumerable: true,\n\t\t\t\tget: function () {\n\t\t\t\t\treturn this.uniforms.opacity.value;\n\t\t\t\t},\n\t\t\t\tset: function ( value ) {\n\t\t\t\t\tthis.uniforms.opacity.value = value;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tShadowMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tShadowMaterial.prototype.constructor = ShadowMaterial;\n\n\tShadowMaterial.prototype.isShadowMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction RawShaderMaterial( parameters ) {\n\n\t\tShaderMaterial.call( this, parameters );\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n\tRawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tRawShaderMaterial.prototype.constructor = RawShaderMaterial;\n\n\tRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MultiMaterial( materials ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.type = 'MultiMaterial';\n\n\t\tthis.materials = materials instanceof Array ? materials : [];\n\n\t\tthis.visible = true;\n\n\t}\n\n\tMultiMaterial.prototype = {\n\n\t\tconstructor: MultiMaterial,\n\n\t\tisMultiMaterial: true,\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.2,\n\t\t\t\t\ttype: 'material',\n\t\t\t\t\tgenerator: 'MaterialExporter'\n\t\t\t\t},\n\t\t\t\tuuid: this.uuid,\n\t\t\t\ttype: this.type,\n\t\t\t\tmaterials: []\n\t\t\t};\n\n\t\t\tvar materials = this.materials;\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tvar material = materials[ i ].toJSON( meta );\n\t\t\t\tdelete material.metadata;\n\n\t\t\t\toutput.materials.push( material );\n\n\t\t\t}\n\n\t\t\toutput.visible = this.visible;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\tvar material = new this.constructor();\n\n\t\t\tfor ( var i = 0; i < this.materials.length; i ++ ) {\n\n\t\t\t\tmaterial.materials.push( this.materials[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tmaterial.visible = this.visible;\n\n\t\t\treturn material;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * color: ,\n\t * roughness: ,\n\t * metalness: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * roughnessMap: new THREE.Texture( ),\n\t *\n\t * metalnessMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n\t * envMapIntensity: \n\t *\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshStandardMaterial( parameters ) {\n\n\t\tMaterial.call( this );\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 = 0.5;\n\t\tthis.metalness = 0.5;\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.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.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.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshStandardMaterial.prototype = Object.create( Material.prototype );\n\tMeshStandardMaterial.prototype.constructor = MeshStandardMaterial;\n\n\tMeshStandardMaterial.prototype.isMeshStandardMaterial = true;\n\n\tMeshStandardMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, 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.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.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.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * reflectivity: \n\t * }\n\t */\n\n\tfunction MeshPhysicalMaterial( parameters ) {\n\n\t\tMeshStandardMaterial.call( this );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.reflectivity = 0.5; // maps to F0 = 0.04\n\n\t\tthis.clearCoat = 0.0;\n\t\tthis.clearCoatRoughness = 0.0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );\n\tMeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;\n\n\tMeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;\n\n\tMeshPhysicalMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshStandardMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.reflectivity = source.reflectivity;\n\n\t\tthis.clearCoat = source.clearCoat;\n\t\tthis.clearCoatRoughness = source.clearCoatRoughness;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * specular: ,\n\t * shininess: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshPhongMaterial( parameters ) {\n\n\t\tMaterial.call( this );\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.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.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhongMaterial.prototype = Object.create( Material.prototype );\n\tMeshPhongMaterial.prototype.constructor = MeshPhongMaterial;\n\n\tMeshPhongMaterial.prototype.isMeshPhongMaterial = true;\n\n\tMeshPhongMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, 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.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.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t *\n\t * parameters = {\n\t * opacity: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t * }\n\t */\n\n\tfunction MeshNormalMaterial( parameters ) {\n\n\t\tMaterial.call( this, parameters );\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshNormalMaterial.prototype = Object.create( Material.prototype );\n\tMeshNormalMaterial.prototype.constructor = MeshNormalMaterial;\n\n\tMeshNormalMaterial.prototype.isMeshNormalMaterial = true;\n\n\tMeshNormalMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshLambertMaterial( parameters ) {\n\n\t\tMaterial.call( this );\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.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.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshLambertMaterial.prototype = Object.create( Material.prototype );\n\tMeshLambertMaterial.prototype.constructor = MeshLambertMaterial;\n\n\tMeshLambertMaterial.prototype.isMeshLambertMaterial = true;\n\n\tMeshLambertMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, 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.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.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t *\n\t * scale: ,\n\t * dashSize: ,\n\t * gapSize: \n\t * }\n\t */\n\n\tfunction LineDashedMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineDashedMaterial.prototype = Object.create( Material.prototype );\n\tLineDashedMaterial.prototype.constructor = LineDashedMaterial;\n\n\tLineDashedMaterial.prototype.isLineDashedMaterial = true;\n\n\tLineDashedMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\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\tvar Materials = Object.freeze({\n\t\tShadowMaterial: ShadowMaterial,\n\t\tSpriteMaterial: SpriteMaterial,\n\t\tRawShaderMaterial: RawShaderMaterial,\n\t\tShaderMaterial: ShaderMaterial,\n\t\tPointsMaterial: PointsMaterial,\n\t\tMultiMaterial: MultiMaterial,\n\t\tMeshPhysicalMaterial: MeshPhysicalMaterial,\n\t\tMeshStandardMaterial: MeshStandardMaterial,\n\t\tMeshPhongMaterial: MeshPhongMaterial,\n\t\tMeshNormalMaterial: MeshNormalMaterial,\n\t\tMeshLambertMaterial: MeshLambertMaterial,\n\t\tMeshDepthMaterial: MeshDepthMaterial,\n\t\tMeshBasicMaterial: MeshBasicMaterial,\n\t\tLineDashedMaterial: LineDashedMaterial,\n\t\tLineBasicMaterial: LineBasicMaterial,\n\t\tMaterial: Material\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar Cache = {\n\n\t\tenabled: false,\n\n\t\tfiles: {},\n\n\t\tadd: function ( key, file ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\t\tthis.files[ key ] = file;\n\n\t\t},\n\n\t\tget: function ( key ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\t\treturn this.files[ key ];\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete this.files[ key ];\n\n\t\t},\n\n\t\tclear: function () {\n\n\t\t\tthis.files = {};\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LoadingManager( onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar isLoading = false, itemsLoaded = 0, itemsTotal = 0;\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}\n\n\tvar DefaultLoadingManager = new LoadingManager();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction XHRLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( XHRLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\t// Check for data: URI\n\t\t\tvar dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\t\t\tvar dataUriRegexResult = url.match( dataUriRegex );\n\n\t\t\t// Safari can not handle Data URIs through XMLHttpRequest so process manually\n\t\t\tif ( dataUriRegexResult ) {\n\n\t\t\t\tvar mimeType = dataUriRegexResult[1];\n\t\t\t\tvar isBase64 = !!dataUriRegexResult[2];\n\t\t\t\tvar data = dataUriRegexResult[3];\n\n\t\t\t\tdata = window.decodeURIComponent(data);\n\n\t\t\t\tif( isBase64 ) {\n\t\t\t\t\tdata = window.atob(data);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar response;\n\t\t\t\t\tvar responseType = ( this.responseType || '' ).toLowerCase();\n\n\t\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\t \tresponse = new ArrayBuffer( data.length );\n\t\t\t\t\t\t\tvar view = new Uint8Array( response );\n\t\t\t\t\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tview[ i ] = data.charCodeAt( i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( responseType === 'blob' ) {\n\n\t\t\t\t\t\t\t\tresponse = new Blob( [ response ], { \"type\" : mimeType } );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\t\tvar parser = new DOMParser();\n\t\t\t\t\t\t\tresponse = parser.parseFromString( data, mimeType );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\t\tresponse = JSON.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault: // 'text' or other\n\n\t\t\t\t\t\t\tresponse = data;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function() {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t}, 0);\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function() {\n\n\t\t\t\t\t\tif ( onError ) onError( error );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}, 0);\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar request = new XMLHttpRequest();\n\t\t\t\trequest.open( 'GET', url, true );\n\n\t\t\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\t\t\tvar response = event.target.response;\n\n\t\t\t\t\tCache.add( url, response );\n\n\t\t\t\t\tif ( this.status === 200 ) {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else if ( this.status === 0 ) {\n\n\t\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\t\tconsole.warn( 'THREE.XHRLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( onProgress !== undefined ) {\n\n\t\t\t\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\t\t\tonProgress( event );\n\n\t\t\t\t\t}, false );\n\n\t\t\t\t}\n\n\t\t\t\trequest.addEventListener( 'error', function ( event ) {\n\n\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( this.responseType !== undefined ) request.responseType = this.responseType;\n\t\t\t\tif ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;\n\n\t\t\t\tif ( request.overrideMimeType ) request.overrideMimeType( 'text/plain' );\n\n\t\t\t\trequest.send( null );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn request;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetResponseType: function ( value ) {\n\n\t\t\tthis.responseType = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t *\n\t * Abstract Base class to block based textures loader (dds, pvr, ...)\n\t */\n\n\tfunction CompressedTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( CompressedTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar images = [];\n\n\t\t\tvar texture = new CompressedTexture();\n\t\t\ttexture.image = images;\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\timages[ i ] = {\n\t\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t\t};\n\n\t\t\t\t\tloaded += 1;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\tif ( texDatas.mipmapCount === 1 )\n\t\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\tvar loaded = 0;\n\n\t\t\t\tfor ( var i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\t\tloadTexture( i );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\t\tvar faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\t\tfor ( var f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\t\timages[ f ] = { mipmaps : [] };\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\t\timages[ f ].height = texDatas.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} else {\n\n\t\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author Nikos M. / https://github.com/foo123/\n\t *\n\t * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n\t */\n\n\tvar DataTextureLoader = BinaryTextureLoader;\n\tfunction BinaryTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( BinaryTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texture = new DataTexture();\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar texData = scope._parser( buffer );\n\n\t\t\t\tif ( ! texData ) return;\n\n\t\t\t\tif ( undefined !== texData.image ) {\n\n\t\t\t\t\ttexture.image = texData.image;\n\n\t\t\t\t} else if ( undefined !== texData.data ) {\n\n\t\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\t\ttexture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\t\ttexture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter;\n\t\t\t\ttexture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter;\n\n\t\t\t\ttexture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;\n\n\t\t\t\tif ( undefined !== texData.format ) {\n\n\t\t\t\t\ttexture.format = texData.format;\n\n\t\t\t\t}\n\t\t\t\tif ( undefined !== texData.type ) {\n\n\t\t\t\t\ttexture.type = texData.type;\n\n\t\t\t\t}\n\n\t\t\t\tif ( undefined !== texData.mipmaps ) {\n\n\t\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( 1 === texData.mipmapCount ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t\t}, onProgress, onError );\n\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ImageLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( ImageLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );\n\t\t\timage.onload = function () {\n\n\t\t\t\timage.onload = null;\n\n\t\t\t\tURL.revokeObjectURL( image.src );\n\n\t\t\t\tif ( onLoad ) onLoad( image );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t};\n\t\t\timage.onerror = onError;\n\n\t\t\tif ( url.indexOf( 'data:' ) === 0 ) {\n\n\t\t\t\timage.src = url;\n\n\t\t\t} else {\n\n\t\t\t\tvar loader = new XHRLoader();\n\t\t\t\tloader.setPath( this.path );\n\t\t\t\tloader.setResponseType( 'blob' );\n\t\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\t\tloader.load( url, function ( blob ) {\n\n\t\t\t\t\timage.src = URL.createObjectURL( blob );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn image;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( CubeTextureLoader.prototype, {\n\n\t\tload: function ( urls, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new CubeTexture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\n\t\t\tvar loaded = 0;\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\t\tloaded ++;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, undefined, onError );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < urls.length; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction TextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( TextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new Texture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.load( url, function ( image ) {\n\n\t\t\t\t// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.\n\t\t\t\tvar isJPEG = url.search( /\\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\\:image\\/jpeg/ ) === 0;\n\n\t\t\t\ttexture.format = isJPEG ? RGBFormat : RGBAFormat;\n\t\t\t\ttexture.image = image;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\t\tonLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Light( color, intensity ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Light';\n\n\t\tthis.color = new Color( color );\n\t\tthis.intensity = intensity !== undefined ? intensity : 1;\n\n\t\tthis.receiveShadow = undefined;\n\n\t}\n\n\tLight.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Light,\n\n\t\tisLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.color.copy( source.color );\n\t\t\tthis.intensity = source.intensity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.color = this.color.getHex();\n\t\t\tdata.object.intensity = this.intensity;\n\n\t\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction HemisphereLight( skyColor, groundColor, intensity ) {\n\n\t\tLight.call( this, skyColor, intensity );\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.castShadow = undefined;\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tHemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: HemisphereLight,\n\n\t\tisHemisphereLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.groundColor.copy( source.groundColor );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LightShadow( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.bias = 0;\n\t\tthis.radius = 1;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.matrix = new Matrix4();\n\n\t}\n\n\tObject.assign( LightShadow.prototype, {\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.camera = source.camera.clone();\n\n\t\t\tthis.bias = source.bias;\n\t\t\tthis.radius = source.radius;\n\n\t\t\tthis.mapSize.copy( source.mapSize );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar object = {};\n\n\t\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\t\tdelete object.camera.matrix;\n\n\t\t\treturn object;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SpotLightShadow() {\n\n\t\tLightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t}\n\n\tSpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: SpotLightShadow,\n\n\t\tisSpotLightShadow: true,\n\n\t\tupdate: function ( light ) {\n\n\t\t\tvar fov = _Math.RAD2DEG * 2 * light.angle;\n\t\t\tvar aspect = this.mapSize.width / this.mapSize.height;\n\t\t\tvar far = light.distance || 500;\n\n\t\t\tvar camera = this.camera;\n\n\t\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\t\tcamera.fov = fov;\n\t\t\t\tcamera.aspect = aspect;\n\t\t\t\tcamera.far = far;\n\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpotLight( color, intensity, distance, angle, penumbra, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * Math.PI;\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / Math.PI;\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.angle = ( angle !== undefined ) ? angle : Math.PI / 3;\n\t\tthis.penumbra = ( penumbra !== undefined ) ? penumbra : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\tSpotLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: SpotLight,\n\n\t\tisSpotLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.angle = source.angle;\n\t\t\tthis.penumbra = source.penumbra;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\n\tfunction PointLight( color, intensity, distance, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'PointLight';\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * 4 * Math.PI;\n\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / ( 4 * Math.PI );\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t}\n\n\tPointLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: PointLight,\n\n\t\tisPointLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectionalLightShadow( light ) {\n\n\t\tLightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n\t}\n\n\tDirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: DirectionalLightShadow\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DirectionalLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tDirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: DirectionalLight,\n\n\t\tisDirectionalLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AmbientLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'AmbientLight';\n\n\t\tthis.castShadow = undefined;\n\n\t}\n\n\tAmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: AmbientLight,\n\n\t\tisAmbientLight: true,\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tvar AnimationUtils = {\n\n\t\t// same as Array.prototype.slice, but also works on typed arrays\n\t\tarraySlice: function( array, from, to ) {\n\n\t\t\tif ( AnimationUtils.isTypedArray( array ) ) {\n\n\t\t\t\treturn new array.constructor( array.subarray( from, to ) );\n\n\t\t\t}\n\n\t\t\treturn array.slice( from, to );\n\n\t\t},\n\n\t\t// converts an array to a specific type\n\t\tconvertArray: function( array, type, forceClone ) {\n\n\t\t\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t\t\t\t! forceClone && array.constructor === type ) return array;\n\n\t\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\t\t\treturn new type( array ); // create typed array\n\n\t\t\t}\n\n\t\t\treturn Array.prototype.slice.call( array ); // create Array\n\n\t\t},\n\n\t\tisTypedArray: function( object ) {\n\n\t\t\treturn ArrayBuffer.isView( object ) &&\n\t\t\t\t\t! ( object instanceof DataView );\n\n\t\t},\n\n\t\t// returns an array by which times and values can be sorted\n\t\tgetKeyframeOrder: function( times ) {\n\n\t\t\tfunction compareTime( i, j ) {\n\n\t\t\t\treturn times[ i ] - times[ j ];\n\n\t\t\t}\n\n\t\t\tvar n = times.length;\n\t\t\tvar result = new Array( n );\n\t\t\tfor ( var i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\t\t\tresult.sort( compareTime );\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// uses the array previously returned by 'getKeyframeOrder' to sort data\n\t\tsortedArray: function( values, stride, order ) {\n\n\t\t\tvar nValues = values.length;\n\t\t\tvar result = new values.constructor( nValues );\n\n\t\t\tfor ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\t\t\tvar srcOffset = order[ i ] * stride;\n\n\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// function for parsing AOS keyframe formats\n\t\tflattenJSON: function( jsonKeys, times, values, valuePropertyName ) {\n\n\t\t\tvar i = 1, key = jsonKeys[ 0 ];\n\n\t\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t}\n\n\t\t\tif ( key === undefined ) return; // no data\n\n\t\t\tvar value = key[ valuePropertyName ];\n\t\t\tif ( value === undefined ) return; // no data\n\n\t\t\tif ( Array.isArray( value ) ) {\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else if ( value.toArray !== undefined ) {\n\t\t\t\t// ...assume THREE.Math-ish\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else {\n\t\t\t\t// otherwise push as-is\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push( value );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Abstract base class of interpolants over parametric samples.\n\t *\n\t * The parameter domain is one dimensional, typically the time or a path\n\t * along a curve defined by the data.\n\t *\n\t * The sample values can have any dimensionality and derived classes may\n\t * apply special interpretations to the data.\n\t *\n\t * This class provides the interval seek in a Template Method, deferring\n\t * the actual interpolation to derived classes.\n\t *\n\t * Time complexity is O(1) for linear access crossing at most two points\n\t * and O(log N) for random access, where N is the number of positions.\n\t *\n\t * References:\n\t *\n\t * \t\thttp://www.oodesign.com/template-method-pattern.html\n\t *\n\t * @author tschw\n\t */\n\n\tfunction Interpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tthis.parameterPositions = parameterPositions;\n\t\tthis._cachedIndex = 0;\n\n\t\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\t\tthis.sampleValues = sampleValues;\n\t\tthis.valueSize = sampleSize;\n\n\t}\n\n\tInterpolant.prototype = {\n\n\t\tconstructor: Interpolant,\n\n\t\tevaluate: function( t ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\ti1 = this._cachedIndex,\n\n\t\t\t\tt1 = pp[ i1 ],\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\tvalidate_interval: {\n\n\t\t\t\tseek: {\n\n\t\t\t\t\tvar right;\n\n\t\t\t\t\tlinear_scan: {\n\t//- See http://jsperf.com/comparison-to-undefined/3\n\t//- slower code:\n\t//-\n\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 + 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\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\t// prepare binary search on the right side of the index\n\t\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t//- slower code:\n\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\t\tvar t1global = pp[ 1 ];\n\n\t\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 - 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\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\t// prepare binary search on the left side of the index\n\t\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t\t} // linear scan\n\n\t\t\t\t\t// binary search\n\n\t\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\t\tvar mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t\t// check boundary cases, again\n\n\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\n\n\t\t\t\t\t}\n\n\t\t\t\t} // seek\n\n\t\t\t\tthis._cachedIndex = i1;\n\n\t\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t\t} // validate_interval\n\n\t\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t\t},\n\n\t\tsettings: null, // optional, subclass-specific settings structure\n\t\t// Note: The indirection allows central control of many interpolants.\n\n\t\t// --- Protected interface\n\n\t\tDefaultSettings_: {},\n\n\t\tgetSettings_: function() {\n\n\t\t\treturn this.settings || this.DefaultSettings_;\n\n\t\t},\n\n\t\tcopySampleValue_: function( index ) {\n\n\t\t\t// copies a sample value to the result buffer\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = index * stride;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// Template methods for derived classes:\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tthrow new Error( \"call to abstract method\" );\n\t\t\t// implementations shall return this.resultBuffer\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\t// empty\n\n\t\t}\n\n\t};\n\n\tObject.assign( Interpolant.prototype, {\n\n\t\tbeforeStart_: //( 0, t, t0 ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_,\n\n\t\tafterEnd_: //( N-1, tN-1, t ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_\n\n\t} );\n\n\t/**\n\t * Fast and simple cubic spline interpolant.\n\t *\n\t * It was derived from a Hermitian construction setting the first derivative\n\t * at each sample position to the linear slope between neighboring positions\n\t * over their parameter interval.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction CubicInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, 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}\n\n\tCubicInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: CubicInterpolant,\n\n\t\tDefaultSettings_: {\n\n\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\tiPrev = i1 - 2,\n\t\t\t\tiNext = i1 + 1,\n\n\t\t\t\ttPrev = pp[ iPrev ],\n\t\t\t\ttNext = pp[ iNext ];\n\n\t\t\tif ( tPrev === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = t1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tNext === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\t\tiNext = i1;\n\t\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiNext = 1;\n\t\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\t\ttNext = t0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar halfDt = ( t1 - t0 ) * 0.5,\n\t\t\t\tstride = this.valueSize;\n\n\t\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\t\tthis._offsetPrev = iPrev * stride;\n\t\t\tthis._offsetNext = iNext * stride;\n\n\t\t},\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tpp = p * p,\n\t\t\t\tppp = pp * p;\n\n\t\t\t// evaluate polynomials\n\n\t\t\tvar sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\t\tvar s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\t\tvar s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\t\tvar sN = wN * ppp - wN * pp;\n\n\t\t\t// combine data linearly\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction LinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: LinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset1 = i1 * stride,\n\t\t\t\toffset0 = offset1 - stride,\n\n\t\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tweight0 = 1 - weight1;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Interpolant that evaluates to the sample value at the position preceeding\n\t * the parameter.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction DiscreteInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tDiscreteInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: DiscreteInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t}\n\n\t} );\n\n\tvar KeyframeTrackPrototype;\n\n\tKeyframeTrackPrototype = {\n\n\t\tTimeBufferType: Float32Array,\n\t\tValueBufferType: Float32Array,\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodDiscrete: function( result ) {\n\n\t\t\treturn new DiscreteInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodLinear: function( result ) {\n\n\t\t\treturn new LinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: function( result ) {\n\n\t\t\treturn new CubicInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tsetInterpolation: function( interpolation ) {\n\n\t\t\tvar factoryMethod;\n\n\t\t\tswitch ( interpolation ) {\n\n\t\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateLinear:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateSmooth:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( factoryMethod === undefined ) {\n\n\t\t\t\tvar message = \"unsupported interpolation for \" +\n\t\t\t\t\t\tthis.ValueTypeName + \" keyframe track named \" + this.name;\n\n\t\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( message );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.createInterpolant = factoryMethod;\n\n\t\t},\n\n\t\tgetInterpolation: function() {\n\n\t\t\tswitch ( this.createInterpolant ) {\n\n\t\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\t\treturn InterpolateLinear;\n\n\t\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\t\treturn InterpolateSmooth;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetValueSize: function() {\n\n\t\t\treturn this.values.length / this.times.length;\n\n\t\t},\n\n\t\t// move all keyframes either forwards or backwards in time\n\t\tshift: function( timeOffset ) {\n\n\t\t\tif( timeOffset !== 0.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\t\tscale: function( timeScale ) {\n\n\t\t\tif( timeScale !== 1.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t\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\t\ttrim: function( startTime, endTime ) {\n\n\t\t\tvar times = this.times,\n\t\t\t\tnKeys = times.length,\n\t\t\t\tfrom = 0,\n\t\t\t\tto = nKeys - 1;\n\n\t\t\twhile ( from !== nKeys && times[ from ] < startTime ) ++ from;\n\t\t\twhile ( to !== -1 && times[ to ] > endTime ) -- to;\n\n\t\t\t++ to; // inclusive -> exclusive bound\n\n\t\t\tif( from !== 0 || to !== nKeys ) {\n\n\t\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\t\tif ( from >= to ) to = Math.max( to , 1 ), from = to - 1;\n\n\t\t\t\tvar stride = this.getValueSize();\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, from, to );\n\t\t\t\tthis.values = AnimationUtils.\n\t\t\t\t\t\tarraySlice( this.values, from * stride, to * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\t\tvalidate: function() {\n\n\t\t\tvar valid = true;\n\n\t\t\tvar valueSize = this.getValueSize();\n\t\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\t\tconsole.error( \"invalid value size in track\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\n\t\t\t\tnKeys = times.length;\n\n\t\t\tif( nKeys === 0 ) {\n\n\t\t\t\tconsole.error( \"track is empty\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar prevTime = null;\n\n\t\t\tfor( var i = 0; i !== nKeys; i ++ ) {\n\n\t\t\t\tvar currTime = times[ i ];\n\n\t\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\t\tconsole.error( \"time is not a valid number\", this, i, currTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\t\tconsole.error( \"out of order keys\", this, i, currTime, prevTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tprevTime = currTime;\n\n\t\t\t}\n\n\t\t\tif ( values !== undefined ) {\n\n\t\t\t\tif ( AnimationUtils.isTypedArray( values ) ) {\n\n\t\t\t\t\tfor ( var i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tvar value = values[ i ];\n\n\t\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\t\tconsole.error( \"value is not a valid number\", this, i, value );\n\t\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn valid;\n\n\t\t},\n\n\t\t// removes equivalent sequential keys as common in morph target sequences\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\t\toptimize: function() {\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\t\t\t\tstride = this.getValueSize(),\n\n\t\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\t\twriteIndex = 1,\n\t\t\t\tlastIndex = times.length - 1;\n\n\t\t\tfor( var i = 1; i < lastIndex; ++ i ) {\n\n\t\t\t\tvar keep = false;\n\n\t\t\t\tvar time = times[ i ];\n\t\t\t\tvar timeNext = times[ i + 1 ];\n\n\t\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\t\tif ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {\n\n\t\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\t\tvar offset = i * stride,\n\t\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\t\tvar value = values[ offset + j ];\n\n\t\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\t\tbreak;\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 keep = true;\n\n\t\t\t\t}\n\n\t\t\t\t// in-place compaction\n\n\t\t\t\tif ( keep ) {\n\n\t\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\t\tvar readOffset = i * stride,\n\t\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j )\n\n\t\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t++ writeIndex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// flush last keyframe (compaction looks ahead)\n\n\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\t\tfor ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j )\n\n\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t\tif ( writeIndex !== times.length ) {\n\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, 0, writeIndex );\n\t\t\t\tthis.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\tfunction KeyframeTrackConstructor( name, times, values, interpolation ) {\n\n\t\tif( name === undefined ) throw new Error( \"track name is undefined\" );\n\n\t\tif( times === undefined || times.length === 0 ) {\n\n\t\t\tthrow new Error( \"no keyframes in track named \" + name );\n\n\t\t}\n\n\t\tthis.name = name;\n\n\t\tthis.times = AnimationUtils.convertArray( times, this.TimeBufferType );\n\t\tthis.values = AnimationUtils.convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t\tthis.validate();\n\t\tthis.optimize();\n\n\t}\n\n\t/**\n\t *\n\t * A Track of vectored keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction VectorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tVectorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: VectorKeyframeTrack,\n\n\t\tValueTypeName: 'vector'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t * Spherical linear unit quaternion interpolant.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction QuaternionLinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tQuaternionLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: QuaternionLinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset = i1 * stride,\n\n\t\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\t\tfor ( var end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\t\tQuaternion.slerpFlat( result, 0,\n\t\t\t\t\t\tvalues, offset - stride, values, offset, alpha );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of quaternion keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction QuaternionKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tQuaternionKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: QuaternionKeyframeTrack,\n\n\t\tValueTypeName: 'quaternion',\n\n\t\t// ValueBufferType is inherited\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodLinear: function( result ) {\n\n\t\t\treturn new QuaternionLinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: undefined // not yet implemented\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of numeric keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction NumberKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tNumberKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: NumberKeyframeTrack,\n\n\t\tValueTypeName: 'number',\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t *\n\t * A Track that interpolates Strings\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction StringKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tStringKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: StringKeyframeTrack,\n\n\t\tValueTypeName: 'string',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of Boolean keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction BooleanKeyframeTrack( name, times, values ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values );\n\n\t}\n\n\tBooleanKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: BooleanKeyframeTrack,\n\n\t\tValueTypeName: 'bool',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t\t// Note: Actually this track could have a optimized / compressed\n\t\t// representation of a single value and a custom interpolant that\n\t\t// computes \"firstValue ^ isOdd( index )\".\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of keyframe values that represent color.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction ColorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tColorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: ColorKeyframeTrack,\n\n\t\tValueTypeName: 'color'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\n\t\t// Note: Very basic implementation and nothing special yet.\n\t\t// However, this is the place for color space parameterization.\n\n\t} );\n\n\t/**\n\t *\n\t * A timed sequence of keyframes for a specific property.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction KeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.apply( this, arguments );\n\n\t}\n\n\tKeyframeTrack.prototype = KeyframeTrackPrototype;\n\tKeyframeTrackPrototype.constructor = KeyframeTrack;\n\n\t// Static methods:\n\n\tObject.assign( KeyframeTrack, {\n\n\t\t// Serialization (in static context, because of constructor invocation\n\t\t// and automatic invocation of .toJSON):\n\n\t\tparse: function( json ) {\n\n\t\t\tif( json.type === undefined ) {\n\n\t\t\t\tthrow new Error( \"track type undefined, can not parse\" );\n\n\t\t\t}\n\n\t\t\tvar trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type );\n\n\t\t\tif ( json.times === undefined ) {\n\n\t\t\t\tvar times = [], values = [];\n\n\t\t\t\tAnimationUtils.flattenJSON( json.keys, times, values, 'value' );\n\n\t\t\t\tjson.times = times;\n\t\t\t\tjson.values = values;\n\n\t\t\t}\n\n\t\t\t// derived classes can define a static parse method\n\t\t\tif ( trackType.parse !== undefined ) {\n\n\t\t\t\treturn trackType.parse( json );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we asssume a constructor compatible with the base\n\t\t\t\treturn new trackType(\n\t\t\t\t\t\tjson.name, json.times, json.values, json.interpolation );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function( track ) {\n\n\t\t\tvar trackType = track.constructor;\n\n\t\t\tvar json;\n\n\t\t\t// derived classes can define a static toJSON method\n\t\t\tif ( trackType.toJSON !== undefined ) {\n\n\t\t\t\tjson = trackType.toJSON( track );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\t\tjson = {\n\n\t\t\t\t\t'name': track.name,\n\t\t\t\t\t'times': AnimationUtils.convertArray( track.times, Array ),\n\t\t\t\t\t'values': AnimationUtils.convertArray( track.values, Array )\n\n\t\t\t\t};\n\n\t\t\t\tvar interpolation = track.getInterpolation();\n\n\t\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\t\treturn json;\n\n\t\t},\n\n\t\t_getTrackTypeForValueTypeName: function( typeName ) {\n\n\t\t\tswitch( typeName.toLowerCase() ) {\n\n\t\t\t\tcase \"scalar\":\n\t\t\t\tcase \"double\":\n\t\t\t\tcase \"float\":\n\t\t\t\tcase \"number\":\n\t\t\t\tcase \"integer\":\n\n\t\t\t\t\treturn NumberKeyframeTrack;\n\n\t\t\t\tcase \"vector\":\n\t\t\t\tcase \"vector2\":\n\t\t\t\tcase \"vector3\":\n\t\t\t\tcase \"vector4\":\n\n\t\t\t\t\treturn VectorKeyframeTrack;\n\n\t\t\t\tcase \"color\":\n\n\t\t\t\t\treturn ColorKeyframeTrack;\n\n\t\t\t\tcase \"quaternion\":\n\n\t\t\t\t\treturn QuaternionKeyframeTrack;\n\n\t\t\t\tcase \"bool\":\n\t\t\t\tcase \"boolean\":\n\n\t\t\t\t\treturn BooleanKeyframeTrack;\n\n\t\t\t\tcase \"string\":\n\n\t\t\t\t\treturn StringKeyframeTrack;\n\n\t\t\t}\n\n\t\t\tthrow new Error( \"Unsupported typeName: \" + typeName );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Reusable set of Tracks that represent an animation.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tfunction AnimationClip( name, duration, tracks ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = ( duration !== undefined ) ? duration : -1;\n\n\t\tthis.uuid = _Math.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\tthis.optimize();\n\n\t}\n\n\tAnimationClip.prototype = {\n\n\t\tconstructor: AnimationClip,\n\n\t\tresetDuration: function() {\n\n\t\t\tvar tracks = this.tracks,\n\t\t\t\tduration = 0;\n\n\t\t\tfor ( var i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\t\tvar track = this.tracks[ i ];\n\n\t\t\t\tduration = Math.max(\n\t\t\t\t\t\tduration, track.times[ track.times.length - 1 ] );\n\n\t\t\t}\n\n\t\t\tthis.duration = duration;\n\n\t\t},\n\n\t\ttrim: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\toptimize: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].optimize();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t// Static methods:\n\n\tObject.assign( AnimationClip, {\n\n\t\tparse: function( json ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tjsonTracks = json.tracks,\n\t\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\t\tfor ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( json.name, json.duration, tracks );\n\n\t\t},\n\n\n\t\ttoJSON: function( clip ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tclipTracks = clip.tracks;\n\n\t\t\tvar json = {\n\n\t\t\t\t'name': clip.name,\n\t\t\t\t'duration': clip.duration,\n\t\t\t\t'tracks': tracks\n\n\t\t\t};\n\n\t\t\tfor ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn json;\n\n\t\t},\n\n\n\t\tCreateFromMorphTargetSequence: function( name, morphTargetSequence, fps, noLoop ) {\n\n\t\t\tvar numMorphTargets = morphTargetSequence.length;\n\t\t\tvar tracks = [];\n\n\t\t\tfor ( var i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\t\tvar times = [];\n\t\t\t\tvar values = [];\n\n\t\t\t\ttimes.push(\n\t\t\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\t\t\ti,\n\t\t\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\t\tvar order = AnimationUtils.getKeyframeOrder( times );\n\t\t\t\ttimes = AnimationUtils.sortedArray( times, 1, order );\n\t\t\t\tvalues = AnimationUtils.sortedArray( values, 1, order );\n\n\t\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t\t// last frame as well for perfect loop.\n\t\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\ttracks.push(\n\t\t\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\t\t\ttimes, values\n\t\t\t\t\t\t).scale( 1.0 / fps ) );\n\t\t\t}\n\n\t\t\treturn new AnimationClip( name, -1, tracks );\n\n\t\t},\n\n\t\tfindByName: function( objectOrClipArray, name ) {\n\n\t\t\tvar clipArray = objectOrClipArray;\n\n\t\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\t\tvar o = objectOrClipArray;\n\t\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\t\treturn clipArray[ i ];\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\tCreateClipsFromMorphTargetSequences: function( morphTargets, fps, noLoop ) {\n\n\t\t\tvar animationToMorphTargets = {};\n\n\t\t\t// tested with https://regex101.com/ on trick sequences\n\t\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\t\tvar pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t\t// sort morph target names into animation groups based\n\t\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\t\tfor ( var i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = morphTargets[ i ];\n\t\t\t\tvar parts = morphTarget.name.match( pattern );\n\n\t\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\t\tvar name = parts[ 1 ];\n\n\t\t\t\t\tvar animationMorphTargets = animationToMorphTargets[ name ];\n\t\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar clips = [];\n\n\t\t\tfor ( var name in animationToMorphTargets ) {\n\n\t\t\t\tclips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t\t}\n\n\t\t\treturn clips;\n\n\t\t},\n\n\t\t// parse the animation.hierarchy format\n\t\tparseAnimation: function( animation, bones ) {\n\n\t\t\tif ( ! animation ) {\n\n\t\t\t\tconsole.error( \" no animation in JSONLoader data\" );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar addNonemptyTrack = function(\n\t\t\t\t\ttrackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t\t// only return track if there are actually keys.\n\t\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\t\tvar times = [];\n\t\t\t\t\tvar values = [];\n\n\t\t\t\t\tAnimationUtils.flattenJSON(\n\t\t\t\t\t\t\tanimationKeys, times, values, propertyName );\n\n\t\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tvar tracks = [];\n\n\t\t\tvar clipName = animation.name || 'default';\n\t\t\t// automatic length determination in AnimationClip.\n\t\t\tvar duration = animation.length || -1;\n\t\t\tvar fps = animation.fps || 30;\n\n\t\t\tvar hierarchyTracks = animation.hierarchy || [];\n\n\t\t\tfor ( var h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\t\tvar animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t\t// skip empty tracks\n\t\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t\t// process morph targets in a way exactly compatible\n\t\t\t\t// with AnimationHandler.init( animation )\n\t\t\t\tif ( animationKeys[0].morphTargets ) {\n\n\t\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\t\tvar morphTargetNames = {};\n\t\t\t\t\tfor ( var k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\t\tif ( animationKeys[k].morphTargets ) {\n\n\t\t\t\t\t\t\tfor ( var m = 0; m < animationKeys[k].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[k].morphTargets[m] ] = -1;\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\t// create a track for each morph target with all zero\n\t\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t\t// the morphTarget is named.\n\t\t\t\t\tfor ( var morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\t\tvar times = [];\n\t\t\t\t\t\tvar values = [];\n\n\t\t\t\t\t\tfor ( var m = 0;\n\t\t\t\t\t\t\t\tm !== animationKeys[k].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\t\tvar animationKey = animationKeys[k];\n\n\t\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttracks.push( new NumberKeyframeTrack(\n\t\t\t\t\t\t\t\t'.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tduration = morphTargetNames.length * ( fps || 1.0 );\n\n\t\t\t\t} else {\n\t\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\t\tvar boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tracks.length === 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar clip = new AnimationClip( clipName, duration, tracks );\n\n\t\t\treturn clip;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MaterialLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.textures = {};\n\n\t}\n\n\tObject.assign( MaterialLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTextures: function ( value ) {\n\n\t\t\tthis.textures = value;\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar textures = this.textures;\n\n\t\t\tfunction getTexture( name ) {\n\n\t\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t\t}\n\n\t\t\t\treturn textures[ name ];\n\n\t\t\t}\n\n\t\t\tvar material = new Materials[ json.type ]();\n\n\t\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\t\tif ( json.color !== undefined ) material.color.setHex( json.color );\n\t\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\t\tif ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\t\tif ( json.specular !== undefined ) material.specular.setHex( json.specular );\n\t\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\t\tif ( json.uniforms !== undefined ) material.uniforms = json.uniforms;\n\t\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\t\tif ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;\n\t\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\t\tif ( json.shading !== undefined ) material.shading = json.shading;\n\t\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\t\t\tif ( json.skinning !== undefined ) material.skinning = json.skinning;\n\t\t\tif ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;\n\n\t\t\t// for PointsMaterial\n\n\t\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t\t// maps\n\n\t\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\n\t\t\tif ( json.alphaMap !== undefined ) {\n\n\t\t\t\tmaterial.alphaMap = getTexture( json.alphaMap );\n\t\t\t\tmaterial.transparent = true;\n\n\t\t\t}\n\n\t\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\t\tvar normalScale = json.normalScale;\n\n\t\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t\t}\n\n\t\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\n\t\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\n\t\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\n\t\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\t\t// MultiMaterial\n\n\t\t\tif ( json.materials !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.materials.length; i < l; i ++ ) {\n\n\t\t\t\t\tmaterial.materials.push( this.parse( json.materials[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn material;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometryLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( BufferGeometryLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar geometry = new BufferGeometry();\n\n\t\t\tvar index = json.data.index;\n\n\t\t\tvar TYPED_ARRAYS = {\n\t\t\t\t'Int8Array': Int8Array,\n\t\t\t\t'Uint8Array': Uint8Array,\n\t\t\t\t'Uint8ClampedArray': Uint8ClampedArray,\n\t\t\t\t'Int16Array': Int16Array,\n\t\t\t\t'Uint16Array': Uint16Array,\n\t\t\t\t'Int32Array': Int32Array,\n\t\t\t\t'Uint32Array': Uint32Array,\n\t\t\t\t'Float32Array': Float32Array,\n\t\t\t\t'Float64Array': Float64Array\n\t\t\t};\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ index.type ]( index.array );\n\t\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tvar attributes = json.data.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );\n\n\t\t\t\tgeometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) );\n\n\t\t\t}\n\n\t\t\tvar groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\t\tif ( groups !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = json.data.boundingSphere;\n\n\t\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\t\tvar center = new Vector3();\n\n\t\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Loader() {\n\n\t\tthis.onLoadStart = function () {};\n\t\tthis.onLoadProgress = function () {};\n\t\tthis.onLoadComplete = function () {};\n\n\t}\n\n\tLoader.prototype = {\n\n\t\tconstructor: Loader,\n\n\t\tcrossOrigin: undefined,\n\n\t\textractUrlBase: function ( url ) {\n\n\t\t\tvar parts = url.split( '/' );\n\n\t\t\tif ( parts.length === 1 ) return './';\n\n\t\t\tparts.pop();\n\n\t\t\treturn parts.join( '/' ) + '/';\n\n\t\t},\n\n\t\tinitMaterials: function ( materials, texturePath, crossOrigin ) {\n\n\t\t\tvar array = [];\n\n\t\t\tfor ( var i = 0; i < materials.length; ++ i ) {\n\n\t\t\t\tarray[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tcreateMaterial: ( function () {\n\n\t\t\tvar color, textureLoader, materialLoader;\n\n\t\t\treturn function createMaterial( m, texturePath, crossOrigin ) {\n\n\t\t\t\tif ( color === undefined ) color = new Color();\n\t\t\t\tif ( textureLoader === undefined ) textureLoader = new TextureLoader();\n\t\t\t\tif ( materialLoader === undefined ) materialLoader = new MaterialLoader();\n\n\t\t\t\t// convert from old material format\n\n\t\t\t\tvar textures = {};\n\n\t\t\t\tfunction loadTexture( path, repeat, offset, wrap, anisotropy ) {\n\n\t\t\t\t\tvar fullPath = texturePath + path;\n\t\t\t\t\tvar loader = Loader.Handlers.get( fullPath );\n\n\t\t\t\t\tvar texture;\n\n\t\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\t\ttexture = loader.load( fullPath );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttextureLoader.setCrossOrigin( crossOrigin );\n\t\t\t\t\t\ttexture = textureLoader.load( fullPath );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( repeat !== undefined ) {\n\n\t\t\t\t\t\ttexture.repeat.fromArray( repeat );\n\n\t\t\t\t\t\tif ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\t\t\ttexture.offset.fromArray( offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( wrap !== undefined ) {\n\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;\n\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( anisotropy !== undefined ) {\n\n\t\t\t\t\t\ttexture.anisotropy = anisotropy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar uuid = _Math.generateUUID();\n\n\t\t\t\t\ttextures[ uuid ] = texture;\n\n\t\t\t\t\treturn uuid;\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tvar json = {\n\t\t\t\t\tuuid: _Math.generateUUID(),\n\t\t\t\t\ttype: 'MeshLambertMaterial'\n\t\t\t\t};\n\n\t\t\t\tfor ( var name in m ) {\n\n\t\t\t\t\tvar value = m[ name ];\n\n\t\t\t\t\tswitch ( name ) {\n\t\t\t\t\t\tcase 'DbgColor':\n\t\t\t\t\t\tcase 'DbgIndex':\n\t\t\t\t\t\tcase 'opticalDensity':\n\t\t\t\t\t\tcase 'illumination':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'DbgName':\n\t\t\t\t\t\t\tjson.name = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'blending':\n\t\t\t\t\t\t\tjson.blending = BlendingMode[ value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorAmbient':\n\t\t\t\t\t\tcase 'mapAmbient':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorDiffuse':\n\t\t\t\t\t\t\tjson.color = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorSpecular':\n\t\t\t\t\t\t\tjson.specular = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorEmissive':\n\t\t\t\t\t\t\tjson.emissive = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'specularCoef':\n\t\t\t\t\t\t\tjson.shininess = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'shading':\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuse':\n\t\t\t\t\t\t\tjson.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuseRepeat':\n\t\t\t\t\t\tcase 'mapDiffuseOffset':\n\t\t\t\t\t\tcase 'mapDiffuseWrap':\n\t\t\t\t\t\tcase 'mapDiffuseAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissive':\n\t\t\t\t\t\t\tjson.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissiveRepeat':\n\t\t\t\t\t\tcase 'mapEmissiveOffset':\n\t\t\t\t\t\tcase 'mapEmissiveWrap':\n\t\t\t\t\t\tcase 'mapEmissiveAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLight':\n\t\t\t\t\t\t\tjson.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLightRepeat':\n\t\t\t\t\t\tcase 'mapLightOffset':\n\t\t\t\t\t\tcase 'mapLightWrap':\n\t\t\t\t\t\tcase 'mapLightAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAO':\n\t\t\t\t\t\t\tjson.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAORepeat':\n\t\t\t\t\t\tcase 'mapAOOffset':\n\t\t\t\t\t\tcase 'mapAOWrap':\n\t\t\t\t\t\tcase 'mapAOAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBump':\n\t\t\t\t\t\t\tjson.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpScale':\n\t\t\t\t\t\t\tjson.bumpScale = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpRepeat':\n\t\t\t\t\t\tcase 'mapBumpOffset':\n\t\t\t\t\t\tcase 'mapBumpWrap':\n\t\t\t\t\t\tcase 'mapBumpAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormal':\n\t\t\t\t\t\t\tjson.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalFactor':\n\t\t\t\t\t\t\tjson.normalScale = [ value, value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalRepeat':\n\t\t\t\t\t\tcase 'mapNormalOffset':\n\t\t\t\t\t\tcase 'mapNormalWrap':\n\t\t\t\t\t\tcase 'mapNormalAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecular':\n\t\t\t\t\t\t\tjson.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecularRepeat':\n\t\t\t\t\t\tcase 'mapSpecularOffset':\n\t\t\t\t\t\tcase 'mapSpecularWrap':\n\t\t\t\t\t\tcase 'mapSpecularAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalness':\n\t\t\t\t\t\t\tjson.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalnessRepeat':\n\t\t\t\t\t\tcase 'mapMetalnessOffset':\n\t\t\t\t\t\tcase 'mapMetalnessWrap':\n\t\t\t\t\t\tcase 'mapMetalnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughness':\n\t\t\t\t\t\t\tjson.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughnessRepeat':\n\t\t\t\t\t\tcase 'mapRoughnessOffset':\n\t\t\t\t\t\tcase 'mapRoughnessWrap':\n\t\t\t\t\t\tcase 'mapRoughnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlpha':\n\t\t\t\t\t\t\tjson.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlphaRepeat':\n\t\t\t\t\t\tcase 'mapAlphaOffset':\n\t\t\t\t\t\tcase 'mapAlphaWrap':\n\t\t\t\t\t\tcase 'mapAlphaAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'flipSided':\n\t\t\t\t\t\t\tjson.side = BackSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'doubleSided':\n\t\t\t\t\t\t\tjson.side = DoubleSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );\n\t\t\t\t\t\t\tjson.opacity = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'depthTest':\n\t\t\t\t\t\tcase 'depthWrite':\n\t\t\t\t\t\tcase 'colorWrite':\n\t\t\t\t\t\tcase 'opacity':\n\t\t\t\t\t\tcase 'reflectivity':\n\t\t\t\t\t\tcase 'transparent':\n\t\t\t\t\t\tcase 'visible':\n\t\t\t\t\t\tcase 'wireframe':\n\t\t\t\t\t\t\tjson[ name ] = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'vertexColors':\n\t\t\t\t\t\t\tif ( value === true ) json.vertexColors = VertexColors;\n\t\t\t\t\t\t\tif ( value === 'face' ) json.vertexColors = FaceColors;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.Loader.createMaterial: Unsupported', name, value );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.type === 'MeshBasicMaterial' ) delete json.emissive;\n\t\t\t\tif ( json.type !== 'MeshPhongMaterial' ) delete json.specular;\n\n\t\t\t\tif ( json.opacity < 1 ) json.transparent = true;\n\n\t\t\t\tmaterialLoader.setTextures( textures );\n\n\t\t\t\treturn materialLoader.parse( json );\n\n\t\t\t};\n\n\t\t} )()\n\n\t};\n\n\tLoader.Handlers = {\n\n\t\thandlers: [],\n\n\t\tadd: function ( regex, loader ) {\n\n\t\t\tthis.handlers.push( regex, loader );\n\n\t\t},\n\n\t\tget: function ( file ) {\n\n\t\t\tvar handlers = this.handlers;\n\n\t\t\tfor ( var i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tvar regex = handlers[ i ];\n\t\t\t\tvar loader = handlers[ i + 1 ];\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\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction JSONLoader( manager ) {\n\n\t\tif ( typeof manager === 'boolean' ) {\n\n\t\t\tconsole.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );\n\t\t\tmanager = undefined;\n\n\t\t}\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\tthis.withCredentials = false;\n\n\t}\n\n\tObject.assign( JSONLoader.prototype, {\n\n\t\tload: function( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texturePath = this.texturePath && ( typeof this.texturePath === \"string\" ) ? this.texturePath : Loader.prototype.extractUrlBase( url );\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = JSON.parse( text );\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata !== undefined ) {\n\n\t\t\t\t\tvar type = metadata.type;\n\n\t\t\t\t\tif ( type !== undefined ) {\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'object' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'scene' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' );\n\t\t\t\t\t\t\treturn;\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\tvar object = scope.parse( json, texturePath );\n\t\t\t\tonLoad( object.geometry, object.materials );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tparse: function ( json, texturePath ) {\n\n\t\t\tvar geometry = new Geometry(),\n\t\t\tscale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0;\n\n\t\t\tparseModel( scale );\n\n\t\t\tparseSkin();\n\t\t\tparseMorphing( scale );\n\t\t\tparseAnimations();\n\n\t\t\tgeometry.computeFaceNormals();\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\tfunction parseModel( scale ) {\n\n\t\t\t\tfunction isBitSet( value, position ) {\n\n\t\t\t\t\treturn value & ( 1 << position );\n\n\t\t\t\t}\n\n\t\t\t\tvar i, j, fi,\n\n\t\t\t\toffset, zLength,\n\n\t\t\tcolorIndex, normalIndex, uvIndex, materialIndex,\n\n\t\t\t\ttype,\n\t\t\t\tisQuad,\n\t\t\t\thasMaterial,\n\t\t\t\thasFaceVertexUv,\n\t\t\t\thasFaceNormal, hasFaceVertexNormal,\n\t\t\t\thasFaceColor, hasFaceVertexColor,\n\n\t\t\tvertex, face, faceA, faceB, hex, normal,\n\n\t\t\t\tuvLayer, uv, u, v,\n\n\t\t\t\tfaces = json.faces,\n\t\t\t\tvertices = json.vertices,\n\t\t\t\tnormals = json.normals,\n\t\t\t\tcolors = json.colors,\n\n\t\t\t\tnUvLayers = 0;\n\n\t\t\t\tif ( json.uvs !== undefined ) {\n\n\t\t\t\t\t// disregard empty arrays\n\n\t\t\t\t\tfor ( i = 0; i < json.uvs.length; i ++ ) {\n\n\t\t\t\t\t\tif ( json.uvs[ i ].length ) nUvLayers ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\tgeometry.faceVertexUvs[ i ] = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = vertices.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\tvertex = new Vector3();\n\n\t\t\t\t\tvertex.x = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.y = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.z = vertices[ offset ++ ] * scale;\n\n\t\t\t\t\tgeometry.vertices.push( vertex );\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = faces.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\ttype = faces[ offset ++ ];\n\n\n\t\t\t\t\tisQuad = isBitSet( type, 0 );\n\t\t\t\t\thasMaterial = isBitSet( type, 1 );\n\t\t\t\t\thasFaceVertexUv = isBitSet( type, 3 );\n\t\t\t\t\thasFaceNormal = isBitSet( type, 4 );\n\t\t\t\t\thasFaceVertexNormal = isBitSet( type, 5 );\n\t\t\t\t\thasFaceColor\t = isBitSet( type, 6 );\n\t\t\t\t\thasFaceVertexColor = isBitSet( type, 7 );\n\n\t\t\t\t\t// console.log(\"type\", type, \"bits\", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);\n\n\t\t\t\t\tif ( isQuad ) {\n\n\t\t\t\t\t\tfaceA = new Face3();\n\t\t\t\t\t\tfaceA.a = faces[ offset ];\n\t\t\t\t\t\tfaceA.b = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceA.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\tfaceB = new Face3();\n\t\t\t\t\t\tfaceB.a = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceB.b = faces[ offset + 2 ];\n\t\t\t\t\t\tfaceB.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tfaceA.materialIndex = materialIndex;\n\t\t\t\t\t\t\tfaceB.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi + 1 ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tif ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );\n\t\t\t\t\t\t\t\t\tif ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );\n\n\t\t\t\t\t\t\t\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\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tfaceA.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tfaceB.normal.copy( faceA.normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexNormals.push( normal );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\tfaceA.color.setHex( hex );\n\t\t\t\t\t\t\tfaceB.color.setHex( hex );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( faceA );\n\t\t\t\t\t\tgeometry.faces.push( faceB );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface = new Face3();\n\t\t\t\t\t\tface.a = faces[ offset ++ ];\n\t\t\t\t\t\tface.b = faces[ offset ++ ];\n\t\t\t\t\t\tface.c = faces[ offset ++ ];\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ].push( uv );\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\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tface.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tface.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.color.setHex( colors[ colorIndex ] );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\tface.vertexColors.push( new Color( colors[ colorIndex ] ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( face );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseSkin() {\n\n\t\t\t\tvar influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;\n\n\t\t\t\tif ( json.skinWeights ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar x = json.skinWeights[ i ];\n\t\t\t\t\t\tvar y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;\n\t\t\t\t\t\tvar z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;\n\t\t\t\t\t\tvar w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinWeights.push( new Vector4( x, y, z, w ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.skinIndices ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar a = json.skinIndices[ i ];\n\t\t\t\t\t\tvar b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;\n\t\t\t\t\t\tvar c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;\n\t\t\t\t\t\tvar d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinIndices.push( new Vector4( a, b, c, d ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.bones = json.bones;\n\n\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {\n\n\t\t\t\t\tconsole.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +\n\t\t\t\t\t\tgeometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseMorphing( scale ) {\n\n\t\t\t\tif ( json.morphTargets !== undefined ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tgeometry.morphTargets[ i ] = {};\n\t\t\t\t\t\tgeometry.morphTargets[ i ].name = json.morphTargets[ i ].name;\n\t\t\t\t\t\tgeometry.morphTargets[ i ].vertices = [];\n\n\t\t\t\t\t\tvar dstVertices = geometry.morphTargets[ i ].vertices;\n\t\t\t\t\t\tvar srcVertices = json.morphTargets[ i ].vertices;\n\n\t\t\t\t\t\tfor ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {\n\n\t\t\t\t\t\t\tvar vertex = new Vector3();\n\t\t\t\t\t\t\tvertex.x = srcVertices[ v ] * scale;\n\t\t\t\t\t\t\tvertex.y = srcVertices[ v + 1 ] * scale;\n\t\t\t\t\t\t\tvertex.z = srcVertices[ v + 2 ] * scale;\n\n\t\t\t\t\t\t\tdstVertices.push( vertex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.morphColors !== undefined && json.morphColors.length > 0 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.JSONLoader: \"morphColors\" no longer supported. Using them as face colors.' );\n\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar morphColors = json.morphColors[ 0 ].colors;\n\n\t\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tfaces[ i ].color.fromArray( morphColors, i * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseAnimations() {\n\n\t\t\t\tvar outputAnimations = [];\n\n\t\t\t\t// parse old style Bone/Hierarchy animations\n\t\t\t\tvar animations = [];\n\n\t\t\t\tif ( json.animation !== undefined ) {\n\n\t\t\t\t\tanimations.push( json.animation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.animations !== undefined ) {\n\n\t\t\t\t\tif ( json.animations.length ) {\n\n\t\t\t\t\t\tanimations = animations.concat( json.animations );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tanimations.push( json.animations );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0; i < animations.length; i ++ ) {\n\n\t\t\t\t\tvar clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones );\n\t\t\t\t\tif ( clip ) outputAnimations.push( clip );\n\n\t\t\t\t}\n\n\t\t\t\t// parse implicit morph animations\n\t\t\t\tif ( geometry.morphTargets ) {\n\n\t\t\t\t\t// TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary.\n\t\t\t\t\tvar morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );\n\t\t\t\t\toutputAnimations = outputAnimations.concat( morphAnimationClips );\n\n\t\t\t\t}\n\n\t\t\t\tif ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;\n\n\t\t\t}\n\n\t\t\tif ( json.materials === undefined || json.materials.length === 0 ) {\n\n\t\t\t\treturn { geometry: geometry };\n\n\t\t\t} else {\n\n\t\t\t\tvar materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin );\n\n\t\t\t\treturn { geometry: geometry, materials: materials };\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ObjectLoader ( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.texturePath = '';\n\n\t}\n\n\tObject.assign( ObjectLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( this.texturePath === '' ) {\n\n\t\t\t\tthis.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );\n\n\t\t\t}\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tscope.parse( JSON.parse( text ), onLoad );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\n\t\t},\n\n\t\tparse: function ( json, onLoad ) {\n\n\t\t\tvar geometries = this.parseGeometries( json.geometries );\n\n\t\t\tvar images = this.parseImages( json.images, function () {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t} );\n\n\t\t\tvar textures = this.parseTextures( json.textures, images );\n\t\t\tvar materials = this.parseMaterials( json.materials, textures );\n\n\t\t\tvar object = this.parseObject( json.object, geometries, materials );\n\n\t\t\tif ( json.animations ) {\n\n\t\t\t\tobject.animations = this.parseAnimations( json.animations );\n\n\t\t\t}\n\n\t\t\tif ( json.images === undefined || json.images.length === 0 ) {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t}\n\n\t\t\treturn object;\n\n\t\t},\n\n\t\tparseGeometries: function ( json ) {\n\n\t\t\tvar geometries = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar geometryLoader = new JSONLoader();\n\t\t\t\tvar bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar geometry;\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\t\tcase 'PlaneGeometry':\n\t\t\t\t\t\tcase 'PlaneBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BoxGeometry':\n\t\t\t\t\t\tcase 'BoxBufferGeometry':\n\t\t\t\t\t\tcase 'CubeGeometry': // backwards compatible\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.depth,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.depthSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CircleGeometry':\n\t\t\t\t\t\tcase 'CircleBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CylinderGeometry':\n\t\t\t\t\t\tcase 'CylinderBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radiusTop,\n\t\t\t\t\t\t\t\tdata.radiusBottom,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'ConeGeometry':\n\t\t\t\t\t\tcase 'ConeBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'SphereGeometry':\n\t\t\t\t\t\tcase 'SphereBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'DodecahedronGeometry':\n\t\t\t\t\t\tcase 'IcosahedronGeometry':\n\t\t\t\t\t\tcase 'OctahedronGeometry':\n\t\t\t\t\t\tcase 'TetrahedronGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.detail\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'RingGeometry':\n\t\t\t\t\t\tcase 'RingBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.innerRadius,\n\t\t\t\t\t\t\t\tdata.outerRadius,\n\t\t\t\t\t\t\t\tdata.thetaSegments,\n\t\t\t\t\t\t\t\tdata.phiSegments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusGeometry':\n\t\t\t\t\t\tcase 'TorusBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.arc\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusKnotGeometry':\n\t\t\t\t\t\tcase 'TorusKnotBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.p,\n\t\t\t\t\t\t\t\tdata.q\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'LatheGeometry':\n\t\t\t\t\t\tcase 'LatheBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.points,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\t\tgeometry = geometryLoader.parse( data.data, this.texturePath ).geometry;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\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\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\n\t\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometries;\n\n\t\t},\n\n\t\tparseMaterials: function ( json, textures ) {\n\n\t\t\tvar materials = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar loader = new MaterialLoader();\n\t\t\t\tloader.setTextures( textures );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar material = loader.parse( json[ i ] );\n\t\t\t\t\tmaterials[ material.uuid ] = material;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn materials;\n\n\t\t},\n\n\t\tparseAnimations: function ( json ) {\n\n\t\t\tvar animations = [];\n\n\t\t\tfor ( var i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tvar clip = AnimationClip.parse( json[ i ] );\n\n\t\t\t\tanimations.push( clip );\n\n\t\t\t}\n\n\t\t\treturn animations;\n\n\t\t},\n\n\t\tparseImages: function ( json, onLoad ) {\n\n\t\t\tvar scope = this;\n\t\t\tvar images = {};\n\n\t\t\tfunction loadImage( url ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\treturn loader.load( url, function () {\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, undefined, function () {\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\t\tvar manager = new LoadingManager( onLoad );\n\n\t\t\t\tvar loader = new ImageLoader( manager );\n\t\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar image = json[ i ];\n\t\t\t\t\tvar path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url;\n\n\t\t\t\t\timages[ image.uuid ] = loadImage( path );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn images;\n\n\t\t},\n\n\t\tparseTextures: function ( json, images ) {\n\n\t\t\tfunction parseConstant( value, type ) {\n\n\t\t\t\tif ( typeof( value ) === 'number' ) return value;\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\t\treturn type[ value ];\n\n\t\t\t}\n\n\t\t\tvar textures = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar texture = new Texture( images[ data.image ] );\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TextureMapping );\n\n\t\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TextureWrapping );\n\t\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TextureWrapping );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TextureFilter );\n\t\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TextureFilter );\n\t\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn textures;\n\n\t\t},\n\n\t\tparseObject: function () {\n\n\t\t\tvar matrix = new Matrix4();\n\n\t\t\treturn function parseObject( data, geometries, materials ) {\n\n\t\t\t\tvar object;\n\n\t\t\t\tfunction getGeometry( name ) {\n\n\t\t\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn geometries[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tfunction getMaterial( name ) {\n\n\t\t\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn materials[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'Scene':\n\n\t\t\t\t\t\tobject = new Scene();\n\n\t\t\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\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\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'AmbientLight':\n\n\t\t\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'DirectionalLight':\n\n\t\t\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\n\t\t\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\n\t\t\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\n\t\t\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Mesh':\n\n\t\t\t\t\t\tvar geometry = getGeometry( data.geometry );\n\t\t\t\t\t\tvar material = getMaterial( data.material );\n\n\t\t\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 ) {\n\n\t\t\t\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LOD':\n\n\t\t\t\t\t\tobject = new LOD();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Line':\n\n\t\t\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LineSegments':\n\n\t\t\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointCloud':\n\t\t\t\t\tcase 'Points':\n\n\t\t\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Sprite':\n\n\t\t\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Group':\n\n\t\t\t\t\t\tobject = new Group();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tobject = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t\tobject.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) object.name = data.name;\n\t\t\t\tif ( data.matrix !== undefined ) {\n\n\t\t\t\t\tmatrix.fromArray( data.matrix );\n\t\t\t\t\tmatrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\t\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\t\t\tif ( data.shadow ) {\n\n\t\t\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\t\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\n\t\t\t\tif ( data.children !== undefined ) {\n\n\t\t\t\t\tfor ( var child in data.children ) {\n\n\t\t\t\t\t\tobject.add( this.parseObject( data.children[ child ], geometries, materials ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.type === 'LOD' ) {\n\n\t\t\t\t\tvar levels = data.levels;\n\n\t\t\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\t\t\tvar level = levels[ l ];\n\t\t\t\t\t\tvar child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn object;\n\n\t\t\t};\n\n\t\t}()\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Extensible curve object\n\t *\n\t * Some common of Curve methods\n\t * .getPoint(t), getTangent(t)\n\t * .getPointAt(u), getTangentAt(u)\n\t * .getPoints(), .getSpacedPoints()\n\t * .getLength()\n\t * .updateArcLengths()\n\t *\n\t * This following classes subclasses THREE.Curve:\n\t *\n\t * -- 2d classes --\n\t * THREE.LineCurve\n\t * THREE.QuadraticBezierCurve\n\t * THREE.CubicBezierCurve\n\t * THREE.SplineCurve\n\t * THREE.ArcCurve\n\t * THREE.EllipseCurve\n\t *\n\t * -- 3d classes --\n\t * THREE.LineCurve3\n\t * THREE.QuadraticBezierCurve3\n\t * THREE.CubicBezierCurve3\n\t * THREE.SplineCurve3\n\t *\n\t * A series of curves can be represented as a THREE.CurvePath\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tAbstract Curve base class\n\t **************************************************************/\n\n\tfunction Curve() {}\n\n\tCurve.prototype = {\n\n\t\tconstructor: Curve,\n\n\t\t// Virtual base class method to overwrite and implement in subclasses\n\t\t//\t- t [0 .. 1]\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tconsole.warn( \"THREE.Curve: Warning, getPoint() not implemented!\" );\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// Get point at relative position in curve according to arc length\n\t\t// - u [0 .. 1]\n\n\t\tgetPointAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getPoint( t );\n\n\t\t},\n\n\t\t// Get sequence of points using getPoint( t )\n\n\t\tgetPoints: function ( divisions ) {\n\n\t\t\tif ( ! divisions ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get sequence of points using getPointAt( u )\n\n\t\tgetSpacedPoints: function ( divisions ) {\n\n\t\t\tif ( ! divisions ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get total curve arc length\n\n\t\tgetLength: function () {\n\n\t\t\tvar lengths = this.getLengths();\n\t\t\treturn lengths[ lengths.length - 1 ];\n\n\t\t},\n\n\t\t// Get list of cumulative segment lengths\n\n\t\tgetLengths: function ( divisions ) {\n\n\t\t\tif ( ! divisions ) divisions = ( this.__arcLengthDivisions ) ? ( this.__arcLengthDivisions ) : 200;\n\n\t\t\tif ( this.cacheArcLengths\n\t\t\t\t&& ( this.cacheArcLengths.length === divisions + 1 )\n\t\t\t\t&& ! this.needsUpdate ) {\n\n\t\t\t\t//console.log( \"cached\", this.cacheArcLengths );\n\t\t\t\treturn this.cacheArcLengths;\n\n\t\t\t}\n\n\t\t\tthis.needsUpdate = false;\n\n\t\t\tvar cache = [];\n\t\t\tvar current, last = this.getPoint( 0 );\n\t\t\tvar p, sum = 0;\n\n\t\t\tcache.push( 0 );\n\n\t\t\tfor ( p = 1; p <= divisions; p ++ ) {\n\n\t\t\t\tcurrent = this.getPoint ( p / divisions );\n\t\t\t\tsum += current.distanceTo( last );\n\t\t\t\tcache.push( sum );\n\t\t\t\tlast = current;\n\n\t\t\t}\n\n\t\t\tthis.cacheArcLengths = cache;\n\n\t\t\treturn cache; // { sums: cache, sum:sum }; Sum is in the last element.\n\n\t\t},\n\n\t\tupdateArcLengths: function() {\n\n\t\t\tthis.needsUpdate = true;\n\t\t\tthis.getLengths();\n\n\t\t},\n\n\t\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\t\tgetUtoTmapping: function ( u, distance ) {\n\n\t\t\tvar arcLengths = this.getLengths();\n\n\t\t\tvar i = 0, il = arcLengths.length;\n\n\t\t\tvar targetArcLength; // The targeted u distance value to get\n\n\t\t\tif ( distance ) {\n\n\t\t\t\ttargetArcLength = distance;\n\n\t\t\t} else {\n\n\t\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t\t}\n\n\t\t\t//var time = Date.now();\n\n\t\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\t\tvar low = 0, high = il - 1, comparison;\n\n\t\t\twhile ( low <= high ) {\n\n\t\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\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\t\tlow = i + 1;\n\n\t\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\t\thigh = i - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thigh = i;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// DONE\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ti = high;\n\n\t\t\t//console.log('b' , i, low, high, Date.now()- time);\n\n\t\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\t\tvar t = i / ( il - 1 );\n\t\t\t\treturn t;\n\n\t\t\t}\n\n\t\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\t\tvar lengthBefore = arcLengths[ i ];\n\t\t\tvar lengthAfter = arcLengths[ i + 1 ];\n\n\t\t\tvar segmentLength = lengthAfter - lengthBefore;\n\n\t\t\t// determine where we are between the 'before' and 'after' points\n\n\t\t\tvar segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t\t// add that fractional amount to t\n\n\t\t\tvar t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\t\treturn t;\n\n\t\t},\n\n\t\t// Returns a unit vector tangent at t\n\t\t// In case any sub curve does not implement its tangent derivation,\n\t\t// 2 points a small delta apart will be used to find its gradient\n\t\t// which seems to give a reasonable approximation\n\n\t\tgetTangent: function( t ) {\n\n\t\t\tvar delta = 0.0001;\n\t\t\tvar t1 = t - delta;\n\t\t\tvar t2 = t + delta;\n\n\t\t\t// Capping in case of danger\n\n\t\t\tif ( t1 < 0 ) t1 = 0;\n\t\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\t\tvar pt1 = this.getPoint( t1 );\n\t\t\tvar pt2 = this.getPoint( t2 );\n\n\t\t\tvar vec = pt2.clone().sub( pt1 );\n\t\t\treturn vec.normalize();\n\n\t\t},\n\n\t\tgetTangentAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getTangent( t );\n\n\t\t},\n\n\t\tcomputeFrenetFrames: function ( segments, closed ) {\n\n\t\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\t\tvar normal = new Vector3();\n\n\t\t\tvar tangents = [];\n\t\t\tvar normals = [];\n\t\t\tvar binormals = [];\n\n\t\t\tvar vec = new Vector3();\n\t\t\tvar mat = new Matrix4();\n\n\t\t\tvar i, u, theta;\n\n\t\t\t// compute the tangent vectors for each segment on the curve\n\n\t\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\t\tu = i / segments;\n\n\t\t\t\ttangents[ i ] = this.getTangentAt( u );\n\t\t\t\ttangents[ i ].normalize();\n\n\t\t\t}\n\n\t\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t\t// and in the direction of the minimum tangent xyz component\n\n\t\t\tnormals[ 0 ] = new Vector3();\n\t\t\tbinormals[ 0 ] = new Vector3();\n\t\t\tvar min = Number.MAX_VALUE;\n\t\t\tvar tx = Math.abs( tangents[ 0 ].x );\n\t\t\tvar ty = Math.abs( tangents[ 0 ].y );\n\t\t\tvar tz = Math.abs( tangents[ 0 ].z );\n\n\t\t\tif ( tx <= min ) {\n\n\t\t\t\tmin = tx;\n\t\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( ty <= min ) {\n\n\t\t\t\tmin = ty;\n\t\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t\t}\n\n\t\t\tif ( tz <= min ) {\n\n\t\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t\t}\n\n\t\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\t\tvec.normalize();\n\n\t\t\t\t\ttheta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t\t}\n\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\t\tif ( closed === true ) {\n\n\t\t\t\ttheta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\t\ttheta /= segments;\n\n\t\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\t\ttheta = - theta;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t\t// twist a little...\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttangents: tangents,\n\t\t\t\tnormals: normals,\n\t\t\t\tbinormals: binormals\n\t\t\t};\n\n\t\t}\n\n\t};\n\n\t// TODO: Transformation for Curves?\n\n\t/**************************************************************\n\t *\t3D Curves\n\t **************************************************************/\n\n\t// A Factory method for creating new curve subclasses\n\n\tCurve.create = function ( constructor, getPointFunc ) {\n\n\t\tconstructor.prototype = Object.create( Curve.prototype );\n\t\tconstructor.prototype.constructor = constructor;\n\t\tconstructor.prototype.getPoint = getPointFunc;\n\n\t\treturn constructor;\n\n\t};\n\n\t/**************************************************************\n\t *\tLine\n\t **************************************************************/\n\n\tfunction LineCurve( v1, v2 ) {\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve.prototype = Object.create( Curve.prototype );\n\tLineCurve.prototype.constructor = LineCurve;\n\n\tLineCurve.prototype.isLineCurve = true;\n\n\tLineCurve.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar point = this.v2.clone().sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\treturn point;\n\n\t};\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\n\tLineCurve.prototype.getPointAt = function ( u ) {\n\n\t\treturn this.getPoint( u );\n\n\t};\n\n\tLineCurve.prototype.getTangent = function( t ) {\n\n\t\tvar tangent = this.v2.clone().sub( this.v1 );\n\n\t\treturn tangent.normalize();\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tCurved Path - a curve path is simply a array of connected\n\t * curves, but retains the api of a curve\n\t **************************************************************/\n\n\tfunction CurvePath() {\n\n\t\tthis.curves = [];\n\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tCurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {\n\n\t\tconstructor: CurvePath,\n\n\t\tadd: function ( curve ) {\n\n\t\t\tthis.curves.push( curve );\n\n\t\t},\n\n\t\tclosePath: function () {\n\n\t\t\t// Add a line curve if start and end of lines are not connected\n\t\t\tvar startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\t\tvar endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tvar d = t * this.getLength();\n\t\t\tvar curveLengths = this.getCurveLengths();\n\t\t\tvar i = 0;\n\n\t\t\t// To think about boundaries points.\n\n\t\t\twhile ( i < curveLengths.length ) {\n\n\t\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\t\tvar diff = curveLengths[ i ] - d;\n\t\t\t\t\tvar curve = this.curves[ i ];\n\n\t\t\t\t\tvar segmentLength = curve.getLength();\n\t\t\t\t\tvar u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\t\treturn curve.getPointAt( u );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t\t// loop where sum != 0, sum > d , sum+1 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\tpoints.push( points[ 0 ] );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t/**************************************************************\n\t\t *\tCreate Geometries Helpers\n\t\t **************************************************************/\n\n\t\t/// Generate geometry from path points (for Line or Points objects)\n\n\t\tcreatePointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\t// Generate geometry from equidistant sampling along the path\n\n\t\tcreateSpacedPointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getSpacedPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\tcreateGeometry: function ( points ) {\n\n\t\t\tvar geometry = new Geometry();\n\n\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tvar point = points[ i ];\n\t\t\t\tgeometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\t/**************************************************************\n\t *\tEllipse curve\n\t **************************************************************/\n\n\tfunction EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\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 || 0;\n\n\t}\n\n\tEllipseCurve.prototype = Object.create( Curve.prototype );\n\tEllipseCurve.prototype.constructor = EllipseCurve;\n\n\tEllipseCurve.prototype.isEllipseCurve = true;\n\n\tEllipseCurve.prototype.getPoint = function( t ) {\n\n\t\tvar twoPi = Math.PI * 2;\n\t\tvar deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tvar 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\tvar angle = this.aStartAngle + t * deltaAngle;\n\t\tvar x = this.aX + this.xRadius * Math.cos( angle );\n\t\tvar y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tvar cos = Math.cos( this.aRotation );\n\t\t\tvar sin = Math.sin( this.aRotation );\n\n\t\t\tvar tx = x - this.aX;\n\t\t\tvar 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 new Vector2( x, y );\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tvar CurveUtils = {\n\n\t\ttangentQuadraticBezier: function ( t, p0, p1, p2 ) {\n\n\t\t\treturn 2 * ( 1 - t ) * ( p1 - p0 ) + 2 * t * ( p2 - p1 );\n\n\t\t},\n\n\t\t// Puay Bing, thanks for helping with this derivative!\n\n\t\ttangentCubicBezier: function ( t, p0, p1, p2, p3 ) {\n\n\t\t\treturn - 3 * p0 * ( 1 - t ) * ( 1 - t ) +\n\t\t\t\t3 * p1 * ( 1 - t ) * ( 1 - t ) - 6 * t * p1 * ( 1 - t ) +\n\t\t\t\t6 * t * p2 * ( 1 - t ) - 3 * t * t * p2 +\n\t\t\t\t3 * t * t * p3;\n\n\t\t},\n\n\t\ttangentSpline: function ( t, p0, p1, p2, p3 ) {\n\n\t\t\t// To check if my formulas are correct\n\n\t\t\tvar h00 = 6 * t * t - 6 * t; \t// derived from 2t^3 − 3t^2 + 1\n\t\t\tvar h10 = 3 * t * t - 4 * t + 1; // t^3 − 2t^2 + t\n\t\t\tvar h01 = - 6 * t * t + 6 * t; \t// − 2t3 + 3t2\n\t\t\tvar h11 = 3 * t * t - 2 * t;\t// t3 − t2\n\n\t\t\treturn h00 + h10 + h01 + h11;\n\n\t\t},\n\n\t\t// Catmull-Rom\n\n\t\tinterpolate: function( p0, p1, p2, p3, t ) {\n\n\t\t\tvar v0 = ( p2 - p0 ) * 0.5;\n\t\t\tvar v1 = ( p3 - p1 ) * 0.5;\n\t\t\tvar t2 = t * t;\n\t\t\tvar t3 = t * t2;\n\t\t\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t\t}\n\n\t};\n\n\t/**************************************************************\n\t *\tSpline curve\n\t **************************************************************/\n\n\tfunction SplineCurve( points /* array of Vector2 */ ) {\n\n\t\tthis.points = ( points === undefined ) ? [] : points;\n\n\t}\n\n\tSplineCurve.prototype = Object.create( Curve.prototype );\n\tSplineCurve.prototype.constructor = SplineCurve;\n\n\tSplineCurve.prototype.isSplineCurve = true;\n\n\tSplineCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar point = ( points.length - 1 ) * t;\n\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tvar point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tvar point1 = points[ intPoint ];\n\t\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tvar interpolate = CurveUtils.interpolate;\n\n\t\treturn new Vector2(\n\t\t\tinterpolate( point0.x, point1.x, point2.x, point3.x, weight ),\n\t\t\tinterpolate( point0.y, point1.y, point2.y, point3.y, weight )\n\t\t);\n\n\t};\n\n\t/**************************************************************\n\t *\tCubic Bezier curve\n\t **************************************************************/\n\n\tfunction CubicBezierCurve( v0, v1, v2, v3 ) {\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\tCubicBezierCurve.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve.prototype.constructor = CubicBezierCurve;\n\n\tCubicBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar b3 = ShapeUtils.b3;\n\n\t\treturn new Vector2(\n\t\t\tb3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ),\n\t\t\tb3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y )\n\t\t);\n\n\t};\n\n\tCubicBezierCurve.prototype.getTangent = function( t ) {\n\n\t\tvar tangentCubicBezier = CurveUtils.tangentCubicBezier;\n\n\t\treturn new Vector2(\n\t\t\ttangentCubicBezier( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ),\n\t\t\ttangentCubicBezier( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y )\n\t\t).normalize();\n\n\t};\n\n\t/**************************************************************\n\t *\tQuadratic Bezier curve\n\t **************************************************************/\n\n\n\tfunction QuadraticBezierCurve( v0, v1, v2 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;\n\n\n\tQuadraticBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar b2 = ShapeUtils.b2;\n\n\t\treturn new Vector2(\n\t\t\tb2( t, this.v0.x, this.v1.x, this.v2.x ),\n\t\t\tb2( t, this.v0.y, this.v1.y, this.v2.y )\n\t\t);\n\n\t};\n\n\n\tQuadraticBezierCurve.prototype.getTangent = function( t ) {\n\n\t\tvar tangentQuadraticBezier = CurveUtils.tangentQuadraticBezier;\n\n\t\treturn new Vector2(\n\t\t\ttangentQuadraticBezier( t, this.v0.x, this.v1.x, this.v2.x ),\n\t\t\ttangentQuadraticBezier( t, this.v0.y, this.v1.y, this.v2.y )\n\t\t).normalize();\n\n\t};\n\n\tvar PathPrototype = Object.assign( Object.create( CurvePath.prototype ), {\n\n\t\tfromPoints: function ( vectors ) {\n\n\t\t\tthis.moveTo( vectors[ 0 ].x, vectors[ 0 ].y );\n\n\t\t\tfor ( var i = 1, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lineTo( vectors[ i ].x, vectors[ i ].y );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tvar curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tvar curve = new QuadraticBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tvar curve = new CubicBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts /*Array of Vector*/ ) {\n\n\t\t\tvar npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\t\tvar curve = new SplineCurve( npts );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\t},\n\n\t\tarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tabsarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t},\n\n\t\tabsellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t\t// if a previous curve is present, attempt to join\n\t\t\t\tvar firstPoint = curve.getPoint( 0 );\n\n\t\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tvar lastPoint = curve.getPoint( 1 );\n\t\t\tthis.currentPoint.copy( lastPoint );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Defines a 2d shape plane using paths.\n\t **/\n\n\t// STEP 1 Create a path.\n\t// STEP 2 Turn path into shape.\n\t// STEP 3 ExtrudeGeometry takes in Shape/Shapes\n\t// STEP 3a - Extract points from each shape, turn to vertices\n\t// STEP 3b - Triangulate each shape, add faces.\n\n\tfunction Shape() {\n\n\t\tPath.apply( this, arguments );\n\n\t\tthis.holes = [];\n\n\t}\n\n\tShape.prototype = Object.assign( Object.create( PathPrototype ), {\n\n\t\tconstructor: Shape,\n\n\t\tgetPointsHoles: function ( divisions ) {\n\n\t\t\tvar holesPts = [];\n\n\t\t\tfor ( var i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t\t}\n\n\t\t\treturn holesPts;\n\n\t\t},\n\n\t\t// Get points of shape and holes (keypoints based on segments parameter)\n\n\t\textractAllPoints: function ( divisions ) {\n\n\t\t\treturn {\n\n\t\t\t\tshape: this.getPoints( divisions ),\n\t\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t\t};\n\n\t\t},\n\n\t\textractPoints: function ( divisions ) {\n\n\t\t\treturn this.extractAllPoints( divisions );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Creates free form 2d path using series of points, lines or curves.\n\t *\n\t **/\n\n\tfunction Path( points ) {\n\n\t\tCurvePath.call( this );\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.fromPoints( points );\n\n\t\t}\n\n\t}\n\n\tPath.prototype = PathPrototype;\n\tPathPrototype.constructor = Path;\n\n\n\t// minimal class for proxing functions to Path. Replaces old \"extractSubpaths()\"\n\tfunction ShapePath() {\n\t\tthis.subPaths = [];\n\t\tthis.currentPath = null;\n\t}\n\n\tShapePath.prototype = {\n\t\tmoveTo: function ( x, y ) {\n\t\t\tthis.currentPath = new Path();\n\t\t\tthis.subPaths.push(this.currentPath);\n\t\t\tthis.currentPath.moveTo( x, y );\n\t\t},\n\t\tlineTo: function ( x, y ) {\n\t\t\tthis.currentPath.lineTo( x, y );\n\t\t},\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\t\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\t\t},\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\t\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\t\t},\n\t\tsplineThru: function ( pts ) {\n\t\t\tthis.currentPath.splineThru( pts );\n\t\t},\n\n\t\ttoShapes: function ( isCCW, noHoles ) {\n\n\t\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\t\tvar shapes = [];\n\n\t\t\t\tfor ( var i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar tmpPath = inSubpaths[ i ];\n\n\t\t\t\t\tvar tmpShape = new Shape();\n\t\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t\t}\n\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\t\tvar polyLen = inPolygon.length;\n\n\t\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\t\tvar inside = false;\n\t\t\t\tfor ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\t\tvar edgeLowPt = inPolygon[ p ];\n\t\t\t\t\tvar edgeHighPt = inPolygon[ q ];\n\n\t\t\t\t\tvar edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\t\tvar edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t\t// not parallel\n\t\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\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\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\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\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// parallel or collinear\n\t\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\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\t// continue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn\tinside;\n\n\t\t\t}\n\n\t\t\tvar isClockWise = ShapeUtils.isClockWise;\n\n\t\t\tvar subPaths = this.subPaths;\n\t\t\tif ( subPaths.length === 0 ) return [];\n\n\t\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tvar solid, tmpPath, tmpShape, shapes = [];\n\n\t\t\tif ( subPaths.length === 1 ) {\n\n\t\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\t\ttmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tvar holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\t\tvar betterShapeHoles = [];\n\t\t\tvar newShapes = [];\n\t\t\tvar newShapeHoles = [];\n\t\t\tvar mainIdx = 0;\n\t\t\tvar tmpPoints;\n\n\t\t\tnewShapes[ mainIdx ] = undefined;\n\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\tfor ( var i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\t\ttmpPath = subPaths[ i ];\n\t\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\t\tif ( solid ) {\n\n\t\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t\t//console.log('cw', i);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t\t//console.log('ccw', i);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tif ( newShapes.length > 1 ) {\n\n\t\t\t\tvar ambiguous = false;\n\t\t\t\tvar toChange = [];\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tvar sho = newShapeHoles[ sIdx ];\n\n\t\t\t\t\tfor ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\t\tvar ho = sho[ hIdx ];\n\t\t\t\t\t\tvar hole_unassigned = true;\n\n\t\t\t\t\t\tfor ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );\n\t\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\t// console.log(\"ambiguous: \", ambiguous);\n\t\t\t\tif ( toChange.length > 0 ) {\n\n\t\t\t\t\t// console.log(\"to change: \", toChange);\n\t\t\t\t\tif ( ! ambiguous )\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar tmpHoles;\n\n\t\t\tfor ( var i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\t\tfor ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//console.log(\"shape\", shapes);\n\n\t\t\treturn shapes;\n\n\t\t}\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Font( data ) {\n\n\t\tthis.data = data;\n\n\t}\n\n\tObject.assign( Font.prototype, {\n\n\t\tisFont: true,\n\n\t\tgenerateShapes: function ( text, size, divisions ) {\n\n\t\t\tfunction createPaths( text ) {\n\n\t\t\t\tvar chars = String( text ).split( '' );\n\t\t\t\tvar scale = size / data.resolution;\n\t\t\t\tvar offset = 0;\n\n\t\t\t\tvar paths = [];\n\n\t\t\t\tfor ( var i = 0; i < chars.length; i ++ ) {\n\n\t\t\t\t\tvar ret = createPath( chars[ i ], scale, offset );\n\t\t\t\t\toffset += ret.offset;\n\n\t\t\t\t\tpaths.push( ret.path );\n\n\t\t\t\t}\n\n\t\t\t\treturn paths;\n\n\t\t\t}\n\n\t\t\tfunction createPath( c, scale, offset ) {\n\n\t\t\t\tvar glyph = data.glyphs[ c ] || data.glyphs[ '?' ];\n\n\t\t\t\tif ( ! glyph ) return;\n\n\t\t\t\tvar path = new ShapePath();\n\n\t\t\t\tvar pts = [], b2 = ShapeUtils.b2, b3 = ShapeUtils.b3;\n\t\t\t\tvar x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste;\n\n\t\t\t\tif ( glyph.o ) {\n\n\t\t\t\t\tvar outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\t\t\t\tfor ( var i = 0, l = outline.length; i < l; ) {\n\n\t\t\t\t\t\tvar action = outline[ i ++ ];\n\n\t\t\t\t\t\tswitch ( action ) {\n\n\t\t\t\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tb2( t, cpx0, cpx1, cpx );\n\t\t\t\t\t\t\t\t\t\tb2( t, cpy0, cpy1, cpy );\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\tbreak;\n\n\t\t\t\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale;\n\t\t\t\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy2 = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tb3( t, cpx0, cpx1, cpx2, cpx );\n\t\t\t\t\t\t\t\t\t\tb3( t, cpy0, cpy1, cpy2, cpy );\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\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn { offset: glyph.ha * scale, path: path };\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( size === undefined ) size = 100;\n\t\t\tif ( divisions === undefined ) divisions = 4;\n\n\t\t\tvar data = this.data;\n\n\t\t\tvar paths = createPaths( text );\n\t\t\tvar shapes = [];\n\n\t\t\tfor ( var p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FontLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FontLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\t\t\t\tjson = JSON.parse( text.substring( 65, text.length - 2 ) );\n\n\t\t\t\t}\n\n\t\t\t\tvar font = scope.parse( json );\n\n\t\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\treturn new Font( json );\n\n\t\t}\n\n\t} );\n\n\tvar context;\n\n\tfunction getAudioContext() {\n\n\t\tif ( context === undefined ) {\n\n\t\t\tcontext = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn context;\n\n\t}\n\n\t/**\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction AudioLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( AudioLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar context = getAudioContext();\n\n\t\t\t\tcontext.decodeAudioData( buffer, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction StereoCamera() {\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}\n\n\tObject.assign( StereoCamera.prototype, {\n\n\t\tupdate: ( function () {\n\n\t\t\tvar instance, focus, fov, aspect, near, far, zoom;\n\n\t\t\tvar eyeRight = new Matrix4();\n\t\t\tvar eyeLeft = new Matrix4();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov ||\n\t\t\t\t\t\t\t\t\t\t\t\t\taspect !== camera.aspect * this.aspect || near !== camera.near ||\n\t\t\t\t\t\t\t\t\t\t\t\t\tfar !== camera.far || zoom !== camera.zoom;\n\n\t\t\t\tif ( needsUpdate ) {\n\n\t\t\t\t\tinstance = this;\n\t\t\t\t\tfocus = camera.focus;\n\t\t\t\t\tfov = camera.fov;\n\t\t\t\t\taspect = camera.aspect * this.aspect;\n\t\t\t\t\tnear = camera.near;\n\t\t\t\t\tfar = camera.far;\n\t\t\t\t\tzoom = camera.zoom;\n\n\t\t\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t\t\tvar projectionMatrix = camera.projectionMatrix.clone();\n\t\t\t\t\tvar eyeSep = this.eyeSep / 2;\n\t\t\t\t\tvar eyeSepOnProjection = eyeSep * near / focus;\n\t\t\t\t\tvar ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom;\n\t\t\t\t\tvar xmin, xmax;\n\n\t\t\t\t\t// translate xOffset\n\n\t\t\t\t\teyeLeft.elements[ 12 ] = - eyeSep;\n\t\t\t\t\teyeRight.elements[ 12 ] = eyeSep;\n\n\t\t\t\t\t// for left eye\n\n\t\t\t\t\txmin = - ymax * aspect + eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect + eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t\t// for right eye\n\n\t\t\t\t\txmin = - ymax * aspect - eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect - eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\n\t\t\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * Camera for rendering cube maps\n\t *\t- renders scene into axis-aligned cube\n\t *\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CubeCamera( near, far, cubeResolution ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tvar fov = 90, aspect = 1;\n\n\t\tvar cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.up.set( 0, - 1, 0 );\n\t\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\t\tthis.add( cameraPX );\n\n\t\tvar cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.up.set( 0, - 1, 0 );\n\t\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\t\tthis.add( cameraNX );\n\n\t\tvar cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.up.set( 0, 0, 1 );\n\t\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\t\tthis.add( cameraPY );\n\n\t\tvar cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.up.set( 0, 0, - 1 );\n\t\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\t\tthis.add( cameraNY );\n\n\t\tvar cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.up.set( 0, - 1, 0 );\n\t\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\t\tthis.add( cameraPZ );\n\n\t\tvar cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.up.set( 0, - 1, 0 );\n\t\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\t\tthis.add( cameraNZ );\n\n\t\tvar options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };\n\n\t\tthis.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );\n\n\t\tthis.updateCubeMap = function ( renderer, scene ) {\n\n\t\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\t\tvar renderTarget = this.renderTarget;\n\t\t\tvar generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\t\trenderTarget.activeCubeFace = 0;\n\t\t\trenderer.render( scene, cameraPX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 1;\n\t\t\trenderer.render( scene, cameraNX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 2;\n\t\t\trenderer.render( scene, cameraPY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 3;\n\t\t\trenderer.render( scene, cameraNY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 4;\n\t\t\trenderer.render( scene, cameraPZ, renderTarget );\n\n\t\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\t\trenderTarget.activeCubeFace = 5;\n\t\t\trenderer.render( scene, cameraNZ, renderTarget );\n\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t};\n\n\t}\n\n\tCubeCamera.prototype = Object.create( Object3D.prototype );\n\tCubeCamera.prototype.constructor = CubeCamera;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioListener() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = getAudioContext();\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}\n\n\tAudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: AudioListener,\n\n\t\tgetInput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tremoveFilter: function ( ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\t\tthis.gain.connect( this.context.destination );\n\t\t\t\tthis.filter = null;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.filter;\n\n\t\t},\n\n\t\tsetFilter: function ( value ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t\t} else {\n\n\t\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t\t}\n\n\t\t\tthis.filter = value;\n\t\t\tthis.gain.connect( this.filter );\n\t\t\tthis.filter.connect( this.context.destination );\n\n\t\t},\n\n\t\tgetMasterVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\t\tsetMasterVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\t\t\tvar scale = new Vector3();\n\n\t\t\tvar orientation = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tvar listener = this.context.listener;\n\t\t\t\tvar up = this.up;\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, scale );\n\n\t\t\t\torientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t\t\tlistener.setPosition( position.x, position.y, position.z );\n\t\t\t\tlistener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z );\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction Audio( listener ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.context = listener.context;\n\t\tthis.source = this.context.createBufferSource();\n\t\tthis.source.onended = this.onEnded.bind( this );\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.startTime = 0;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis.filters = [];\n\n\t}\n\n\tAudio.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Audio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tsetNodeSource: function ( audioNode ) {\n\n\t\t\tthis.hasPlaybackControl = false;\n\t\t\tthis.sourceType = 'audioNode';\n\t\t\tthis.source = audioNode;\n\t\t\tthis.connect();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetBuffer: function ( audioBuffer ) {\n\n\t\t\tthis.source.buffer = audioBuffer;\n\t\t\tthis.sourceType = 'buffer';\n\n\t\t\tif ( this.autoplay ) this.play();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tplay: function () {\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar source = this.context.createBufferSource();\n\n\t\t\tsource.buffer = this.source.buffer;\n\t\t\tsource.loop = this.source.loop;\n\t\t\tsource.onended = this.source.onended;\n\t\t\tsource.start( 0, this.startTime );\n\t\t\tsource.playbackRate.value = this.playbackRate;\n\n\t\t\tthis.isPlaying = true;\n\n\t\t\tthis.source = source;\n\n\t\t\treturn this.connect();\n\n\t\t},\n\n\t\tpause: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = this.context.currentTime;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = 0;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdisconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilters: function () {\n\n\t\t\treturn this.filters;\n\n\t\t},\n\n\t\tsetFilters: function ( value ) {\n\n\t\t\tif ( ! value ) value = [];\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.disconnect();\n\t\t\t\tthis.filters = value;\n\t\t\t\tthis.connect();\n\n\t\t\t} else {\n\n\t\t\t\tthis.filters = value;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.getFilters()[ 0 ];\n\n\t\t},\n\n\t\tsetFilter: function ( filter ) {\n\n\t\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t\t},\n\n\t\tsetPlaybackRate: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.playbackRate = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.playbackRate.value = this.playbackRate;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetPlaybackRate: function () {\n\n\t\t\treturn this.playbackRate;\n\n\t\t},\n\n\t\tonEnded: function () {\n\n\t\t\tthis.isPlaying = false;\n\n\t\t},\n\n\t\tgetLoop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn this.source.loop;\n\n\t\t},\n\n\t\tsetLoop: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.loop = value;\n\n\t\t},\n\n\t\tgetVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\n\t\tsetVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PositionalAudio( listener ) {\n\n\t\tAudio.call( this, listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tPositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {\n\n\t\tconstructor: PositionalAudio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.panner;\n\n\t\t},\n\n\t\tgetRefDistance: function () {\n\n\t\t\treturn this.panner.refDistance;\n\n\t\t},\n\n\t\tsetRefDistance: function ( value ) {\n\n\t\t\tthis.panner.refDistance = value;\n\n\t\t},\n\n\t\tgetRolloffFactor: function () {\n\n\t\t\treturn this.panner.rolloffFactor;\n\n\t\t},\n\n\t\tsetRolloffFactor: function ( value ) {\n\n\t\t\tthis.panner.rolloffFactor = value;\n\n\t\t},\n\n\t\tgetDistanceModel: function () {\n\n\t\t\treturn this.panner.distanceModel;\n\n\t\t},\n\n\t\tsetDistanceModel: function ( value ) {\n\n\t\t\tthis.panner.distanceModel = value;\n\n\t\t},\n\n\t\tgetMaxDistance: function () {\n\n\t\t\treturn this.panner.maxDistance;\n\n\t\t},\n\n\t\tsetMaxDistance: function ( value ) {\n\n\t\t\tthis.panner.maxDistance = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tposition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tthis.panner.setPosition( position.x, position.y, position.z );\n\n\t\t\t};\n\n\t\t} )()\n\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioAnalyser( audio, fftSize ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\tObject.assign( AudioAnalyser.prototype, {\n\n\t\tgetFrequencyData: function () {\n\n\t\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\t\treturn this.data;\n\n\t\t},\n\n\t\tgetAverageFrequency: function () {\n\n\t\t\tvar value = 0, data = this.getFrequencyData();\n\n\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tvalue += data[ i ];\n\n\t\t\t}\n\n\t\t\treturn value / data.length;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Buffered scene graph property that allows weighted accumulation.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyMixer( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tvar bufferType = Float64Array,\n\t\t\tmixFunction;\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\t\t\tmixFunction = this._slerp;\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\n\t\t\t\tbufferType = Array,\t\tmixFunction = this._select;\t\tbreak;\n\n\t\t\tdefault:\t\t\t\t\tmixFunction = this._lerp;\n\n\t\t}\n\n\t\tthis.buffer = new bufferType( valueSize * 4 );\n\t\t// layout: [ incoming | accu0 | accu1 | orig ]\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\n\t\tthis._mixBufferRegion = mixFunction;\n\n\t\tthis.cumulativeWeight = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\tPropertyMixer.prototype = {\n\n\t\tconstructor: PropertyMixer,\n\n\t\t// accumulate data in the 'incoming' region into 'accu'\n\t\taccumulate: function( accuIndex, weight ) {\n\n\t\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t\t// the weight and shouldn't have made the call in the first place\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tcurrentWeight = this.cumulativeWeight;\n\n\t\t\tif ( currentWeight === 0 ) {\n\n\t\t\t\t// accuN := incoming * weight\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcurrentWeight = weight;\n\n\t\t\t} else {\n\n\t\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\t\tcurrentWeight += weight;\n\t\t\t\tvar mix = weight / currentWeight;\n\t\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = currentWeight;\n\n\t\t},\n\n\t\t// apply the state of 'accu' to the binding when accus differ\n\t\tapply: function( accuIndex ) {\n\n\t\t\tvar stride = this.valueSize,\n\t\t\t\tbuffer = this.buffer,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tweight = this.cumulativeWeight,\n\n\t\t\t\tbinding = this.binding;\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t\tif ( weight < 1 ) {\n\n\t\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\t\tvar originalValueOffset = stride * 3;\n\n\t\t\t\tthis._mixBufferRegion(\n\t\t\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t\t}\n\n\t\t\tfor ( var i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remember the state of the bound property and copy it to both accus\n\t\tsaveOriginalState: function() {\n\n\t\t\tvar binding = this.binding;\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toriginalValueOffset = stride * 3;\n\n\t\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\t\tfor ( var i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t},\n\n\t\t// apply the state previously taken via 'saveOriginalState' to the binding\n\t\trestoreOriginalState: function() {\n\n\t\t\tvar originalValueOffset = this.valueSize * 3;\n\t\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t\t},\n\n\n\t\t// mix functions\n\n\t\t_select: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tif ( t >= 0.5 ) {\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_slerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tQuaternion.slerpFlat( buffer, dstOffset,\n\t\t\t\t\tbuffer, dstOffset, buffer, srcOffset, t );\n\n\t\t},\n\n\t\t_lerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tvar s = 1 - t;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tvar j = dstOffset + i;\n\n\t\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * A reference to a real property in the scene graph.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyBinding( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode(\n\t\t\t\trootNode, this.parsedPath.nodeName ) || rootNode;\n\n\t\tthis.rootNode = rootNode;\n\n\t}\n\n\tPropertyBinding.prototype = {\n\n\t\tconstructor: PropertyBinding,\n\n\t\tgetValue: function getValue_unbound( targetArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.getValue( targetArray, offset );\n\n\t\t\t// Note: This class uses a State pattern on a per-method basis:\n\t\t\t// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n\t\t\t// prototype version of these methods with one that represents\n\t\t\t// the bound state. When the property is not found, the methods\n\t\t\t// become no-ops.\n\n\t\t},\n\n\t\tsetValue: function getValue_unbound( sourceArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.setValue( sourceArray, offset );\n\n\t\t},\n\n\t\t// create getter / setter pair for a property in the scene graph\n\t\tbind: function() {\n\n\t\t\tvar targetObject = this.node,\n\t\t\t\tparsedPath = this.parsedPath,\n\n\t\t\t\tobjectName = parsedPath.objectName,\n\t\t\t\tpropertyName = parsedPath.propertyName,\n\t\t\t\tpropertyIndex = parsedPath.propertyIndex;\n\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\ttargetObject = PropertyBinding.findNode(\n\t\t\t\t\t\tthis.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\t\tthis.node = targetObject;\n\n\t\t\t}\n\n\t\t\t// set fail state so we can just 'return' on error\n\t\t\tthis.getValue = this._getValue_unavailable;\n\t\t\tthis.setValue = this._setValue_unavailable;\n\n\t \t\t// ensure there is a value node\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\tconsole.error( \" trying to update node for track: \" + this.path + \" but it wasn't found.\" );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( objectName ) {\n\n\t\t\t\tvar objectIndex = parsedPath.objectIndex;\n\n\t\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\t\tswitch ( objectName ) {\n\n\t\t\t\t\tcase 'materials':\n\n\t\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material as node does not have a material', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material.materials as node.material does not have a materials array', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bones':\n\n\t\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to bones as node does not have a skeleton', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\t\tfor ( var i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to objectName of node, undefined', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( \" trying to bind to objectIndex of objectName, but is undefined:\", this, targetObject );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// resolve property\n\t\t\tvar nodeProperty = targetObject[ propertyName ];\n\n\t\t\tif ( nodeProperty === undefined ) {\n\n\t\t\t\tvar nodeName = parsedPath.nodeName;\n\n\t\t\t\tconsole.error( \" trying to update property for track: \" + nodeName +\n\t\t\t\t\t\t'.' + propertyName + \" but it wasn't found.\", targetObject );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// determine versioning scheme\n\t\t\tvar versioning = this.Versioning.None;\n\n\t\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\t\tversioning = this.Versioning.NeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t}\n\n\t\t\t// determine how the property gets bound\n\t\t\tvar bindingType = this.BindingType.Direct;\n\n\t\t\tif ( propertyIndex !== undefined ) {\n\t\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\t\tif ( propertyName === \"morphTargetInfluences\" ) {\n\t\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\t// support resolving morphTarget names into indices.\n\t\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphTargets ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) {\n\n\t\t\t\t\t\t\tpropertyIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\t\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else if ( nodeProperty.length !== undefined ) {\n\n\t\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else {\n\n\t\t\t\tthis.propertyName = propertyName;\n\n\t\t\t}\n\n\t\t\t// select getter / setter\n\t\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tthis.node = null;\n\n\t\t\t// back to the prototype version of getValue / setValue\n\t\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\t\tthis.getValue = this._getValue_unbound;\n\t\t\tthis.setValue = this._setValue_unbound;\n\n\t\t}\n\n\t};\n\n\tObject.assign( PropertyBinding.prototype, { // prototype, continued\n\n\t\t// these are used to \"bind\" a nonexistent property\n\t\t_getValue_unavailable: function() {},\n\t\t_setValue_unavailable: function() {},\n\n\t\t// initial state of these methods that calls 'bind'\n\t\t_getValue_unbound: PropertyBinding.prototype.getValue,\n\t\t_setValue_unbound: PropertyBinding.prototype.setValue,\n\n\t\tBindingType: {\n\t\t\tDirect: 0,\n\t\t\tEntireArray: 1,\n\t\t\tArrayElement: 2,\n\t\t\tHasFromToArray: 3\n\t\t},\n\n\t\tVersioning: {\n\t\t\tNone: 0,\n\t\t\tNeedsUpdate: 1,\n\t\t\tMatrixWorldNeedsUpdate: 2\n\t\t},\n\n\t\tGetterByBindingType: [\n\n\t\t\tfunction getValue_direct( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.node[ this.propertyName ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_array( buffer, offset ) {\n\n\t\t\t\tvar source = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tfunction getValue_arrayElement( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_toArray( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t\t\t}\n\n\t\t],\n\n\t\tSetterByBindingTypeAndVersioning: [\n\n\t\t\t[\n\t\t\t\t// Direct\n\n\t\t\t\tfunction setValue_direct( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// EntireArray\n\n\t\t\t\tfunction setValue_array( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// ArrayElement\n\n\t\t\t\tfunction setValue_arrayElement( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// HasToFromArray\n\n\t\t\t\tfunction setValue_fromArray( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t]\n\n\t\t]\n\n\t} );\n\n\tPropertyBinding.Composite =\n\t\t\tfunction( targetGroup, path, optionalParsedPath ) {\n\n\t\tvar parsedPath = optionalParsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t};\n\n\tPropertyBinding.Composite.prototype = {\n\n\t\tconstructor: PropertyBinding.Composite,\n\n\t\tgetValue: function( array, offset ) {\n\n\t\t\tthis.bind(); // bind all binding\n\n\t\t\tvar firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t\t// and only call .getValue on the first\n\t\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t\t},\n\n\t\tsetValue: function( array, offset ) {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t\t}\n\n\t\t},\n\n\t\tbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].bind();\n\n\t\t\t}\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].unbind();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.create = function( root, path, parsedPath ) {\n\n\t\tif ( ! ( (root && root.isAnimationObjectGroup) ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.parseTrackName = function( trackName ) {\n\n\t\t// matches strings in the form of:\n\t\t// nodeName.property\n\t\t// nodeName.property[accessor]\n\t\t// nodeName.material.property[accessor]\n\t\t// uuid.property[accessor]\n\t\t// uuid.objectName[objectIndex].propertyName[propertyIndex]\n\t\t// parentName/nodeName.property\n\t\t// parentName/parentName/nodeName.property[index]\n\t\t// .bone[Armature.DEF_cog].position\n\t\t// scene:helium_balloon_model:helium_balloon_model.position\n\t\t// created and tested via https://regex101.com/#javascript\n\n\t\tvar re = /^((?:\\w+[\\/:])*)(\\w+)?(?:\\.(\\w+)(?:\\[(.+)\\])?)?\\.(\\w+)(?:\\[(.+)\\])?$/;\n\t\tvar matches = re.exec( trackName );\n\n\t\tif ( ! matches ) {\n\n\t\t\tthrow new Error( \"cannot parse trackName at all: \" + trackName );\n\n\t\t}\n\n\t\tvar results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ], \t// allowed to be null, specified root node.\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ],\n\t\t\tpropertyIndex: matches[ 6 ]\t// allowed to be null, specifies that the whole property is set.\n\t\t};\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( \"can not parse propertyName from trackName: \" + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t};\n\n\tPropertyBinding.findNode = function( root, nodeName ) {\n\n\t\tif ( ! nodeName || nodeName === \"\" || nodeName === \"root\" || nodeName === \".\" || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tvar searchSkeleton = function( skeleton ) {\n\n\t\t\t\tfor( var i = 0; i < skeleton.bones.length; i ++ ) {\n\n\t\t\t\t\tvar bone = skeleton.bones[ i ];\n\n\t\t\t\t\tif ( bone.name === nodeName ) {\n\n\t\t\t\t\t\treturn bone;\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar bone = searchSkeleton( root.skeleton );\n\n\t\t\tif ( bone ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tvar searchNodeSubtree = function( children ) {\n\n\t\t\t\tfor( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tvar childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\t/**\n\t *\n\t * A group of objects that receives a shared animation state.\n\t *\n\t * Usage:\n\t *\n\t * \t-\tAdd objects you would otherwise pass as 'root' to the\n\t * \t\tconstructor or the .clipAction method of AnimationMixer.\n\t *\n\t * \t-\tInstead pass this object as 'root'.\n\t *\n\t * \t-\tYou can also add and remove objects later when the mixer\n\t * \t\tis running.\n\t *\n\t * Note:\n\t *\n\t * \tObjects of this class appear as one object to the mixer,\n\t * \tso cache control of the individual objects must be done\n\t * \ton the group.\n\t *\n\t * Limitation:\n\t *\n\t * \t- \tThe animated properties must be compatible among the\n\t * \t\tall objects in the group.\n\t *\n\t * -\tA single property can either be controlled through a\n\t * \ttarget group or directly, but not both.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction AnimationObjectGroup( var_args ) {\n\n\t\tthis.uuid = _Math.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;\t\t\t// threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tvar indices = {};\n\t\tthis._indicesByUUID = indices;\t\t// for bookkeeping\n\n\t\tfor ( var 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 = [];\t\t\t\t\t// inside: string\n\t\tthis._parsedPaths = [];\t\t\t\t// inside: { we don't care, here }\n\t\tthis._bindings = []; \t\t\t\t// inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; \t// inside: indices in these arrays\n\n\t\tvar scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() { return scope._objects.length; },\n\t\t\t\tget inUse() { return this.total - scope.nCachedObjects_; }\n\t\t\t},\n\n\t\t\tget bindingsPerObject() { return scope._bindings.length; }\n\n\t\t};\n\n\t}\n\n\tAnimationObjectGroup.prototype = {\n\n\t\tconstructor: AnimationObjectGroup,\n\n\t\tisAnimationObjectGroup: true,\n\n\t\tadd: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tpaths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index === undefined ) {\n\n\t\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\t\tindex = nObjects ++;\n\t\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\t\tobjects.push( object );\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tbindings[ j ].push(\n\t\t\t\t\t\t\t\tnew PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\t\tvar knownObject = objects[ index ];\n\n\t\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\t\tbinding = new PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( objects[ index ] !== knownObject) {\n\n\t\t\t\t\tconsole.error( \"Different objects with the same UUID \" +\n\t\t\t\t\t\t\t\"detected. Clean the caches or recreate your \" +\n\t\t\t\t\t\t\t\"infrastructure when reloading scenes...\" );\n\n\t\t\t\t} // else the object is already where we want it to be\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\tremove: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\t\tvar lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// remove & forget\n\t\tuncache: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\t\tvar lastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} // cached or active\n\n\t\t\t\t} // if object is known\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\t\tsubscribe_: function( path, parsedPath ) {\n\t\t\t// returns an array of bindings for the given path that is changed\n\t\t\t// according to the contained objects in the group\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ],\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\t\tvar paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tobjects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\t\tindex = bindings.length;\n\n\t\t\tindicesByPath[ path ] = index;\n\n\t\t\tpaths.push( path );\n\t\t\tparsedPaths.push( parsedPath );\n\t\t\tbindings.push( bindingsForPath );\n\n\t\t\tfor ( var i = nCachedObjects,\n\t\t\t\t\tn = objects.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = objects[ i ];\n\n\t\t\t\tbindingsForPath[ i ] =\n\t\t\t\t\t\tnew PropertyBinding( object, path, parsedPath );\n\n\t\t\t}\n\n\t\t\treturn bindingsForPath;\n\n\t\t},\n\n\t\tunsubscribe_: function( path ) {\n\t\t\t// tells the group to forget about a property path and no longer\n\t\t\t// update the array previously obtained with 'subscribe_'\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar paths = this._paths,\n\t\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\t\tbindings = this._bindings,\n\t\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\t\tbindings[ index ] = lastBindings;\n\t\t\t\tbindings.pop();\n\n\t\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\t\tparsedPaths.pop();\n\n\t\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\t\tpaths.pop();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Action provided by AnimationMixer for scheduling clip playback on specific\n\t * objects.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t *\n\t */\n\n\tfunction AnimationAction( mixer, clip, localRoot ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot || null;\n\n\t\tvar tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tvar interpolantSettings = {\n\t\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tvar 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;\t// 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;\t\t\t// for the memory manager\n\t\tthis._byClipCacheIndex = null;\t\t// 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; \t\t// no. of repetitions when looping\n\n\t\tthis.paused = false;\t\t\t\t// false -> zero effective time scale\n\t\tthis.enabled = true;\t\t\t\t// true -> zero effective weight\n\n\t\tthis.clampWhenFinished \t= false;\t// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart \t= true;\t\t// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd\t\t= true;\t\t// clips for start, loop and end\n\n\t}\n\n\tAnimationAction.prototype = {\n\n\t\tconstructor: AnimationAction,\n\n\t\t// State & Scheduling\n\n\t\tplay: function() {\n\n\t\t\tthis._mixer._activateAction( this );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function() {\n\n\t\t\tthis._mixer._deactivateAction( this );\n\n\t\t\treturn this.reset();\n\n\t\t},\n\n\t\treset: function() {\n\n\t\t\tthis.paused = false;\n\t\t\tthis.enabled = true;\n\n\t\t\tthis.time = 0;\t\t\t// restart clip\n\t\t\tthis._loopCount = -1;\t// forget previous loops\n\t\t\tthis._startTime = null;\t// forget scheduling\n\n\t\t\treturn this.stopFading().stopWarping();\n\n\t\t},\n\n\t\tisRunning: function() {\n\n\t\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\t// return true when play has been called\n\t\tisScheduled: function() {\n\n\t\t\treturn this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\tstartAt: function( time ) {\n\n\t\t\tthis._startTime = time;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetLoop: function( mode, repetitions ) {\n\n\t\t\tthis.loop = mode;\n\t\t\tthis.repetitions = repetitions;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Weight\n\n\t\t// set the weight stopping any scheduled fading\n\t\t// although .enabled = false yields an effective weight of zero, this\n\t\t// method does *not* change .enabled, because it would be confusing\n\t\tsetEffectiveWeight: function( weight ) {\n\n\t\t\tthis.weight = weight;\n\n\t\t\t// note: same logic as when updated at runtime\n\t\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\t\treturn this.stopFading();\n\n\t\t},\n\n\t\t// return the weight considering fading and .enabled\n\t\tgetEffectiveWeight: function() {\n\n\t\t\treturn this._effectiveWeight;\n\n\t\t},\n\n\t\tfadeIn: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t\t},\n\n\t\tfadeOut: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t\t},\n\n\t\tcrossFadeFrom: function( fadeOutAction, duration, warp ) {\n\n\t\t\tfadeOutAction.fadeOut( duration );\n\t\t\tthis.fadeIn( duration );\n\n\t\t\tif( warp ) {\n\n\t\t\t\tvar fadeInDuration = this._clip.duration,\n\t\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossFadeTo: function( fadeInAction, duration, warp ) {\n\n\t\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t\t},\n\n\t\tstopFading: function() {\n\n\t\t\tvar weightInterpolant = this._weightInterpolant;\n\n\t\t\tif ( weightInterpolant !== null ) {\n\n\t\t\t\tthis._weightInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Time Scale Control\n\n\t\t// set the weight stopping any scheduled warping\n\t\t// although .paused = true yields an effective time scale of zero, this\n\t\t// method does *not* change .paused, because it would be confusing\n\t\tsetEffectiveTimeScale: function( timeScale ) {\n\n\t\t\tthis.timeScale = timeScale;\n\t\t\tthis._effectiveTimeScale = this.paused ? 0 :timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\t// return the time scale considering warping and .paused\n\t\tgetEffectiveTimeScale: function() {\n\n\t\t\treturn this._effectiveTimeScale;\n\n\t\t},\n\n\t\tsetDuration: function( duration ) {\n\n\t\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\tsyncWith: function( action ) {\n\n\t\t\tthis.time = action.time;\n\t\t\tthis.timeScale = action.timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\thalt: function( duration ) {\n\n\t\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t\t},\n\n\t\twarp: function( startTimeScale, endTimeScale, duration ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._timeScaleInterpolant,\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant(),\n\t\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now;\n\t\t\ttimes[ 1 ] = now + duration;\n\n\t\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstopWarping: function() {\n\n\t\t\tvar timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\t\tthis._timeScaleInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Object Accessors\n\n\t\tgetMixer: function() {\n\n\t\t\treturn this._mixer;\n\n\t\t},\n\n\t\tgetClip: function() {\n\n\t\t\treturn this._clip;\n\n\t\t},\n\n\t\tgetRoot: function() {\n\n\t\t\treturn this._localRoot || this._mixer._root;\n\n\t\t},\n\n\t\t// Interna\n\n\t\t_update: function( time, deltaTime, timeDirection, accuIndex ) {\n\t\t\t// called by the mixer\n\n\t\t\tvar startTime = this._startTime;\n\n\t\t\tif ( startTime !== null ) {\n\n\t\t\t\t// check for scheduled start of action\n\n\t\t\t\tvar timeRunning = ( time - startTime ) * timeDirection;\n\t\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t\t}\n\n\t\t\t\t// start\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\t// apply time scale and advance time\n\n\t\t\tdeltaTime *= this._updateTimeScale( time );\n\t\t\tvar clipTime = this._updateTime( deltaTime );\n\n\t\t\t// note: _updateTime may disable the action resulting in\n\t\t\t// an effective weight of 0\n\n\t\t\tvar weight = this._updateWeight( time );\n\n\t\t\tif ( weight > 0 ) {\n\n\t\t\t\tvar interpolants = this._interpolants;\n\t\t\t\tvar propertyMixers = this._propertyBindings;\n\n\t\t\t\tfor ( var j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_updateWeight: function( time ) {\n\n\t\t\tvar weight = 0;\n\n\t\t\tif ( this.enabled ) {\n\n\t\t\t\tweight = this.weight;\n\t\t\t\tvar interpolant = this._weightInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\t\tthis.enabled = 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\tthis._effectiveWeight = weight;\n\t\t\treturn weight;\n\n\t\t},\n\n\t\t_updateTimeScale: function( time ) {\n\n\t\t\tvar timeScale = 0;\n\n\t\t\tif ( ! this.paused ) {\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\t\tvar interpolant = this._timeScaleInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\t\tthis.timeScale = timeScale;\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\tthis._effectiveTimeScale = timeScale;\n\t\t\treturn timeScale;\n\n\t\t},\n\n\t\t_updateTime: function( deltaTime ) {\n\n\t\t\tvar time = this.time + deltaTime;\n\n\t\t\tif ( deltaTime === 0 ) return time;\n\n\t\t\tvar duration = this._clip.duration,\n\n\t\t\t\tloop = this.loop,\n\t\t\t\tloopCount = this._loopCount;\n\n\t\t\tif ( loop === LoopOnce ) {\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tthis.loopCount = 0;\n\t\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t\t}\n\n\t\t\t\thandle_stop: {\n\n\t\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\t\ttime = duration;\n\n\t\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\t\ttime = 0;\n\n\t\t\t\t\t} else break handle_stop;\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\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}\n\n\t\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\t\tvar pingPong = ( loop === LoopPingPong );\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\ttrue, this.repetitions === 0, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\tthis.repetitions === 0, true, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( time >= duration || time < 0 ) {\n\t\t\t\t\t// wrap around\n\n\t\t\t\t\tvar loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\t\tvar pending = this.repetitions - loopCount;\n\n\t\t\t\t\tif ( pending < 0 ) {\n\t\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// keep running\n\n\t\t\t\t\t\tif ( pending === 0 ) {\n\t\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\t\tvar atStart = deltaTime < 0;\n\t\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\t\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\t\tthis.time = time;\n\t\t\t\t\treturn duration - time;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.time = time;\n\t\t\treturn time;\n\n\t\t},\n\n\t\t_setEndings: function( atStart, atEnd, pingPong ) {\n\n\t\t\tvar settings = this._interpolantSettings;\n\n\t\t\tif ( pingPong ) {\n\n\t\t\t\tsettings.endingStart \t= ZeroSlopeEnding;\n\t\t\t\tsettings.endingEnd\t\t= ZeroSlopeEnding;\n\n\t\t\t} else {\n\n\t\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\t\tif ( atStart ) {\n\n\t\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t\tif ( atEnd ) {\n\n\t\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_scheduleFading: function( duration, weightNow, weightThen ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant(),\n\t\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now; \t\t\t\tvalues[ 0 ] = weightNow;\n\t\t\ttimes[ 1 ] = now + duration;\tvalues[ 1 ] = weightThen;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Player for AnimationClips.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction AnimationMixer( root ) {\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\tObject.assign( AnimationMixer.prototype, EventDispatcher.prototype, {\n\n\t\t// return an action for a clip optionally using a custom root target\n\t\t// object (this method allocates a lot of dynamic memory in case a\n\t\t// previously unknown clip/root combination is specified)\n\t\tclipAction: function( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject !== null ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ],\n\t\t\t\tprototypeAction = null;\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\tvar existingAction =\n\t\t\t\t\t\tactionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( existingAction !== undefined ) {\n\n\t\t\t\t\treturn existingAction;\n\n\t\t\t\t}\n\n\t\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t\t// the bindings again but can just copy\n\t\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t\t// also, take the clip from the prototype action\n\t\t\t\tif ( clipObject === null )\n\t\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t\t}\n\n\t\t\t// clip must be known when specified via string\n\t\t\tif ( clipObject === null ) return null;\n\n\t\t\t// allocate all resources required to run it\n\t\t\tvar newAction = new AnimationAction( this, clipObject, optionalRoot );\n\n\t\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t\t// and make the action known to the memory manager\n\t\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\t\treturn newAction;\n\n\t\t},\n\n\t\t// get an existing action\n\t\texistingAction: function( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// deactivates all previously scheduled actions\n\t\tstopAllAction: function() {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tthis._nActiveActions = 0;\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tactions[ i ].reset();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].useCount = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// advance the time and update apply the animation\n\t\tupdate: function( deltaTime ) {\n\n\t\t\tdeltaTime *= this.timeScale;\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\n\t\t\t\ttime = this.time += deltaTime,\n\t\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t\t// run active actions\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tvar action = actions[ i ];\n\n\t\t\t\tif ( action.enabled ) {\n\n\t\t\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// update scene graph\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// return this mixer's root target object\n\t\tgetRoot: function() {\n\n\t\t\treturn this._root;\n\n\t\t},\n\n\t\t// free all resources specific to a particular clip\n\t\tuncacheClip: function( clip ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tclipUuid = clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t\t// iteration state and also require updating the state we can\n\t\t\t\t// just throw away\n\n\t\t\t\tvar actionsToRemove = actionsForClip.knownActions;\n\n\t\t\t\tfor ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar action = actionsToRemove[ i ];\n\n\t\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\t\tvar cacheIndex = action._cacheIndex,\n\t\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\t\taction._cacheIndex = null;\n\t\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\t\tactions.pop();\n\n\t\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t\t}\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t// free all resources specific to a particular root target object\n\t\tuncacheRoot: function( root ) {\n\n\t\t\tvar rootUuid = root.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip;\n\n\t\t\tfor ( var clipUuid in actionsByClip ) {\n\n\t\t\t\tvar actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( action !== undefined ) {\n\n\t\t\t\t\tthis._deactivateAction( action );\n\t\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingByName !== undefined ) {\n\n\t\t\t\tfor ( var trackName in bindingByName ) {\n\n\t\t\t\t\tvar binding = bindingByName[ trackName ];\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remove a targeted clip from the cache\n\t\tuncacheAction: function( clip, optionalRoot ) {\n\n\t\t\tvar action = this.existingAction( clip, optionalRoot );\n\n\t\t\tif ( action !== null ) {\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} );\n\n\t// Implementation details:\n\n\tObject.assign( AnimationMixer.prototype, {\n\n\t\t_bindAction: function( action, prototypeAction ) {\n\n\t\t\tvar root = action._localRoot || this._root,\n\t\t\t\ttracks = action._clip.tracks,\n\t\t\t\tnTracks = tracks.length,\n\t\t\t\tbindings = action._propertyBindings,\n\t\t\t\tinterpolants = action._interpolants,\n\t\t\t\trootUuid = root.uuid,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingsByName === undefined ) {\n\n\t\t\t\tbindingsByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\t\tvar track = tracks[ i ],\n\t\t\t\t\ttrackName = track.name,\n\t\t\t\t\tbinding = bindingsByName[ trackName ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar path = prototypeAction && prototypeAction.\n\t\t\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t}\n\n\t\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t\t}\n\n\t\t},\n\n\t\t_activateAction: function( action ) {\n\n\t\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\t\tvar rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\t\tthis._bindAction( action,\n\t\t\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t\t}\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// increment reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._lendAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t_deactivateAction: function( action ) {\n\n\t\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// decrement reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._takeBackAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// Memory manager\n\n\t\t_initMemoryManager: function() {\n\n\t\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\t\tthis._nActiveActions = 0;\n\n\t\t\tthis._actionsByClip = {};\n\t\t\t// inside:\n\t\t\t// {\n\t\t\t// \t\tknownActions: Array< AnimationAction >\t- used as prototypes\n\t\t\t// \t\tactionByRoot: AnimationAction\t\t\t- lookup\n\t\t\t// }\n\n\n\t\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\t\tthis._controlInterpolants = []; // same game as above\n\t\t\tthis._nActiveControlInterpolants = 0;\n\n\t\t\tvar scope = this;\n\n\t\t\tthis.stats = {\n\n\t\t\t\tactions: {\n\t\t\t\t\tget total() { return scope._actions.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveActions; }\n\t\t\t\t},\n\t\t\t\tbindings: {\n\t\t\t\t\tget total() { return scope._bindings.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveBindings; }\n\t\t\t\t},\n\t\t\t\tcontrolInterpolants: {\n\t\t\t\t\tget total() { return scope._controlInterpolants.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveControlInterpolants; }\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t},\n\n\t\t// Memory management for AnimationAction objects\n\n\t\t_isActiveAction: function( action ) {\n\n\t\t\tvar index = action._cacheIndex;\n\t\t\treturn index !== null && index < this._nActiveActions;\n\n\t\t},\n\n\t\t_addInactiveAction: function( action, clipUuid, rootUuid ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip === undefined ) {\n\n\t\t\t\tactionsForClip = {\n\n\t\t\t\t\tknownActions: [ action ],\n\t\t\t\t\tactionByRoot: {}\n\n\t\t\t\t};\n\n\t\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t\t} else {\n\n\t\t\t\tvar knownActions = actionsForClip.knownActions;\n\n\t\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\t\tknownActions.push( action );\n\n\t\t\t}\n\n\t\t\taction._cacheIndex = actions.length;\n\t\t\tactions.push( action );\n\n\t\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t\t},\n\n\t\t_removeInactiveAction: function( action ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\t\tcacheIndex = action._cacheIndex;\n\n\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\tactions.pop();\n\n\t\t\taction._cacheIndex = null;\n\n\n\t\t\tvar clipUuid = action._clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\t\tlastKnownAction =\n\t\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\t\tknownActionsForClip.pop();\n\n\t\t\taction._byClipCacheIndex = null;\n\n\n\t\t\tvar actionByRoot = actionsForClip.actionByRoot,\n\t\t\t\trootUuid = ( actions._localRoot || this._root ).uuid;\n\n\t\t\tdelete actionByRoot[ rootUuid ];\n\n\t\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t},\n\n\t\t_removeInactiveBindingsForAction: function( action ) {\n\n\t\t\tvar bindings = action._propertyBindings;\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendAction: function( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions >| inactive actions ]\n\t\t\t// s a\n\t\t\t// <-swap->\n\t\t\t// a s\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\t\taction._cacheIndex = lastActiveIndex;\n\t\t\tactions[ lastActiveIndex ] = action;\n\n\t\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t\t},\n\n\t\t_takeBackAction: function( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions |< inactive actions ]\n\t\t\t// a s\n\t\t\t// <-swap->\n\t\t\t// s a\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\t\taction._cacheIndex = firstInactiveIndex;\n\t\t\tactions[ firstInactiveIndex ] = action;\n\n\t\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t\t},\n\n\t\t// Memory management for PropertyMixer objects\n\n\t\t_addInactiveBinding: function( binding, rootUuid, trackName ) {\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( bindingByName === undefined ) {\n\n\t\t\t\tbindingByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t\t}\n\n\t\t\tbindingByName[ trackName ] = binding;\n\n\t\t\tbinding._cacheIndex = bindings.length;\n\t\t\tbindings.push( binding );\n\n\t\t},\n\n\t\t_removeInactiveBinding: function( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tpropBinding = binding.binding,\n\t\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\t\ttrackName = propBinding.path,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\t\tbindings.pop();\n\n\t\t\tdelete bindingByName[ trackName ];\n\n\t\t\tremove_empty_map: {\n\n\t\t\t\tfor ( var _ in bindingByName ) break remove_empty_map;\n\n\t\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendBinding: function( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\t\tbinding._cacheIndex = lastActiveIndex;\n\t\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t\t},\n\n\t\t_takeBackBinding: function( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t\t},\n\n\n\t\t// Memory management of Interpolants for weight and time scale\n\n\t\t_lendControlInterpolant: function() {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++,\n\t\t\t\tinterpolant = interpolants[ lastActiveIndex ];\n\n\t\t\tif ( interpolant === undefined ) {\n\n\t\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t\t\t\t1, this._controlInterpolantsResultBuffer );\n\n\t\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t\t}\n\n\t\t\treturn interpolant;\n\n\t\t},\n\n\t\t_takeBackControlInterpolant: function( interpolant ) {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t\t},\n\n\t\t_controlInterpolantsResultBuffer: new Float32Array( 1 )\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Uniform( value ) {\n\n\t\tif ( typeof value === 'string' ) {\n\n\t\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\n\t\t\tvalue = arguments[ 1 ];\n\n\t\t}\n\n\t\tthis.value = value;\n\n\t}\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferGeometry() {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.maxInstancedCount = undefined;\n\n\t}\n\n\tInstancedBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tInstancedBufferGeometry.prototype.constructor = InstancedBufferGeometry;\n\n\tInstancedBufferGeometry.prototype.isInstancedBufferGeometry = true;\n\n\tInstancedBufferGeometry.prototype.addGroup = function ( start, count, materialIndex ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t};\n\n\tInstancedBufferGeometry.prototype.copy = function ( source ) {\n\n\t\tvar index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\tvar attributes = source.attributes;\n\n\t\tfor ( var name in attributes ) {\n\n\t\t\tvar attribute = attributes[ name ];\n\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t}\n\n\t\tvar groups = source.groups;\n\n\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tvar group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.data = interleavedBuffer;\n\t\tthis.itemSize = itemSize;\n\t\tthis.offset = offset;\n\n\t\tthis.normalized = normalized === true;\n\n\t}\n\n\n\tInterleavedBufferAttribute.prototype = {\n\n\t\tconstructor: InterleavedBufferAttribute,\n\n\t\tisInterleavedBufferAttribute: true,\n\n\t\tget count() {\n\n\t\t\treturn this.data.count;\n\n\t\t},\n\n\t\tget array() {\n\n\t\t\treturn this.data.array;\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\t\t\tthis.data.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBuffer( array, stride ) {\n\n\t\tthis.uuid = _Math.generateUUID();\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.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t}\n\n\tInterleavedBuffer.prototype = {\n\n\t\tconstructor: InterleavedBuffer,\n\n\t\tisInterleavedBuffer: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.stride : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.count = source.count;\n\t\t\tthis.stride = source.stride;\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.stride;\n\t\t\tindex2 *= attribute.stride;\n\n\t\t\tfor ( var i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {\n\n\t\tInterleavedBuffer.call( this, array, stride );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedInterleavedBuffer.prototype = Object.create( InterleavedBuffer.prototype );\n\tInstancedInterleavedBuffer.prototype.constructor = InstancedInterleavedBuffer;\n\n\tInstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true;\n\n\tInstancedInterleavedBuffer.prototype.copy = function ( source ) {\n\n\t\tInterleavedBuffer.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferAttribute( array, itemSize, meshPerAttribute ) {\n\n\t\tBufferAttribute.call( this, array, itemSize );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInstancedBufferAttribute.prototype.constructor = InstancedBufferAttribute;\n\n\tInstancedBufferAttribute.prototype.isInstancedBufferAttribute = true;\n\n\tInstancedBufferAttribute.prototype.copy = function ( source ) {\n\n\t\tBufferAttribute.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author bhouston / http://clara.io/\n\t * @author stephomi / http://stephaneginier.com/\n\t */\n\n\tfunction Raycaster( origin, direction, near, far ) {\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 || 0;\n\t\tthis.far = far || Infinity;\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: {},\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t\tObject.defineProperties( this.params, {\n\t\t\tPointCloud: {\n\t\t\t\tget: function () {\n\t\t\t\t\tconsole.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );\n\t\t\t\t\treturn this.Points;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tfunction ascSort( a, b ) {\n\n\t\treturn a.distance - b.distance;\n\n\t}\n\n\tfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t//\n\n\tRaycaster.prototype = {\n\n\t\tconstructor: Raycaster,\n\n\t\tlinePrecision: 1,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\t\tthis.ray.set( origin, direction );\n\n\t\t},\n\n\t\tsetFromCamera: function ( coords, camera ) {\n\n\t\t\tif ( (camera && camera.isPerspectiveCamera) ) {\n\n\t\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\n\t\t\t} else if ( (camera && camera.isOrthographicCamera) ) {\n\n\t\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\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type.' );\n\n\t\t\t}\n\n\t\t},\n\n\t\tintersectObject: function ( object, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tintersectObject( object, this, intersects, recursive );\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t},\n\n\t\tintersectObjects: function ( objects, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tif ( Array.isArray( objects ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );\n\t\t\t\treturn intersects;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t\t}\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Clock( autoStart ) {\n\n\t\tthis.autoStart = ( autoStart !== undefined ) ? autoStart : true;\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\tClock.prototype = {\n\n\t\tconstructor: Clock,\n\n\t\tstart: function () {\n\n\t\t\tthis.startTime = ( performance || Date ).now();\n\n\t\t\tthis.oldTime = this.startTime;\n\t\t\tthis.elapsedTime = 0;\n\t\t\tthis.running = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tthis.getElapsedTime();\n\t\t\tthis.running = false;\n\n\t\t},\n\n\t\tgetElapsedTime: function () {\n\n\t\t\tthis.getDelta();\n\t\t\treturn this.elapsedTime;\n\n\t\t},\n\n\t\tgetDelta: function () {\n\n\t\t\tvar diff = 0;\n\n\t\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\t\tthis.start();\n\n\t\t\t}\n\n\t\t\tif ( this.running ) {\n\n\t\t\t\tvar newTime = ( performance || Date ).now();\n\n\t\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\t\tthis.oldTime = newTime;\n\n\t\t\t\tthis.elapsedTime += diff;\n\n\t\t\t}\n\n\t\t\treturn diff;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Spline from Tween.js, slightly optimized (and trashed)\n\t * http://sole.github.com/tween.js/examples/05_spline.html\n\t *\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Spline( points ) {\n\n\t\tthis.points = points;\n\n\t\tvar c = [], v3 = { x: 0, y: 0, z: 0 },\n\t\tpoint, intPoint, weight, w2, w3,\n\t\tpa, pb, pc, pd;\n\n\t\tthis.initFromArray = function ( a ) {\n\n\t\t\tthis.points = [];\n\n\t\t\tfor ( var i = 0; i < a.length; i ++ ) {\n\n\t\t\t\tthis.points[ i ] = { x: a[ i ][ 0 ], y: a[ i ][ 1 ], z: a[ i ][ 2 ] };\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getPoint = function ( k ) {\n\n\t\t\tpoint = ( this.points.length - 1 ) * k;\n\t\t\tintPoint = Math.floor( point );\n\t\t\tweight = point - intPoint;\n\n\t\t\tc[ 0 ] = intPoint === 0 ? intPoint : intPoint - 1;\n\t\t\tc[ 1 ] = intPoint;\n\t\t\tc[ 2 ] = intPoint > this.points.length - 2 ? this.points.length - 1 : intPoint + 1;\n\t\t\tc[ 3 ] = intPoint > this.points.length - 3 ? this.points.length - 1 : intPoint + 2;\n\n\t\t\tpa = this.points[ c[ 0 ] ];\n\t\t\tpb = this.points[ c[ 1 ] ];\n\t\t\tpc = this.points[ c[ 2 ] ];\n\t\t\tpd = this.points[ c[ 3 ] ];\n\n\t\t\tw2 = weight * weight;\n\t\t\tw3 = weight * w2;\n\n\t\t\tv3.x = interpolate( pa.x, pb.x, pc.x, pd.x, weight, w2, w3 );\n\t\t\tv3.y = interpolate( pa.y, pb.y, pc.y, pd.y, weight, w2, w3 );\n\t\t\tv3.z = interpolate( pa.z, pb.z, pc.z, pd.z, weight, w2, w3 );\n\n\t\t\treturn v3;\n\n\t\t};\n\n\t\tthis.getControlPointsArray = function () {\n\n\t\t\tvar i, p, l = this.points.length,\n\t\t\t\tcoords = [];\n\n\t\t\tfor ( i = 0; i < l; i ++ ) {\n\n\t\t\t\tp = this.points[ i ];\n\t\t\t\tcoords[ i ] = [ p.x, p.y, p.z ];\n\n\t\t\t}\n\n\t\t\treturn coords;\n\n\t\t};\n\n\t\t// approximate length by summing linear segments\n\n\t\tthis.getLength = function ( nSubDivisions ) {\n\n\t\t\tvar i, index, nSamples, position,\n\t\t\t\tpoint = 0, intPoint = 0, oldIntPoint = 0,\n\t\t\t\toldPosition = new Vector3(),\n\t\t\t\ttmpVec = new Vector3(),\n\t\t\t\tchunkLengths = [],\n\t\t\t\ttotalLength = 0;\n\n\t\t\t// first point has 0 length\n\n\t\t\tchunkLengths[ 0 ] = 0;\n\n\t\t\tif ( ! nSubDivisions ) nSubDivisions = 100;\n\n\t\t\tnSamples = this.points.length * nSubDivisions;\n\n\t\t\toldPosition.copy( this.points[ 0 ] );\n\n\t\t\tfor ( i = 1; i < nSamples; i ++ ) {\n\n\t\t\t\tindex = i / nSamples;\n\n\t\t\t\tposition = this.getPoint( index );\n\t\t\t\ttmpVec.copy( position );\n\n\t\t\t\ttotalLength += tmpVec.distanceTo( oldPosition );\n\n\t\t\t\toldPosition.copy( position );\n\n\t\t\t\tpoint = ( this.points.length - 1 ) * index;\n\t\t\t\tintPoint = Math.floor( point );\n\n\t\t\t\tif ( intPoint !== oldIntPoint ) {\n\n\t\t\t\t\tchunkLengths[ intPoint ] = totalLength;\n\t\t\t\t\toldIntPoint = intPoint;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// last point ends with total length\n\n\t\t\tchunkLengths[ chunkLengths.length ] = totalLength;\n\n\t\t\treturn { chunks: chunkLengths, total: totalLength };\n\n\t\t};\n\n\t\tthis.reparametrizeByArcLength = function ( samplingCoef ) {\n\n\t\t\tvar i, j,\n\t\t\t\tindex, indexCurrent, indexNext,\n\t\t\t\trealDistance,\n\t\t\t\tsampling, position,\n\t\t\t\tnewpoints = [],\n\t\t\t\ttmpVec = new Vector3(),\n\t\t\t\tsl = this.getLength();\n\n\t\t\tnewpoints.push( tmpVec.copy( this.points[ 0 ] ).clone() );\n\n\t\t\tfor ( i = 1; i < this.points.length; i ++ ) {\n\n\t\t\t\t//tmpVec.copy( this.points[ i - 1 ] );\n\t\t\t\t//linearDistance = tmpVec.distanceTo( this.points[ i ] );\n\n\t\t\t\trealDistance = sl.chunks[ i ] - sl.chunks[ i - 1 ];\n\n\t\t\t\tsampling = Math.ceil( samplingCoef * realDistance / sl.total );\n\n\t\t\t\tindexCurrent = ( i - 1 ) / ( this.points.length - 1 );\n\t\t\t\tindexNext = i / ( this.points.length - 1 );\n\n\t\t\t\tfor ( j = 1; j < sampling - 1; j ++ ) {\n\n\t\t\t\t\tindex = indexCurrent + j * ( 1 / sampling ) * ( indexNext - indexCurrent );\n\n\t\t\t\t\tposition = this.getPoint( index );\n\t\t\t\t\tnewpoints.push( tmpVec.copy( position ).clone() );\n\n\t\t\t\t}\n\n\t\t\t\tnewpoints.push( tmpVec.copy( this.points[ i ] ).clone() );\n\n\t\t\t}\n\n\t\t\tthis.points = newpoints;\n\n\t\t};\n\n\t\t// Catmull-Rom\n\n\t\tfunction interpolate( p0, p1, p2, p3, t, t2, t3 ) {\n\n\t\t\tvar v0 = ( p2 - p0 ) * 0.5,\n\t\t\t\tv1 = ( p3 - p1 ) * 0.5;\n\n\t\t\treturn ( 2 * ( p1 - p2 ) + v0 + v1 ) * t3 + ( - 3 * ( p1 - p2 ) - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n\t *\n\t * The poles (phi) are at the positive and negative y axis.\n\t * The equator starts at positive z.\n\t */\n\n\tfunction Spherical( radius, phi, theta ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0;\n\t\tthis.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere\n\n\t\treturn this;\n\n\t}\n\n\tSpherical.prototype = {\n\n\t\tconstructor: Spherical,\n\n\t\tset: function ( radius, phi, theta ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.phi = phi;\n\t\t\tthis.theta = theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.phi = other.phi;\n\t\t\tthis.theta = other.theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\tmakeSafe: function() {\n\n\t\t\tvar EPS = 0.000001;\n\t\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = vec3.length();\n\n\t\t\tif ( this.radius === 0 ) {\n\n\t\t\t\tthis.theta = 0;\n\t\t\t\tthis.phi = 0;\n\n\t\t\t} else {\n\n\t\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis\n\t\t\t\tthis.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t};\n\n\t/**\r\n\t * @author alteredq / http://alteredqualia.com/\r\n\t */\r\n\r\n\tfunction MorphBlendMesh( geometry, material ) {\n\r\n\t\tMesh.call( this, geometry, material );\r\n\r\n\t\tthis.animationsMap = {};\r\n\t\tthis.animationsList = [];\r\n\r\n\t\t// prepare default animation\r\n\t\t// (all frames played together in 1 second)\r\n\r\n\t\tvar numFrames = this.geometry.morphTargets.length;\r\n\r\n\t\tvar name = \"__default\";\r\n\r\n\t\tvar startFrame = 0;\r\n\t\tvar endFrame = numFrames - 1;\r\n\r\n\t\tvar fps = numFrames / 1;\r\n\r\n\t\tthis.createAnimation( name, startFrame, endFrame, fps );\r\n\t\tthis.setAnimationWeight( name, 1 );\r\n\r\n\t}\r\n\r\n\tMorphBlendMesh.prototype = Object.create( Mesh.prototype );\r\n\tMorphBlendMesh.prototype.constructor = MorphBlendMesh;\r\n\r\n\tMorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) {\r\n\r\n\t\tvar animation = {\r\n\r\n\t\t\tstart: start,\r\n\t\t\tend: end,\r\n\r\n\t\t\tlength: end - start + 1,\r\n\r\n\t\t\tfps: fps,\r\n\t\t\tduration: ( end - start ) / fps,\r\n\r\n\t\t\tlastFrame: 0,\r\n\t\t\tcurrentFrame: 0,\r\n\r\n\t\t\tactive: false,\r\n\r\n\t\t\ttime: 0,\r\n\t\t\tdirection: 1,\r\n\t\t\tweight: 1,\r\n\r\n\t\t\tdirectionBackwards: false,\r\n\t\t\tmirroredLoop: false\r\n\r\n\t\t};\r\n\r\n\t\tthis.animationsMap[ name ] = animation;\r\n\t\tthis.animationsList.push( animation );\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) {\r\n\r\n\t\tvar pattern = /([a-z]+)_?(\\d+)/i;\r\n\r\n\t\tvar firstAnimation, frameRanges = {};\r\n\r\n\t\tvar geometry = this.geometry;\r\n\r\n\t\tfor ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar morph = geometry.morphTargets[ i ];\r\n\t\t\tvar chunks = morph.name.match( pattern );\r\n\r\n\t\t\tif ( chunks && chunks.length > 1 ) {\r\n\r\n\t\t\t\tvar name = chunks[ 1 ];\r\n\r\n\t\t\t\tif ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity };\r\n\r\n\t\t\t\tvar range = frameRanges[ name ];\r\n\r\n\t\t\t\tif ( i < range.start ) range.start = i;\r\n\t\t\t\tif ( i > range.end ) range.end = i;\r\n\r\n\t\t\t\tif ( ! firstAnimation ) firstAnimation = name;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var name in frameRanges ) {\r\n\r\n\t\t\tvar range = frameRanges[ name ];\r\n\t\t\tthis.createAnimation( name, range.start, range.end, fps );\r\n\r\n\t\t}\r\n\r\n\t\tthis.firstAnimation = firstAnimation;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = 1;\r\n\t\t\tanimation.directionBackwards = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = - 1;\r\n\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.fps = fps;\r\n\t\t\tanimation.duration = ( animation.end - animation.start ) / animation.fps;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.duration = duration;\r\n\t\t\tanimation.fps = ( animation.end - animation.start ) / animation.duration;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.weight = weight;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationTime = function ( name, time ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = time;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationTime = function ( name ) {\r\n\r\n\t\tvar time = 0;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\ttime = animation.time;\r\n\r\n\t\t}\r\n\r\n\t\treturn time;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationDuration = function ( name ) {\r\n\r\n\t\tvar duration = - 1;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tduration = animation.duration;\r\n\r\n\t\t}\r\n\r\n\t\treturn duration;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.playAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = 0;\r\n\t\t\tanimation.active = true;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconsole.warn( \"THREE.MorphBlendMesh: animation[\" + name + \"] undefined in .playAnimation()\" );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.stopAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.active = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.update = function ( delta ) {\r\n\r\n\t\tfor ( var i = 0, il = this.animationsList.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar animation = this.animationsList[ i ];\r\n\r\n\t\t\tif ( ! animation.active ) continue;\r\n\r\n\t\t\tvar frameTime = animation.duration / animation.length;\r\n\r\n\t\t\tanimation.time += animation.direction * delta;\r\n\r\n\t\t\tif ( animation.mirroredLoop ) {\r\n\r\n\t\t\t\tif ( animation.time > animation.duration || animation.time < 0 ) {\r\n\r\n\t\t\t\t\tanimation.direction *= - 1;\r\n\r\n\t\t\t\t\tif ( animation.time > animation.duration ) {\r\n\r\n\t\t\t\t\t\tanimation.time = animation.duration;\r\n\t\t\t\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( animation.time < 0 ) {\r\n\r\n\t\t\t\t\t\tanimation.time = 0;\r\n\t\t\t\t\t\tanimation.directionBackwards = false;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tanimation.time = animation.time % animation.duration;\r\n\r\n\t\t\t\tif ( animation.time < 0 ) animation.time += animation.duration;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar keyframe = animation.start + _Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 );\r\n\t\t\tvar weight = animation.weight;\r\n\r\n\t\t\tif ( keyframe !== animation.currentFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = 0;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = 1 * weight;\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ keyframe ] = 0;\r\n\r\n\t\t\t\tanimation.lastFrame = animation.currentFrame;\r\n\t\t\t\tanimation.currentFrame = keyframe;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar mix = ( animation.time % frameTime ) / frameTime;\r\n\r\n\t\t\tif ( animation.directionBackwards ) mix = 1 - mix;\r\n\r\n\t\t\tif ( animation.currentFrame !== animation.lastFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = mix * weight;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = weight;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction ImmediateRenderObject( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.material = material;\n\t\tthis.render = function ( renderCallback ) {};\n\n\t}\n\n\tImmediateRenderObject.prototype = Object.create( Object3D.prototype );\n\tImmediateRenderObject.prototype.constructor = ImmediateRenderObject;\n\n\tImmediateRenderObject.prototype.isImmediateRenderObject = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction VertexNormalsHelper( object, size, hex, linewidth ) {\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xff0000;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( (objGeometry && objGeometry.isGeometry) ) {\n\n\t\t\tnNormals = objGeometry.faces.length * 3;\n\n\t\t} else if ( (objGeometry && objGeometry.isBufferGeometry) ) {\n\n\t\t\tnNormals = objGeometry.attributes.normal.count;\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32Attribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tVertexNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tVertexNormalsHelper.prototype.constructor = VertexNormalsHelper;\n\n\tVertexNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tif ( (objGeometry && objGeometry.isGeometry) ) {\n\n\t\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\t\tvar faces = objGeometry.faces;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar vertex = vertices[ face[ keys[ j ] ] ];\n\n\t\t\t\t\t\tvar normal = face.vertexNormals[ j ];\n\n\t\t\t\t\t\tv1.copy( vertex ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( (objGeometry && objGeometry.isBufferGeometry) ) {\n\n\t\t\t\tvar objPos = objGeometry.attributes.position;\n\n\t\t\t\tvar objNorm = objGeometry.attributes.normal;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\t// for simplicity, ignore index and drawcalls, and render every normal\n\n\t\t\t\tfor ( var j = 0, jl = objPos.count; j < jl; j ++ ) {\n\n\t\t\t\t\tv1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\tv2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) );\n\n\t\t\t\t\tv2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction SpotLightHelper( light ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = [\n\t\t\t0, 0, 0, 0, 0, 1,\n\t\t\t0, 0, 0, 1, 0, 1,\n\t\t\t0, 0, 0, - 1, 0, 1,\n\t\t\t0, 0, 0, 0, 1, 1,\n\t\t\t0, 0, 0, 0, - 1, 1\n\t\t];\n\n\t\tfor ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tvar p1 = ( i / l ) * Math.PI * 2;\n\t\t\tvar 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.addAttribute( 'position', new Float32Attribute( positions, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: 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\tSpotLightHelper.prototype = Object.create( Object3D.prototype );\n\tSpotLightHelper.prototype.constructor = SpotLightHelper;\n\n\tSpotLightHelper.prototype.dispose = function () {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t};\n\n\tSpotLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\t\tvar vector2 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tvar coneLength = this.light.distance ? this.light.distance : 1000;\n\t\t\tvar coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t\tvector.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\t\tthis.cone.lookAt( vector2.sub( vector ) );\n\n\t\t\tthis.cone.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author Sean Griffin / http://twitter.com/sgrif\n\t * @author Michael Guerrero / http://realitymeltdown.com\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction SkeletonHelper( object ) {\n\n\t\tthis.bones = this.getBoneList( object );\n\n\t\tvar geometry = new Geometry();\n\n\t\tfor ( var i = 0; i < this.bones.length; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( (bone.parent && bone.parent.isBone) ) {\n\n\t\t\t\tgeometry.vertices.push( new Vector3() );\n\t\t\t\tgeometry.vertices.push( new Vector3() );\n\t\t\t\tgeometry.colors.push( new Color( 0, 0, 1 ) );\n\t\t\t\tgeometry.colors.push( new Color( 0, 1, 0 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.dynamic = true;\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.root = object;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\n\tSkeletonHelper.prototype = Object.create( LineSegments.prototype );\n\tSkeletonHelper.prototype.constructor = SkeletonHelper;\n\n\tSkeletonHelper.prototype.getBoneList = function( object ) {\n\n\t\tvar boneList = [];\n\n\t\tif ( (object && object.isBone) ) {\n\n\t\t\tboneList.push( object );\n\n\t\t}\n\n\t\tfor ( var i = 0; i < object.children.length; i ++ ) {\n\n\t\t\tboneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) );\n\n\t\t}\n\n\t\treturn boneList;\n\n\t};\n\n\tSkeletonHelper.prototype.update = function () {\n\n\t\tvar geometry = this.geometry;\n\n\t\tvar matrixWorldInv = new Matrix4().getInverse( this.root.matrixWorld );\n\n\t\tvar boneMatrix = new Matrix4();\n\n\t\tvar j = 0;\n\n\t\tfor ( var i = 0; i < this.bones.length; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( (bone.parent && bone.parent.isBone) ) {\n\n\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );\n\t\t\t\tgeometry.vertices[ j ].setFromMatrixPosition( boneMatrix );\n\n\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\tgeometry.vertices[ j + 1 ].setFromMatrixPosition( boneMatrix );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.verticesNeedUpdate = true;\n\n\t\tgeometry.computeBoundingSphere();\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PointLightHelper( light, sphereSize ) {\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar geometry = new SphereBufferGeometry( sphereSize, 4, 2 );\n\t\tvar material = new MeshBasicMaterial( { wireframe: true, fog: false } );\n\t\tmaterial.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/*\n\t\tvar distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\t\tvar distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\t\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\t\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\t\tvar d = 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.scale.set( d, d, d );\n\n\t\t}\n\n\t\tthis.add( this.lightDistance );\n\t\t*/\n\n\t}\n\n\tPointLightHelper.prototype = Object.create( Mesh.prototype );\n\tPointLightHelper.prototype.constructor = PointLightHelper;\n\n\tPointLightHelper.prototype.dispose = function () {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t};\n\n\tPointLightHelper.prototype.update = function () {\n\n\t\tthis.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t/*\n\t\tvar 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\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction HemisphereLightHelper( light, sphereSize ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.colors = [ new Color(), new Color() ];\n\n\t\tvar geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tgeometry.rotateX( - Math.PI / 2 );\n\n\t\tfor ( var i = 0, il = 8; i < il; i ++ ) {\n\n\t\t\tgeometry.faces[ i ].color = this.colors[ i < 4 ? 0 : 1 ];\n\n\t\t}\n\n\t\tvar material = new MeshBasicMaterial( { vertexColors: FaceColors, wireframe: true } );\n\n\t\tthis.lightSphere = new Mesh( geometry, material );\n\t\tthis.add( this.lightSphere );\n\n\t\tthis.update();\n\n\t}\n\n\tHemisphereLightHelper.prototype = Object.create( Object3D.prototype );\n\tHemisphereLightHelper.prototype.constructor = HemisphereLightHelper;\n\n\tHemisphereLightHelper.prototype.dispose = function () {\n\n\t\tthis.lightSphere.geometry.dispose();\n\t\tthis.lightSphere.material.dispose();\n\n\t};\n\n\tHemisphereLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tthis.colors[ 0 ].copy( this.light.color ).multiplyScalar( this.light.intensity );\n\t\t\tthis.colors[ 1 ].copy( this.light.groundColor ).multiplyScalar( this.light.intensity );\n\n\t\t\tthis.lightSphere.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\t\t\tthis.lightSphere.geometry.colorsNeedUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction GridHelper( size, divisions, color1, color2 ) {\n\n\t\tdivisions = divisions || 1;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar center = divisions / 2;\n\t\tvar step = ( size * 2 ) / divisions;\n\t\tvar vertices = [], colors = [];\n\n\t\tfor ( var i = 0, j = 0, k = - size; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - size, 0, k, size, 0, k );\n\t\t\tvertices.push( k, 0, - size, k, 0, size );\n\n\t\t\tvar 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\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32Attribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32Attribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tGridHelper.prototype = Object.create( LineSegments.prototype );\n\tGridHelper.prototype.constructor = GridHelper;\n\n\tGridHelper.prototype.setColors = function () {\n\n\t\tconsole.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction FaceNormalsHelper( object, size, hex, linewidth ) {\n\n\t\t// FaceNormalsHelper only supports THREE.Geometry\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( (objGeometry && objGeometry.isGeometry) ) {\n\n\t\t\tnNormals = objGeometry.faces.length;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' );\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32Attribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\t\tthis.update();\n\n\t}\n\n\tFaceNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tFaceNormalsHelper.prototype.constructor = FaceNormalsHelper;\n\n\tFaceNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\tvar faces = objGeometry.faces;\n\n\t\t\tvar idx = 0;\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar normal = face.normal;\n\n\t\t\t\tv1.copy( vertices[ face.a ] )\n\t\t\t\t\t.add( vertices[ face.b ] )\n\t\t\t\t\t.add( vertices[ face.c ] )\n\t\t\t\t\t.divideScalar( 3 )\n\t\t\t\t\t.applyMatrix4( matrixWorld );\n\n\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction DirectionalLightHelper( light, size ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32Attribute( [\n\t\t\t- size, size, 0,\n\t\t\t size, size, 0,\n\t\t\t size, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.add( new Line( geometry, material ) );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32Attribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.add( new Line( geometry, material ));\n\n\t\tthis.update();\n\n\t}\n\n\tDirectionalLightHelper.prototype = Object.create( Object3D.prototype );\n\tDirectionalLightHelper.prototype.constructor = DirectionalLightHelper;\n\n\tDirectionalLightHelper.prototype.dispose = function () {\n\n\t\tvar lightPlane = this.children[ 0 ];\n\t\tvar targetLine = this.children[ 1 ];\n\n\t\tlightPlane.geometry.dispose();\n\t\tlightPlane.material.dispose();\n\t\ttargetLine.geometry.dispose();\n\t\ttargetLine.material.dispose();\n\n\t};\n\n\tDirectionalLightHelper.prototype.update = function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar v3 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tv1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tv2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t\tv3.subVectors( v2, v1 );\n\n\t\t\tvar lightPlane = this.children[ 0 ];\n\t\t\tvar targetLine = this.children[ 1 ];\n\n\t\t\tlightPlane.lookAt( v3 );\n\t\t\tlightPlane.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\ttargetLine.lookAt( v3 );\n\t\t\ttargetLine.scale.z = v3.length();\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t *\t- shows frustum, line of sight and up of the camera\n\t *\t- suitable for fast updates\n\t * \t- based on frustum visualization in lightgl.js shadowmap example\n\t *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\n\t */\n\n\tfunction CameraHelper( camera ) {\n\n\t\tvar geometry = new Geometry();\n\t\tvar material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } );\n\n\t\tvar pointMap = {};\n\n\t\t// colors\n\n\t\tvar hexFrustum = 0xffaa00;\n\t\tvar hexCone = 0xff0000;\n\t\tvar hexUp = 0x00aaff;\n\t\tvar hexTarget = 0xffffff;\n\t\tvar hexCross = 0x333333;\n\n\t\t// near\n\n\t\taddLine( \"n1\", \"n2\", hexFrustum );\n\t\taddLine( \"n2\", \"n4\", hexFrustum );\n\t\taddLine( \"n4\", \"n3\", hexFrustum );\n\t\taddLine( \"n3\", \"n1\", hexFrustum );\n\n\t\t// far\n\n\t\taddLine( \"f1\", \"f2\", hexFrustum );\n\t\taddLine( \"f2\", \"f4\", hexFrustum );\n\t\taddLine( \"f4\", \"f3\", hexFrustum );\n\t\taddLine( \"f3\", \"f1\", hexFrustum );\n\n\t\t// sides\n\n\t\taddLine( \"n1\", \"f1\", hexFrustum );\n\t\taddLine( \"n2\", \"f2\", hexFrustum );\n\t\taddLine( \"n3\", \"f3\", hexFrustum );\n\t\taddLine( \"n4\", \"f4\", hexFrustum );\n\n\t\t// cone\n\n\t\taddLine( \"p\", \"n1\", hexCone );\n\t\taddLine( \"p\", \"n2\", hexCone );\n\t\taddLine( \"p\", \"n3\", hexCone );\n\t\taddLine( \"p\", \"n4\", hexCone );\n\n\t\t// up\n\n\t\taddLine( \"u1\", \"u2\", hexUp );\n\t\taddLine( \"u2\", \"u3\", hexUp );\n\t\taddLine( \"u3\", \"u1\", hexUp );\n\n\t\t// target\n\n\t\taddLine( \"c\", \"t\", hexTarget );\n\t\taddLine( \"p\", \"c\", hexCross );\n\n\t\t// cross\n\n\t\taddLine( \"cn1\", \"cn2\", hexCross );\n\t\taddLine( \"cn3\", \"cn4\", hexCross );\n\n\t\taddLine( \"cf1\", \"cf2\", hexCross );\n\t\taddLine( \"cf3\", \"cf4\", hexCross );\n\n\t\tfunction addLine( a, b, hex ) {\n\n\t\t\taddPoint( a, hex );\n\t\t\taddPoint( b, hex );\n\n\t\t}\n\n\t\tfunction addPoint( id, hex ) {\n\n\t\t\tgeometry.vertices.push( new Vector3() );\n\t\t\tgeometry.colors.push( new Color( hex ) );\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( geometry.vertices.length - 1 );\n\n\t\t}\n\n\t\tLineSegments.call( this, geometry, material );\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}\n\n\tCameraHelper.prototype = Object.create( LineSegments.prototype );\n\tCameraHelper.prototype.constructor = CameraHelper;\n\n\tCameraHelper.prototype.update = function () {\n\n\t\tvar geometry, pointMap;\n\n\t\tvar vector = new Vector3();\n\t\tvar camera = new Camera();\n\n\t\tfunction setPoint( point, x, y, z ) {\n\n\t\t\tvector.set( x, y, z ).unproject( camera );\n\n\t\t\tvar points = pointMap[ point ];\n\n\t\t\tif ( points !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\t\tgeometry.vertices[ points[ i ] ].copy( vector );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn function update() {\n\n\t\t\tgeometry = this.geometry;\n\t\t\tpointMap = this.pointMap;\n\n\t\t\tvar w = 1, h = 1;\n\n\t\t\t// we need just camera projection matrix\n\t\t\t// world matrix must be identity\n\n\t\t\tcamera.projectionMatrix.copy( this.camera.projectionMatrix );\n\n\t\t\t// center / target\n\n\t\t\tsetPoint( \"c\", 0, 0, - 1 );\n\t\t\tsetPoint( \"t\", 0, 0, 1 );\n\n\t\t\t// near\n\n\t\t\tsetPoint( \"n1\", - w, - h, - 1 );\n\t\t\tsetPoint( \"n2\", w, - h, - 1 );\n\t\t\tsetPoint( \"n3\", - w, h, - 1 );\n\t\t\tsetPoint( \"n4\", w, h, - 1 );\n\n\t\t\t// far\n\n\t\t\tsetPoint( \"f1\", - w, - h, 1 );\n\t\t\tsetPoint( \"f2\", w, - h, 1 );\n\t\t\tsetPoint( \"f3\", - w, h, 1 );\n\t\t\tsetPoint( \"f4\", w, h, 1 );\n\n\t\t\t// up\n\n\t\t\tsetPoint( \"u1\", w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u2\", - w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u3\", 0, h * 2, - 1 );\n\n\t\t\t// cross\n\n\t\t\tsetPoint( \"cf1\", - w, 0, 1 );\n\t\t\tsetPoint( \"cf2\", w, 0, 1 );\n\t\t\tsetPoint( \"cf3\", 0, - h, 1 );\n\t\t\tsetPoint( \"cf4\", 0, h, 1 );\n\n\t\t\tsetPoint( \"cn1\", - w, 0, - 1 );\n\t\t\tsetPoint( \"cn2\", w, 0, - 1 );\n\t\t\tsetPoint( \"cn3\", 0, - h, - 1 );\n\t\t\tsetPoint( \"cn4\", 0, h, - 1 );\n\n\t\t\tgeometry.verticesNeedUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\t// a helper to show the world-axis-aligned bounding box for an object\n\n\tfunction BoundingBoxHelper( object, hex ) {\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0x888888;\n\n\t\tthis.object = object;\n\n\t\tthis.box = new Box3();\n\n\t\tMesh.call( this, new BoxGeometry( 1, 1, 1 ), new MeshBasicMaterial( { color: color, wireframe: true } ) );\n\n\t}\n\n\tBoundingBoxHelper.prototype = Object.create( Mesh.prototype );\n\tBoundingBoxHelper.prototype.constructor = BoundingBoxHelper;\n\n\tBoundingBoxHelper.prototype.update = function () {\n\n\t\tthis.box.setFromObject( this.object );\n\n\t\tthis.box.getSize( this.scale );\n\n\t\tthis.box.getCenter( this.position );\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BoxHelper( object, color ) {\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\n\t\tvar indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\t\tvar positions = new Float32Array( 8 * 3 );\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tthis.update( object );\n\n\t\t}\n\n\t}\n\n\tBoxHelper.prototype = Object.create( LineSegments.prototype );\n\tBoxHelper.prototype.constructor = BoxHelper;\n\n\tBoxHelper.prototype.update = ( function () {\n\n\t\tvar box = new Box3();\n\n\t\treturn function update( object ) {\n\n\t\t\tif ( (object && object.isBox3) ) {\n\n\t\t\t\tbox.copy( object );\n\n\t\t\t} else {\n\n\t\t\t\tbox.setFromObject( object );\n\n\t\t\t}\n\n\t\t\tif ( box.isEmpty() ) return;\n\n\t\t\tvar min = box.min;\n\t\t\tvar max = box.max;\n\n\t\t\t/*\n\t\t\t 5____4\n\t\t\t1/___0/|\n\t\t\t| 6__|_7\n\t\t\t2/___3/\n\n\t\t\t0: max.x, max.y, max.z\n\t\t\t1: min.x, max.y, max.z\n\t\t\t2: min.x, min.y, max.z\n\t\t\t3: max.x, min.y, max.z\n\t\t\t4: max.x, max.y, min.z\n\t\t\t5: min.x, max.y, min.z\n\t\t\t6: min.x, min.y, min.z\n\t\t\t7: max.x, min.y, min.z\n\t\t\t*/\n\n\t\t\tvar position = this.geometry.attributes.position;\n\t\t\tvar array = position.array;\n\n\t\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\tthis.geometry.computeBoundingSphere();\n\n\t\t};\n\n\t} )();\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author zz85 / http://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t *\n\t * Creates an arrow for visualizing directions\n\t *\n\t * Parameters:\n\t * dir - Vector3\n\t * origin - Vector3\n\t * length - Number\n\t * color - color in hex value\n\t * headLength - Number\n\t * headWidth - Number\n\t */\n\n\tvar lineGeometry = new BufferGeometry();\n\tlineGeometry.addAttribute( 'position', new Float32Attribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\tvar coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );\n\tconeGeometry.translate( 0, - 0.5, 0 );\n\n\tfunction ArrowHelper( dir, origin, length, color, headLength, headWidth ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tObject3D.call( this );\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\t\tif ( length === undefined ) length = 1;\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) );\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\tArrowHelper.prototype = Object.create( Object3D.prototype );\n\tArrowHelper.prototype.constructor = ArrowHelper;\n\n\tArrowHelper.prototype.setDirection = ( function () {\n\n\t\tvar axis = new Vector3();\n\t\tvar radians;\n\n\t\treturn function setDirection( dir ) {\n\n\t\t\t// dir is assumed to be normalized\n\n\t\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\taxis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\t\tradians = Math.acos( dir.y );\n\n\t\t\t\tthis.quaternion.setFromAxisAngle( axis, radians );\n\n\t\t\t}\n\n\t\t};\n\n\t}() );\n\n\tArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {\n\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tthis.line.scale.set( 1, Math.max( 0, length - headLength ), 1 );\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\tArrowHelper.prototype.setColor = function ( color ) {\n\n\t\tthis.line.material.color.copy( color );\n\t\tthis.cone.material.color.copy( color );\n\n\t};\n\n\t/**\n\t * @author sroucheray / http://sroucheray.org/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AxisHelper( size ) {\n\n\t\tsize = size || 1;\n\n\t\tvar vertices = new Float32Array( [\n\t\t\t0, 0, 0, size, 0, 0,\n\t\t\t0, 0, 0, 0, size, 0,\n\t\t\t0, 0, 0, 0, 0, size\n\t\t] );\n\n\t\tvar colors = new Float32Array( [\n\t\t\t1, 0, 0, 1, 0.6, 0,\n\t\t\t0, 1, 0, 0.6, 1, 0,\n\t\t\t0, 0, 1, 0, 0.6, 1\n\t\t] );\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tAxisHelper.prototype = Object.create( LineSegments.prototype );\n\tAxisHelper.prototype.constructor = AxisHelper;\n\n\t/**\n\t * @author zz85 https://github.com/zz85\n\t *\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t * cusps and self-intersections in non-uniform catmull rom curves.\n\t * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t *\n\t * curve.type accepts centripetal(default), chordal and catmullrom\n\t * curve.tension is used for catmullrom which defaults to 0.5\n\t */\n\n\tvar CatmullRomCurve3 = ( function() {\n\n\t\tvar\n\t\t\ttmp = new Vector3(),\n\t\t\tpx = new CubicPoly(),\n\t\t\tpy = new CubicPoly(),\n\t\t\tpz = new CubicPoly();\n\n\t\t/*\n\t\tBased on an optimized c++ solution in\n\t\t - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t\t - http://ideone.com/NoEbVM\n\n\t\tThis CubicPoly class could be used for reusing some variables and calculations,\n\t\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\t\twhich can be placed in CurveUtils.\n\t\t*/\n\n\t\tfunction CubicPoly() {}\n\n\t\t/*\n\t\t * Compute coefficients for a cubic polynomial\n\t\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t\t * such that\n\t\t * p(0) = x0, p(1) = x1\n\t\t * and\n\t\t * p'(0) = t0, p'(1) = t1.\n\t\t */\n\t\tCubicPoly.prototype.init = function( x0, x1, t0, t1 ) {\n\n\t\t\tthis.c0 = x0;\n\t\t\tthis.c1 = t0;\n\t\t\tthis.c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\t\tthis.c3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t\t};\n\n\t\tCubicPoly.prototype.initNonuniformCatmullRom = function( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tvar t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tvar t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\t// initCubicPoly\n\t\t\tthis.init( x1, x2, t1, t2 );\n\n\t\t};\n\n\t\t// standard Catmull-Rom spline: interpolate between x1 and x2 with previous/following points x1/x4\n\t\tCubicPoly.prototype.initCatmullRom = function( x0, x1, x2, x3, tension ) {\n\n\t\t\tthis.init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t};\n\n\t\tCubicPoly.prototype.calc = function( t ) {\n\n\t\t\tvar t2 = t * t;\n\t\t\tvar t3 = t2 * t;\n\t\t\treturn this.c0 + this.c1 * t + this.c2 * t2 + this.c3 * t3;\n\n\t\t};\n\n\t\t// Subclass Three.js curve\n\t\treturn Curve.create(\n\n\t\t\tfunction ( p /* array of Vector3 */ ) {\n\n\t\t\t\tthis.points = p || [];\n\t\t\t\tthis.closed = false;\n\n\t\t\t},\n\n\t\t\tfunction ( t ) {\n\n\t\t\t\tvar points = this.points,\n\t\t\t\t\tpoint, intPoint, weight, l;\n\n\t\t\t\tl = points.length;\n\n\t\t\t\tif ( l < 2 ) console.log( 'duh, you need at least 2 points' );\n\n\t\t\t\tpoint = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\t\t\tintPoint = Math.floor( point );\n\t\t\t\tweight = point - intPoint;\n\n\t\t\t\tif ( this.closed ) {\n\n\t\t\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length;\n\n\t\t\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\t\t\tintPoint = l - 2;\n\t\t\t\t\tweight = 1;\n\n\t\t\t\t}\n\n\t\t\t\tvar p0, p1, p2, p3; // 4 points\n\n\t\t\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// extrapolate first point\n\t\t\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\t\t\tp0 = tmp;\n\n\t\t\t\t}\n\n\t\t\t\tp1 = points[ intPoint % l ];\n\t\t\t\tp2 = points[ ( intPoint + 1 ) % l ];\n\n\t\t\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// extrapolate last point\n\t\t\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\t\t\tp3 = tmp;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) {\n\n\t\t\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\t\t\tvar pow = this.type === 'chordal' ? 0.5 : 0.25;\n\t\t\t\t\tvar dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\t\t\tvar dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\t\t\tvar dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t\t\t// safety check for repeated points\n\t\t\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t\t\t} else if ( this.type === 'catmullrom' ) {\n\n\t\t\t\t\tvar tension = this.tension !== undefined ? this.tension : 0.5;\n\t\t\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension );\n\t\t\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension );\n\t\t\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension );\n\n\t\t\t\t}\n\n\t\t\t\tvar v = new Vector3(\n\t\t\t\t\tpx.calc( weight ),\n\t\t\t\t\tpy.calc( weight ),\n\t\t\t\t\tpz.calc( weight )\n\t\t\t\t);\n\n\t\t\t\treturn v;\n\n\t\t\t}\n\n\t\t);\n\n\t} )();\n\n\t/**************************************************************\n\t *\tClosed Spline 3D curve\n\t **************************************************************/\n\n\n\tfunction ClosedSplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Please use THREE.CatmullRomCurve3.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\t\tthis.closed = true;\n\n\t}\n\n\tClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t/**************************************************************\n\t *\tSpline 3D curve\n\t **************************************************************/\n\n\n\tvar SplineCurve3 = Curve.create(\n\n\t\tfunction ( points /* array of Vector3 */ ) {\n\n\t\t\tconsole.warn( 'THREE.SplineCurve3 will be deprecated. Please use THREE.CatmullRomCurve3' );\n\t\t\tthis.points = ( points === undefined ) ? [] : points;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tvar points = this.points;\n\t\t\tvar point = ( points.length - 1 ) * t;\n\n\t\t\tvar intPoint = Math.floor( point );\n\t\t\tvar weight = point - intPoint;\n\n\t\t\tvar point0 = points[ intPoint == 0 ? intPoint : intPoint - 1 ];\n\t\t\tvar point1 = points[ intPoint ];\n\t\t\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\t\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\t\tvar interpolate = CurveUtils.interpolate;\n\n\t\t\treturn new Vector3(\n\t\t\t\tinterpolate( point0.x, point1.x, point2.x, point3.x, weight ),\n\t\t\t\tinterpolate( point0.y, point1.y, point2.y, point3.y, weight ),\n\t\t\t\tinterpolate( point0.z, point1.z, point2.z, point3.z, weight )\n\t\t\t);\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tCubic Bezier 3D curve\n\t **************************************************************/\n\n\tvar CubicBezierCurve3 = Curve.create(\n\n\t\tfunction ( v0, v1, v2, v3 ) {\n\n\t\t\tthis.v0 = v0;\n\t\t\tthis.v1 = v1;\n\t\t\tthis.v2 = v2;\n\t\t\tthis.v3 = v3;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tvar b3 = ShapeUtils.b3;\n\n\t\t\treturn new Vector3(\n\t\t\t\tb3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ),\n\t\t\t\tb3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ),\n\t\t\t\tb3( t, this.v0.z, this.v1.z, this.v2.z, this.v3.z )\n\t\t\t);\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tQuadratic Bezier 3D curve\n\t **************************************************************/\n\n\tvar QuadraticBezierCurve3 = Curve.create(\n\n\t\tfunction ( v0, v1, v2 ) {\n\n\t\t\tthis.v0 = v0;\n\t\t\tthis.v1 = v1;\n\t\t\tthis.v2 = v2;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tvar b2 = ShapeUtils.b2;\n\n\t\t\treturn new Vector3(\n\t\t\t\tb2( t, this.v0.x, this.v1.x, this.v2.x ),\n\t\t\t\tb2( t, this.v0.y, this.v1.y, this.v2.y ),\n\t\t\t\tb2( t, this.v0.z, this.v1.z, this.v2.z )\n\t\t\t);\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tLine3D\n\t **************************************************************/\n\n\tvar LineCurve3 = Curve.create(\n\n\t\tfunction ( v1, v2 ) {\n\n\t\t\tthis.v1 = v1;\n\t\t\tthis.v2 = v2;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tif ( t === 1 ) {\n\n\t\t\t\treturn this.v2.clone();\n\n\t\t\t}\n\n\t\t\tvar vector = new Vector3();\n\n\t\t\tvector.subVectors( this.v2, this.v1 ); // diff\n\t\t\tvector.multiplyScalar( t );\n\t\t\tvector.add( this.v1 );\n\n\t\t\treturn vector;\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tArc curve\n\t **************************************************************/\n\n\tfunction ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tEllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t}\n\n\tArcCurve.prototype = Object.create( EllipseCurve.prototype );\n\tArcCurve.prototype.constructor = ArcCurve;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar SceneUtils = {\n\n\t\tcreateMultiMaterialObject: function ( geometry, materials ) {\n\n\t\t\tvar group = new Group();\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tgroup.add( new Mesh( geometry, materials[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t},\n\n\t\tdetach: function ( child, parent, scene ) {\n\n\t\t\tchild.applyMatrix( parent.matrixWorld );\n\t\t\tparent.remove( child );\n\t\t\tscene.add( child );\n\n\t\t},\n\n\t\tattach: function ( child, scene, parent ) {\n\n\t\t\tvar matrixWorldInverse = new Matrix4();\n\t\t\tmatrixWorldInverse.getInverse( parent.matrixWorld );\n\t\t\tchild.applyMatrix( matrixWorldInverse );\n\n\t\t\tscene.remove( child );\n\t\t\tparent.add( child );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Face4 ( a, b, c, d, normal, color, materialIndex ) {\n\t\tconsole.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' );\n\t\treturn new Face3( a, b, c, normal, color, materialIndex );\n\t}\n\n\tvar LineStrip = 0;\n\n\tvar LinePieces = 1;\n\n\tfunction PointCloud ( geometry, material ) {\n\t\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\t}\n\n\tfunction ParticleSystem ( geometry, material ) {\n\t\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\t}\n\n\tfunction PointCloudMaterial ( parameters ) {\n\t\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\t}\n\n\tfunction ParticleBasicMaterial ( parameters ) {\n\t\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\t}\n\n\tfunction ParticleSystemMaterial ( parameters ) {\n\t\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\t}\n\n\tfunction Vertex ( x, y, z ) {\n\t\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\n\t\treturn new Vector3( x, y, z );\n\t}\n\n\t//\n\n\tfunction EdgesHelper( object, hex ) {\n\t\tconsole.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );\n\t\treturn new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\t}\n\n\tfunction WireframeHelper( object, hex ) {\n\t\tconsole.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );\n\t\treturn new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\t}\n\n\t//\n\n\tObject.assign( Box2.prototype, {\n\t\tcenter: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\t\t},\n\t\tempty: function () {\n\t\t\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\t\t\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\t\t}\n\t} );\n\n\tObject.assign( Box3.prototype, {\n\t\tcenter: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\t\t},\n\t\tempty: function () {\n\t\t\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\t\t}\n\t} );\n\n\tObject.assign( Line3.prototype, {\n\t\tcenter: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\t\t}\n\t} );\n\n\tObject.assign( Matrix3.prototype, {\n\t\tmultiplyVector3: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix3( this );\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\t\t}\n\t} );\n\n\tObject.assign( Matrix4.prototype, {\n\t\textractPosition: function ( m ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\n\t\t\treturn this.copyPosition( m );\n\t\t},\n\t\tsetRotationFromQuaternion: function ( q ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\n\t\t\treturn this.makeRotationFromQuaternion( q );\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.' );\n\t\t\treturn vector.applyProjection( this );\n\t\t},\n\t\tmultiplyVector4: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\t\t},\n\t\trotateAxis: function ( v ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\n\t\t\tv.transformDirection( this );\n\t\t},\n\t\tcrossVector: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\t\t},\n\t\ttranslate: function ( v ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\n\t\t},\n\t\trotateX: function ( angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\n\t\t},\n\t\trotateY: function ( angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\n\t\t},\n\t\trotateZ: function ( angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\n\t\t},\n\t\trotateByAxis: function ( axis, angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\n\t\t}\n\t} );\n\n\tObject.assign( Plane.prototype, {\n\t\tisIntersectionLine: function ( line ) {\n\t\t\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\n\t\t\treturn this.intersectsLine( line );\n\t\t}\n\t} );\n\n\tObject.assign( Quaternion.prototype, {\n\t\tmultiplyVector3: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\n\t\t\treturn vector.applyQuaternion( this );\n\t\t}\n\t} );\n\n\tObject.assign( Ray.prototype, {\n\t\tisIntersectionBox: function ( box ) {\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\t\t},\n\t\tisIntersectionPlane: function ( plane ) {\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\n\t\t\treturn this.intersectsPlane( plane );\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\t\t}\n\t} );\n\n\tObject.assign( Shape.prototype, {\n\t\textrude: function ( options ) {\n\t\t\tconsole.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );\n\t\t\treturn new ExtrudeGeometry( this, options );\n\t\t},\n\t\tmakeGeometry: function ( options ) {\n\t\t\tconsole.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );\n\t\t\treturn new ShapeGeometry( this, options );\n\t\t}\n\t} );\n\n\tObject.assign( Vector3.prototype, {\n\t\tsetEulerFromRotationMatrix: function () {\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\n\t\t},\n\t\tsetEulerFromQuaternion: function () {\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\n\t\t},\n\t\tgetPositionFromMatrix: function ( m ) {\n\t\t\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\n\t\t\treturn this.setFromMatrixPosition( m );\n\t\t},\n\t\tgetScaleFromMatrix: function ( m ) {\n\t\t\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\n\t\t\treturn this.setFromMatrixScale( m );\n\t\t},\n\t\tgetColumnFromMatrix: function ( index, matrix ) {\n\t\t\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\n\t\t\treturn this.setFromMatrixColumn( matrix, index );\n\t\t}\n\t} );\n\n\t//\n\n\tObject.assign( Object3D.prototype, {\n\t\tgetChildByName: function ( name ) {\n\t\t\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\n\t\t\treturn this.getObjectByName( name );\n\t\t},\n\t\trenderDepth: function ( value ) {\n\t\t\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\n\t\t},\n\t\ttranslate: function ( distance, axis ) {\n\t\t\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\n\t\t\treturn this.translateOnAxis( axis, distance );\n\t\t}\n\t} );\n\n\tObject.defineProperties( Object3D.prototype, {\n\t\teulerOrder: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\treturn this.rotation.order;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\tthis.rotation.order = value;\n\t\t\t}\n\t\t},\n\t\tuseQuaternion: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( LOD.prototype, {\n\t\tobjects: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.LOD: .objects has been renamed to .levels.' );\n\t\t\t\treturn this.levels;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tPerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {\n\n\t\tconsole.warn( \"THREE.PerspectiveCamera.setLens is deprecated. \" +\n\t\t\t\t\"Use .setFocalLength and .filmGauge for a photographic setup.\" );\n\n\t\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\n\t\tthis.setFocalLength( focalLength );\n\n\t};\n\n\t//\n\n\tObject.defineProperties( Light.prototype, {\n\t\tonlyShadow: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\n\t\t\t}\n\t\t},\n\t\tshadowCameraFov: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\n\t\t\t\tthis.shadow.camera.fov = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraLeft: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\n\t\t\t\tthis.shadow.camera.left = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraRight: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\n\t\t\t\tthis.shadow.camera.right = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraTop: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\n\t\t\t\tthis.shadow.camera.top = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraBottom: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\n\t\t\t\tthis.shadow.camera.bottom = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraNear: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\n\t\t\t\tthis.shadow.camera.near = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraFar: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\n\t\t\t\tthis.shadow.camera.far = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraVisible: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\n\t\t\t}\n\t\t},\n\t\tshadowBias: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\n\t\t\t\tthis.shadow.bias = value;\n\t\t\t}\n\t\t},\n\t\tshadowDarkness: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\n\t\t\t}\n\t\t},\n\t\tshadowMapWidth: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\n\t\t\t\tthis.shadow.mapSize.width = value;\n\t\t\t}\n\t\t},\n\t\tshadowMapHeight: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\n\t\t\t\tthis.shadow.mapSize.height = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( BufferAttribute.prototype, {\n\t\tlength: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Please use .count.' );\n\t\t\t\treturn this.array.length;\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.assign( BufferGeometry.prototype, {\n\t\taddIndex: function ( index ) {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\n\t\t\tthis.setIndex( index );\n\t\t},\n\t\taddDrawCall: function ( start, count, indexOffset ) {\n\t\t\tif ( indexOffset !== undefined ) {\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\n\t\t\t}\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\n\t\t\tthis.addGroup( start, count );\n\t\t},\n\t\tclearDrawCalls: function () {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\n\t\t\tthis.clearGroups();\n\t\t},\n\t\tcomputeTangents: function () {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );\n\t\t},\n\t\tcomputeOffsets: function () {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\n\t\t}\n\t} );\n\n\tObject.defineProperties( BufferGeometry.prototype, {\n\t\tdrawcalls: {\n\t\t\tget: function () {\n\t\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\t\t\t}\n\t\t},\n\t\toffsets: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( Material.prototype, {\n\t\twrapAround: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\t\t\t}\n\t\t},\n\t\twrapRGB: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapRGB has been removed.' );\n\t\t\t\treturn new Color();\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( MeshPhongMaterial.prototype, {\n\t\tmetal: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( ShaderMaterial.prototype, {\n\t\tderivatives: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\treturn this.extensions.derivatives;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\tthis.extensions.derivatives = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tEventDispatcher.prototype = Object.assign( Object.create( {\n\n\t\t// Note: Extra base ensures these properties are not 'assign'ed.\n\n\t\tconstructor: EventDispatcher,\n\n\t\tapply: function ( target ) {\n\n\t\t\tconsole.warn( \"THREE.EventDispatcher: .apply is deprecated, \" +\n\t\t\t\t\t\"just inherit or Object.assign the prototype to mix-in.\" );\n\n\t\t\tObject.assign( target, this );\n\n\t\t}\n\n\t} ), EventDispatcher.prototype );\n\n\t//\n\n\tObject.defineProperties( Uniform.prototype, {\n\t\tdynamic: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );\n\t\t\t}\n\t\t},\n\t\tonUpdate: {\n\t\t\tvalue: function () {\n\t\t\t\tconsole.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.assign( WebGLRenderer.prototype, {\n\t\tsupportsFloatTextures: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_float' );\n\t\t},\n\t\tsupportsHalfFloatTextures: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_half_float' );\n\t\t},\n\t\tsupportsStandardDerivatives: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_standard_derivatives' );\n\t\t},\n\t\tsupportsCompressedTextureS3TC: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\t\t},\n\t\tsupportsCompressedTexturePVRTC: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\t\t},\n\t\tsupportsBlendMinMax: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\n\t\t\treturn this.extensions.get( 'EXT_blend_minmax' );\n\t\t},\n\t\tsupportsVertexTextures: function () {\n\t\t\treturn this.capabilities.vertexTextures;\n\t\t},\n\t\tsupportsInstancedArrays: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\n\t\t\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\n\t\t},\n\t\tenableScissorTest: function ( boolean ) {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\n\t\t\tthis.setScissorTest( boolean );\n\t\t},\n\t\tinitMaterial: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\n\t\t},\n\t\taddPrePlugin: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\n\t\t},\n\t\taddPostPlugin: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\n\t\t},\n\t\tupdateShadowMap: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\n\t\t}\n\t} );\n\n\tObject.defineProperties( WebGLRenderer.prototype, {\n\t\tshadowMapEnabled: {\n\t\t\tget: function () {\n\t\t\t\treturn this.shadowMap.enabled;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\n\t\t\t\tthis.shadowMap.enabled = value;\n\t\t\t}\n\t\t},\n\t\tshadowMapType: {\n\t\t\tget: function () {\n\t\t\t\treturn this.shadowMap.type;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\n\t\t\t\tthis.shadowMap.type = value;\n\t\t\t}\n\t\t},\n\t\tshadowMapCullFace: {\n\t\t\tget: function () {\n\t\t\t\treturn this.shadowMap.cullFace;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' );\n\t\t\t\tthis.shadowMap.cullFace = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( WebGLShadowMap.prototype, {\n\t\tcullFace: {\n\t\t\tget: function () {\n\t\t\t\treturn this.renderReverseSided ? CullFaceFront : CullFaceBack;\n\t\t\t},\n\t\t\tset: function ( cullFace ) {\n\t\t\t\tvar value = ( cullFace !== CullFaceBack );\n\t\t\t\tconsole.warn( \"WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to \" + value + \".\" );\n\t\t\t\tthis.renderReverseSided = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( WebGLRenderTarget.prototype, {\n\t\twrapS: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\treturn this.texture.wrapS;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\tthis.texture.wrapS = value;\n\t\t\t}\n\t\t},\n\t\twrapT: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\treturn this.texture.wrapT;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\tthis.texture.wrapT = value;\n\t\t\t}\n\t\t},\n\t\tmagFilter: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\treturn this.texture.magFilter;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\tthis.texture.magFilter = value;\n\t\t\t}\n\t\t},\n\t\tminFilter: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\treturn this.texture.minFilter;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\tthis.texture.minFilter = value;\n\t\t\t}\n\t\t},\n\t\tanisotropy: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\treturn this.texture.anisotropy;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\tthis.texture.anisotropy = value;\n\t\t\t}\n\t\t},\n\t\toffset: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\treturn this.texture.offset;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\tthis.texture.offset = value;\n\t\t\t}\n\t\t},\n\t\trepeat: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\treturn this.texture.repeat;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\tthis.texture.repeat = value;\n\t\t\t}\n\t\t},\n\t\tformat: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\treturn this.texture.format;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\tthis.texture.format = value;\n\t\t\t}\n\t\t},\n\t\ttype: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\treturn this.texture.type;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\tthis.texture.type = value;\n\t\t\t}\n\t\t},\n\t\tgenerateMipmaps: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\treturn this.texture.generateMipmaps;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\tthis.texture.generateMipmaps = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.assign( Audio.prototype, {\n\t\tload: function ( file ) {\n\t\t\tconsole.warn( 'THREE.Audio: .load has been deprecated. Please use THREE.AudioLoader.' );\n\t\t\tvar scope = this;\n\t\t\tvar audioLoader = new AudioLoader();\n\t\t\taudioLoader.load( file, function ( buffer ) {\n\t\t\t\tscope.setBuffer( buffer );\n\t\t\t} );\n\t\t\treturn this;\n\t\t}\n\t} );\n\n\tObject.assign( AudioAnalyser.prototype, {\n\t\tgetData: function ( file ) {\n\t\t\tconsole.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );\n\t\t\treturn this.getFrequencyData();\n\t\t}\n\t} );\n\n\t//\n\n\tvar GeometryUtils = {\n\n\t\tmerge: function ( geometry1, geometry2, materialIndexOffset ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );\n\n\t\t\tvar matrix;\n\n\t\t\tif ( geometry2.isMesh ) {\n\n\t\t\t\tgeometry2.matrixAutoUpdate && geometry2.updateMatrix();\n\n\t\t\t\tmatrix = geometry2.matrix;\n\t\t\t\tgeometry2 = geometry2.geometry;\n\n\t\t\t}\n\n\t\t\tgeometry1.merge( geometry2, matrix, materialIndexOffset );\n\n\t\t},\n\n\t\tcenter: function ( geometry ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );\n\t\t\treturn geometry.center();\n\n\t\t}\n\n\t};\n\n\tvar ImageUtils = {\n\n\t\tcrossOrigin: undefined,\n\n\t\tloadTexture: function ( url, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\n\n\t\t\tvar loader = new TextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( url, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadTextureCube: function ( urls, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\n\n\t\t\tvar loader = new CubeTextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( urls, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadCompressedTexture: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t},\n\n\t\tloadCompressedTextureCube: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Projector () {\n\n\t\tconsole.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' );\n\n\t\tthis.projectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .projectVector() is now vector.project().' );\n\t\t\tvector.project( camera );\n\n\t\t};\n\n\t\tthis.unprojectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' );\n\t\t\tvector.unproject( camera );\n\n\t\t};\n\n\t\tthis.pickingRay = function ( vector, camera ) {\n\n\t\t\tconsole.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' );\n\n\t\t};\n\n\t}\n\n\t//\n\n\tfunction CanvasRenderer () {\n\n\t\tconsole.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' );\n\n\t\tthis.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\tthis.clear = function () {};\n\t\tthis.render = function () {};\n\t\tthis.setClearColor = function () {};\n\t\tthis.setSize = function () {};\n\n\t}\n\n\texports.WebGLRenderTargetCube = WebGLRenderTargetCube;\n\texports.WebGLRenderTarget = WebGLRenderTarget;\n\texports.WebGLRenderer = WebGLRenderer;\n\texports.ShaderLib = ShaderLib;\n\texports.UniformsLib = UniformsLib;\n\texports.UniformsUtils = UniformsUtils;\n\texports.ShaderChunk = ShaderChunk;\n\texports.FogExp2 = FogExp2;\n\texports.Fog = Fog;\n\texports.Scene = Scene;\n\texports.LensFlare = LensFlare;\n\texports.Sprite = Sprite;\n\texports.LOD = LOD;\n\texports.SkinnedMesh = SkinnedMesh;\n\texports.Skeleton = Skeleton;\n\texports.Bone = Bone;\n\texports.Mesh = Mesh;\n\texports.LineSegments = LineSegments;\n\texports.Line = Line;\n\texports.Points = Points;\n\texports.Group = Group;\n\texports.VideoTexture = VideoTexture;\n\texports.DataTexture = DataTexture;\n\texports.CompressedTexture = CompressedTexture;\n\texports.CubeTexture = CubeTexture;\n\texports.CanvasTexture = CanvasTexture;\n\texports.DepthTexture = DepthTexture;\n\texports.TextureIdCount = TextureIdCount;\n\texports.Texture = Texture;\n\texports.MaterialIdCount = MaterialIdCount;\n\texports.CompressedTextureLoader = CompressedTextureLoader;\n\texports.BinaryTextureLoader = BinaryTextureLoader;\n\texports.DataTextureLoader = DataTextureLoader;\n\texports.CubeTextureLoader = CubeTextureLoader;\n\texports.TextureLoader = TextureLoader;\n\texports.ObjectLoader = ObjectLoader;\n\texports.MaterialLoader = MaterialLoader;\n\texports.BufferGeometryLoader = BufferGeometryLoader;\n\texports.DefaultLoadingManager = DefaultLoadingManager;\n\texports.LoadingManager = LoadingManager;\n\texports.JSONLoader = JSONLoader;\n\texports.ImageLoader = ImageLoader;\n\texports.FontLoader = FontLoader;\n\texports.XHRLoader = XHRLoader;\n\texports.Loader = Loader;\n\texports.Cache = Cache;\n\texports.AudioLoader = AudioLoader;\n\texports.SpotLightShadow = SpotLightShadow;\n\texports.SpotLight = SpotLight;\n\texports.PointLight = PointLight;\n\texports.HemisphereLight = HemisphereLight;\n\texports.DirectionalLightShadow = DirectionalLightShadow;\n\texports.DirectionalLight = DirectionalLight;\n\texports.AmbientLight = AmbientLight;\n\texports.LightShadow = LightShadow;\n\texports.Light = Light;\n\texports.StereoCamera = StereoCamera;\n\texports.PerspectiveCamera = PerspectiveCamera;\n\texports.OrthographicCamera = OrthographicCamera;\n\texports.CubeCamera = CubeCamera;\n\texports.Camera = Camera;\n\texports.AudioListener = AudioListener;\n\texports.PositionalAudio = PositionalAudio;\n\texports.getAudioContext = getAudioContext;\n\texports.AudioAnalyser = AudioAnalyser;\n\texports.Audio = Audio;\n\texports.VectorKeyframeTrack = VectorKeyframeTrack;\n\texports.StringKeyframeTrack = StringKeyframeTrack;\n\texports.QuaternionKeyframeTrack = QuaternionKeyframeTrack;\n\texports.NumberKeyframeTrack = NumberKeyframeTrack;\n\texports.ColorKeyframeTrack = ColorKeyframeTrack;\n\texports.BooleanKeyframeTrack = BooleanKeyframeTrack;\n\texports.PropertyMixer = PropertyMixer;\n\texports.PropertyBinding = PropertyBinding;\n\texports.KeyframeTrack = KeyframeTrack;\n\texports.AnimationUtils = AnimationUtils;\n\texports.AnimationObjectGroup = AnimationObjectGroup;\n\texports.AnimationMixer = AnimationMixer;\n\texports.AnimationClip = AnimationClip;\n\texports.Uniform = Uniform;\n\texports.InstancedBufferGeometry = InstancedBufferGeometry;\n\texports.BufferGeometry = BufferGeometry;\n\texports.GeometryIdCount = GeometryIdCount;\n\texports.Geometry = Geometry;\n\texports.InterleavedBufferAttribute = InterleavedBufferAttribute;\n\texports.InstancedInterleavedBuffer = InstancedInterleavedBuffer;\n\texports.InterleavedBuffer = InterleavedBuffer;\n\texports.InstancedBufferAttribute = InstancedBufferAttribute;\n\texports.DynamicBufferAttribute = DynamicBufferAttribute;\n\texports.Float64Attribute = Float64Attribute;\n\texports.Float32Attribute = Float32Attribute;\n\texports.Uint32Attribute = Uint32Attribute;\n\texports.Int32Attribute = Int32Attribute;\n\texports.Uint16Attribute = Uint16Attribute;\n\texports.Int16Attribute = Int16Attribute;\n\texports.Uint8ClampedAttribute = Uint8ClampedAttribute;\n\texports.Uint8Attribute = Uint8Attribute;\n\texports.Int8Attribute = Int8Attribute;\n\texports.BufferAttribute = BufferAttribute;\n\texports.Face3 = Face3;\n\texports.Object3DIdCount = Object3DIdCount;\n\texports.Object3D = Object3D;\n\texports.Raycaster = Raycaster;\n\texports.Layers = Layers;\n\texports.EventDispatcher = EventDispatcher;\n\texports.Clock = Clock;\n\texports.QuaternionLinearInterpolant = QuaternionLinearInterpolant;\n\texports.LinearInterpolant = LinearInterpolant;\n\texports.DiscreteInterpolant = DiscreteInterpolant;\n\texports.CubicInterpolant = CubicInterpolant;\n\texports.Interpolant = Interpolant;\n\texports.Triangle = Triangle;\n\texports.Spline = Spline;\n\texports.Math = _Math;\n\texports.Spherical = Spherical;\n\texports.Plane = Plane;\n\texports.Frustum = Frustum;\n\texports.Sphere = Sphere;\n\texports.Ray = Ray;\n\texports.Matrix4 = Matrix4;\n\texports.Matrix3 = Matrix3;\n\texports.Box3 = Box3;\n\texports.Box2 = Box2;\n\texports.Line3 = Line3;\n\texports.Euler = Euler;\n\texports.Vector4 = Vector4;\n\texports.Vector3 = Vector3;\n\texports.Vector2 = Vector2;\n\texports.Quaternion = Quaternion;\n\texports.ColorKeywords = ColorKeywords;\n\texports.Color = Color;\n\texports.MorphBlendMesh = MorphBlendMesh;\n\texports.ImmediateRenderObject = ImmediateRenderObject;\n\texports.VertexNormalsHelper = VertexNormalsHelper;\n\texports.SpotLightHelper = SpotLightHelper;\n\texports.SkeletonHelper = SkeletonHelper;\n\texports.PointLightHelper = PointLightHelper;\n\texports.HemisphereLightHelper = HemisphereLightHelper;\n\texports.GridHelper = GridHelper;\n\texports.FaceNormalsHelper = FaceNormalsHelper;\n\texports.DirectionalLightHelper = DirectionalLightHelper;\n\texports.CameraHelper = CameraHelper;\n\texports.BoundingBoxHelper = BoundingBoxHelper;\n\texports.BoxHelper = BoxHelper;\n\texports.ArrowHelper = ArrowHelper;\n\texports.AxisHelper = AxisHelper;\n\texports.ClosedSplineCurve3 = ClosedSplineCurve3;\n\texports.CatmullRomCurve3 = CatmullRomCurve3;\n\texports.SplineCurve3 = SplineCurve3;\n\texports.CubicBezierCurve3 = CubicBezierCurve3;\n\texports.QuadraticBezierCurve3 = QuadraticBezierCurve3;\n\texports.LineCurve3 = LineCurve3;\n\texports.ArcCurve = ArcCurve;\n\texports.EllipseCurve = EllipseCurve;\n\texports.SplineCurve = SplineCurve;\n\texports.CubicBezierCurve = CubicBezierCurve;\n\texports.QuadraticBezierCurve = QuadraticBezierCurve;\n\texports.LineCurve = LineCurve;\n\texports.Shape = Shape;\n\texports.ShapePath = ShapePath;\n\texports.Path = Path;\n\texports.Font = Font;\n\texports.CurvePath = CurvePath;\n\texports.Curve = Curve;\n\texports.ShapeUtils = ShapeUtils;\n\texports.SceneUtils = SceneUtils;\n\texports.CurveUtils = CurveUtils;\n\texports.WireframeGeometry = WireframeGeometry;\n\texports.ParametricGeometry = ParametricGeometry;\n\texports.ParametricBufferGeometry = ParametricBufferGeometry;\n\texports.TetrahedronGeometry = TetrahedronGeometry;\n\texports.TetrahedronBufferGeometry = TetrahedronBufferGeometry;\n\texports.OctahedronGeometry = OctahedronGeometry;\n\texports.OctahedronBufferGeometry = OctahedronBufferGeometry;\n\texports.IcosahedronGeometry = IcosahedronGeometry;\n\texports.IcosahedronBufferGeometry = IcosahedronBufferGeometry;\n\texports.DodecahedronGeometry = DodecahedronGeometry;\n\texports.DodecahedronBufferGeometry = DodecahedronBufferGeometry;\n\texports.PolyhedronGeometry = PolyhedronGeometry;\n\texports.PolyhedronBufferGeometry = PolyhedronBufferGeometry;\n\texports.TubeGeometry = TubeGeometry;\n\texports.TubeBufferGeometry = TubeBufferGeometry;\n\texports.TorusKnotGeometry = TorusKnotGeometry;\n\texports.TorusKnotBufferGeometry = TorusKnotBufferGeometry;\n\texports.TorusGeometry = TorusGeometry;\n\texports.TorusBufferGeometry = TorusBufferGeometry;\n\texports.TextGeometry = TextGeometry;\n\texports.SphereBufferGeometry = SphereBufferGeometry;\n\texports.SphereGeometry = SphereGeometry;\n\texports.RingGeometry = RingGeometry;\n\texports.RingBufferGeometry = RingBufferGeometry;\n\texports.PlaneBufferGeometry = PlaneBufferGeometry;\n\texports.PlaneGeometry = PlaneGeometry;\n\texports.LatheGeometry = LatheGeometry;\n\texports.LatheBufferGeometry = LatheBufferGeometry;\n\texports.ShapeGeometry = ShapeGeometry;\n\texports.ExtrudeGeometry = ExtrudeGeometry;\n\texports.EdgesGeometry = EdgesGeometry;\n\texports.ConeGeometry = ConeGeometry;\n\texports.ConeBufferGeometry = ConeBufferGeometry;\n\texports.CylinderGeometry = CylinderGeometry;\n\texports.CylinderBufferGeometry = CylinderBufferGeometry;\n\texports.CircleBufferGeometry = CircleBufferGeometry;\n\texports.CircleGeometry = CircleGeometry;\n\texports.BoxBufferGeometry = BoxBufferGeometry;\n\texports.BoxGeometry = BoxGeometry;\n\texports.ShadowMaterial = ShadowMaterial;\n\texports.SpriteMaterial = SpriteMaterial;\n\texports.RawShaderMaterial = RawShaderMaterial;\n\texports.ShaderMaterial = ShaderMaterial;\n\texports.PointsMaterial = PointsMaterial;\n\texports.MultiMaterial = MultiMaterial;\n\texports.MeshPhysicalMaterial = MeshPhysicalMaterial;\n\texports.MeshStandardMaterial = MeshStandardMaterial;\n\texports.MeshPhongMaterial = MeshPhongMaterial;\n\texports.MeshNormalMaterial = MeshNormalMaterial;\n\texports.MeshLambertMaterial = MeshLambertMaterial;\n\texports.MeshDepthMaterial = MeshDepthMaterial;\n\texports.MeshBasicMaterial = MeshBasicMaterial;\n\texports.LineDashedMaterial = LineDashedMaterial;\n\texports.LineBasicMaterial = LineBasicMaterial;\n\texports.Material = Material;\n\texports.REVISION = REVISION;\n\texports.MOUSE = MOUSE;\n\texports.CullFaceNone = CullFaceNone;\n\texports.CullFaceBack = CullFaceBack;\n\texports.CullFaceFront = CullFaceFront;\n\texports.CullFaceFrontBack = CullFaceFrontBack;\n\texports.FrontFaceDirectionCW = FrontFaceDirectionCW;\n\texports.FrontFaceDirectionCCW = FrontFaceDirectionCCW;\n\texports.BasicShadowMap = BasicShadowMap;\n\texports.PCFShadowMap = PCFShadowMap;\n\texports.PCFSoftShadowMap = PCFSoftShadowMap;\n\texports.FrontSide = FrontSide;\n\texports.BackSide = BackSide;\n\texports.DoubleSide = DoubleSide;\n\texports.FlatShading = FlatShading;\n\texports.SmoothShading = SmoothShading;\n\texports.NoColors = NoColors;\n\texports.FaceColors = FaceColors;\n\texports.VertexColors = VertexColors;\n\texports.NoBlending = NoBlending;\n\texports.NormalBlending = NormalBlending;\n\texports.AdditiveBlending = AdditiveBlending;\n\texports.SubtractiveBlending = SubtractiveBlending;\n\texports.MultiplyBlending = MultiplyBlending;\n\texports.CustomBlending = CustomBlending;\n\texports.BlendingMode = BlendingMode;\n\texports.AddEquation = AddEquation;\n\texports.SubtractEquation = SubtractEquation;\n\texports.ReverseSubtractEquation = ReverseSubtractEquation;\n\texports.MinEquation = MinEquation;\n\texports.MaxEquation = MaxEquation;\n\texports.ZeroFactor = ZeroFactor;\n\texports.OneFactor = OneFactor;\n\texports.SrcColorFactor = SrcColorFactor;\n\texports.OneMinusSrcColorFactor = OneMinusSrcColorFactor;\n\texports.SrcAlphaFactor = SrcAlphaFactor;\n\texports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor;\n\texports.DstAlphaFactor = DstAlphaFactor;\n\texports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor;\n\texports.DstColorFactor = DstColorFactor;\n\texports.OneMinusDstColorFactor = OneMinusDstColorFactor;\n\texports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor;\n\texports.NeverDepth = NeverDepth;\n\texports.AlwaysDepth = AlwaysDepth;\n\texports.LessDepth = LessDepth;\n\texports.LessEqualDepth = LessEqualDepth;\n\texports.EqualDepth = EqualDepth;\n\texports.GreaterEqualDepth = GreaterEqualDepth;\n\texports.GreaterDepth = GreaterDepth;\n\texports.NotEqualDepth = NotEqualDepth;\n\texports.MultiplyOperation = MultiplyOperation;\n\texports.MixOperation = MixOperation;\n\texports.AddOperation = AddOperation;\n\texports.NoToneMapping = NoToneMapping;\n\texports.LinearToneMapping = LinearToneMapping;\n\texports.ReinhardToneMapping = ReinhardToneMapping;\n\texports.Uncharted2ToneMapping = Uncharted2ToneMapping;\n\texports.CineonToneMapping = CineonToneMapping;\n\texports.UVMapping = UVMapping;\n\texports.CubeReflectionMapping = CubeReflectionMapping;\n\texports.CubeRefractionMapping = CubeRefractionMapping;\n\texports.EquirectangularReflectionMapping = EquirectangularReflectionMapping;\n\texports.EquirectangularRefractionMapping = EquirectangularRefractionMapping;\n\texports.SphericalReflectionMapping = SphericalReflectionMapping;\n\texports.CubeUVReflectionMapping = CubeUVReflectionMapping;\n\texports.CubeUVRefractionMapping = CubeUVRefractionMapping;\n\texports.TextureMapping = TextureMapping;\n\texports.RepeatWrapping = RepeatWrapping;\n\texports.ClampToEdgeWrapping = ClampToEdgeWrapping;\n\texports.MirroredRepeatWrapping = MirroredRepeatWrapping;\n\texports.TextureWrapping = TextureWrapping;\n\texports.NearestFilter = NearestFilter;\n\texports.NearestMipMapNearestFilter = NearestMipMapNearestFilter;\n\texports.NearestMipMapLinearFilter = NearestMipMapLinearFilter;\n\texports.LinearFilter = LinearFilter;\n\texports.LinearMipMapNearestFilter = LinearMipMapNearestFilter;\n\texports.LinearMipMapLinearFilter = LinearMipMapLinearFilter;\n\texports.TextureFilter = TextureFilter;\n\texports.UnsignedByteType = UnsignedByteType;\n\texports.ByteType = ByteType;\n\texports.ShortType = ShortType;\n\texports.UnsignedShortType = UnsignedShortType;\n\texports.IntType = IntType;\n\texports.UnsignedIntType = UnsignedIntType;\n\texports.FloatType = FloatType;\n\texports.HalfFloatType = HalfFloatType;\n\texports.UnsignedShort4444Type = UnsignedShort4444Type;\n\texports.UnsignedShort5551Type = UnsignedShort5551Type;\n\texports.UnsignedShort565Type = UnsignedShort565Type;\n\texports.UnsignedInt248Type = UnsignedInt248Type;\n\texports.AlphaFormat = AlphaFormat;\n\texports.RGBFormat = RGBFormat;\n\texports.RGBAFormat = RGBAFormat;\n\texports.LuminanceFormat = LuminanceFormat;\n\texports.LuminanceAlphaFormat = LuminanceAlphaFormat;\n\texports.RGBEFormat = RGBEFormat;\n\texports.DepthFormat = DepthFormat;\n\texports.DepthStencilFormat = DepthStencilFormat;\n\texports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format;\n\texports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format;\n\texports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format;\n\texports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format;\n\texports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format;\n\texports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format;\n\texports.RGB_ETC1_Format = RGB_ETC1_Format;\n\texports.LoopOnce = LoopOnce;\n\texports.LoopRepeat = LoopRepeat;\n\texports.LoopPingPong = LoopPingPong;\n\texports.InterpolateDiscrete = InterpolateDiscrete;\n\texports.InterpolateLinear = InterpolateLinear;\n\texports.InterpolateSmooth = InterpolateSmooth;\n\texports.ZeroCurvatureEnding = ZeroCurvatureEnding;\n\texports.ZeroSlopeEnding = ZeroSlopeEnding;\n\texports.WrapAroundEnding = WrapAroundEnding;\n\texports.TrianglesDrawMode = TrianglesDrawMode;\n\texports.TriangleStripDrawMode = TriangleStripDrawMode;\n\texports.TriangleFanDrawMode = TriangleFanDrawMode;\n\texports.LinearEncoding = LinearEncoding;\n\texports.sRGBEncoding = sRGBEncoding;\n\texports.GammaEncoding = GammaEncoding;\n\texports.RGBEEncoding = RGBEEncoding;\n\texports.LogLuvEncoding = LogLuvEncoding;\n\texports.RGBM7Encoding = RGBM7Encoding;\n\texports.RGBM16Encoding = RGBM16Encoding;\n\texports.RGBDEncoding = RGBDEncoding;\n\texports.BasicDepthPacking = BasicDepthPacking;\n\texports.RGBADepthPacking = RGBADepthPacking;\n\texports.CubeGeometry = BoxGeometry;\n\texports.Face4 = Face4;\n\texports.LineStrip = LineStrip;\n\texports.LinePieces = LinePieces;\n\texports.MeshFaceMaterial = MultiMaterial;\n\texports.PointCloud = PointCloud;\n\texports.Particle = Sprite;\n\texports.ParticleSystem = ParticleSystem;\n\texports.PointCloudMaterial = PointCloudMaterial;\n\texports.ParticleBasicMaterial = ParticleBasicMaterial;\n\texports.ParticleSystemMaterial = ParticleSystemMaterial;\n\texports.Vertex = Vertex;\n\texports.EdgesHelper = EdgesHelper;\n\texports.WireframeHelper = WireframeHelper;\n\texports.GeometryUtils = GeometryUtils;\n\texports.ImageUtils = ImageUtils;\n\texports.Projector = Projector;\n\texports.CanvasRenderer = CanvasRenderer;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n\tObject.defineProperty( exports, 'AudioContext', {\n\t\tget: function () {\n\t\t\treturn exports.getAudioContext();\n\t\t}\n\t});\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three/build/three.js\n// module id = 2\n// module chunks = 0","const THREE = require('three');\n\nexport default class Agent {\n constructor(id, pos, vel, goal, size, col) {\n \tthis.id = id;\n this.position = pos;\n this.velocity = vel;\n this.goal = goal\n this.size = size;\n this.markers = [];\n this.color = col;\n this.mesh = null;\n }\n} \n\n\n// WEBPACK FOOTER //\n// ./src/agent.js","export default class Marker {\n\tconstructor(position) {\n\t\tthis.position = position;\n\t\tthis.color = 0xff0000;\n\t\tthis.owned = false;\n\t\tthis.mesh = null;\n\t\tthis.agent = null;\n\t}\n}\n\n\n// WEBPACK FOOTER //\n// ./src/marker.js","const THREE = require('three');\nimport Grid from './grid.js'\nimport Agent from './agent.js'\nimport Marker from './marker.js'\n\nexport default class Crowd {\n constructor(renderengine) {\n \tthis.renderengine = renderengine;\n \tthis.markers = [];\n \tthis.agents = [];\n \tthis.board = new Grid(10.0, 100.0);\n\n \tthis.create_agents();\n \tthis.populate_board();\n \tthis.create_markers();\n \tthis.renderengine.render_plane(100.0);\n \tthis.renderengine.render_agents(this.agents);\n \tthis.renderengine.render_markers(this.markers);\n }\n\n create_agents() {\n \tvar agent_1_pos = new THREE.Vector3(-49, 1, 49);\n \tvar agent_2_pos = new THREE.Vector3(49, 1, 49);\n \tvar agent_1_goal = new THREE.Vector3(49, 0, -49);\n \tvar agent_2_goal = new THREE.Vector3(-49, 0, -49);\n \tvar zero = new THREE.Vector3(0, 0, 0);\n\n \tvar agent_1 = new Agent(0, agent_1_pos, zero, agent_1_goal, 2.0, 0x00ff00);\n \tvar agent_2 = new Agent(1, agent_2_pos, zero, agent_2_goal, 2.0, 0x0000ff);\n\tthis.agents.push(agent_1);\n\tthis.agents.push(agent_2);\n }\n\n populate_board() {\n \tfor (var i = 0; i < this.agents.length; i++) {\n \t\tvar agent = this.agents[i];\n \t\tvar gs = this.board.find_nearest_grid(agent.position.x, agent.position.z);\n \t\tthis.board.grid[gs.z][gs.x].add(agent);\n \t}\n }\n\n create_markers() {\n\tfor (var i = 0; i < 2000; i++) {\n\t\tvar x = Math.random() * 98 - 49;\n\t\tvar z = Math.random() * 98 - 49;\n\t\tvar marker = new Marker(new THREE.Vector3(x, 0.5, z));\n\t\tthis.markers.push(marker);\n\t}\n }\n\n /* \n\tupdate() - for each agent in the crowd, the velocity is calculated based off of the markers that belongs to each agent. \n */ \n update(time) {\n \tthis.update_marker_ownership();\n \tthis.update_agent_velocities(time);\n \tthis.renderengine.update_agents(this.agents);\n \tthis.renderengine.update_markers(this.markers);\n \tthis.reset_ownership();\n }\n\n reset_ownership() {\n \tfor (var i = 0; i < this.agents.length; i++) {\n \t\tthis.agents[i].markers = [];\n \t}\n\n \tfor (var i = 0; i < this.markers.length; i++) {\n \t\tthis.markers[i].owned = false;\n \t\tthis.markers[i].color = 0xff0000;\n \t\tthis.markers[i].agent = null;\n \t}\n }\n\n update_marker_ownership() {\n \tfor (var i = 0; i < this.markers.length; i++) {\n \t\tvar marker = this.markers[i];\n \t\tif (marker.owned) {\n \t\t\tcontinue;\n \t\t}\n \t\tvar ngs = this.board.find_nearest_grid(marker.position.x, marker.position.z);\n \t\tvar top_left = {x: ngs.x -1, z: ngs.z - 1};\n \t\tvar top = {x: ngs.x, z: ngs.z - 1};\n \t\tvar left = {x: ngs.x - 1, z: ngs.z};\n \t\tvar grid = this.board.grid;\n \t\tvar eligible_agents = [];\n \t\tif (top_left.z > -1 && top_left.x > -1 && grid[top_left.z][top_left.x].size > 0) {\n \t\t\tgrid[top_left.z][top_left.x].forEach(function(agent) {\n \t\t\t\teligible_agents.push(agent);\n \t\t\t});\n \t\t}\n \t\tif (top.z > -1 && top.x > -1 && grid[top.z][top.x].size > 0) {\n \t\t\tgrid[top.z][top.x].forEach(function(agent) {\n \t\t\t\teligible_agents.push(agent);\n \t\t\t});\n\t\t}\n \t\tif (left.z > -1 && left.x > -1 && grid[left.z][left.x].size > 0) {\n \t\t\tgrid[left.z][left.x].forEach(function(agent) {\n \t\t\t\teligible_agents.push(agent);\n \t\t\t});\n \t\t}\n \t\tif (ngs.z > -1 && ngs.x > -1 && grid[ngs.z][ngs.x].size > 0) {\n \t\t\tgrid[ngs.z][ngs.x].forEach(function(agent) {\n \t\t\t\teligible_agents.push(agent);\n \t\t\t});\n \t\t}\n \t\tthis.assign_marker_to_agent(eligible_agents, marker);\n \t}\n }\n\n assign_marker_to_agent(agents, marker) {\n \tif (agents.length === 0) {\n \t\tmarker.color = 0xff0000;\n \t\tmarker.owned = false;\n \t\tmarker.agent = null;\n \t\treturn;\n \t}\n \tvar closest = {dist: marker.position.distanceTo(agents[0].position), agent: agents[0]};\n \tagents.forEach(function(agent) {\n \t\tvar test_dist = marker.position.distanceTo(agent.position);\n \t\tif (test_dist < closest.dist) {\n \t\t\tclosest.dist = test_dist;\n \t\t\tclosest.agent = agent;\n \t\t}\n \t});\n \tmarker.agent = closest.agent;\n \tmarker.color = closest.agent.color;\n \tmarker.owned = true;\n \tclosest.agent.markers.push(marker);\n \treturn;\n }\n\n update_agent_velocities(time) {\n \tfor (var i = 0; i < this.agents.length; i++) {\n \t\tvar agent = this.agents[i];\n \t\tif (agent.position.distanceTo(agent.goal) > 2.0) {\n\t \t\tvar old_gs = this.board.find_nearest_grid(agent.position.x, agent.position.z);\n\n\t \t\t// computing total marker influence\n\t \t\tvar G = new THREE.Vector3(agent.goal.x - agent.position.x, 0, agent.goal.z - agent.position.z);\n\t \t\tvar total_weight = 0.0;\n\t \t\tvar total_velocity = new THREE.Vector3(0, 0, 0);\n\t \t\tfor (var j = 0; j < agent.markers.length; j++) {\n\t \t\t\tvar marker = agent.markers[j];\n\t \t\t\tvar m = new THREE.Vector3(marker.position.x - agent.position.x, 0, marker.position.z - agent.position.z);\n\t \t\t\tvar weight = (1.0 + Math.cos(m.angleTo(G))) / (1.0 + m.length());\n\t \t\t\ttotal_weight += weight;\n\t \t\t}\n\t \t\tfor (var j = 0; j < agent.markers.length; j++) {\n\t \t\t\tvar marker = agent.markers[j];\n\t \t\t\tvar m = new THREE.Vector3(marker.position.x - agent.position.x, 0, marker.position.z - agent.position.z);\n\t \t\t\tvar weight = (1.0 + Math.cos(m.angleTo(G))) / (1.0 + m.length());\n\t \t\t\ttotal_velocity.add(m.multiplyScalar(weight / total_weight));\n\t \t\t}\n\t\t\tif (i === 1) {\n\t \t\t}\n\t \t\t// agent.velocity = total_velocity.normalize();\n\t \t\tagent.position.add(total_velocity.multiplyScalar(time).normalize());\n\t \t\t// agent.position.add(G.divideScalar(100.0));\n\t \t\t// check if the movement of this agent causes it to leave its current grid\n\t\t\tvar agent_gs = this.board.find_nearest_grid(agent.position.x, agent.position.z);\n\t\t\tif (old_gs.x !== agent_gs.x || old_gs.z !== agent_gs.z) {\n \t\t\t\tthis.board.grid[old_gs.z][old_gs.x].delete(agent);\n \t\t\t\tthis.board.grid[agent_gs.z][agent_gs.x].add(agent);\n\t\t\t}\n\t \t}\n \t}\n }\n}\n\n\n// WEBPACK FOOTER //\n// ./src/crowd.js","const THREE = require('three');\n\nexport default class RenderEngine {\n\n\tconstructor(scene) {\n\t\tthis.scene = scene;\n \t}\n\n \trender_plane(size) {\n\t \tvar plane_geo = new THREE.PlaneGeometry(size, size);\n\t\tvar plane_mesh = new THREE.Mesh(plane_geo, new THREE.MeshBasicMaterial( {color: 0xcccccc, side: THREE.DoubleSide}));\n\t\tplane_mesh.rotation.x = Math.PI / 2.0;\n\t\tplane_mesh.position.set(0.0, 0.0, 0.0);\n\t\tthis.scene.add(plane_mesh);\n \t}\n\n \trender_agents(agents) {\n\t \tvar cylinder_geo = new THREE.CylinderGeometry(1, 1, 2, 20);\n\t\tvar agent; \n\t\tfor (var i = 0; i < agents.length; i++) {\n\t\t\tagent = new THREE.Mesh(cylinder_geo, new THREE.MeshBasicMaterial( {color: agents[i].color, side: THREE.DoubleSide}));\n\t\t\tagent.position.set(agents[i].position.x, agents[i].position.y, agents[i].position.z);\n\t\t\tagents[i].mesh = agent;\n\t\t\tthis.scene.add(agent);\n\t\t}\n \t}\n \n \trender_markers(markers) {\n\t\tvar cube_geo = new THREE.BoxGeometry(0.5, 0.5, 0.5);\n\t\tvar marker;\n\t\tfor (var i = 0; i < markers.length; i++) {\n\t\t\tmarker = new THREE.Mesh(cube_geo, new THREE.MeshBasicMaterial( {color: markers[i].color, side: THREE.DoubleSide}));\n\t\t\tmarker.position.set(markers[i].position.x, markers[i].position.y, markers[i].position.z);\n\t\t\tmarkers[i].mesh = marker;\n\t\t\tthis.scene.add(marker);\n\t\t}\n \t}\n\n \tupdate_agents(agents) {\n \t\tfor (var i = 0; i < agents.length; i++) {\n \t\t\tvar pos = agents[i].position;\n \t\t\tvar mesh = agents[i].mesh;\n \t\t\tmesh.position.set(pos.x, pos.y, pos.z);\n \t\t\tmesh.geometry.verticesNeedUpdate = true;\n \t\t}\n \t}\n\n \tupdate_markers(markers) {\n \t\tmarkers.forEach(function(marker) {\n \t\t\tmarker.mesh.material.color.setHex(marker.color);\n \t\t});\n \t}\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/renderengine.js","\nconst THREE = require('three');\nconst OrbitControls = require('three-orbit-controls')(THREE)\nimport Stats from 'stats-js'\nimport DAT from 'dat-gui'\n\n// when the scene is done initializing, the function passed as `callback` will be executed\n// then, every frame, the function passed as `update` will be executed\nfunction init(callback, update) {\n var stats = new Stats();\n stats.setMode(1);\n stats.domElement.style.position = 'absolute';\n stats.domElement.style.left = '0px';\n stats.domElement.style.top = '0px';\n document.body.appendChild(stats.domElement);\n\n var gui = new DAT.GUI();\n\n var framework = {\n gui: gui,\n stats: stats\n };\n\n // run this function after the window loads\n window.addEventListener('load', function() {\n\n var scene = new THREE.Scene();\n var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );\n var renderer = new THREE.WebGLRenderer( { antialias: true } );\n renderer.setPixelRatio(window.devicePixelRatio);\n renderer.setSize(window.innerWidth, window.innerHeight);\n renderer.setClearColor(0x020202, 0);\n\n var controls = new OrbitControls(camera, renderer.domElement);\n controls.enableDamping = true;\n controls.enableZoom = true;\n controls.target.set(0, 0, 0);\n controls.rotateSpeed = 0.3;\n controls.zoomSpeed = 1.0;\n controls.panSpeed = 2.0;\n\n document.body.appendChild(renderer.domElement);\n\n // resize the canvas when the window changes\n window.addEventListener('resize', function() {\n camera.aspect = window.innerWidth / window.innerHeight;\n camera.updateProjectionMatrix();\n renderer.setSize(window.innerWidth, window.innerHeight);\n }, false);\n\n // assign THREE.js objects to the object we will return\n framework.scene = scene;\n framework.camera = camera;\n framework.renderer = renderer;\n\n // begin the animation loop\n (function tick() {\n stats.begin();\n update(framework); // perform any requested updates\n renderer.render(scene, camera); // render the scene\n stats.end();\n requestAnimationFrame(tick); // register to call this again when the browser renders a new frame\n })();\n\n // we will pass the scene, gui, renderer, camera, etc... to the callback function\n return callback(framework);\n });\n}\n\nexport default {\n init: init\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/framework.js","// stats.js - http://github.com/mrdoob/stats.js\nvar Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement(\"div\");f.id=\"stats\";f.addEventListener(\"mousedown\",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText=\"width:80px;opacity:0.9;cursor:pointer\";var a=document.createElement(\"div\");a.id=\"fps\";a.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#002\";f.appendChild(a);var i=document.createElement(\"div\");i.id=\"fpsText\";i.style.cssText=\"color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";\ni.innerHTML=\"FPS\";a.appendChild(i);var c=document.createElement(\"div\");c.id=\"fpsGraph\";c.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0ff\";for(a.appendChild(c);74>c.children.length;){var j=document.createElement(\"span\");j.style.cssText=\"width:1px;height:30px;float:left;background-color:#113\";c.appendChild(j)}var d=document.createElement(\"div\");d.id=\"ms\";d.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#020;display:none\";f.appendChild(d);var k=document.createElement(\"div\");\nk.id=\"msText\";k.style.cssText=\"color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";k.innerHTML=\"MS\";d.appendChild(k);var e=document.createElement(\"div\");e.id=\"msGraph\";e.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0f0\";for(d.appendChild(e);74>e.children.length;)j=document.createElement(\"span\"),j.style.cssText=\"width:1px;height:30px;float:left;background-color:#131\",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display=\n\"block\";d.style.display=\"none\";break;case 1:a.style.display=\"none\",d.style.display=\"block\"}};return{REVISION:12,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+\" MS (\"+n+\"-\"+o+\")\";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+\"px\";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+\" FPS (\"+p+\"-\"+q+\")\",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height=\na+\"px\",m=b,r=0);return b},update:function(){l=this.end()}}};\"object\"===typeof module&&(module.exports=Stats);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/stats-js/build/stats.min.js\n// module id = 8\n// module chunks = 0","module.exports = require('./vendor/dat.gui')\nmodule.exports.color = require('./vendor/dat.color')\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/index.js\n// module id = 9\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.gui = dat.gui || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\n/** @namespace */\ndat.controllers = dat.controllers || {};\n\n/** @namespace */\ndat.dom = dat.dom || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\ndat.utils.css = (function () {\n return {\n load: function (url, doc) {\n doc = doc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function(css, doc) {\n doc = doc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = css;\n doc.getElementsByTagName('head')[0].appendChild(injected);\n }\n }\n})();\n\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.controllers.Controller = (function (common) {\n\n /**\n * @class An \"abstract\" class that represents a given property of an object.\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var Controller = function(object, property) {\n\n this.initialValue = object[property];\n\n /**\n * Those who extend this class will put their DOM elements in here.\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n\n /**\n * The object to manipulate\n * @type {Object}\n */\n this.object = object;\n\n /**\n * The name of the property to manipulate\n * @type {String}\n */\n this.property = property;\n\n /**\n * The function to be called on change.\n * @type {Function}\n * @ignore\n */\n this.__onChange = undefined;\n\n /**\n * The function to be called on finishing change.\n * @type {Function}\n * @ignore\n */\n this.__onFinishChange = undefined;\n\n };\n\n common.extend(\n\n Controller.prototype,\n\n /** @lends dat.controllers.Controller.prototype */\n {\n\n /**\n * Specify that a function fire every time someone changes the value with\n * this Controller.\n *\n * @param {Function} fnc This function will be called whenever the value\n * is modified via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onChange: function(fnc) {\n this.__onChange = fnc;\n return this;\n },\n\n /**\n * Specify that a function fire every time someone \"finishes\" changing\n * the value wih this Controller. Useful for values that change\n * incrementally like numbers or strings.\n *\n * @param {Function} fnc This function will be called whenever\n * someone \"finishes\" changing the value via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onFinishChange: function(fnc) {\n this.__onFinishChange = fnc;\n return this;\n },\n\n /**\n * Change the value of object[property]\n *\n * @param {Object} newValue The new value of object[property]\n */\n setValue: function(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n },\n\n /**\n * Gets the value of object[property]\n *\n * @returns {Object} The current value of object[property]\n */\n getValue: function() {\n return this.object[this.property];\n },\n\n /**\n * Refreshes the visual display of a Controller in order to keep sync\n * with the object's current value.\n * @returns {dat.controllers.Controller} this\n */\n updateDisplay: function() {\n return this;\n },\n\n /**\n * @returns {Boolean} true if the value has deviated from initialValue\n */\n isModified: function() {\n return this.initialValue !== this.getValue()\n }\n\n }\n\n );\n\n return Controller;\n\n\n})(dat.utils.common);\n\n\ndat.dom.dom = (function (common) {\n\n var EVENT_MAP = {\n 'HTMLEvents': ['change'],\n 'MouseEvents': ['click','mousemove','mousedown','mouseup', 'mouseover'],\n 'KeyboardEvents': ['keydown']\n };\n\n var EVENT_MAP_INV = {};\n common.each(EVENT_MAP, function(v, k) {\n common.each(v, function(e) {\n EVENT_MAP_INV[e] = k;\n });\n });\n\n var CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\n\n function cssValueToPixels(val) {\n\n if (val === '0' || common.isUndefined(val)) return 0;\n\n var match = val.match(CSS_VALUE_PIXELS);\n\n if (!common.isNull(match)) {\n return parseFloat(match[1]);\n }\n\n // TODO ...ems? %?\n\n return 0;\n\n }\n\n /**\n * @namespace\n * @member dat.dom\n */\n var dom = {\n\n /**\n * \n * @param elem\n * @param selectable\n */\n makeSelectable: function(elem, selectable) {\n\n if (elem === undefined || elem.style === undefined) return;\n\n elem.onselectstart = selectable ? function() {\n return false;\n } : function() {\n };\n\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n\n },\n\n /**\n *\n * @param elem\n * @param horizontal\n * @param vertical\n */\n makeFullscreen: function(elem, horizontal, vertical) {\n\n if (common.isUndefined(horizontal)) horizontal = true;\n if (common.isUndefined(vertical)) vertical = true;\n\n elem.style.position = 'absolute';\n\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n\n },\n\n /**\n *\n * @param elem\n * @param eventType\n * @param params\n */\n fakeEvent: function(elem, eventType, params, aux) {\n params = params || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false,\n params.cancelable || true, window, params.clickCount || 1,\n 0, //screen X\n 0, //screen Y\n clientX, //client X\n clientY, //client Y\n false, false, false, false, 0, null);\n break;\n case 'KeyboardEvents':\n var init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz\n common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false,\n params.cancelable, window,\n params.ctrlKey, params.altKey,\n params.shiftKey, params.metaKey,\n params.keyCode, params.charCode);\n break;\n default:\n evt.initEvent(eventType, params.bubbles || false,\n params.cancelable || true);\n break;\n }\n common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n bind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.addEventListener)\n elem.addEventListener(event, func, bool);\n else if (elem.attachEvent)\n elem.attachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n unbind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.removeEventListener)\n elem.removeEventListener(event, func, bool);\n else if (elem.detachEvent)\n elem.detachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n addClass: function(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) == -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n removeClass: function(elem, className) {\n if (className) {\n if (elem.className === undefined) {\n // elem.className = className;\n } else if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index != -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n\n hasClass: function(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n\n /**\n *\n * @param elem\n */\n getWidth: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-left-width']) +\n cssValueToPixels(style['border-right-width']) +\n cssValueToPixels(style['padding-left']) +\n cssValueToPixels(style['padding-right']) +\n cssValueToPixels(style['width']);\n },\n\n /**\n *\n * @param elem\n */\n getHeight: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-top-width']) +\n cssValueToPixels(style['border-bottom-width']) +\n cssValueToPixels(style['padding-top']) +\n cssValueToPixels(style['padding-bottom']) +\n cssValueToPixels(style['height']);\n },\n\n /**\n *\n * @param elem\n */\n getOffset: function(elem) {\n var offset = {left: 0, top:0};\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n } while (elem = elem.offsetParent);\n }\n return offset;\n },\n\n // http://stackoverflow.com/posts/2684561/revisions\n /**\n * \n * @param elem\n */\n isActive: function(elem) {\n return elem === document.activeElement && ( elem.type || elem.href );\n }\n\n };\n\n return dom;\n\n})(dat.utils.common);\n\n\ndat.controllers.OptionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a select input to alter the property of an object, using a\n * list of accepted values.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object|string[]} options A map of labels to acceptable values, or\n * a list of acceptable string values.\n *\n * @member dat.controllers\n */\n var OptionController = function(object, property, options) {\n\n OptionController.superclass.call(this, object, property);\n\n var _this = this;\n\n /**\n * The drop down menu\n * @ignore\n */\n this.__select = document.createElement('select');\n\n if (common.isArray(options)) {\n var map = {};\n common.each(options, function(element) {\n map[element] = element;\n });\n options = map;\n }\n\n common.each(options, function(value, key) {\n\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n\n });\n\n // Acknowledge original value\n this.updateDisplay();\n\n dom.bind(this.__select, 'change', function() {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n\n this.domElement.appendChild(this.__select);\n\n };\n\n OptionController.superclass = Controller;\n\n common.extend(\n\n OptionController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = OptionController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n },\n\n updateDisplay: function() {\n this.__select.value = this.getValue();\n return OptionController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return OptionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberController = (function (Controller, common) {\n\n /**\n * @class Represents a given property of an object that is a number.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberController = function(object, property, params) {\n\n NumberController.superclass.call(this, object, property);\n\n params = params || {};\n\n this.__min = params.min;\n this.__max = params.max;\n this.__step = params.step;\n\n if (common.isUndefined(this.__step)) {\n\n if (this.initialValue == 0) {\n this.__impliedStep = 1; // What are we, psychics?\n } else {\n // Hey Doug, check this out.\n this.__impliedStep = Math.pow(10, Math.floor(Math.log(this.initialValue)/Math.LN10))/10;\n }\n\n } else {\n\n this.__impliedStep = this.__step;\n\n }\n\n this.__precision = numDecimals(this.__impliedStep);\n\n\n };\n\n NumberController.superclass = Controller;\n\n common.extend(\n\n NumberController.prototype,\n Controller.prototype,\n\n /** @lends dat.controllers.NumberController.prototype */\n {\n\n setValue: function(v) {\n\n if (this.__min !== undefined && v < this.__min) {\n v = this.__min;\n } else if (this.__max !== undefined && v > this.__max) {\n v = this.__max;\n }\n\n if (this.__step !== undefined && v % this.__step != 0) {\n v = Math.round(v / this.__step) * this.__step;\n }\n\n return NumberController.superclass.prototype.setValue.call(this, v);\n\n },\n\n /**\n * Specify a minimum value for object[property].\n *\n * @param {Number} minValue The minimum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n min: function(v) {\n this.__min = v;\n return this;\n },\n\n /**\n * Specify a maximum value for object[property].\n *\n * @param {Number} maxValue The maximum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n max: function(v) {\n this.__max = v;\n return this;\n },\n\n /**\n * Specify a step value that dat.controllers.NumberController\n * increments by.\n *\n * @param {Number} stepValue The step value for\n * dat.controllers.NumberController\n * @default if minimum and maximum specified increment is 1% of the\n * difference otherwise stepValue is 1\n * @returns {dat.controllers.NumberController} this\n */\n step: function(v) {\n this.__step = v;\n return this;\n }\n\n }\n\n );\n\n function numDecimals(x) {\n x = x.toString();\n if (x.indexOf('.') > -1) {\n return x.length - x.indexOf('.') - 1;\n } else {\n return 0;\n }\n }\n\n return NumberController;\n\n})(dat.controllers.Controller,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerBox = (function (NumberController, dom, common) {\n\n /**\n * @class Represents a given property of an object that is a number and\n * provides an input element with which to manipulate it.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerBox = function(object, property, params) {\n\n this.__truncationSuspended = false;\n\n NumberControllerBox.superclass.call(this, object, property, params);\n\n var _this = this;\n\n /**\n * {Number} Previous mouse y position\n * @ignore\n */\n var prev_y;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n // Makes it so manually specified values are not truncated.\n\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'mousedown', onMouseDown);\n dom.bind(this.__input, 'keydown', function(e) {\n\n // When pressing entire, you can be as precise as you want.\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n }\n\n });\n\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!common.isNaN(attempted)) _this.setValue(attempted);\n }\n\n function onBlur() {\n onChange();\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prev_y = e.clientY;\n }\n\n function onMouseDrag(e) {\n\n var diff = prev_y - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n\n prev_y = e.clientY;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n NumberControllerBox.superclass = NumberController;\n\n common.extend(\n\n NumberControllerBox.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return NumberControllerBox.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n function roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n }\n\n return NumberControllerBox;\n\n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerSlider = (function (NumberController, dom, css, common, styleSheet) {\n\n /**\n * @class Represents a given property of an object that is a number, contains\n * a minimum and maximum, and provides a slider element with which to\n * manipulate it. It should be noted that the slider element is made up of\n * <div> tags, not the html5\n * <slider> element.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n * \n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Number} minValue Minimum allowed value\n * @param {Number} maxValue Maximum allowed value\n * @param {Number} stepValue Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerSlider = function(object, property, min, max, step) {\n\n NumberControllerSlider.superclass.call(this, object, property, { min: min, max: max, step: step });\n\n var _this = this;\n\n this.__background = document.createElement('div');\n this.__foreground = document.createElement('div');\n \n\n\n dom.bind(this.__background, 'mousedown', onMouseDown);\n \n dom.addClass(this.__background, 'slider');\n dom.addClass(this.__foreground, 'slider-fg');\n\n function onMouseDown(e) {\n\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n\n onMouseDrag(e);\n }\n\n function onMouseDrag(e) {\n\n e.preventDefault();\n\n var offset = dom.getOffset(_this.__background);\n var width = dom.getWidth(_this.__background);\n \n _this.setValue(\n map(e.clientX, offset.left, offset.left + width, _this.__min, _this.__max)\n );\n\n return false;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.__background.appendChild(this.__foreground);\n this.domElement.appendChild(this.__background);\n\n };\n\n NumberControllerSlider.superclass = NumberController;\n\n /**\n * Injects default stylesheet for slider elements.\n */\n NumberControllerSlider.useDefaultStyles = function() {\n css.inject(styleSheet);\n };\n\n common.extend(\n\n NumberControllerSlider.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n var pct = (this.getValue() - this.__min)/(this.__max - this.__min);\n this.__foreground.style.width = pct*100+'%';\n return NumberControllerSlider.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n\n\n );\n\n function map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n }\n\n return NumberControllerSlider;\n \n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.css,\ndat.utils.common,\n\".slider {\\n box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);\\n height: 1em;\\n border-radius: 1em;\\n background-color: #eee;\\n padding: 0 0.5em;\\n overflow: hidden;\\n}\\n\\n.slider-fg {\\n padding: 1px 0 2px 0;\\n background-color: #aaa;\\n height: 1em;\\n margin-left: -0.5em;\\n padding-right: 0.5em;\\n border-radius: 1em 0 0 1em;\\n}\\n\\n.slider-fg:after {\\n display: inline-block;\\n border-radius: 1em;\\n background-color: #fff;\\n border: 1px solid #aaa;\\n content: '';\\n float: right;\\n margin-right: -1em;\\n margin-top: -1px;\\n height: 0.9em;\\n width: 0.9em;\\n}\");\n\n\ndat.controllers.FunctionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a GUI interface to fire a specified method, a property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var FunctionController = function(object, property, text) {\n\n FunctionController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__button = document.createElement('div');\n this.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(this.__button, 'click', function(e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n\n dom.addClass(this.__button, 'button');\n\n this.domElement.appendChild(this.__button);\n\n\n };\n\n FunctionController.superclass = Controller;\n\n common.extend(\n\n FunctionController.prototype,\n Controller.prototype,\n {\n \n fire: function() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.getValue().call(this.object);\n }\n }\n\n );\n\n return FunctionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.BooleanController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a checkbox input to alter the boolean property of an object.\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var BooleanController = function(object, property) {\n\n BooleanController.superclass.call(this, object, property);\n\n var _this = this;\n this.__prev = this.getValue();\n\n this.__checkbox = document.createElement('input');\n this.__checkbox.setAttribute('type', 'checkbox');\n\n\n dom.bind(this.__checkbox, 'change', onChange, false);\n\n this.domElement.appendChild(this.__checkbox);\n\n // Match original value\n this.updateDisplay();\n\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n\n };\n\n BooleanController.superclass = Controller;\n\n common.extend(\n\n BooleanController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = BooleanController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n },\n\n updateDisplay: function() {\n \n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true; \n } else {\n this.__checkbox.checked = false;\n }\n\n return BooleanController.superclass.prototype.updateDisplay.call(this);\n\n }\n\n\n }\n\n );\n\n return BooleanController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common);\n\n\ndat.GUI = dat.gui.GUI = (function (css, saveDialogueContents, styleSheet, controllerFactory, Controller, BooleanController, FunctionController, NumberControllerBox, NumberControllerSlider, OptionController, ColorController, requestAnimationFrame, CenteredDiv, dom, common) {\n\n css.inject(styleSheet);\n\n /** Outer-most className for GUI's */\n var CSS_NAMESPACE = 'dg';\n\n var HIDE_KEY_CODE = 72;\n\n /** The only value shared between the JS and SCSS. Use caution. */\n var CLOSE_BUTTON_HEIGHT = 20;\n\n var DEFAULT_DEFAULT_PRESET_NAME = 'Default';\n\n var SUPPORTS_LOCAL_STORAGE = (function() {\n try {\n return 'localStorage' in window && window['localStorage'] !== null;\n } catch (e) {\n return false;\n }\n })();\n\n var SAVE_DIALOGUE;\n\n /** Have we yet to create an autoPlace GUI? */\n var auto_place_virgin = true;\n\n /** Fixed position div that auto place GUI's go inside */\n var auto_place_container;\n\n /** Are we hiding the GUI's ? */\n var hide = false;\n\n /** GUI's which should be hidden */\n var hideable_guis = [];\n\n /**\n * A lightweight controller library for JavaScript. It allows you to easily\n * manipulate variables and fire functions on the fly.\n * @class\n *\n * @member dat.gui\n *\n * @param {Object} [params]\n * @param {String} [params.name] The name of this GUI.\n * @param {Object} [params.load] JSON object representing the saved state of\n * this GUI.\n * @param {Boolean} [params.auto=true]\n * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.\n * @param {Boolean} [params.closed] If true, starts closed\n */\n var GUI = function(params) {\n\n var _this = this;\n\n /**\n * Outermost DOM Element\n * @type DOMElement\n */\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n\n dom.addClass(this.domElement, CSS_NAMESPACE);\n\n /**\n * Nested GUI's by name\n * @ignore\n */\n this.__folders = {};\n\n this.__controllers = [];\n\n /**\n * List of objects I'm remembering for save, only used in top level GUI\n * @ignore\n */\n this.__rememberedObjects = [];\n\n /**\n * Maps the index of remembered objects to a map of controllers, only used\n * in top level GUI.\n *\n * @private\n * @ignore\n *\n * @example\n * [\n * {\n * propertyName: Controller,\n * anotherPropertyName: Controller\n * },\n * {\n * propertyName: Controller\n * }\n * ]\n */\n this.__rememberedObjectIndecesToControllers = [];\n\n this.__listening = [];\n\n params = params || {};\n\n // Default parameters\n params = common.defaults(params, {\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n\n params = common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n\n\n if (!common.isUndefined(params.load)) {\n\n // Explicit preset\n if (params.preset) params.load.preset = params.preset;\n\n } else {\n\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n\n }\n\n if (common.isUndefined(params.parent) && params.hideable) {\n hideable_guis.push(this);\n }\n\n // Only root level GUI's are resizable.\n params.resizable = common.isUndefined(params.parent) && params.resizable;\n\n\n if (params.autoPlace && common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;\n\n // Not part of params because I don't want people passing this in via\n // constructor. Should be a 'remembered' value.\n var use_local_storage =\n SUPPORTS_LOCAL_STORAGE &&\n localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n\n Object.defineProperties(this,\n\n /** @lends dat.gui.GUI.prototype */\n {\n\n /**\n * The parent GUI\n * @type dat.gui.GUI\n */\n parent: {\n get: function() {\n return params.parent;\n }\n },\n\n scrollable: {\n get: function() {\n return params.scrollable;\n }\n },\n\n /**\n * Handles GUI's element placement for you\n * @type Boolean\n */\n autoPlace: {\n get: function() {\n return params.autoPlace;\n }\n },\n\n /**\n * The identifier for a set of saved values\n * @type String\n */\n preset: {\n\n get: function() {\n if (_this.parent) {\n return _this.getRoot().preset;\n } else {\n return params.load.preset;\n }\n },\n\n set: function(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n\n },\n\n /**\n * The width of GUI element\n * @type Number\n */\n width: {\n get: function() {\n return params.width;\n },\n set: function(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n\n /**\n * The name of GUI. Used for folders. i.e\n * a folder's name\n * @type String\n */\n name: {\n get: function() {\n return params.name;\n },\n set: function(v) {\n // TODO Check for collisions among sibling folders\n params.name = v;\n if (title_row_name) {\n title_row_name.innerHTML = params.name;\n }\n }\n },\n\n /**\n * Whether the GUI is collapsed or not\n * @type Boolean\n */\n closed: {\n get: function() {\n return params.closed;\n },\n set: function(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n // For browsers that aren't going to respect the CSS transition,\n // Lets just check our height against the window height right off\n // the bat.\n this.onResize();\n\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n\n /**\n * Contains all presets\n * @type Object\n */\n load: {\n get: function() {\n return params.load;\n }\n },\n\n /**\n * Determines whether or not to use localStorage as the means for\n * remembering\n * @type Boolean\n */\n useLocalStorage: {\n\n get: function() {\n return use_local_storage;\n },\n set: function(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n use_local_storage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n\n }\n\n });\n\n // Are we a root level GUI?\n if (common.isUndefined(params.parent)) {\n\n params.closed = false;\n\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n\n // Are we supposed to be loading locally?\n if (SUPPORTS_LOCAL_STORAGE) {\n\n if (use_local_storage) {\n\n _this.useLocalStorage = true;\n\n var saved_gui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n\n if (saved_gui) {\n params.load = JSON.parse(saved_gui);\n }\n\n }\n\n }\n\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n this.domElement.appendChild(this.__closeButton);\n\n dom.bind(this.__closeButton, 'click', function() {\n\n _this.closed = !_this.closed;\n\n\n });\n\n\n // Oh, you're a nested GUI!\n } else {\n\n if (params.closed === undefined) {\n params.closed = true;\n }\n\n var title_row_name = document.createTextNode(params.name);\n dom.addClass(title_row_name, 'controller-name');\n\n var title_row = addRow(_this, title_row_name);\n\n var on_click_title = function(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n\n dom.addClass(title_row, 'title');\n dom.bind(title_row, 'click', on_click_title);\n\n if (!params.closed) {\n this.closed = false;\n }\n\n }\n\n if (params.autoPlace) {\n\n if (common.isUndefined(params.parent)) {\n\n if (auto_place_virgin) {\n auto_place_container = document.createElement('div');\n dom.addClass(auto_place_container, CSS_NAMESPACE);\n dom.addClass(auto_place_container, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(auto_place_container);\n auto_place_virgin = false;\n }\n\n // Put it in the dom for you.\n auto_place_container.appendChild(this.domElement);\n\n // Apply the auto styles\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n\n }\n\n\n // Make it not elastic.\n if (!this.parent) setWidth(_this, params.width);\n\n }\n\n dom.bind(window, 'resize', function() { _this.onResize() });\n dom.bind(this.__ul, 'webkitTransitionEnd', function() { _this.onResize(); });\n dom.bind(this.__ul, 'transitionend', function() { _this.onResize() });\n dom.bind(this.__ul, 'oTransitionEnd', function() { _this.onResize() });\n this.onResize();\n\n\n if (params.resizable) {\n addResizeHandle(this);\n }\n\n function saveToLocalStorage() {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n\n var root = _this.getRoot();\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n common.defer(function() {\n root.width -= 1;\n });\n }\n\n if (!params.parent) {\n resetWidth();\n }\n\n };\n\n GUI.toggleHide = function() {\n\n hide = !hide;\n common.each(hideable_guis, function(gui) {\n gui.domElement.style.zIndex = hide ? -999 : 999;\n gui.domElement.style.opacity = hide ? 0 : 1;\n });\n };\n\n GUI.CLASS_AUTO_PLACE = 'a';\n GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\n GUI.CLASS_MAIN = 'main';\n GUI.CLASS_CONTROLLER_ROW = 'cr';\n GUI.CLASS_TOO_TALL = 'taller-than-window';\n GUI.CLASS_CLOSED = 'closed';\n GUI.CLASS_CLOSE_BUTTON = 'close-button';\n GUI.CLASS_DRAG = 'drag';\n\n GUI.DEFAULT_WIDTH = 245;\n GUI.TEXT_CLOSED = 'Close Controls';\n GUI.TEXT_OPEN = 'Open Controls';\n\n dom.bind(window, 'keydown', function(e) {\n\n if (document.activeElement.type !== 'text' &&\n (e.which === HIDE_KEY_CODE || e.keyCode == HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n\n }, false);\n\n common.extend(\n\n GUI.prototype,\n\n /** @lends dat.gui.GUI */\n {\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.Controller} The new controller that was added.\n * @instance\n */\n add: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n }\n );\n\n },\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.ColorController} The new controller that was added.\n * @instance\n */\n addColor: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n color: true\n }\n );\n\n },\n\n /**\n * @param controller\n * @instance\n */\n remove: function(controller) {\n\n // TODO listening?\n this.__ul.removeChild(controller.__li);\n this.__controllers.slice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n common.defer(function() {\n _this.onResize();\n });\n\n },\n\n destroy: function() {\n\n if (this.autoPlace) {\n auto_place_container.removeChild(this.domElement);\n }\n\n },\n\n /**\n * @param name\n * @returns {dat.gui.GUI} The new folder.\n * @throws {Error} if this GUI already has a folder by the specified\n * name\n * @instance\n */\n addFolder: function(name) {\n\n // We have to prevent collisions on names in order to have a key\n // by which to remember saved values\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' +\n ' name \"' + name + '\"');\n }\n\n var new_gui_params = { name: name, parent: this };\n\n // We need to pass down the autoPlace trait so that we can\n // attach event listeners to open/close folder actions to\n // ensure that a scrollbar appears if the window is too short.\n new_gui_params.autoPlace = this.autoPlace;\n\n // Do we have saved appearance data for this folder?\n\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[name]) { // Did daddy remember me?\n\n // Start me closed if I was closed\n new_gui_params.closed = this.load.folders[name].closed;\n\n // Pass down the loaded data\n new_gui_params.load = this.load.folders[name];\n\n }\n\n var gui = new GUI(new_gui_params);\n this.__folders[name] = gui;\n\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n\n },\n\n open: function() {\n this.closed = false;\n },\n\n close: function() {\n this.closed = true;\n },\n\n onResize: function() {\n\n var root = this.getRoot();\n\n if (root.scrollable) {\n\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n\n common.each(root.__ul.childNodes, function(node) {\n if (! (root.autoPlace && node === root.__save_row))\n h += dom.getHeight(node);\n });\n\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n\n }\n\n if (root.__resize_handle) {\n common.defer(function() {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n\n },\n\n /**\n * Mark objects for saving. The order of these objects cannot change as\n * the GUI grows. When remembering new objects, append them to the end\n * of the list.\n *\n * @param {Object...} objects\n * @throws {Error} if not called on a top level GUI.\n * @instance\n */\n remember: function() {\n\n if (common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;\n }\n\n if (this.parent) {\n throw new Error(\"You can only call remember on a top level GUI.\");\n }\n\n var _this = this;\n\n common.each(Array.prototype.slice.call(arguments), function(object) {\n if (_this.__rememberedObjects.length == 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) == -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n\n if (this.autoPlace) {\n // Set save row width\n setWidth(this, this.width);\n }\n\n },\n\n /**\n * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.\n * @instance\n */\n getRoot: function() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n\n /**\n * @returns {Object} a JSON object representing the current state of\n * this GUI as well as its remembered properties.\n * @instance\n */\n getSaveObject: function() {\n\n var toReturn = this.load;\n\n toReturn.closed = this.closed;\n\n // Am I remembering any values?\n if (this.__rememberedObjects.length > 0) {\n\n toReturn.preset = this.preset;\n\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n\n }\n\n toReturn.folders = {};\n common.each(this.__folders, function(element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n\n return toReturn;\n\n },\n\n save: function() {\n\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n\n },\n\n saveAs: function(presetName) {\n\n if (!this.load.remembered) {\n\n // Retain default values upon first save\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n\n }\n\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n\n },\n\n revert: function(gui) {\n\n common.each(this.__controllers, function(controller) {\n // Make revert work on Default.\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n }, this);\n\n common.each(this.__folders, function(folder) {\n folder.revert(folder);\n });\n\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n\n\n },\n\n listen: function(controller) {\n\n var init = this.__listening.length == 0;\n this.__listening.push(controller);\n if (init) updateDisplays(this.__listening);\n\n }\n\n }\n\n );\n\n function add(gui, object, property, params) {\n\n if (object[property] === undefined) {\n throw new Error(\"Object \" + object + \" has no property \\\"\" + property + \"\\\"\");\n }\n\n var controller;\n\n if (params.color) {\n\n controller = new ColorController(object, property);\n\n } else {\n\n var factoryArgs = [object,property].concat(params.factoryArgs);\n controller = controllerFactory.apply(gui, factoryArgs);\n\n }\n\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n\n recallSavedValue(gui, controller);\n\n dom.addClass(controller.domElement, 'c');\n\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n\n var li = addRow(gui, container, params.before);\n\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n dom.addClass(li, typeof controller.getValue());\n\n augmentController(gui, li, controller);\n\n gui.__controllers.push(controller);\n\n return controller;\n\n }\n\n /**\n * Add a row to the end of the GUI or before another row.\n *\n * @param gui\n * @param [dom] If specified, inserts the dom content in the new row\n * @param [liBefore] If specified, places the new row before another row\n */\n function addRow(gui, dom, liBefore) {\n var li = document.createElement('li');\n if (dom) li.appendChild(dom);\n if (liBefore) {\n gui.__ul.insertBefore(li, params.before);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n }\n\n function augmentController(gui, li, controller) {\n\n controller.__li = li;\n controller.__gui = gui;\n\n common.extend(controller, {\n\n options: function(options) {\n\n if (arguments.length > 1) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [common.toArray(arguments)]\n }\n );\n\n }\n\n if (common.isArray(options) || common.isObject(options)) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [options]\n }\n );\n\n }\n\n },\n\n name: function(v) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = v;\n return controller;\n },\n\n listen: function() {\n controller.__gui.listen(controller);\n return controller;\n },\n\n remove: function() {\n controller.__gui.remove(controller);\n return controller;\n }\n\n });\n\n // All sliders should be accompanied by a box.\n if (controller instanceof NumberControllerSlider) {\n\n var box = new NumberControllerBox(controller.object, controller.property,\n { min: controller.__min, max: controller.__max, step: controller.__step });\n\n common.each(['updateDisplay', 'onChange', 'onFinishChange'], function(method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function() {\n var args = Array.prototype.slice.call(arguments);\n pc.apply(controller, args);\n return pb.apply(box, args);\n }\n });\n\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n\n }\n else if (controller instanceof NumberControllerBox) {\n\n var r = function(returned) {\n\n // Have we defined both boundaries?\n if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {\n\n // Well, then lets just replace this with a slider.\n controller.remove();\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n\n }\n\n return returned;\n\n };\n\n controller.min = common.compose(r, controller.min);\n controller.max = common.compose(r, controller.max);\n\n }\n else if (controller instanceof BooleanController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n\n dom.bind(controller.__checkbox, 'click', function(e) {\n e.stopPropagation(); // Prevents double-toggle\n })\n\n }\n else if (controller instanceof FunctionController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__button, 'click');\n });\n\n dom.bind(li, 'mouseover', function() {\n dom.addClass(controller.__button, 'hover');\n });\n\n dom.bind(li, 'mouseout', function() {\n dom.removeClass(controller.__button, 'hover');\n });\n\n }\n else if (controller instanceof ColorController) {\n\n dom.addClass(li, 'color');\n controller.updateDisplay = common.compose(function(r) {\n li.style.borderLeftColor = controller.__color.toString();\n return r;\n }, controller.updateDisplay);\n\n controller.updateDisplay();\n\n }\n\n controller.setValue = common.compose(function(r) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return r;\n }, controller.setValue);\n\n }\n\n function recallSavedValue(gui, controller) {\n\n // Find the topmost GUI, that's where remembered objects live.\n var root = gui.getRoot();\n\n // Does the object we're controlling match anything we've been told to\n // remember?\n var matched_index = root.__rememberedObjects.indexOf(controller.object);\n\n // Why yes, it does!\n if (matched_index != -1) {\n\n // Let me fetch a map of controllers for thcommon.isObject.\n var controller_map =\n root.__rememberedObjectIndecesToControllers[matched_index];\n\n // Ohp, I believe this is the first controller we've created for this\n // object. Lets make the map fresh.\n if (controller_map === undefined) {\n controller_map = {};\n root.__rememberedObjectIndecesToControllers[matched_index] =\n controller_map;\n }\n\n // Keep track of this controller\n controller_map[controller.property] = controller;\n\n // Okay, now have we saved any values for this controller?\n if (root.load && root.load.remembered) {\n\n var preset_map = root.load.remembered;\n\n // Which preset are we trying to load?\n var preset;\n\n if (preset_map[gui.preset]) {\n\n preset = preset_map[gui.preset];\n\n } else if (preset_map[DEFAULT_DEFAULT_PRESET_NAME]) {\n\n // Uhh, you can have the default instead?\n preset = preset_map[DEFAULT_DEFAULT_PRESET_NAME];\n\n } else {\n\n // Nada.\n\n return;\n\n }\n\n\n // Did the loaded object remember thcommon.isObject?\n if (preset[matched_index] &&\n\n // Did we remember this particular property?\n preset[matched_index][controller.property] !== undefined) {\n\n // We did remember something for this guy ...\n var value = preset[matched_index][controller.property];\n\n // And that's what it is.\n controller.initialValue = value;\n controller.setValue(value);\n\n }\n\n }\n\n }\n\n }\n\n function getLocalStorageHash(gui, key) {\n // TODO how does this deal with multiple GUI's?\n return document.location.href + '.' + key;\n\n }\n\n function addSaveMenu(gui) {\n\n var div = gui.__save_row = document.createElement('li');\n\n dom.addClass(gui.domElement, 'has-save');\n\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n\n dom.addClass(div, 'save-row');\n\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n\n // TODO replace with FunctionController\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n\n var select = gui.__preset_select = document.createElement('select');\n\n if (gui.load && gui.load.remembered) {\n\n common.each(gui.load.remembered, function(value, key) {\n addPresetOption(gui, key, key == gui.preset);\n });\n\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n\n dom.bind(select, 'change', function() {\n\n\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n\n gui.preset = this.value;\n\n });\n\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n\n if (SUPPORTS_LOCAL_STORAGE) {\n\n var saveLocally = document.getElementById('dg-save-locally');\n var explain = document.getElementById('dg-local-explain');\n\n saveLocally.style.display = 'block';\n\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n\n function showHideExplain() {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n }\n\n showHideExplain();\n\n // TODO: Use a boolean controller, fool!\n dom.bind(localStorageCheckBox, 'change', function() {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain();\n });\n\n }\n\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n\n dom.bind(newConstructorTextArea, 'keydown', function(e) {\n if (e.metaKey && (e.which === 67 || e.keyCode == 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n\n dom.bind(gears, 'click', function() {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n\n dom.bind(button, 'click', function() {\n gui.save();\n });\n\n dom.bind(button2, 'click', function() {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) gui.saveAs(presetName);\n });\n\n dom.bind(button3, 'click', function() {\n gui.revert();\n });\n\n// div.appendChild(button2);\n\n }\n\n function addResizeHandle(gui) {\n\n gui.__resize_handle = document.createElement('div');\n\n common.extend(gui.__resize_handle.style, {\n\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n// border: '1px solid blue'\n\n });\n\n var pmouseX;\n\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n\n function dragStart(e) {\n\n e.preventDefault();\n\n pmouseX = e.clientX;\n\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n\n return false;\n\n }\n\n function drag(e) {\n\n e.preventDefault();\n\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n\n return false;\n\n }\n\n function dragStop() {\n\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n\n }\n\n }\n\n function setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n // Auto placed save-rows are position fixed, so we have to\n // set the width manually if we want it to bleed to the edge\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n }\n\n function getCurrentPreset(gui, useInitialValues) {\n\n var toReturn = {};\n\n // For each object I'm remembering\n common.each(gui.__rememberedObjects, function(val, index) {\n\n var saved_values = {};\n\n // The controllers I've made for thcommon.isObject by property\n var controller_map =\n gui.__rememberedObjectIndecesToControllers[index];\n\n // Remember each value for each property\n common.each(controller_map, function(controller, property) {\n saved_values[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n\n // Save the values for thcommon.isObject\n toReturn[index] = saved_values;\n\n });\n\n return toReturn;\n\n }\n\n function addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n }\n\n function setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value == gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n }\n\n function markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n// console.log('mark', modified, opt);\n if (modified) {\n opt.innerHTML = opt.value + \"*\";\n } else {\n opt.innerHTML = opt.value;\n }\n }\n\n function updateDisplays(controllerArray) {\n\n\n if (controllerArray.length != 0) {\n\n requestAnimationFrame(function() {\n updateDisplays(controllerArray);\n });\n\n }\n\n common.each(controllerArray, function(c) {\n c.updateDisplay();\n });\n\n }\n\n return GUI;\n\n})(dat.utils.css,\n\"
\\n\\n Here's the new load parameter for your GUI's constructor:\\n\\n \\n\\n
\\n\\n Automatically save\\n values to localStorage on exit.\\n\\n
The values saved to localStorage will\\n override those passed to dat.GUI's constructor. This makes it\\n easier to work incrementally, but localStorage is fragile,\\n and your friends may not see the same values you do.\\n \\n
\\n \\n
\\n\\n
\",\n\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear;border:0;position:absolute;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save ul{margin-top:27px}.dg.a.has-save ul.closed{margin-top:0}.dg.a .save-row{position:fixed;top:0;z-index:1002}.dg li{-webkit-transition:height 0.1s ease-out;-o-transition:height 0.1s ease-out;-moz-transition:height 0.1s ease-out;transition:height 0.1s ease-out}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:hidden;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li > *{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:9px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\",\ndat.controllers.factory = (function (OptionController, NumberControllerBox, NumberControllerSlider, StringController, FunctionController, BooleanController, common) {\n\n return function(object, property) {\n\n var initialValue = object[property];\n\n // Providing options?\n if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n\n // Providing a map?\n\n if (common.isNumber(initialValue)) {\n\n if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {\n\n // Has min and max.\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n\n } else {\n\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n\n }\n\n }\n\n if (common.isString(initialValue)) {\n return new StringController(object, property);\n }\n\n if (common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n\n if (common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n\n }\n\n })(dat.controllers.OptionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.StringController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a text input to alter the string property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var StringController = function(object, property) {\n\n StringController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n dom.bind(this.__input, 'keyup', onChange);\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n \n\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n StringController.superclass = Controller;\n\n common.extend(\n\n StringController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n // Stops the caret from moving on account of:\n // keyup -> setValue -> updateDisplay\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return StringController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return StringController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common),\ndat.controllers.FunctionController,\ndat.controllers.BooleanController,\ndat.utils.common),\ndat.controllers.Controller,\ndat.controllers.BooleanController,\ndat.controllers.FunctionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.OptionController,\ndat.controllers.ColorController = (function (Controller, dom, Color, interpret, common) {\n\n var ColorController = function(object, property) {\n\n ColorController.superclass.call(this, object, property);\n\n this.__color = new Color(this.getValue());\n this.__temp = new Color(0);\n\n var _this = this;\n\n this.domElement = document.createElement('div');\n\n dom.makeSelectable(this.domElement, false);\n\n this.__selector = document.createElement('div');\n this.__selector.className = 'selector';\n\n this.__saturation_field = document.createElement('div');\n this.__saturation_field.className = 'saturation-field';\n\n this.__field_knob = document.createElement('div');\n this.__field_knob.className = 'field-knob';\n this.__field_knob_border = '2px solid ';\n\n this.__hue_knob = document.createElement('div');\n this.__hue_knob.className = 'hue-knob';\n\n this.__hue_field = document.createElement('div');\n this.__hue_field.className = 'hue-field';\n\n this.__input = document.createElement('input');\n this.__input.type = 'text';\n this.__input_textShadow = '0 1px 1px ';\n\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) { // on enter\n onBlur.call(this);\n }\n });\n\n dom.bind(this.__input, 'blur', onBlur);\n\n dom.bind(this.__selector, 'mousedown', function(e) {\n\n dom\n .addClass(this, 'drag')\n .bind(window, 'mouseup', function(e) {\n dom.removeClass(_this.__selector, 'drag');\n });\n\n });\n\n var value_field = document.createElement('div');\n\n common.extend(this.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n\n common.extend(this.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: this.__field_knob_border + (this.__color.v < .5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n \n common.extend(this.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n\n common.extend(this.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n\n common.extend(value_field.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n \n linearGradient(value_field, 'top', 'rgba(0,0,0,0)', '#000');\n\n common.extend(this.__hue_field.style, {\n width: '15px',\n height: '100px',\n display: 'inline-block',\n border: '1px solid #555',\n cursor: 'ns-resize'\n });\n\n hueGradient(this.__hue_field);\n\n common.extend(this.__input.style, {\n outline: 'none',\n// width: '120px',\n textAlign: 'center',\n// padding: '4px',\n// marginBottom: '6px',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n\n dom.bind(this.__saturation_field, 'mousedown', fieldDown);\n dom.bind(this.__field_knob, 'mousedown', fieldDown);\n\n dom.bind(this.__hue_field, 'mousedown', function(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'mouseup', unbindH);\n });\n\n function fieldDown(e) {\n setSV(e);\n // document.body.style.cursor = 'none';\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'mouseup', unbindSV);\n }\n\n function unbindSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'mouseup', unbindSV);\n // document.body.style.cursor = 'default';\n }\n\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n\n function unbindH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'mouseup', unbindH);\n }\n\n this.__saturation_field.appendChild(value_field);\n this.__selector.appendChild(this.__field_knob);\n this.__selector.appendChild(this.__saturation_field);\n this.__selector.appendChild(this.__hue_field);\n this.__hue_field.appendChild(this.__hue_knob);\n\n this.domElement.appendChild(this.__input);\n this.domElement.appendChild(this.__selector);\n\n this.updateDisplay();\n\n function setSV(e) {\n\n e.preventDefault();\n\n var w = dom.getWidth(_this.__saturation_field);\n var o = dom.getOffset(_this.__saturation_field);\n var s = (e.clientX - o.left + document.body.scrollLeft) / w;\n var v = 1 - (e.clientY - o.top + document.body.scrollTop) / w;\n\n if (v > 1) v = 1;\n else if (v < 0) v = 0;\n\n if (s > 1) s = 1;\n else if (s < 0) s = 0;\n\n _this.__color.v = v;\n _this.__color.s = s;\n\n _this.setValue(_this.__color.toOriginal());\n\n\n return false;\n\n }\n\n function setH(e) {\n\n e.preventDefault();\n\n var s = dom.getHeight(_this.__hue_field);\n var o = dom.getOffset(_this.__hue_field);\n var h = 1 - (e.clientY - o.top + document.body.scrollTop) / s;\n\n if (h > 1) h = 1;\n else if (h < 0) h = 0;\n\n _this.__color.h = h * 360;\n\n _this.setValue(_this.__color.toOriginal());\n\n return false;\n\n }\n\n };\n\n ColorController.superclass = Controller;\n\n common.extend(\n\n ColorController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n\n var i = interpret(this.getValue());\n\n if (i !== false) {\n\n var mismatch = false;\n\n // Check for mismatch on the interpreted value.\n\n common.each(Color.COMPONENTS, function(component) {\n if (!common.isUndefined(i[component]) &&\n !common.isUndefined(this.__color.__state[component]) &&\n i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {}; // break\n }\n }, this);\n\n // If nothing diverges, we keep our previous values\n // for statefulness, otherwise we recalculate fresh\n if (mismatch) {\n common.extend(this.__color.__state, i);\n }\n\n }\n\n common.extend(this.__temp.__state, this.__color.__state);\n\n this.__temp.a = 1;\n\n var flip = (this.__color.v < .5 || this.__color.s > .5) ? 255 : 0;\n var _flip = 255 - flip;\n\n common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip +')'\n });\n\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'\n\n this.__temp.s = 1;\n this.__temp.v = 1;\n\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toString());\n\n common.extend(this.__input.style, {\n backgroundColor: this.__input.value = this.__color.toString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip +')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip +',.7)'\n });\n\n }\n\n }\n\n );\n \n var vendors = ['-moz-','-o-','-webkit-','-ms-',''];\n \n function linearGradient(elem, x, a, b) {\n elem.style.background = '';\n common.each(vendors, function(vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient('+x+', '+a+' 0%, ' + b + ' 100%); ';\n });\n }\n \n function hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n }\n\n\n return ColorController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret,\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common),\ndat.color.interpret,\ndat.utils.common),\ndat.utils.requestAnimationFrame = (function () {\n\n /**\n * requirejs version of Paul Irish's RequestAnimationFrame\n * http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n */\n\n return window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function(callback, element) {\n\n window.setTimeout(callback, 1000 / 60);\n\n };\n})(),\ndat.dom.CenteredDiv = (function (dom, common) {\n\n\n var CenteredDiv = function() {\n\n this.backgroundElement = document.createElement('div');\n common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear'\n });\n\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n\n this.domElement = document.createElement('div');\n common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear'\n });\n\n\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function() {\n _this.hide();\n });\n\n\n };\n\n CenteredDiv.prototype.show = function() {\n\n var _this = this;\n \n\n\n this.backgroundElement.style.display = 'block';\n\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n// this.domElement.style.top = '52%';\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n this.layout();\n\n common.defer(function() {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n\n };\n\n CenteredDiv.prototype.hide = function() {\n\n var _this = this;\n\n var hide = function() {\n\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n\n };\n\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n\n this.backgroundElement.style.opacity = 0;\n// this.domElement.style.top = '48%';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n };\n\n CenteredDiv.prototype.layout = function() {\n this.domElement.style.left = window.innerWidth/2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight/2 - dom.getHeight(this.domElement) / 2 + 'px';\n };\n \n function lockScroll(e) {\n console.log(e);\n }\n\n return CenteredDiv;\n\n})(dat.dom.dom,\ndat.utils.common),\ndat.dom.dom,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.gui.js\n// module id = 10\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.Color = dat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common),\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.color.js\n// module id = 11\n// module chunks = 0","module.exports = function( THREE ) {\n\t/**\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one finger move\n// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n// Pan - right mouse, or arrow keys / touch: three finter swipe\n\n\tfunction OrbitControls( object, domElement ) {\n\n\t\tthis.object = object;\n\n\t\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new THREE.Vector3();\n\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = - Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t//\n\t\t// public methods\n\t\t//\n\n\t\tthis.getPolarAngle = function () {\n\n\t\t\treturn spherical.phi;\n\n\t\t};\n\n\t\tthis.getAzimuthalAngle = function () {\n\n\t\t\treturn spherical.theta;\n\n\t\t};\n\n\t\tthis.reset = function () {\n\n\t\t\tscope.target.copy( scope.target0 );\n\t\t\tscope.object.position.copy( scope.position0 );\n\t\t\tscope.object.zoom = scope.zoom0;\n\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\tscope.update();\n\n\t\t\tstate = STATE.NONE;\n\n\t\t};\n\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\t// so camera.up is the orbit axis\n\t\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\t\tvar quatInverse = quat.clone().inverse();\n\n\t\t\tvar lastPosition = new THREE.Vector3();\n\t\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\t\treturn function update () {\n\n\t\t\t\tvar position = scope.object.position;\n\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t\t// angle from z-axis around y-axis\n\t\t\t\tspherical.setFromVector3( offset );\n\n\t\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t\t}\n\n\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\tspherical.phi += sphericalDelta.phi;\n\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\tspherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) );\n\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tspherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n\t\t\t\tspherical.makeSafe();\n\n\n\t\t\t\tspherical.radius *= scale;\n\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tspherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n\t\t\t\t// move target to panned location\n\t\t\t\tscope.target.add( panOffset );\n\n\t\t\t\toffset.setFromSpherical( spherical );\n\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\t\tsphericalDelta.theta *= ( 1 - scope.dampingFactor );\n\t\t\t\t\tsphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsphericalDelta.set( 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\t\tif ( zoomChanged ||\n\t\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\t\tzoomChanged = false;\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t};\n\n\t\t}();\n\n\t\tthis.dispose = function() {\n\n\t\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\t\tscope.domElement.removeEventListener( 'wheel', onMouseWheel, false );\n\n\t\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t\t};\n\n\t\t//\n\t\t// internals\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tvar changeEvent = { type: 'change' };\n\t\tvar startEvent = { type: 'start' };\n\t\tvar endEvent = { type: 'end' };\n\n\t\tvar STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\n\t\tvar state = STATE.NONE;\n\n\t\tvar EPS = 0.000001;\n\n\t\t// current position in spherical coordinates\n\t\tvar spherical = new THREE.Spherical();\n\t\tvar sphericalDelta = new THREE.Spherical();\n\n\t\tvar scale = 1;\n\t\tvar panOffset = new THREE.Vector3();\n\t\tvar zoomChanged = false;\n\n\t\tvar rotateStart = new THREE.Vector2();\n\t\tvar rotateEnd = new THREE.Vector2();\n\t\tvar rotateDelta = new THREE.Vector2();\n\n\t\tvar panStart = new THREE.Vector2();\n\t\tvar panEnd = new THREE.Vector2();\n\t\tvar panDelta = new THREE.Vector2();\n\n\t\tvar dollyStart = new THREE.Vector2();\n\t\tvar dollyEnd = new THREE.Vector2();\n\t\tvar dollyDelta = new THREE.Vector2();\n\n\t\tfunction getAutoRotationAngle() {\n\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t\t}\n\n\t\tfunction getZoomScale() {\n\n\t\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t\t}\n\n\t\tfunction rotateLeft( angle ) {\n\n\t\t\tsphericalDelta.theta -= angle;\n\n\t\t}\n\n\t\tfunction rotateUp( angle ) {\n\n\t\t\tsphericalDelta.phi -= angle;\n\n\t\t}\n\n\t\tvar panLeft = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panLeft( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t\t\tv.multiplyScalar( - distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\tvar panUp = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panUp( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 1 ); // get Y column of objectMatrix\n\t\t\t\tv.multiplyScalar( distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tvar pan = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\treturn function pan ( deltaX, deltaY ) {\n\n\t\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\t\t// perspective\n\t\t\t\t\tvar position = scope.object.position;\n\t\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n\t\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\t\tscope.enablePan = false;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}();\n\n\t\tfunction dollyIn( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale /= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction dollyOut( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale *= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\n\t\tfunction handleMouseDownRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseDownRotate' );\n\n\t\t\trotateStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseDownDolly' );\n\n\t\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownPan( event ) {\n\n\t\t\t//console.log( 'handleMouseDownPan' );\n\n\t\t\tpanStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveRotate' );\n\n\t\t\trotateEnd.set( event.clientX, event.clientY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveDolly' );\n\n\t\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMovePan( event ) {\n\n\t\t\t//console.log( 'handleMouseMovePan' );\n\n\t\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseUp( event ) {\n\n\t\t\t//console.log( 'handleMouseUp' );\n\n\t\t}\n\n\t\tfunction handleMouseWheel( event ) {\n\n\t\t\t//console.log( 'handleMouseWheel' );\n\n\t\t\tif ( event.deltaY < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleKeyDown( event ) {\n\n\t\t\t//console.log( 'handleKeyDown' );\n\n\t\t\tswitch ( event.keyCode ) {\n\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction handleTouchStartRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchStartRotate' );\n\n\t\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchStartDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchStartDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyStart.set( 0, distance );\n\n\t\t}\n\n\t\tfunction handleTouchStartPan( event ) {\n\n\t\t\t//console.log( 'handleTouchStartPan' );\n\n\t\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveRotate' );\n\n\t\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyEnd.set( 0, distance );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMovePan( event ) {\n\n\t\t\t//console.log( 'handleTouchMovePan' );\n\n\t\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchEnd( event ) {\n\n\t\t\t//console.log( 'handleTouchEnd' );\n\n\t\t}\n\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\n\t\tfunction onMouseDown( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( event.button === scope.mouseButtons.ORBIT ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.ZOOM ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseDownDolly( event );\n\n\t\t\t\tstate = STATE.DOLLY;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\tstate = STATE.PAN;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseMoveRotate( event );\n\n\t\t\t} else if ( state === STATE.DOLLY ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseMoveDolly( event );\n\n\t\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseMovePan( event );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseUp( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleMouseUp( event );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onMouseWheel( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\thandleMouseWheel( event );\n\n\t\t\tscope.dispatchEvent( startEvent ); // not sure why these are here...\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t}\n\n\t\tfunction onKeyDown( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\t\thandleKeyDown( event );\n\n\t\t}\n\n\t\tfunction onTouchStart( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\t// two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\t\thandleTouchStartDolly( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleTouchStartPan( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2: // two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveDolly( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchEnd( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleTouchEnd( event );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onContextMenu( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t}\n\n\t\t//\n\n\t\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\t\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.addEventListener( 'wheel', onMouseWheel, false );\n\n\t\tscope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\t\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t\t// force an update at start\n\n\t\tthis.update();\n\n\t};\n\n\tOrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\n\tOrbitControls.prototype.constructor = OrbitControls;\n\n\tObject.defineProperties( OrbitControls.prototype, {\n\n\t\tcenter: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .center has been renamed to .target' );\n\t\t\t\treturn this.target;\n\n\t\t\t}\n\n\t\t},\n\n\t\t// backward compatibility\n\n\t\tnoZoom: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\treturn ! this.enableZoom;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\tthis.enableZoom = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoRotate: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\treturn ! this.enableRotate;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\tthis.enableRotate = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoPan: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\treturn ! this.enablePan;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\tthis.enablePan = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoKeys: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\treturn ! this.enableKeys;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\tthis.enableKeys = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tstaticMoving : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\treturn ! this.enableDamping;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\tthis.enableDamping = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tdynamicDampingFactor : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\treturn this.dampingFactor;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\tthis.dampingFactor = value;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\treturn OrbitControls;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-orbit-controls/index.js\n// module id = 12\n// module chunks = 0","'use strict';\n\nmodule.exports = function (THREE) {\n\n /**\n * @author mrdoob / http://mrdoob.com/\n */\n THREE.OBJLoader = function (manager) {\n\n this.manager = manager !== undefined ? manager : THREE.DefaultLoadingManager;\n };\n\n THREE.OBJLoader.prototype = {\n\n constructor: THREE.OBJLoader,\n\n load: function load(url, onLoad, onProgress, onError) {\n\n var scope = this;\n\n var loader = new THREE.XHRLoader(scope.manager);\n loader.load(url, function (text) {\n\n onLoad(scope.parse(text));\n }, onProgress, onError);\n },\n\n parse: function parse(text) {\n\n console.time('OBJLoader');\n\n var object,\n objects = [];\n var geometry, material;\n\n function parseVertexIndex(value) {\n\n var index = parseInt(value);\n\n return (index >= 0 ? index - 1 : index + vertices.length / 3) * 3;\n }\n\n function parseNormalIndex(value) {\n\n var index = parseInt(value);\n\n return (index >= 0 ? index - 1 : index + normals.length / 3) * 3;\n }\n\n function parseUVIndex(value) {\n\n var index = parseInt(value);\n\n return (index >= 0 ? index - 1 : index + uvs.length / 2) * 2;\n }\n\n function addVertex(a, b, c) {\n\n geometry.vertices.push(vertices[a], vertices[a + 1], vertices[a + 2], vertices[b], vertices[b + 1], vertices[b + 2], vertices[c], vertices[c + 1], vertices[c + 2]);\n }\n\n function addNormal(a, b, c) {\n\n geometry.normals.push(normals[a], normals[a + 1], normals[a + 2], normals[b], normals[b + 1], normals[b + 2], normals[c], normals[c + 1], normals[c + 2]);\n }\n\n function addUV(a, b, c) {\n\n geometry.uvs.push(uvs[a], uvs[a + 1], uvs[b], uvs[b + 1], uvs[c], uvs[c + 1]);\n }\n\n function addFace(a, b, c, d, ua, ub, uc, ud, na, nb, nc, nd) {\n\n var ia = parseVertexIndex(a);\n var ib = parseVertexIndex(b);\n var ic = parseVertexIndex(c);\n var id;\n\n if (d === undefined) {\n\n addVertex(ia, ib, ic);\n } else {\n\n id = parseVertexIndex(d);\n\n addVertex(ia, ib, id);\n addVertex(ib, ic, id);\n }\n\n if (ua !== undefined) {\n\n ia = parseUVIndex(ua);\n ib = parseUVIndex(ub);\n ic = parseUVIndex(uc);\n\n if (d === undefined) {\n\n addUV(ia, ib, ic);\n } else {\n\n id = parseUVIndex(ud);\n\n addUV(ia, ib, id);\n addUV(ib, ic, id);\n }\n }\n\n if (na !== undefined) {\n\n ia = parseNormalIndex(na);\n ib = parseNormalIndex(nb);\n ic = parseNormalIndex(nc);\n\n if (d === undefined) {\n\n addNormal(ia, ib, ic);\n } else {\n\n id = parseNormalIndex(nd);\n\n addNormal(ia, ib, id);\n addNormal(ib, ic, id);\n }\n }\n }\n\n // create mesh if no objects in text\n\n if (/^o /gm.test(text) === false) {\n\n geometry = {\n vertices: [],\n normals: [],\n uvs: []\n };\n\n material = {\n name: ''\n };\n\n object = {\n name: '',\n geometry: geometry,\n material: material\n };\n\n objects.push(object);\n }\n\n var vertices = [];\n var normals = [];\n var uvs = [];\n\n // v float float float\n\n var vertex_pattern = /v( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)/;\n\n // vn float float float\n\n var normal_pattern = /vn( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)/;\n\n // vt float float\n\n var uv_pattern = /vt( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)/;\n\n // f vertex vertex vertex ...\n\n var face_pattern1 = /f( +-?\\d+)( +-?\\d+)( +-?\\d+)( +-?\\d+)?/;\n\n // f vertex/uv vertex/uv vertex/uv ...\n\n var face_pattern2 = /f( +(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+))?/;\n\n // f vertex/uv/normal vertex/uv/normal vertex/uv/normal ...\n\n var face_pattern3 = /f( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))?/;\n\n // f vertex//normal vertex//normal vertex//normal ...\n\n var face_pattern4 = /f( +(-?\\d+)\\/\\/(-?\\d+))( +(-?\\d+)\\/\\/(-?\\d+))( +(-?\\d+)\\/\\/(-?\\d+))( +(-?\\d+)\\/\\/(-?\\d+))?/;\n\n //\n\n var lines = text.split('\\n');\n\n for (var i = 0; i < lines.length; i++) {\n\n var line = lines[i];\n line = line.trim();\n\n var result;\n\n if (line.length === 0 || line.charAt(0) === '#') {\n\n continue;\n } else if ((result = vertex_pattern.exec(line)) !== null) {\n\n // [\"v 1.0 2.0 3.0\", \"1.0\", \"2.0\", \"3.0\"]\n\n vertices.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3]));\n } else if ((result = normal_pattern.exec(line)) !== null) {\n\n // [\"vn 1.0 2.0 3.0\", \"1.0\", \"2.0\", \"3.0\"]\n\n normals.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3]));\n } else if ((result = uv_pattern.exec(line)) !== null) {\n\n // [\"vt 0.1 0.2\", \"0.1\", \"0.2\"]\n\n uvs.push(parseFloat(result[1]), parseFloat(result[2]));\n } else if ((result = face_pattern1.exec(line)) !== null) {\n\n // [\"f 1 2 3\", \"1\", \"2\", \"3\", undefined]\n\n addFace(result[1], result[2], result[3], result[4]);\n } else if ((result = face_pattern2.exec(line)) !== null) {\n\n // [\"f 1/1 2/2 3/3\", \" 1/1\", \"1\", \"1\", \" 2/2\", \"2\", \"2\", \" 3/3\", \"3\", \"3\", undefined, undefined, undefined]\n\n addFace(result[2], result[5], result[8], result[11], result[3], result[6], result[9], result[12]);\n } else if ((result = face_pattern3.exec(line)) !== null) {\n\n // [\"f 1/1/1 2/2/2 3/3/3\", \" 1/1/1\", \"1\", \"1\", \"1\", \" 2/2/2\", \"2\", \"2\", \"2\", \" 3/3/3\", \"3\", \"3\", \"3\", undefined, undefined, undefined, undefined]\n\n addFace(result[2], result[6], result[10], result[14], result[3], result[7], result[11], result[15], result[4], result[8], result[12], result[16]);\n } else if ((result = face_pattern4.exec(line)) !== null) {\n\n // [\"f 1//1 2//2 3//3\", \" 1//1\", \"1\", \"1\", \" 2//2\", \"2\", \"2\", \" 3//3\", \"3\", \"3\", undefined, undefined, undefined]\n\n addFace(result[2], result[5], result[8], result[11], undefined, undefined, undefined, undefined, result[3], result[6], result[9], result[12]);\n } else if (/^o /.test(line)) {\n\n geometry = {\n vertices: [],\n normals: [],\n uvs: []\n };\n\n material = {\n name: ''\n };\n\n object = {\n name: line.substring(2).trim(),\n geometry: geometry,\n material: material\n };\n\n objects.push(object);\n } else if (/^g /.test(line)) {\n\n // group\n\n } else if (/^usemtl /.test(line)) {\n\n // material\n\n material.name = line.substring(7).trim();\n } else if (/^mtllib /.test(line)) {\n\n // mtl file\n\n } else if (/^s /.test(line)) {\n\n // smooth shading\n\n } else {\n\n // console.log( \"THREE.OBJLoader: Unhandled line \" + line );\n\n }\n }\n\n var container = new THREE.Object3D();\n var l;\n\n for (i = 0, l = objects.length; i < l; i++) {\n\n object = objects[i];\n geometry = object.geometry;\n\n var buffergeometry = new THREE.BufferGeometry();\n\n buffergeometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array(geometry.vertices), 3));\n\n if (geometry.normals.length > 0) {\n\n buffergeometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(geometry.normals), 3));\n }\n\n if (geometry.uvs.length > 0) {\n\n buffergeometry.addAttribute('uv', new THREE.BufferAttribute(new Float32Array(geometry.uvs), 2));\n }\n\n material = new THREE.MeshLambertMaterial({\n color: 0xff0000\n });\n material.name = object.material.name;\n\n var mesh = new THREE.Mesh(buffergeometry, material);\n mesh.name = object.name;\n\n container.add(mesh);\n }\n\n console.timeEnd('OBJLoader');\n\n return container;\n }\n\n };\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-obj-loader/dist/index.js\n// module id = 13\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 2c8bb8e21ffab54f0a10","webpack:///./src/main.js","webpack:///./src/grid.js","webpack:///./~/three/build/three.js","webpack:///./src/agent.js","webpack:///./src/marker.js","webpack:///./src/crowd.js","webpack:///./src/renderengine.js","webpack:///./src/framework.js","webpack:///./~/stats-js/build/stats.min.js","webpack:///./~/dat-gui/index.js","webpack:///./~/dat-gui/vendor/dat.gui.js","webpack:///./~/dat-gui/vendor/dat.color.js","webpack:///./~/three-orbit-controls/index.js","webpack:///./~/three-obj-loader/dist/index.js"],"names":["THREE","require","OBJLoader","crowd","renderengine","time","onLoad","framework","scene","camera","renderer","gui","stats","directionalLight","DirectionalLight","color","setHSL","position","set","multiplyScalar","add","ambientLight","AmbientLight","lookAt","Vector3","onChange","newVal","updateProjectionMatrix","onUpdate","update","init","Grid","cell_size","plane_size","grid_cell_size","grid_len","grid","push","Array","i","j","Set","ws_x","ws_z","tgs","ws_to_tgs","gs_z","Math","round","z","gs_x","x","floor","tgs_x","tgs_z","Agent","id","pos","vel","goal","size","col","velocity","markers","mesh","Marker","owned","agent","Crowd","agents","board","create_agents","populate_board","create_markers","render_plane","render_agents","render_markers","agent_1_pos","agent_2_pos","agent_1_goal","agent_2_goal","zero","agent_1","agent_2","length","gs","find_absolute_grid","random","marker","update_marker_ownership","update_agent_velocities","update_agents","update_markers","reset_ownership","ngs","find_nearest_grid","top_left","top","left","eligible_agents","forEach","assign_marker_to_agent","closest","dist","distanceTo","test_dist","old_gs","G","subVectors","total_weight","total_velocity","m","y","weight","dot","normalize","agent_gs","delete","RenderEngine","plane_geo","PlaneGeometry","plane_mesh","Mesh","MeshBasicMaterial","side","DoubleSide","rotation","PI","cylinder_geo","CylinderGeometry","cube_geo","BoxGeometry","geometry","verticesNeedUpdate","material","setHex","OrbitControls","callback","setMode","domElement","style","document","body","appendChild","GUI","window","addEventListener","Scene","PerspectiveCamera","innerWidth","innerHeight","WebGLRenderer","antialias","setPixelRatio","devicePixelRatio","setSize","setClearColor","controls","enableDamping","enableZoom","target","rotateSpeed","zoomSpeed","panSpeed","aspect","tick","begin","render","end","requestAnimationFrame"],"mappings":"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AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,qBAAoB,QAAQ;;AAE5B;;AAEA;;AAEA,OAAM;;AAEN;;AAEA,OAAM;;AAEN;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4BAA2B;AAC3B,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AA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AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA,oEAAmE;;AAEnE;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;A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;;AAE7zB,wCAAuC,sBAAsB,8KAA8K,wKAAwK,mCAAmC,gJAAgJ;;AAEtkB,2CAA0C,yKAAyK,+EAA+E,GAAG;;AAErS,oEAAmE,wHAAwH;;AAE3L;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;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EA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA,+CAA8C;;AAE9C;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA,oBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA,qBAAoB,QAAQ;;AAE5B;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;;AAGH;;AAEA;;AAEA,oBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,mBAAkB,iCAAiC;;AAEnD;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,+CAA8C,QAAQ;;AAEtD;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA,kBAAiB;;AAEjB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,wBAAuB,kBAAkB;;AAEzC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,+CAA8C,QAAQ;;AAEtD;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,4CAA2C,QAAQ;;AAEnD;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,SAAQ;;AAER;;AAEA;AACA;AACA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;;;AAIH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;A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EA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,8CAA6C,OAAO;;AAEpD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,yCAAwC,QAAQ;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,yCAAwC,QAAQ;;AAEhD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,0CAAyC,QAAQ;;AAEjD;;AAEA;AACA;;AAEA,+CAA8C,QAAQ;;AAEtD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,6CAA4C,QAAQ;;AAEpD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,iDAAgD,4BAA4B;;AAE5E;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,yCAAwC,QAAQ;;AAEhD;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;;AAEA,sBAAqB,cAAc;;AAEnC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,iBAAgB,eAAe;;AAE/B;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,uCAAsC,OAAO;;AAE7C;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,yBAAwB,kBAAkB;;AAE1C;;AAEA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,+EAA8E,kCAAkC;;AAEhH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA,+CAA8C,QAAQ;;AAEtD;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,2CAA0C,OAAO;;AAEjD;AACA;AACA;;AAEA;;AAEA;;AAEA,sDAAqD;AACrD;;AAEA;;AAEA;;AAEA,OAAM;;;AAGN,6CAA4C,OAAO;;AAEnD;AACA;AACA;;AAEA;;AAEA;;AAEA,gCAA+B;AAC/B;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yCAAwC,QAAQ;;AAEhD;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,kDAAiD,QAAQ;;AAEzD;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,oGAAmG;AACnG,oGAAmG;AACnG,oGAAmG;AACnG,oGAAmG;AACnG,oGAAmG;AACnG,oGAAmG;;AAEnG;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,sCAAqC;AACrC,sCAAqC;AACrC,sCAAqC;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;AACA,uBAAsB;AACtB,uBAAsB;AACtB,uBAAsB;;AAEtB,qBAAoB;;AAEpB;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,qBAAoB,aAAa;;AAEjC;;AAEA,sBAAqB,aAAa;;AAElC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,iBAAgB,YAAY;;AAE5B,kBAAiB,YAAY;;AAE7B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,oBAAmB,aAAa;;AAEhC;;AAEA,qBAAoB,aAAa;;AAEjC;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,YAAY;;AAE/B,qBAAoB,YAAY;;AAEhC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,uBAAsB;AACtB,uBAAsB;;AAEtB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,+DAA8D;;AAE9D;AACA;;AAEA;;AAEA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,kEAAiE;;AAEjE;AACA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,+DAA8D;;AAE9D;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kEAAiE;;AAEjE;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB,kBAAkB;;AAEpC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,oDAAmD,+DAA+D,EAAE;;AAEpH;;AAEA;;AAEA;AACA,oDAAmD,0DAA0D,EAAE;;AAE/G;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,oDAAmD,oDAAoD,EAAE;;AAEzG;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB,OAAO;;AAEzB;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yCAAwC,YAAY,aAAa,eAAe,GAAG;;AAEnF;;AAEA;;AAEA,oCAAmC,qBAAqB;;AAExD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,mDAAkD;AAClD,iDAAgD;;AAEhD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,+BAA8B;AAC9B,mCAAkC;AAClC,oCAAmC;AACnC,8BAA6B;AAC7B,gCAA+B;AAC/B,kCAAiC;;AAEjC,8BAA6B;AAC7B,4BAA2B;AAC3B,wBAAuB;;AAEvB;;AAEA,4BAA2B;;AAE3B;;AAEA;;AAEA,mCAAkC;AAClC,mCAAkC;AAClC,mCAAkC;AAClC,mCAAkC;;AAElC;;AAEA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA;;AAEA;;AAEA,gCAA+B;AAC/B,iCAAgC;;AAEhC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mDAAkD;AAClD,iDAAgD;;AAEhD;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,8BAA6B;AAC7B,kCAAiC;;AAEjC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,KAAI;;AAEJ;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAG;;;AAGH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,oBAAmB,2BAA2B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,0CAAyC,QAAQ;;AAEjD;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uCAAsC,OAAO;;AAE7C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;AACA;;AAEA,gCAA+B;;AAE/B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,uCAAsC,OAAO;;AAE7C;AACA;AACA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,mDAAkD,OAAO;;AAEzD;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB,OAAO;;AAE3B;AACA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;;;AAIA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,sBAAqB,OAAO;;AAE5B;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,sBAAqB,OAAO;;AAE5B;;AAEA;;AAEA;;AAEA,SAAQ;;AAER;;AAEA;;AAEA,QAAO;;AAEP;;AAEA,6CAA4C,QAAQ;;AAEpD;;AAEA;;AAEA;;AAEA;;AAEA,WAAU;;AAEV;;AAEA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA,2CAA0C,QAAQ;;AAElD;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,KAAI;;AAEJ,0CAAyC,QAAQ;;AAEjD;;AAEA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;;AAEA;;AAEA,2CAA0C,QAAQ;;AAElD;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,sBAAqB,OAAO;;AAE5B;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB,OAAO;;AAE3B;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,qBAAoB,OAAO;;AAE3B;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,mCAAkC;AAClC;;AAEA;AACA;AACA;;AAEA,oBAAmB,WAAW;;AAE9B;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,8CAA6C,OAAO;;AAEpD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,kDAAiD,SAAS;;AAE1D;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,sBAAqB,oBAAoB;;AAEzC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB;AACpB;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,8BAA8B;;AAEjD;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA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;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,oEAAmE;;AAEnE;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA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A;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,eAAc,sBAAsB;;AAEpC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,gBAAe,qBAAqB;;AAEpC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,sBAAsB;;AAEpC,gBAAe,qBAAqB;;AAEpC;AACA;AACA;AACA;AACA;;AAEA;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,eAAc,qBAAqB;;AAEnC,gBAAe,sBAAsB;;AAErC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,qBAAqB;;AAEnC,gBAAe,sBAAsB;;AAErC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,+BAA8B,OAAO;;AAErC;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,kBAAiB;AACjB,kBAAiB;AACjB,kBAAiB;;AAEjB,iBAAgB,OAAO;;AAEvB;AACA;;AAEA;AACA;AACA;;AAEA,oBAAmB;AACnB,oBAAmB;AACnB,oBAAmB;;AAEnB;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,kBAAiB,OAAO;;AAExB,MAAK;;AAEL,kBAAiB,OAAO;;AAExB;;AAEA;;AAEA;;AAEA,wBAAuB;;AAEvB,sBAAqB,QAAQ;;AAE7B;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,YAAW,yBAAyB;AACpC,gBAAe,uBAAuB;AACtC,gBAAe,uBAAuB;;AAEtC;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;;AAGA;;AAEA;;AAEA,8BAA6B,QAAQ;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,OAAM;;AAEN;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAe;AACf,+CAA8C;;AAE9C,MAAK;;AAEL;AACA;AACA;;AAEA;AACA,4DAA2D;AAC3D,4DAA2D;AAC3D;AACA;;AAEA;AACA,sDAAqD;AACrD,4BAA2B;;AAE3B;AACA;AACA;;AAEA,wFAAuF;AACvF;;AAEA;AACA;AACA;;AAEA,wFAAuF;AACvF;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,4BAA2B;AAC3B,4BAA2B;;AAE3B,QAAO;;AAEP,4BAA2B;AAC3B,4BAA2B;;AAE3B;AACA;;AAEA,4BAA2B;AAC3B,4BAA2B;;AAE3B,QAAO;;AAEP,4BAA2B;AAC3B,4BAA2B;;AAE3B;;AAEA,OAAM;;AAEN;AACA;;AAEA,4BAA2B;AAC3B,4BAA2B;;AAE3B,QAAO;;AAEP,4BAA2B;AAC3B,4BAA2B;;AAE3B;AACA;;AAEA,4BAA2B;AAC3B,4BAA2B;;AAE3B,QAAO;;AAEP,4BAA2B;AAC3B,4BAA2B;;AAE3B;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,kCAAiC,aAAa;AAC9C;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;;AAGA;;AAEA,kCAAiC;AACjC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,qBAAoB,qBAAqB;;AAEzC,0BAAyB;AACzB;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,sBAAqB,2BAA2B;;AAEhD;AACA,sBAAqB,uBAAuB;;AAE5C,2BAA0B;AAC1B;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,wCAAuC,QAAQ;;AAE/C;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,uCAAsC,2BAA2B;;AAEjE;AACA;;AAEA;AACA,uBAAsB,uBAAuB;;AAE7C;;AAEA;AACA;AACA;;AAEA;AACA,yBAAwB,kBAAkB;;AAE1C;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,oCAAmC;;AAEnC,oCAAmC;;AAEnC;AACA,mCAAkC;;AAElC;;AAEA;;AAEA,kBAAiB;;AAEjB;;;AAGA;AACA;AACA;;AAEA;;AAEA;;AAEA,uCAAsC,QAAQ;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA,uCAAsC,QAAQ;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,uEAAsE;AACtE;;AAEA;;AAEA,uCAAsC,QAAQ;;AAE9C;;AAEA,iBAAgB,OAAO;;AAEvB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB,QAAQ;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,0FAAyF;AACzF,4FAA2F;AAC3F;;AAEA,uFAAsF;;AAEtF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,yBAAwB;;AAExB;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,oBAAmB;AACnB;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mCAAkC,QAAQ;;AAE1C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB;;AAEnB;;;AAGA;;AAEA;;AAEA,0BAAyB;;AAEzB,kCAAiC,QAAQ;;AAEzC;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;;AAGA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,4CAA2C;;AAE3C;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,8BAA6B;AAC7B;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA,+DAA8D,QAAQ;;AAEtE;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,kCAAiC,QAAQ;;AAEzC;;AAEA;;AAEA,0DAAyD,QAAQ;;AAEjE;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA,eAAc,mBAAmB;;AAEjC,8BAA6B,OAAO;;AAEpC;AACA;AACA;;AAEA;;AAEA,qCAAoC,QAAQ;;AAE5C;;AAEA;;AAEA;;AAEA;;AAEA,mCAAkC,QAAQ;;AAE1C;AACA;;AAEA,oCAAmC,QAAQ;;AAE3C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,UAAU;;AAExB;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,eAAc,YAAY;;AAE1B,gBAAe,UAAU;;AAEzB;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA,iBAAgB,oBAAoB;AACpC,+BAA8B,QAAQ;;AAEtC;AACA;AACA;;AAEA;;AAEA,qCAAoC,QAAQ;;AAE5C;AACA;;AAEA;;AAEA;;AAEA,mCAAkC,QAAQ;;AAE1C;AACA;;AAEA,oCAAmC,QAAQ;;AAE3C;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA,mBAAkB;AAClB;;AAEA;;AAEA,iBAAgB,UAAU;;AAE1B;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,iBAAgB,UAAU;;AAE1B;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,iBAAgB,UAAU;;AAE1B;AACA;;AAEA;;AAEA;;AAEA,iBAAgB,UAAU;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,mCAAkC,QAAQ;;AAE1C;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,iBAAgB,QAAQ;;AAExB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,mBAAkB,qBAAqB;;AAEvC;;AAEA;;AAEA,oBAAmB,oBAAoB;;AAEvC;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB,oBAAoB;;AAEtC,oBAAmB,mBAAmB;;AAEtC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,eAAc,kBAAkB;;AAEhC,gBAAe,oBAAoB;;AAEnC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,eAAc,iBAAiB;;AAE/B;;AAEA,gBAAe,mBAAmB;;AAElC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,eAAc,eAAe;;AAE7B;;AAEA;AACA;;AAEA,gBAAe,4BAA4B;;AAE3C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,cAAc;;AAE5B,gBAAe,2BAA2B;;AAE1C;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,sBAAqB,mBAAmB;;AAExC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,sCAAqC,OAAO;;AAE5C;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,kCAAiC,OAAO;;AAExC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,iCAAgC,OAAO;;AAEvC;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,eAAc,UAAU;;AAExB;;AAEA;;AAEA;;AAEA,eAAc,UAAU;;AAExB;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,qCAAoC,OAAO;;AAE3C;;AAEA,oBAAmB,OAAO;;AAE1B;AACA;AACA;;AAEA;;AAEA;;AAEA,qBAAoB;;AAEpB,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;;AAEA;AACA;;AAEA,iBAAgB,qBAAqB;;AAErC;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,oBAAoB;;AAEnC,iBAAgB,oBAAoB;;AAEpC;AACA;AACA;AACA;AACA;;AAEA;AACA,sCAAqC;AACrC,sCAAqC;AACrC,sCAAqC;;AAErC;AACA,sCAAqC;AACrC,sCAAqC;AACrC,sCAAqC;;AAErC;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,gBAAe,qBAAqB;;AAEpC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,oBAAoB;;AAEnC;AACA;;AAEA;;AAEA;AACA,qCAAoC;AACpC,yCAAwC;AACxC,qCAAoC;;AAEpC,MAAK;;AAEL;AACA,yCAAwC;AACxC,qCAAoC;AACpC,qCAAoC;;AAEpC;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,mCAAkC,eAAe;;AAEjD;;AAEA;AACA;;AAEA,yBAAwB;;AAExB;AACA;;AAEA;;AAEA;;AAEA,mBAAkB,eAAe;;AAEjC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA,0CAAyC,OAAO;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,2BAA2B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,2BAA0B;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;;AAErC;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA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ACA;AACA,0FAAyF,4CAA4C;AACrI;;AAEA;AACA;AACA,8FAA6F,4CAA4C;AACzI;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AA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MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,QAAQ;AAC7B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,qBAAoB;AACpB;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,gBAAgB;AAC7B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,gCAA+B;AAC/B,QAAO;AACP;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,SAAQ,OAAO;AACf;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;A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ACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA,cAAa,QAAQ;AACrB,cAAa,YAAY;AACzB,cAAa,QAAQ;AACrB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;AACA;;AAEA,MAAK;;AAEL,sBAAqB;;AAErB;;AAEA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;;AAGA,QAAO;;;AAGP;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;AACA;;AAEA;;AAEA,4CAA2C,mBAAmB;AAC9D,4DAA2D,kBAAkB,EAAE;AAC/E,sDAAqD,mBAAmB;AACxE,uDAAsD,mBAAmB;AACzE;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,gCAAgC;AACrD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,sBAAqB,YAAY;AACjC,qBAAoB,MAAM;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAgC;;AAEhC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,yCAAwC;;AAExC;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAa;AACb;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,UAAU;AAC7B,qBAAoB,MAAM;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA,sBAAqB,YAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,YAAW;;AAEX;AACA;AACA,YAAW;;AAEX;AACA;AACA;;;AAGA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA,YAAW,wEAAwE;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;;A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AK;;;AAGL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,8BAA6B;AAC7B;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,2BAA0B;AAC1B;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,yGAAwG;AACxG,MAAK;AACL;;AAEA;AACA;AACA,8JAA6J;AAC7J,2JAA0J;AAC1J,sJAAqJ;AACrJ,uJAAsJ;AACtJ,mJAAkJ;AAClJ;;;AAGA;;AAEA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;AAGL;AACA;;AAEA;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;;AAEA;;;;AAIA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA,mB;;;;;;AC3kHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,W;;AAEA,cAAa;;AAEb;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA,6CAA4C,QAAQ;AACpD;AACA;AACA;AACA;AACA,MAAK;;AAEL;;;AAGA,kD;;AAEA;;AAEA,QAAO,0CAA0C;;AAEjD,0CAAyC,SAAS;AAClD;AACA;;AAEA,QAAO;;AAEP;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAC;;AAED;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA,oDAAmD,EAAE;AACrD;;AAEA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA,mB;;;;;;AClvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,0BAAyB;AACzB,gCAA+B;;AAE/B;AACA;AACA,qCAAoC;AACpC,mCAAkC;;AAElC;AACA;AACA;AACA;;AAEA,uDAAsD;AACtD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,0BAAyB;;AAEzB;AACA;AACA;AACA,8BAA6B;;AAE7B;AACA;;AAEA;AACA,gBAAe;;AAEf;AACA,wBAAuB;;AAEvB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;A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","file":"./bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 2c8bb8e21ffab54f0a10","\nconst THREE = require('three'); // older modules are imported like this. You shouldn't have to worry about this much\nconst OBJLoader = require('three-obj-loader')(THREE)\nimport Grid from './grid.js'\nimport Agent from './agent.js'\nimport Marker from './marker.js'\nimport Crowd from './crowd.js'\nimport RenderEngine from './renderengine.js'\nimport Framework from './framework'\n\nvar crowd, renderengine;\nvar time = 0.0;\n// called after the scene loads\nfunction onLoad(framework) {\n var scene = framework.scene;\n var camera = framework.camera;\n var renderer = framework.renderer;\n var gui = framework.gui;\n var stats = framework.stats;\n\n // initialize a simple box and material\n var directionalLight = new THREE.DirectionalLight( 0xffffff, 1.25 );\n directionalLight.color.setHSL(0.1, 1, 0.95);\n directionalLight.position.set(1, 3, 2);\n directionalLight.position.multiplyScalar(10);\n scene.add(directionalLight);\n\n var ambientLight = new THREE.AmbientLight(0x404040);\n scene.add(ambientLight);\n\n // set camera position\n camera.position.set(50, 50, 100);\n camera.lookAt(new THREE.Vector3(0,0,0));\n\n gui.add(camera, 'fov', 0, 180).onChange(function(newVal) {\n camera.updateProjectionMatrix();\n });\n\n renderengine = new RenderEngine(scene);\n crowd = new Crowd(renderengine);\n}\n\n// called on frame updates\nfunction onUpdate(framework) {\n time += 1.0;\n if (crowd) {\n crowd.update(time);\n }\n}\n\n// when the scene is done initializing, it will call onLoad, then on frame updates, call onUpdate\nFramework.init(onLoad, onUpdate);\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.js","const THREE = require('three');\n\n// GRID IS ASSUMED TO BE A SQUARE\nexport default class Grid {\n\tconstructor(cell_size, plane_size) {\n\t\tthis.plane_size = plane_size;\n\t\tthis.grid_cell_size = cell_size;\n\t\tthis.grid_len = plane_size / cell_size;\n\t\tthis.grid = [];\n\t\twhile(this.grid.push(new Array(this.grid_len)) < this.grid_len);\n\t\tfor (var i = 0; i < this.grid_len; i++) {\n\t\t\tfor (var j = 0; j < this.grid_len; j++) {\n\t\t\t\tthis.grid[i][j] = new Set();\n\t\t\t}\n\t\t}\n\t}\n\n\t// find_nearest_grid will be used by marker to ultimately find nearest 4 grid\n\tfind_nearest_grid(ws_x, ws_z) {\n\t\tvar tgs = this.ws_to_tgs(ws_x, ws_z);\n\t\tvar gs_z = Math.round(tgs.z / this.grid_cell_size);\n\t\tvar gs_x = Math.round(tgs.x / this.grid_cell_size);\n\t\tif (gs_z === 10.0) {\n\t\t\tgs_z = 9.0;\n\t\t}\n\t\tif (gs_x === 10.0) {\n\t\t\tgs_x = 9.0;\n\t\t}\n\t\treturn {z: gs_z, x: gs_x};\n\t}\n\n\t// find_absolute_grid will be used by agent to demarcate it's exact grid location\n\tfind_absolute_grid(ws_x, ws_z) {\n\t\tvar tgs = this.ws_to_tgs(ws_x, ws_z);\n\t\t// console.log('tgs:', tgs);\n\t\tvar gs_z = Math.floor(tgs.z / this.grid_cell_size);\n\t\tvar gs_x = Math.floor(tgs.x / this.grid_cell_size);\n\t\treturn {z: gs_z, x: gs_x};\n\t}\n\n\t// convert from world space to uniform grid space\n\tws_to_tgs(ws_x, ws_z) {\n\t\t// perform translation\n\t\tvar tgs_x = ws_x + 50.0;\n\t\tvar tgs_z = ws_z + 50.0;\n\t\treturn {x: tgs_x, z: tgs_z};\n\t}\n}\n\n\n// WEBPACK FOOTER //\n// ./src/grid.js","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.THREE = global.THREE || {})));\n}(this, (function (exports) { 'use strict';\n\n\t// Polyfills\n\n\tif ( Number.EPSILON === undefined ) {\n\n\t\tNumber.EPSILON = Math.pow( 2, - 52 );\n\n\t}\n\n\t//\n\n\tif ( Math.sign === undefined ) {\n\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign\n\n\t\tMath.sign = function ( x ) {\n\n\t\t\treturn ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;\n\n\t\t};\n\n\t}\n\n\tif ( Function.prototype.name === undefined ) {\n\n\t\t// Missing in IE9-11.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\n\n\t\tObject.defineProperty( Function.prototype, 'name', {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.toString().match( /^\\s*function\\s*(\\S*)\\s*\\(/ )[ 1 ];\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tif ( Object.assign === undefined ) {\n\n\t\t// Missing in IE.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n\n\t\t( function () {\n\n\t\t\tObject.assign = function ( target ) {\n\n\t\t\t\t'use strict';\n\n\t\t\t\tif ( target === undefined || target === null ) {\n\n\t\t\t\t\tthrow new TypeError( 'Cannot convert undefined or null to object' );\n\n\t\t\t\t}\n\n\t\t\t\tvar output = Object( target );\n\n\t\t\t\tfor ( var index = 1; index < arguments.length; index ++ ) {\n\n\t\t\t\t\tvar source = arguments[ index ];\n\n\t\t\t\t\tif ( source !== undefined && source !== null ) {\n\n\t\t\t\t\t\tfor ( var nextKey in source ) {\n\n\t\t\t\t\t\t\tif ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {\n\n\t\t\t\t\t\t\t\toutput[ nextKey ] = source[ nextKey ];\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\treturn output;\n\n\t\t\t};\n\n\t\t} )();\n\n\t}\n\n\t/**\n\t * https://github.com/mrdoob/eventdispatcher.js/\n\t */\n\n\tfunction EventDispatcher() {}\n\n\tObject.assign( EventDispatcher.prototype, {\n\n\t\taddEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\t\tlisteners[ type ] = [];\n\n\t\t\t}\n\n\t\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\t\tlisteners[ type ].push( listener );\n\n\t\t\t}\n\n\t\t},\n\n\t\thasEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return false;\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\tif ( listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tremoveEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tvar index = listenerArray.indexOf( listener );\n\n\t\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tdispatchEvent: function ( event ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ event.type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tevent.target = this;\n\n\t\t\t\tvar array = [], i = 0;\n\t\t\t\tvar length = listenerArray.length;\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ] = listenerArray[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\tvar REVISION = '82';\n\tvar MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };\n\tvar CullFaceNone = 0;\n\tvar CullFaceBack = 1;\n\tvar CullFaceFront = 2;\n\tvar CullFaceFrontBack = 3;\n\tvar FrontFaceDirectionCW = 0;\n\tvar FrontFaceDirectionCCW = 1;\n\tvar BasicShadowMap = 0;\n\tvar PCFShadowMap = 1;\n\tvar PCFSoftShadowMap = 2;\n\tvar FrontSide = 0;\n\tvar BackSide = 1;\n\tvar DoubleSide = 2;\n\tvar FlatShading = 1;\n\tvar SmoothShading = 2;\n\tvar NoColors = 0;\n\tvar FaceColors = 1;\n\tvar VertexColors = 2;\n\tvar NoBlending = 0;\n\tvar NormalBlending = 1;\n\tvar AdditiveBlending = 2;\n\tvar SubtractiveBlending = 3;\n\tvar MultiplyBlending = 4;\n\tvar CustomBlending = 5;\n\tvar BlendingMode = {\n\t\tNoBlending: NoBlending,\n\t\tNormalBlending: NormalBlending,\n\t\tAdditiveBlending: AdditiveBlending,\n\t\tSubtractiveBlending: SubtractiveBlending,\n\t\tMultiplyBlending: MultiplyBlending,\n\t\tCustomBlending: CustomBlending\n\t};\n\tvar AddEquation = 100;\n\tvar SubtractEquation = 101;\n\tvar ReverseSubtractEquation = 102;\n\tvar MinEquation = 103;\n\tvar MaxEquation = 104;\n\tvar ZeroFactor = 200;\n\tvar OneFactor = 201;\n\tvar SrcColorFactor = 202;\n\tvar OneMinusSrcColorFactor = 203;\n\tvar SrcAlphaFactor = 204;\n\tvar OneMinusSrcAlphaFactor = 205;\n\tvar DstAlphaFactor = 206;\n\tvar OneMinusDstAlphaFactor = 207;\n\tvar DstColorFactor = 208;\n\tvar OneMinusDstColorFactor = 209;\n\tvar SrcAlphaSaturateFactor = 210;\n\tvar NeverDepth = 0;\n\tvar AlwaysDepth = 1;\n\tvar LessDepth = 2;\n\tvar LessEqualDepth = 3;\n\tvar EqualDepth = 4;\n\tvar GreaterEqualDepth = 5;\n\tvar GreaterDepth = 6;\n\tvar NotEqualDepth = 7;\n\tvar MultiplyOperation = 0;\n\tvar MixOperation = 1;\n\tvar AddOperation = 2;\n\tvar NoToneMapping = 0;\n\tvar LinearToneMapping = 1;\n\tvar ReinhardToneMapping = 2;\n\tvar Uncharted2ToneMapping = 3;\n\tvar CineonToneMapping = 4;\n\tvar UVMapping = 300;\n\tvar CubeReflectionMapping = 301;\n\tvar CubeRefractionMapping = 302;\n\tvar EquirectangularReflectionMapping = 303;\n\tvar EquirectangularRefractionMapping = 304;\n\tvar SphericalReflectionMapping = 305;\n\tvar CubeUVReflectionMapping = 306;\n\tvar CubeUVRefractionMapping = 307;\n\tvar TextureMapping = {\n\t\tUVMapping: UVMapping,\n\t\tCubeReflectionMapping: CubeReflectionMapping,\n\t\tCubeRefractionMapping: CubeRefractionMapping,\n\t\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\t\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\t\tSphericalReflectionMapping: SphericalReflectionMapping,\n\t\tCubeUVReflectionMapping: CubeUVReflectionMapping,\n\t\tCubeUVRefractionMapping: CubeUVRefractionMapping\n\t};\n\tvar RepeatWrapping = 1000;\n\tvar ClampToEdgeWrapping = 1001;\n\tvar MirroredRepeatWrapping = 1002;\n\tvar TextureWrapping = {\n\t\tRepeatWrapping: RepeatWrapping,\n\t\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\t\tMirroredRepeatWrapping: MirroredRepeatWrapping\n\t};\n\tvar NearestFilter = 1003;\n\tvar NearestMipMapNearestFilter = 1004;\n\tvar NearestMipMapLinearFilter = 1005;\n\tvar LinearFilter = 1006;\n\tvar LinearMipMapNearestFilter = 1007;\n\tvar LinearMipMapLinearFilter = 1008;\n\tvar TextureFilter = {\n\t\tNearestFilter: NearestFilter,\n\t\tNearestMipMapNearestFilter: NearestMipMapNearestFilter,\n\t\tNearestMipMapLinearFilter: NearestMipMapLinearFilter,\n\t\tLinearFilter: LinearFilter,\n\t\tLinearMipMapNearestFilter: LinearMipMapNearestFilter,\n\t\tLinearMipMapLinearFilter: LinearMipMapLinearFilter\n\t};\n\tvar UnsignedByteType = 1009;\n\tvar ByteType = 1010;\n\tvar ShortType = 1011;\n\tvar UnsignedShortType = 1012;\n\tvar IntType = 1013;\n\tvar UnsignedIntType = 1014;\n\tvar FloatType = 1015;\n\tvar HalfFloatType = 1016;\n\tvar UnsignedShort4444Type = 1017;\n\tvar UnsignedShort5551Type = 1018;\n\tvar UnsignedShort565Type = 1019;\n\tvar UnsignedInt248Type = 1020;\n\tvar AlphaFormat = 1021;\n\tvar RGBFormat = 1022;\n\tvar RGBAFormat = 1023;\n\tvar LuminanceFormat = 1024;\n\tvar LuminanceAlphaFormat = 1025;\n\tvar RGBEFormat = RGBAFormat;\n\tvar DepthFormat = 1026;\n\tvar DepthStencilFormat = 1027;\n\tvar RGB_S3TC_DXT1_Format = 2001;\n\tvar RGBA_S3TC_DXT1_Format = 2002;\n\tvar RGBA_S3TC_DXT3_Format = 2003;\n\tvar RGBA_S3TC_DXT5_Format = 2004;\n\tvar RGB_PVRTC_4BPPV1_Format = 2100;\n\tvar RGB_PVRTC_2BPPV1_Format = 2101;\n\tvar RGBA_PVRTC_4BPPV1_Format = 2102;\n\tvar RGBA_PVRTC_2BPPV1_Format = 2103;\n\tvar RGB_ETC1_Format = 2151;\n\tvar LoopOnce = 2200;\n\tvar LoopRepeat = 2201;\n\tvar LoopPingPong = 2202;\n\tvar InterpolateDiscrete = 2300;\n\tvar InterpolateLinear = 2301;\n\tvar InterpolateSmooth = 2302;\n\tvar ZeroCurvatureEnding = 2400;\n\tvar ZeroSlopeEnding = 2401;\n\tvar WrapAroundEnding = 2402;\n\tvar TrianglesDrawMode = 0;\n\tvar TriangleStripDrawMode = 1;\n\tvar TriangleFanDrawMode = 2;\n\tvar LinearEncoding = 3000;\n\tvar sRGBEncoding = 3001;\n\tvar GammaEncoding = 3007;\n\tvar RGBEEncoding = 3002;\n\tvar LogLuvEncoding = 3003;\n\tvar RGBM7Encoding = 3004;\n\tvar RGBM16Encoding = 3005;\n\tvar RGBDEncoding = 3006;\n\tvar BasicDepthPacking = 3200;\n\tvar RGBADepthPacking = 3201;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar _Math = {\n\n\t\tDEG2RAD: Math.PI / 180,\n\t\tRAD2DEG: 180 / Math.PI,\n\n\t\tgenerateUUID: function () {\n\n\t\t\t// http://www.broofa.com/Tools/Math.uuid.htm\n\n\t\t\tvar chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' );\n\t\t\tvar uuid = new Array( 36 );\n\t\t\tvar rnd = 0, r;\n\n\t\t\treturn function generateUUID() {\n\n\t\t\t\tfor ( var i = 0; i < 36; i ++ ) {\n\n\t\t\t\t\tif ( i === 8 || i === 13 || i === 18 || i === 23 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '-';\n\n\t\t\t\t\t} else if ( i === 14 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '4';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0;\n\t\t\t\t\t\tr = rnd & 0xf;\n\t\t\t\t\t\trnd = rnd >> 4;\n\t\t\t\t\t\tuuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn uuid.join( '' );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclamp: function ( value, min, max ) {\n\n\t\t\treturn Math.max( min, Math.min( max, value ) );\n\n\t\t},\n\n\t\t// compute euclidian modulo of m % n\n\t\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\t\teuclideanModulo: function ( n, m ) {\n\n\t\t\treturn ( ( n % m ) + m ) % m;\n\n\t\t},\n\n\t\t// Linear mapping from range to range \n\n\t\tmapLinear: function ( x, a1, a2, b1, b2 ) {\n\n\t\t\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n\t\t},\n\n\t\t// https://en.wikipedia.org/wiki/Linear_interpolation\n\n\t\tlerp: function ( x, y, t ) {\n\n\t\t\treturn ( 1 - t ) * x + t * y;\n\n\t\t},\n\n\t\t// http://en.wikipedia.org/wiki/Smoothstep\n\n\t\tsmoothstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * ( 3 - 2 * x );\n\n\t\t},\n\n\t\tsmootherstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n\t\t},\n\n\t\trandom16: function () {\n\n\t\t\tconsole.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' );\n\t\t\treturn Math.random();\n\n\t\t},\n\n\t\t// Random integer from interval\n\n\t\trandInt: function ( low, high ) {\n\n\t\t\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n\t\t},\n\n\t\t// Random float from interval\n\n\t\trandFloat: function ( low, high ) {\n\n\t\t\treturn low + Math.random() * ( high - low );\n\n\t\t},\n\n\t\t// Random float from <-range/2, range/2> interval\n\n\t\trandFloatSpread: function ( range ) {\n\n\t\t\treturn range * ( 0.5 - Math.random() );\n\n\t\t},\n\n\t\tdegToRad: function ( degrees ) {\n\n\t\t\treturn degrees * _Math.DEG2RAD;\n\n\t\t},\n\n\t\tradToDeg: function ( radians ) {\n\n\t\t\treturn radians * _Math.RAD2DEG;\n\n\t\t},\n\n\t\tisPowerOfTwo: function ( value ) {\n\n\t\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t\t},\n\n\t\tnearestPowerOfTwo: function ( value ) {\n\n\t\t\treturn Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) );\n\n\t\t},\n\n\t\tnextPowerOfTwo: function ( value ) {\n\n\t\t\tvalue --;\n\t\t\tvalue |= value >> 1;\n\t\t\tvalue |= value >> 2;\n\t\t\tvalue |= value >> 4;\n\t\t\tvalue |= value >> 8;\n\t\t\tvalue |= value >> 16;\n\t\t\tvalue ++;\n\n\t\t\treturn value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author egraether / http://egraether.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tfunction Vector2( x, y ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\n\t}\n\n\tVector2.prototype = {\n\n\t\tconstructor: Vector2,\n\n\t\tisVector2: true,\n\n\t\tget width() {\n\n\t\t\treturn this.x;\n\n\t\t},\n\n\t\tset width( value ) {\n\n\t\t\tthis.x = value;\n\n\t\t},\n\n\t\tget height() {\n\n\t\t\treturn this.y;\n\n\t\t},\n\n\t\tset height( value ) {\n\n\t\t\tthis.y = value;\n\n\t\t},\n\n\t\t//\n\n\t\tset: function ( x, y ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\t\t\t\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v ) {\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector2();\n\t\t\t\t\tmax = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t\t},\n\n\t\tlengthManhattan: function() {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tangle: function () {\n\n\t\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\t\tvar angle = Math.atan2( this.y, this.x );\n\n\t\t\tif ( angle < 0 ) angle += 2 * Math.PI;\n\n\t\t\treturn angle;\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y;\n\t\t\treturn dx * dx + dy * dy;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tindex = index * attribute.itemSize + offset;\n\n\t\t\tthis.x = attribute.array[ index ];\n\t\t\tthis.y = attribute.array[ index + 1 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateAround: function ( center, angle ) {\n\n\t\t\tvar c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\t\tvar x = this.x - center.x;\n\t\t\tvar y = this.y - center.y;\n\n\t\t\tthis.x = x * c - y * s + center.x;\n\t\t\tthis.y = x * s + y * c + center.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t */\n\n\tfunction Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\tObject.defineProperty( this, 'id', { value: TextureIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.sourceFile = '';\n\n\t\tthis.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;\n\n\t\tthis.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;\n\t\tthis.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter;\n\n\t\tthis.anisotropy = anisotropy !== undefined ? anisotropy : 1;\n\n\t\tthis.format = format !== undefined ? format : RGBAFormat;\n\t\tthis.type = type !== undefined ? type : UnsignedByteType;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\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\n\t\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t\t//\n\t\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\t\tthis.encoding = encoding !== undefined ? encoding : LinearEncoding;\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t}\n\n\tTexture.DEFAULT_IMAGE = undefined;\n\tTexture.DEFAULT_MAPPING = UVMapping;\n\n\tTexture.prototype = {\n\n\t\tconstructor: Texture,\n\n\t\tisTexture: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.image = source.image;\n\t\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\t\tthis.mapping = source.mapping;\n\n\t\t\tthis.wrapS = source.wrapS;\n\t\t\tthis.wrapT = source.wrapT;\n\n\t\t\tthis.magFilter = source.magFilter;\n\t\t\tthis.minFilter = source.minFilter;\n\n\t\t\tthis.anisotropy = source.anisotropy;\n\n\t\t\tthis.format = source.format;\n\t\t\tthis.type = source.type;\n\n\t\t\tthis.offset.copy( source.offset );\n\t\t\tthis.repeat.copy( source.repeat );\n\n\t\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\t\tthis.flipY = source.flipY;\n\t\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\t\tthis.encoding = source.encoding;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tif ( meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t\t}\n\n\t\t\tfunction getDataURL( image ) {\n\n\t\t\t\tvar canvas;\n\n\t\t\t\tif ( image.toDataURL !== undefined ) {\n\n\t\t\t\t\tcanvas = image;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcanvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\t\tcanvas.width = image.width;\n\t\t\t\t\tcanvas.height = image.height;\n\n\t\t\t\t\tcanvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Texture',\n\t\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t\t},\n\n\t\t\t\tuuid: this.uuid,\n\t\t\t\tname: this.name,\n\n\t\t\t\tmapping: this.mapping,\n\n\t\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\t\tminFilter: this.minFilter,\n\t\t\t\tmagFilter: this.magFilter,\n\t\t\t\tanisotropy: this.anisotropy,\n\n\t\t\t\tflipY: this.flipY\n\t\t\t};\n\n\t\t\tif ( this.image !== undefined ) {\n\n\t\t\t\t// TODO: Move to THREE.Image\n\n\t\t\t\tvar image = this.image;\n\n\t\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\t\timage.uuid = _Math.generateUUID(); // UGH\n\n\t\t\t\t}\n\n\t\t\t\tif ( meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\t\turl: getDataURL( image )\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\toutput.image = image.uuid;\n\n\t\t\t}\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t},\n\n\t\ttransformUv: function ( uv ) {\n\n\t\t\tif ( this.mapping !== UVMapping ) return;\n\n\t\t\tuv.multiply( this.repeat );\n\t\t\tuv.add( this.offset );\n\n\t\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.flipY ) {\n\n\t\t\t\tuv.y = 1 - uv.y;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tObject.assign( Texture.prototype, EventDispatcher.prototype );\n\n\tvar count = 0;\n\tfunction TextureIdCount() { return count++; }\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector4( x, y, z, w ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\t\tthis.w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tVector4.prototype = {\n\n\t\tconstructor: Vector4,\n\n\t\tisVector4: true,\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\t\t\tthis.w = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( w ) {\n\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tcase 3: this.w = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\t\t\t\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tcase 3: return this.w;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\t\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\t\t\tthis.w += v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\t\t\tthis.w += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\t\t\tthis.w = a.w + b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\t\t\tthis.w += v.w * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\t\t\tthis.w -= v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\t\t\tthis.w -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\t\t\tthis.w = a.w - b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\t\t\t\tthis.w *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\t\t\t\tthis.w = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z, w = this.w;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tsetAxisAngleFromQuaternion: function ( q ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t\t// q is assumed to be normalized\n\n\t\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\t\tvar s = Math.sqrt( 1 - q.w * q.w );\n\n\t\t\tif ( s < 0.0001 ) {\n\n\t\t\t\t this.x = 1;\n\t\t\t\t this.y = 0;\n\t\t\t\t this.z = 0;\n\n\t\t\t} else {\n\n\t\t\t\t this.x = q.x / s;\n\t\t\t\t this.y = q.y / s;\n\t\t\t\t this.z = q.z / s;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetAxisAngleFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar angle, x, y, z,\t\t// variables for result\n\t\t\t\tepsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\t\tte = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t\t// singularity found\n\t\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t\t}\n\n\t\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\t\tangle = Math.PI;\n\n\t\t\t\tvar xx = ( m11 + 1 ) / 2;\n\t\t\t\tvar yy = ( m22 + 1 ) / 2;\n\t\t\t\tvar zz = ( m33 + 1 ) / 2;\n\t\t\t\tvar xy = ( m12 + m21 ) / 4;\n\t\t\t\tvar xz = ( m13 + m31 ) / 4;\n\t\t\t\tvar yz = ( m23 + m32 ) / 4;\n\n\t\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\t\tx = 0;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\t\ty = xy / x;\n\t\t\t\t\t\tz = xz / x;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\t\tx = xy / y;\n\t\t\t\t\t\tz = yz / y;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\t\tx = xz / z;\n\t\t\t\t\t\ty = yz / z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.set( x, y, z, angle );\n\n\t\t\t\treturn this; // return 180 deg rotation\n\n\t\t\t}\n\n\t\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\t\tvar 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\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t\t// caught by singularity test above, but I've left it in just in case\n\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\t\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\t\t\tthis.w = Math.min( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\t\t\tthis.w = Math.max( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector4();\n\t\t\t\t\tmax = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\t\t\tthis.w = Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\t\t\tthis.w = Math.ceil( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\t\t\tthis.w = Math.round( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\t\t\tthis.w = - this.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\t\t\tthis.w = array[ offset + 3 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\t\t\tarray[ offset + 3 ] = this.w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tindex = index * attribute.itemSize + offset;\n\n\t\t\tthis.x = attribute.array[ index ];\n\t\t\tthis.y = attribute.array[ index + 1 ];\n\t\t\tthis.z = attribute.array[ index + 2 ];\n\t\t\tthis.w = attribute.array[ index + 3 ];\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author szimek / https://github.com/szimek/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Marius Kintel / https://github.com/kintel\n\t */\n\n\t/*\n\t In options, we can specify:\n\t * Texture parameters for an auto-generated target texture\n\t * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n\t*/\n\tfunction WebGLRenderTarget( width, height, options ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\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\toptions = options || {};\n\n\t\tif ( options.minFilter === undefined ) options.minFilter = LinearFilter;\n\n\t\tthis.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\t\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\t\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;\n\t\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n\t}\n\n\tObject.assign( WebGLRenderTarget.prototype, EventDispatcher.prototype, {\n\n\t\tisWebGLRenderTarget: true,\n\n\t\tsetSize: function ( width, height ) {\n\n\t\t\tif ( this.width !== width || this.height !== height ) {\n\n\t\t\t\tthis.width = width;\n\t\t\t\tthis.height = height;\n\n\t\t\t\tthis.dispose();\n\n\t\t\t}\n\n\t\t\tthis.viewport.set( 0, 0, width, height );\n\t\t\tthis.scissor.set( 0, 0, width, height );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\tthis.viewport.copy( source.viewport );\n\n\t\t\tthis.texture = source.texture.clone();\n\n\t\t\tthis.depthBuffer = source.depthBuffer;\n\t\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\t\tthis.depthTexture = source.depthTexture;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com\n\t */\n\n\tfunction WebGLRenderTargetCube( width, height, options ) {\n\n\t\tWebGLRenderTarget.call( this, width, height, options );\n\n\t\tthis.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5\n\t\tthis.activeMipMapLevel = 0;\n\n\t}\n\n\tWebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype );\n\tWebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube;\n\n\tWebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true;\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Quaternion( x, y, z, w ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tQuaternion.prototype = {\n\n\t\tconstructor: Quaternion,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget w () {\n\n\t\t\treturn this._w;\n\n\t\t},\n\n\t\tset w ( value ) {\n\n\t\t\tthis._w = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._w = w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t\t},\n\n\t\tcopy: function ( quaternion ) {\n\n\t\t\tthis._x = quaternion.x;\n\t\t\tthis._y = quaternion.y;\n\t\t\tthis._z = quaternion.z;\n\t\t\tthis._w = quaternion.w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromEuler: function ( euler, update ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t\t//\tcontent/SpinCalc.m\n\n\t\t\tvar c1 = Math.cos( euler._x / 2 );\n\t\t\tvar c2 = Math.cos( euler._y / 2 );\n\t\t\tvar c3 = Math.cos( euler._z / 2 );\n\t\t\tvar s1 = Math.sin( euler._x / 2 );\n\t\t\tvar s2 = Math.sin( euler._y / 2 );\n\t\t\tvar s3 = Math.sin( euler._z / 2 );\n\n\t\t\tvar order = euler.order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\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\n\t\t\t} else if ( order === 'YXZ' ) {\n\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\n\t\t\t} else if ( order === 'ZXY' ) {\n\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\n\t\t\t} else if ( order === 'ZYX' ) {\n\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\n\t\t\t} else if ( order === 'YZX' ) {\n\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\n\t\t\t} else if ( order === 'XZY' ) {\n\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\n\t\t\t}\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tvar halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\t\tthis._x = axis.x * s;\n\t\t\tthis._y = axis.y * s;\n\t\t\tthis._z = axis.z * s;\n\t\t\tthis._w = Math.cos( halfAngle );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\t\ttrace = m11 + m22 + m33,\n\t\t\t\ts;\n\n\t\t\tif ( trace > 0 ) {\n\n\t\t\t\ts = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\t\tthis._w = 0.25 / s;\n\t\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\t\tthis._x = 0.25 * s;\n\t\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t\t} else if ( m22 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\t\tthis._y = 0.25 * s;\n\t\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t\t} else {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\t\tthis._z = 0.25 * s;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromUnitVectors: function () {\n\n\t\t\t// http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n\n\t\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\t\tvar v1, r;\n\n\t\t\tvar EPS = 0.000001;\n\n\t\t\treturn function setFromUnitVectors( vFrom, vTo ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tr = vFrom.dot( vTo ) + 1;\n\n\t\t\t\tif ( r < EPS ) {\n\n\t\t\t\t\tr = 0;\n\n\t\t\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\t\t\tv1.set( - vFrom.y, vFrom.x, 0 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv1.set( 0, - vFrom.z, vFrom.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv1.crossVectors( vFrom, vTo );\n\n\t\t\t\t}\n\n\t\t\t\tthis._x = v1.x;\n\t\t\t\tthis._y = v1.y;\n\t\t\t\tthis._z = v1.z;\n\t\t\t\tthis._w = r;\n\n\t\t\t\treturn this.normalize();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tinverse: function () {\n\n\t\t\treturn this.conjugate().normalize();\n\n\t\t},\n\n\t\tconjugate: function () {\n\n\t\t\tthis._x *= - 1;\n\t\t\tthis._y *= - 1;\n\t\t\tthis._z *= - 1;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tvar l = this.length();\n\n\t\t\tif ( l === 0 ) {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = 0;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = 1;\n\n\t\t\t} else {\n\n\t\t\t\tl = 1 / l;\n\n\t\t\t\tthis._x = this._x * l;\n\t\t\t\tthis._y = this._y * l;\n\t\t\t\tthis._z = this._z * l;\n\t\t\t\tthis._w = this._w * l;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( q, p ) {\n\n\t\t\tif ( p !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyQuaternions( this, q );\n\n\t\t},\n\n\t\tpremultiply: function ( q ) {\n\n\t\t\treturn this.multiplyQuaternions( q, this );\n\n\t\t},\n\n\t\tmultiplyQuaternions: function ( a, b ) {\n\n\t\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\t\tvar qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\t\tvar qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tslerp: function ( qb, t ) {\n\n\t\t\tif ( t === 0 ) return this;\n\t\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\t\tvar x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\t\tvar cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\t\tthis._w = - qb._w;\n\t\t\t\tthis._x = - qb._x;\n\t\t\t\tthis._y = - qb._y;\n\t\t\t\tthis._z = - qb._z;\n\n\t\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t\t} else {\n\n\t\t\t\tthis.copy( qb );\n\n\t\t\t}\n\n\t\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\t\tthis._w = w;\n\t\t\t\tthis._x = x;\n\t\t\t\tthis._y = y;\n\t\t\t\tthis._z = z;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n\t\t\tif ( Math.abs( sinHalfTheta ) < 0.001 ) {\n\n\t\t\t\tthis._w = 0.5 * ( w + this._w );\n\t\t\t\tthis._x = 0.5 * ( x + this._x );\n\t\t\t\tthis._y = 0.5 * ( y + this._y );\n\t\t\t\tthis._z = 0.5 * ( z + this._z );\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\t\tvar ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( quaternion ) {\n\n\t\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis._x = array[ offset ];\n\t\t\tthis._y = array[ offset + 1 ];\n\t\t\tthis._z = array[ offset + 2 ];\n\t\t\tthis._w = array[ offset + 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\tObject.assign( Quaternion, {\n\n\t\tslerp: function( qa, qb, qm, t ) {\n\n\t\t\treturn qm.copy( qa ).slerp( qb, t );\n\n\t\t},\n\n\t\tslerpFlat: function(\n\t\t\t\tdst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\t\tvar x0 = src0[ srcOffset0 + 0 ],\n\t\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\t\tw0 = src0[ srcOffset0 + 3 ],\n\n\t\t\t\tx1 = src1[ srcOffset1 + 0 ],\n\t\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\t\tvar s = 1 - t,\n\n\t\t\t\t\tcos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\n\t\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\t\tvar sin = Math.sqrt( sqrSin ),\n\t\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t\t}\n\n\t\t\t\tvar tDir = t * dir;\n\n\t\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t\t// Normalize in case we just did a lerp:\n\t\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\t\tvar f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\t\tx0 *= f;\n\t\t\t\t\ty0 *= f;\n\t\t\t\t\tz0 *= f;\n\t\t\t\t\tw0 *= f;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdst[ dstOffset ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author *kile / http://kile.stravaganza.org/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector3( x, y, z ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\n\t}\n\n\tVector3.prototype = {\n\n\t\tconstructor: Vector3,\n\n\t\tisVector3: true,\n\n\t\tset: function ( x, y, z ) {\n\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\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\t\t\t\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\t\t\tthis.z *= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x * b.x;\n\t\t\tthis.y = a.y * b.y;\n\t\t\tthis.z = a.z * b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyEuler: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyEuler( euler ) {\n\n\t\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromEuler( euler ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyAxisAngle: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyAxisAngle( axis, angle ) {\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix3: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 affine matrix\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ];\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ];\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyProjection: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 projection matrix\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\t\t\tvar d = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); // perspective divide\n\n\t\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * d;\n\t\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * d;\n\t\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * d;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyQuaternion: function ( q ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t\t// calculate quat * vector\n\n\t\t\tvar ix = qw * x + qy * z - qz * y;\n\t\t\tvar iy = qw * y + qz * x - qx * z;\n\t\t\tvar iz = qw * z + qx * y - qy * x;\n\t\t\tvar iw = - qx * x - qy * y - qz * z;\n\n\t\t\t// calculate result * inverse quat\n\n\t\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function project( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );\n\t\t\t\treturn this.applyProjection( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tunproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function unproject( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );\n\t\t\t\treturn this.applyProjection( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttransformDirection: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 affine matrix\n\t\t\t// vector interpreted as a direction\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\t\treturn this.normalize();\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\t\t\tthis.z /= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector3();\n\t\t\t\t\tmax = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tcross: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\t\treturn this.crossVectors( v, w );\n\n\t\t\t}\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\n\t\t\tthis.x = y * v.z - z * v.y;\n\t\t\tthis.y = z * v.x - x * v.z;\n\t\t\tthis.z = x * v.y - y * v.x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossVectors: function ( a, b ) {\n\n\t\t\tvar ax = a.x, ay = a.y, az = a.z;\n\t\t\tvar bx = b.x, by = b.y, bz = b.z;\n\n\t\t\tthis.x = ay * bz - az * by;\n\t\t\tthis.y = az * bx - ax * bz;\n\t\t\tthis.z = ax * by - ay * bx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tprojectOnVector: function ( vector ) {\n\n\t\t\tvar scalar = vector.dot( this ) / vector.lengthSq();\n\n\t\t\treturn this.copy( vector ).multiplyScalar( scalar );\n\n\t\t},\n\n\t\tprojectOnPlane: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function projectOnPlane( planeNormal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tv1.copy( this ).projectOnVector( planeNormal );\n\n\t\t\t\treturn this.sub( v1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\treflect: function () {\n\n\t\t\t// reflect incident vector off plane orthogonal to normal\n\t\t\t// normal is assumed to have unit length\n\n\t\t\tvar v1;\n\n\t\t\treturn function reflect( normal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\treturn this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tangleTo: function ( v ) {\n\n\t\t\tvar theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );\n\n\t\t\t// clamp, to handle numerical problems\n\n\t\t\treturn Math.acos( _Math.clamp( theta, - 1, 1 ) );\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t\t},\n\n\t\tsetFromSpherical: function( s ) {\n\n\t\t\tvar sinPhiRadius = Math.sin( s.phi ) * s.radius;\n\n\t\t\tthis.x = sinPhiRadius * Math.sin( s.theta );\n\t\t\tthis.y = Math.cos( s.phi ) * s.radius;\n\t\t\tthis.z = sinPhiRadius * Math.cos( s.theta );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixPosition: function ( m ) {\n\n\t\t\treturn this.setFromMatrixColumn( m, 3 );\n\n\t\t},\n\n\t\tsetFromMatrixScale: function ( m ) {\n\n\t\t\tvar sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\t\tvar sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\t\tvar sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\tthis.x = sx;\n\t\t\tthis.y = sy;\n\t\t\tthis.z = sz;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixColumn: function ( m, index ) {\n\n\t\t\tif ( typeof m === 'number' ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: setFromMatrixColumn now expects ( matrix, index ).' );\n\t\t\t\tvar temp = m;\n\t\t\t\tm = index;\n\t\t\t\tindex = temp;\n\n\t\t\t}\n\n\t\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tindex = index * attribute.itemSize + offset;\n\n\t\t\tthis.x = attribute.array[ index ];\n\t\t\tthis.y = attribute.array[ index + 1 ];\n\t\t\tthis.z = attribute.array[ index + 2 ];\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author jordi_ros / http://plattsoft.com\n\t * @author D1plo1d / http://github.com/D1plo1d\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author timknip / http://www.floorplanner.com/\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Matrix4() {\n\n\t\tthis.elements = new Float32Array( [\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 ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix4.prototype = {\n\n\t\tconstructor: Matrix4,\n\n\t\tisMatrix4: true,\n\n\t\tset: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, 1, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new Matrix4().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tthis.elements.set( m.elements );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyPosition: function ( m ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = m.elements;\n\n\t\t\tte[ 12 ] = me[ 12 ];\n\t\t\tte[ 13 ] = me[ 13 ];\n\t\t\tte[ 14 ] = me[ 14 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\tthis.set(\n\t\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractRotation: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function extractRotation( m ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tvar te = this.elements;\n\t\t\t\tvar me = m.elements;\n\n\t\t\t\tvar scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length();\n\t\t\t\tvar scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length();\n\t\t\t\tvar scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\t\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\t\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\n\t\t\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\t\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\t\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\n\t\t\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\t\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\t\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakeRotationFromEuler: function ( euler ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = euler.x, y = euler.y, z = euler.z;\n\t\t\tvar a = Math.cos( x ), b = Math.sin( x );\n\t\t\tvar c = Math.cos( y ), d = Math.sin( y );\n\t\t\tvar e = Math.cos( z ), f = Math.sin( z );\n\n\t\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - c * f;\n\t\t\t\tte[ 8 ] = d;\n\n\t\t\t\tte[ 1 ] = af + be * d;\n\t\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\t\tte[ 9 ] = - b * c;\n\n\t\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\t\tte[ 6 ] = be + af * d;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce + df * b;\n\t\t\t\tte[ 4 ] = de * b - cf;\n\t\t\t\tte[ 8 ] = a * d;\n\n\t\t\t\tte[ 1 ] = a * f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b;\n\n\t\t\t\tte[ 2 ] = cf * b - de;\n\t\t\t\tte[ 6 ] = df + ce * b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce - df * b;\n\t\t\t\tte[ 4 ] = - a * f;\n\t\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\t\tte[ 1 ] = cf + de * b;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\t\tte[ 2 ] = - a * d;\n\t\t\t\tte[ 6 ] = b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = be * d - af;\n\t\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\t\tte[ 1 ] = c * f;\n\t\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\t\tte[ 2 ] = - d;\n\t\t\t\tte[ 6 ] = b * c;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\t\tte[ 1 ] = f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b * e;\n\n\t\t\t\tte[ 2 ] = - d * e;\n\t\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - f;\n\t\t\t\tte[ 8 ] = d * e;\n\n\t\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\t\tte[ 6 ] = b * e;\n\t\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t\t}\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationFromQuaternion: function ( q ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = q.x, y = q.y, z = q.z, w = q.w;\n\t\t\tvar x2 = x + x, y2 = y + y, z2 = z + z;\n\t\t\tvar xx = x * x2, xy = x * y2, xz = x * z2;\n\t\t\tvar yy = y * y2, yz = y * z2, zz = z * z2;\n\t\t\tvar wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\t\tte[ 0 ] = 1 - ( yy + zz );\n\t\t\tte[ 4 ] = xy - wz;\n\t\t\tte[ 8 ] = xz + wy;\n\n\t\t\tte[ 1 ] = xy + wz;\n\t\t\tte[ 5 ] = 1 - ( xx + zz );\n\t\t\tte[ 9 ] = yz - wx;\n\n\t\t\tte[ 2 ] = xz - wy;\n\t\t\tte[ 6 ] = yz + wx;\n\t\t\tte[ 10 ] = 1 - ( xx + yy );\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlookAt: function () {\n\n\t\t\tvar x, y, z;\n\n\t\t\treturn function lookAt( eye, target, up ) {\n\n\t\t\t\tif ( x === undefined ) {\n\n\t\t\t\t\tx = new Vector3();\n\t\t\t\t\ty = new Vector3();\n\t\t\t\t\tz = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tz.subVectors( eye, target ).normalize();\n\n\t\t\t\tif ( z.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z = 1;\n\n\t\t\t\t}\n\n\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\tif ( x.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z += 0.0001;\n\t\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\ty.crossVectors( z, x );\n\n\n\t\t\t\tte[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;\n\t\t\t\tte[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;\n\t\t\t\tte[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiply: function ( m, n ) {\n\n\t\t\tif ( n !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyMatrices( this, m );\n\n\t\t},\n\n\t\tpremultiply: function ( m ) {\n\n\t\t\treturn this.multiplyMatrices( m, this );\n\n\t\t},\n\n\t\tmultiplyMatrices: function ( a, b ) {\n\n\t\t\tvar ae = a.elements;\n\t\t\tvar be = b.elements;\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\t\tvar a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\t\tvar a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\t\tvar a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\t\tvar b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\t\tvar b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\t\tvar b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\t\tvar b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyToArray: function ( a, b, r ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tthis.multiplyMatrices( a, b );\n\n\t\t\tr[ 0 ] = te[ 0 ]; r[ 1 ] = te[ 1 ]; r[ 2 ] = te[ 2 ]; r[ 3 ] = te[ 3 ];\n\t\t\tr[ 4 ] = te[ 4 ]; r[ 5 ] = te[ 5 ]; r[ 6 ] = te[ 6 ]; r[ 7 ] = te[ 7 ];\n\t\t\tr[ 8 ] = te[ 8 ]; r[ 9 ] = te[ 9 ]; r[ 10 ] = te[ 10 ]; r[ 11 ] = te[ 11 ];\n\t\t\tr[ 12 ] = te[ 12 ]; r[ 13 ] = te[ 13 ]; r[ 14 ] = te[ 14 ]; r[ 15 ] = te[ 15 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToVector3Array: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToVector3Array( array, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = array.length;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i += 3, j += 3 ) {\n\n\t\t\t\t\tv1.fromArray( array, j );\n\t\t\t\t\tv1.applyMatrix4( this );\n\t\t\t\t\tv1.toArray( array, j );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyToBuffer: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBuffer( buffer, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = buffer.length / buffer.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i ++, j ++ ) {\n\n\t\t\t\t\tv1.x = buffer.getX( j );\n\t\t\t\t\tv1.y = buffer.getY( j );\n\t\t\t\t\tv1.z = buffer.getZ( j );\n\n\t\t\t\t\tv1.applyMatrix4( this );\n\n\t\t\t\t\tbuffer.setXYZ( j, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn buffer;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\t\tvar n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\t\tvar n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\t\tvar n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t\t//TODO: make this more efficient\n\t\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\t\treturn (\n\t\t\t\tn41 * (\n\t\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t\t - n13 * n24 * n32\n\t\t\t\t\t - n14 * n22 * n33\n\t\t\t\t\t + n12 * n24 * n33\n\t\t\t\t\t + n13 * n22 * n34\n\t\t\t\t\t - n12 * n23 * n34\n\t\t\t\t) +\n\t\t\t\tn42 * (\n\t\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t\t - n11 * n24 * n33\n\t\t\t\t\t + n14 * n21 * n33\n\t\t\t\t\t - n13 * n21 * n34\n\t\t\t\t\t + n13 * n24 * n31\n\t\t\t\t\t - n14 * n23 * n31\n\t\t\t\t) +\n\t\t\t\tn43 * (\n\t\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t\t - n11 * n22 * n34\n\t\t\t\t\t - n14 * n21 * n32\n\t\t\t\t\t + n12 * n21 * n34\n\t\t\t\t\t + n14 * n22 * n31\n\t\t\t\t\t - n12 * n24 * n31\n\t\t\t\t) +\n\t\t\t\tn44 * (\n\t\t\t\t\t- n13 * n22 * n31\n\t\t\t\t\t - n11 * n23 * n32\n\t\t\t\t\t + n11 * n22 * n33\n\t\t\t\t\t + n13 * n21 * n32\n\t\t\t\t\t - n12 * n21 * n33\n\t\t\t\t\t + n12 * n23 * n31\n\t\t\t\t)\n\n\t\t\t);\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar tmp;\n\n\t\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset is deprecated \" +\n\t\t\t\t\t\"- just use .toArray instead.\" );\n\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\n\t\tgetPosition: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function getPosition() {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\n\n\t\t\t\treturn v1.setFromMatrixColumn( this, 3 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetPosition: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 12 ] = v.x;\n\t\t\tte[ 13 ] = v.y;\n\t\t\tte[ 14 ] = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetInverse: function ( m, throwOnDegenerate ) {\n\n\t\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\t\tvar te = this.elements,\n\t\t\t\tme = m.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],\n\t\t\t\tn12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],\n\t\t\t\tn13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],\n\t\t\t\tn14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],\n\n\t\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\t\tvar det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\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\t\tte[ 4 ] = t12 * detInv;\n\t\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\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\t\tte[ 8 ] = t13 * detInv;\n\t\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\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\t\tte[ 12 ] = t14 * detInv;\n\t\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\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\t\treturn this;\n\n\t\t},\n\n\t\tscale: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = v.x, y = v.y, z = v.z;\n\n\t\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetMaxScaleOnAxis: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\t\tvar scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\t\tvar scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t\t},\n\n\t\tmakeTranslation: function ( x, y, z ) {\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\treturn this;\n\n\t\t},\n\n\t\tmakeRotationX: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, c, - s, 0,\n\t\t\t\t0, s, c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationY: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t c, 0, s, 0,\n\t\t\t\t 0, 1, 0, 0,\n\t\t\t\t- s, 0, c, 0,\n\t\t\t\t 0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationZ: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\tc, - s, 0, 0,\n\t\t\t\ts, c, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationAxis: function ( axis, angle ) {\n\n\t\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\t\tvar c = Math.cos( angle );\n\t\t\tvar s = Math.sin( angle );\n\t\t\tvar t = 1 - c;\n\t\t\tvar x = axis.x, y = axis.y, z = axis.z;\n\t\t\tvar tx = t * x, ty = t * y;\n\n\t\t\tthis.set(\n\n\t\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\t return this;\n\n\t\t},\n\n\t\tmakeScale: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\tx, 0, 0, 0,\n\t\t\t\t0, y, 0, 0,\n\t\t\t\t0, 0, z, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcompose: function ( position, quaternion, scale ) {\n\n\t\t\tthis.makeRotationFromQuaternion( quaternion );\n\t\t\tthis.scale( scale );\n\t\t\tthis.setPosition( position );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdecompose: function () {\n\n\t\t\tvar vector, matrix;\n\n\t\t\treturn function decompose( position, quaternion, scale ) {\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tvector = new Vector3();\n\t\t\t\t\tmatrix = new Matrix4();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tvar sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\t\t\tvar sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\t\t\tvar sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t\t\t// if determine is negative, we need to invert one scale\n\t\t\t\tvar det = this.determinant();\n\t\t\t\tif ( det < 0 ) {\n\n\t\t\t\t\tsx = - sx;\n\n\t\t\t\t}\n\n\t\t\t\tposition.x = te[ 12 ];\n\t\t\t\tposition.y = te[ 13 ];\n\t\t\t\tposition.z = te[ 14 ];\n\n\t\t\t\t// scale the rotation part\n\n\t\t\t\tmatrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy()\n\n\t\t\t\tvar invSX = 1 / sx;\n\t\t\t\tvar invSY = 1 / sy;\n\t\t\t\tvar invSZ = 1 / sz;\n\n\t\t\t\tmatrix.elements[ 0 ] *= invSX;\n\t\t\t\tmatrix.elements[ 1 ] *= invSX;\n\t\t\t\tmatrix.elements[ 2 ] *= invSX;\n\n\t\t\t\tmatrix.elements[ 4 ] *= invSY;\n\t\t\t\tmatrix.elements[ 5 ] *= invSY;\n\t\t\t\tmatrix.elements[ 6 ] *= invSY;\n\n\t\t\t\tmatrix.elements[ 8 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 9 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 10 ] *= invSZ;\n\n\t\t\t\tquaternion.setFromRotationMatrix( matrix );\n\n\t\t\t\tscale.x = sx;\n\t\t\t\tscale.y = sy;\n\t\t\t\tscale.z = sz;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakeFrustum: function ( left, right, bottom, top, near, far ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = 2 * near / ( right - left );\n\t\t\tvar y = 2 * near / ( top - bottom );\n\n\t\t\tvar a = ( right + left ) / ( right - left );\n\t\t\tvar b = ( top + bottom ) / ( top - bottom );\n\t\t\tvar c = - ( far + near ) / ( far - near );\n\t\t\tvar d = - 2 * far * near / ( far - near );\n\n\t\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakePerspective: function ( fov, aspect, near, far ) {\n\n\t\t\tvar ymax = near * Math.tan( _Math.DEG2RAD * fov * 0.5 );\n\t\t\tvar ymin = - ymax;\n\t\t\tvar xmin = ymin * aspect;\n\t\t\tvar xmax = ymax * aspect;\n\n\t\t\treturn this.makeFrustum( xmin, xmax, ymin, ymax, near, far );\n\n\t\t},\n\n\t\tmakeOrthographic: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar w = 1.0 / ( right - left );\n\t\t\tvar h = 1.0 / ( top - bottom );\n\t\t\tvar p = 1.0 / ( far - near );\n\n\t\t\tvar x = ( right + left ) * w;\n\t\t\tvar y = ( top + bottom ) * h;\n\t\t\tvar z = ( far + near ) * p;\n\n\t\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( matrix ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = matrix.elements;\n\n\t\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tTexture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tCubeTexture.prototype = Object.create( Texture.prototype );\n\tCubeTexture.prototype.constructor = CubeTexture;\n\n\tCubeTexture.prototype.isCubeTexture = true;\n\n\tObject.defineProperty( CubeTexture.prototype, 'images', {\n\n\t\tget: function () {\n\n\t\t\treturn this.image;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.image = value;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t *\n\t * Uniforms of a program.\n\t * Those form a tree structure with a special top-level container for the root,\n\t * which you get by calling 'new WebGLUniforms( gl, program, renderer )'.\n\t *\n\t *\n\t * Properties of inner nodes including the top-level container:\n\t *\n\t * .seq - array of nested uniforms\n\t * .map - nested uniforms by name\n\t *\n\t *\n\t * Methods of all nodes except the top-level container:\n\t *\n\t * .setValue( gl, value, [renderer] )\n\t *\n\t * \t\tuploads a uniform value(s)\n\t * \tthe 'renderer' parameter is needed for sampler uniforms\n\t *\n\t *\n\t * Static methods of the top-level container (renderer factorizations):\n\t *\n\t * .upload( gl, seq, values, renderer )\n\t *\n\t * \t\tsets uniforms in 'seq' to 'values[id].value'\n\t *\n\t * .seqWithValue( seq, values ) : filteredSeq\n\t *\n\t * \t\tfilters 'seq' entries with corresponding entry in values\n\t *\n\t *\n\t * Methods of the top-level container (renderer factorizations):\n\t *\n\t * .setValue( gl, name, value )\n\t *\n\t * \t\tsets uniform with name 'name' to 'value'\n\t *\n\t * .set( gl, obj, prop )\n\t *\n\t * \t\tsets uniform from object and property with same name than uniform\n\t *\n\t * .setOptional( gl, obj, prop )\n\t *\n\t * \t\tlike .set for an optional property of the object\n\t *\n\t */\n\n\tvar emptyTexture = new Texture();\n\tvar emptyCubeTexture = new CubeTexture();\n\n\t// --- Base for inner nodes (including the root) ---\n\n\tfunction UniformContainer() {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\t// --- Utilities ---\n\n\t// Array Caches (provide typed arrays for temporary by size)\n\n\tvar arrayCacheF32 = [];\n\tvar arrayCacheI32 = [];\n\n\t// Flattening for arrays of vectors and matrices\n\n\tfunction flatten( array, nBlocks, blockSize ) {\n\n\t\tvar firstElem = array[ 0 ];\n\n\t\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t\t// unoptimized: ! isNaN( firstElem )\n\t\t// see http://jacksondunstan.com/articles/983\n\n\t\tvar n = nBlocks * blockSize,\n\t\t\tr = arrayCacheF32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Float32Array( n );\n\t\t\tarrayCacheF32[ n ] = r;\n\n\t\t}\n\n\t\tif ( nBlocks !== 0 ) {\n\n\t\t\tfirstElem.toArray( r, 0 );\n\n\t\t\tfor ( var i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\t\toffset += blockSize;\n\t\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n\t// Texture unit allocation\n\n\tfunction allocTexUnits( renderer, n ) {\n\n\t\tvar r = arrayCacheI32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Int32Array( n );\n\t\t\tarrayCacheI32[ n ] = r;\n\n\t\t}\n\n\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\tr[ i ] = renderer.allocTextureUnit();\n\n\t\treturn r;\n\n\t}\n\n\t// --- Setters ---\n\n\t// Note: Defining these methods externally, because they come in a bunch\n\t// and this way their names minify.\n\n\t// Single scalar\n\n\tfunction setValue1f( gl, v ) { gl.uniform1f( this.addr, v ); }\n\tfunction setValue1i( gl, v ) { gl.uniform1i( this.addr, v ); }\n\n\t// Single float vector (from flat array or THREE.VectorN)\n\n\tfunction setValue2fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform2fv( this.addr, v );\n\t\telse gl.uniform2f( this.addr, v.x, v.y );\n\n\t}\n\n\tfunction setValue3fv( gl, v ) {\n\n\t\tif ( v.x !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\t\telse if ( v.r !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\t\telse\n\t\t\tgl.uniform3fv( this.addr, v );\n\n\t}\n\n\tfunction setValue4fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform4fv( this.addr, v );\n\t\telse gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t}\n\n\t// Single matrix (from flat array or MatrixN)\n\n\tfunction setValue2fm( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue3fm( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue4fm( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v.elements || v );\n\n\t}\n\n\t// Single texture (2D / Cube)\n\n\tfunction setValueT1( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTexture2D( v || emptyTexture, unit );\n\n\t}\n\n\tfunction setValueT6( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTextureCube( v || emptyCubeTexture, unit );\n\n\t}\n\n\t// Integer / Boolean vectors or arrays thereof (always flat arrays)\n\n\tfunction setValue2iv( gl, v ) { gl.uniform2iv( this.addr, v ); }\n\tfunction setValue3iv( gl, v ) { gl.uniform3iv( this.addr, v ); }\n\tfunction setValue4iv( gl, v ) { gl.uniform4iv( this.addr, v ); }\n\n\t// Helper to pick the right setter for the singular case\n\n\tfunction getSingularSetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1f; // FLOAT\n\t\t\tcase 0x8b50: return setValue2fv; // _VEC2\n\t\t\tcase 0x8b51: return setValue3fv; // _VEC3\n\t\t\tcase 0x8b52: return setValue4fv; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValue2fm; // _MAT2\n\t\t\tcase 0x8b5b: return setValue3fm; // _MAT3\n\t\t\tcase 0x8b5c: return setValue4fm; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1i; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// Array of scalars\n\n\tfunction setValue1fv( gl, v ) { gl.uniform1fv( this.addr, v ); }\n\tfunction setValue1iv( gl, v ) { gl.uniform1iv( this.addr, v ); }\n\n\t// Array of vectors (flat or from THREE classes)\n\n\tfunction setValueV2a( gl, v ) {\n\n\t\tgl.uniform2fv( this.addr, flatten( v, this.size, 2 ) );\n\n\t}\n\n\tfunction setValueV3a( gl, v ) {\n\n\t\tgl.uniform3fv( this.addr, flatten( v, this.size, 3 ) );\n\n\t}\n\n\tfunction setValueV4a( gl, v ) {\n\n\t\tgl.uniform4fv( this.addr, flatten( v, this.size, 4 ) );\n\n\t}\n\n\t// Array of matrices (flat or from THREE clases)\n\n\tfunction setValueM2a( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) );\n\n\t}\n\n\tfunction setValueM3a( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) );\n\n\t}\n\n\tfunction setValueM4a( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) );\n\n\t}\n\n\t// Array of textures (2D / Cube)\n\n\tfunction setValueT1a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\tfunction setValueT6a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\t// Helper to pick the right setter for a pure (bottom-level) array\n\n\tfunction getPureArraySetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1fv; // FLOAT\n\t\t\tcase 0x8b50: return setValueV2a; // _VEC2\n\t\t\tcase 0x8b51: return setValueV3a; // _VEC3\n\t\t\tcase 0x8b52: return setValueV4a; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValueM2a; // _MAT2\n\t\t\tcase 0x8b5b: return setValueM3a; // _MAT3\n\t\t\tcase 0x8b5c: return setValueM4a; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1a; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6a; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// --- Uniform Classes ---\n\n\tfunction SingleUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\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\tfunction StructuredUniform( id ) {\n\n\t\tthis.id = id;\n\n\t\tUniformContainer.call( this ); // mix-in\n\n\t}\n\n\tStructuredUniform.prototype.setValue = function( gl, value ) {\n\n\t\t// Note: Don't need an extra 'renderer' parameter, since samplers\n\t\t// are not allowed in structured uniforms.\n\n\t\tvar seq = this.seq;\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ] );\n\n\t\t}\n\n\t};\n\n\t// --- Top-level ---\n\n\t// Parser - builds up the property tree from the path strings\n\n\tvar RePathPart = /([\\w\\d_]+)(\\])?(\\[|\\.)?/g;\n\n\t// extracts\n\t// \t- the identifier (member name or array index)\n\t// - followed by an optional right bracket (found when array index)\n\t// - followed by an optional left bracket or dot (type of subscript)\n\t//\n\t// Note: These portions can be read in a non-overlapping fashion and\n\t// allow straightforward parsing of the hierarchy that WebGL encodes\n\t// in the uniform names.\n\n\tfunction addUniform( container, uniformObject ) {\n\n\t\tcontainer.seq.push( uniformObject );\n\t\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n\t}\n\n\tfunction parseUniform( activeInfo, addr, container ) {\n\n\t\tvar path = activeInfo.name,\n\t\t\tpathLength = path.length;\n\n\t\t// reset RegExp object, because of the early exit of a previous run\n\t\tRePathPart.lastIndex = 0;\n\n\t\tfor (; ;) {\n\n\t\t\tvar match = RePathPart.exec( path ),\n\t\t\t\tmatchEnd = RePathPart.lastIndex,\n\n\t\t\t\tid = match[ 1 ],\n\t\t\t\tidIsIndex = match[ 2 ] === ']',\n\t\t\t\tsubscript = match[ 3 ];\n\n\t\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\t\tif ( subscript === undefined ||\n\t\t\t\t\tsubscript === '[' && matchEnd + 2 === pathLength ) {\n\t\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\t\tbreak;\n\n\t\t\t} else {\n\t\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\t\tvar map = container.map,\n\t\t\t\t\tnext = map[ id ];\n\n\t\t\t\tif ( next === undefined ) {\n\n\t\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\t\taddUniform( container, next );\n\n\t\t\t\t}\n\n\t\t\t\tcontainer = next;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Root Container\n\n\tfunction WebGLUniforms( gl, program, renderer ) {\n\n\t\tUniformContainer.call( this );\n\n\t\tthis.renderer = renderer;\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\tvar info = gl.getActiveUniform( program, i ),\n\t\t\t\tpath = info.name,\n\t\t\t\taddr = gl.getUniformLocation( program, path );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tWebGLUniforms.prototype.setValue = function( gl, name, value ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.set = function( gl, object, name ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, object[ name ], this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.setOptional = function( gl, object, name ) {\n\n\t\tvar v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t};\n\n\n\t// Static interface\n\n\tWebGLUniforms.upload = function( gl, seq, values, renderer ) {\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\n\t\t\t\tu.setValue( gl, v.value, renderer );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tWebGLUniforms.seqWithValue = function( seq, values ) {\n\n\t\tvar r = [];\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar 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\t/**\n\t * Uniform Utilities\n\t */\n\n\tvar UniformsUtils = {\n\n\t\tmerge: function ( uniforms ) {\n\n\t\t\tvar merged = {};\n\n\t\t\tfor ( var u = 0; u < uniforms.length; u ++ ) {\n\n\t\t\t\tvar tmp = this.clone( uniforms[ u ] );\n\n\t\t\t\tfor ( var p in tmp ) {\n\n\t\t\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn merged;\n\n\t\t},\n\n\t\tclone: function ( uniforms_src ) {\n\n\t\t\tvar uniforms_dst = {};\n\n\t\t\tfor ( var u in uniforms_src ) {\n\n\t\t\t\tuniforms_dst[ u ] = {};\n\n\t\t\t\tfor ( var p in uniforms_src[ u ] ) {\n\n\t\t\t\t\tvar parameter_src = uniforms_src[ u ][ p ];\n\n\t\t\t\t\tif ( parameter_src && ( parameter_src.isColor ||\n\t\t\t\t\t\tparameter_src.isMatrix3 || parameter_src.isMatrix4 ||\n\t\t\t\t\t\tparameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 ||\n\t\t\t\t\t\tparameter_src.isTexture ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.clone();\n\n\t\t\t\t\t} else if ( Array.isArray( parameter_src ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.slice();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn uniforms_dst;\n\n\t\t}\n\n\t};\n\n\tvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\\n\";\n\n\tvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\\n\";\n\n\tvar alphatest_fragment = \"#ifdef ALPHATEST\\n\\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\\n\";\n\n\tvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\\n\\t#endif\\n#endif\\n\";\n\n\tvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\n\tvar begin_vertex = \"\\nvec3 transformed = vec3( position );\\n\";\n\n\tvar beginnormal_vertex = \"\\nvec3 objectNormal = vec3( normal );\\n\";\n\n\tvar bsdfs = \"bool testLightInRange( const in float lightDistance, const in float cutoffDistance ) {\\n\\treturn any( bvec2( cutoffDistance == 0.0, lightDistance < cutoffDistance ) );\\n}\\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\t\\tif( decayExponent > 0.0 ) {\\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\\n\\t\\t\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\t\\t\\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t\\t\\treturn distanceFalloff * maxDistanceCutoffFactor;\\n#else\\n\\t\\t\\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\\n#endif\\n\\t\\t}\\n\\t\\treturn 1.0;\\n}\\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\\n\\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\\n\\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\\n}\\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\treturn 1.0 / ( gl * gv );\\n}\\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\tfloat D = D_GGX( alpha, dotNH );\\n\\treturn F * ( G * D );\\n}\\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\\n\\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\\n\\tvec4 r = roughness * c0 + c1;\\n\\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\\n\\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\\n\\treturn specularColor * AB.x + AB.y;\\n}\\nfloat G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n}\\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\\n\\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\\n}\\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\\n\\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\\n}\\n\";\n\n\tvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vUv );\\n\\t\\tvec2 dSTdy = dFdy( vUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\\n\\t\\tvec3 vSigmaX = dFdx( surf_pos );\\n\\t\\tvec3 vSigmaY = dFdy( surf_pos );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 );\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\\n\";\n\n\tvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\\n\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t\\t\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\\n\\t\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\tif ( clipped ) discard;\\n\\t\\n\\t#endif\\n#endif\\n\";\n\n\tvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\t\\tvarying vec3 vViewPosition;\\n\\t#endif\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\\n\";\n\n\tvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n\";\n\n\tvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n\";\n\n\tvar color_fragment = \"#ifdef USE_COLOR\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\n\tvar color_pars_fragment = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\\n\";\n\n\tvar color_pars_vertex = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\";\n\n\tvar color_vertex = \"#ifdef USE_COLOR\\n\\tvColor.xyz = color.xyz;\\n#endif\";\n\n\tvar common = \"#define PI 3.14159265359\\n#define PI2 6.28318530718\\n#define RECIPROCAL_PI 0.31830988618\\n#define RECIPROCAL_PI2 0.15915494\\n#define LOG2 1.442695\\n#define EPSILON 1e-6\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract(sin(sn) * c);\\n}\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\tfloat distance = dot( planeNormal, point - pointOnPlane );\\n\\treturn - distance * planeNormal + point;\\n}\\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn sign( dot( point - pointOnPlane, planeNormal ) );\\n}\\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\\n}\\n\";\n\n\tvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n#define cubeUV_textureSize (1024.0)\\nint getFaceFromDirection(vec3 direction) {\\n\\tvec3 absDirection = abs(direction);\\n\\tint face = -1;\\n\\tif( absDirection.x > absDirection.z ) {\\n\\t\\tif(absDirection.x > absDirection.y )\\n\\t\\t\\tface = direction.x > 0.0 ? 0 : 3;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\telse {\\n\\t\\tif(absDirection.z > absDirection.y )\\n\\t\\t\\tface = direction.z > 0.0 ? 2 : 5;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\treturn face;\\n}\\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\\n\\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\\n\\tfloat dxRoughness = dFdx(roughness);\\n\\tfloat dyRoughness = dFdy(roughness);\\n\\tvec3 dx = dFdx( vec * scale * dxRoughness );\\n\\tvec3 dy = dFdy( vec * scale * dyRoughness );\\n\\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\\n\\td = clamp(d, 1.0, cubeUV_rangeClamp);\\n\\tfloat mipLevel = 0.5 * log2(d);\\n\\treturn vec2(floor(mipLevel), fract(mipLevel));\\n}\\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\\n\\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\\n\\tfloat a = 16.0 * cubeUV_rcpTextureSize;\\n\\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\\n\\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\\n\\tfloat powScale = exp2_packed.x * exp2_packed.y;\\n\\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\\n\\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\\n\\tbool bRes = mipLevel == 0.0;\\n\\tscale = bRes && (scale < a) ? a : scale;\\n\\tvec3 r;\\n\\tvec2 offset;\\n\\tint face = getFaceFromDirection(direction);\\n\\tfloat rcpPowScale = 1.0 / powScale;\\n\\tif( face == 0) {\\n\\t\\tr = vec3(direction.x, -direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 1) {\\n\\t\\tr = vec3(direction.y, direction.x, direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 2) {\\n\\t\\tr = vec3(direction.z, direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 3) {\\n\\t\\tr = vec3(direction.x, direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse if( face == 4) {\\n\\t\\tr = vec3(direction.y, direction.x, -direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse {\\n\\t\\tr = vec3(direction.z, -direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\tr = normalize(r);\\n\\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\\n\\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\\n\\tvec2 base = offset + vec2( texelOffset );\\n\\treturn base + s * ( scale - 2.0 * texelOffset );\\n}\\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\\n\\tfloat roughnessVal = roughness* cubeUV_maxLods3;\\n\\tfloat r1 = floor(roughnessVal);\\n\\tfloat r2 = r1 + 1.0;\\n\\tfloat t = fract(roughnessVal);\\n\\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\\n\\tfloat s = mipInfo.y;\\n\\tfloat level0 = mipInfo.x;\\n\\tfloat level1 = level0 + 1.0;\\n\\tlevel1 = level1 > 5.0 ? 5.0 : level1;\\n\\tlevel0 += min( floor( s + 0.5 ), 5.0 );\\n\\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\\n\\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\\n\\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\\n\\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\\n\\tvec4 result = mix(color10, color20, t);\\n\\treturn vec4(result.rgb, 1.0);\\n}\\n#endif\\n\";\n\n\tvar defaultnormal_vertex = \"#ifdef FLIP_SIDED\\n\\tobjectNormal = -objectNormal;\\n#endif\\nvec3 transformedNormal = normalMatrix * objectNormal;\\n\";\n\n\tvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\\n\";\n\n\tvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\\n#endif\\n\";\n\n\tvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\\n\";\n\n\tvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\\n\";\n\n\tvar encodings_fragment = \" gl_FragColor = linearToOutputTexel( gl_FragColor );\\n\";\n\n\tvar encodings_pars_fragment = \"\\nvec4 LinearToLinear( in vec4 value ) {\\n return value;\\n}\\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\\n return vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\\n}\\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\\n return vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n return vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\\n}\\nvec4 RGBEToLinear( in vec4 value ) {\\n return vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n float maxComponent = max( max( value.r, value.g ), value.b );\\n float fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n return vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n return vec4( value.xyz * value.w * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n float maxRGB = max( value.x, max( value.g, value.b ) );\\n float M = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n M = ceil( M * 255.0 ) / 255.0;\\n return vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n return vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n float maxRGB = max( value.x, max( value.g, value.b ) );\\n float D = max( maxRange / maxRGB, 1.0 );\\n D = min( floor( D ) / 255.0, 1.0 );\\n return vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\\n}\\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\\nvec4 LinearToLogLuv( in vec4 value ) {\\n vec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\\n Xp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\\n vec4 vResult;\\n vResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n float Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n vResult.w = fract(Le);\\n vResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\\n return vResult;\\n}\\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\\nvec4 LogLuvToLinear( in vec4 value ) {\\n float Le = value.z * 255.0 + value.w;\\n vec3 Xp_Y_XYZp;\\n Xp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\\n Xp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n Xp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n vec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\\n return vec4( max(vRGB, 0.0), 1.0 );\\n}\\n\";\n\n\tvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\tvec2 sampleUV;\\n\\t\\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\\n\\t\\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\tvec4 envColor = texture2D( envMap, sampleUV );\\n\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\\n\\t\\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\tenvColor = envMapTexelToLinear( envColor );\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_pars_fragment = \"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\\n\\tuniform float reflectivity;\\n\\tuniform float envMapIntenstiy;\\n#endif\\n#ifdef USE_ENVMAP\\n\\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\tuniform float flipEnvMap;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\\n\";\n\n\tvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tfloat depth = gl_FragDepthEXT / gl_FragCoord.w;\\n\\t#else\\n\\t\\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\n\\t#endif\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, depth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\\n\";\n\n\tvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\n\tvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n#endif\\n\";\n\n\tvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\n\tvar lights_lambert_vertex = \"vec3 diffuse = vec3( 1.0 );\\nGeometricContext geometry;\\ngeometry.position = mvPosition.xyz;\\ngeometry.normal = normalize( transformedNormal );\\ngeometry.viewDir = normalize( -mvPosition.xyz );\\nGeometricContext backGeometry;\\nbackGeometry.position = geometry.position;\\nbackGeometry.normal = -geometry.normal;\\nbackGeometry.viewDir = geometry.viewDir;\\nvLightFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\n\\tvLightBack = vec3( 0.0 );\\n#endif\\nIncidentLight directLight;\\nfloat dotNL;\\nvec3 directLightColor_Diffuse;\\n#if NUM_POINT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_DIR_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar lights_pars = \"uniform vec3 ambientLightColor;\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treturn irradiance;\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tdirectLight.color = directionalLight.color;\\n\\t\\tdirectLight.direction = directionalLight.direction;\\n\\t\\tdirectLight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = pointLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tif ( testLightInRange( lightDistance, pointLight.distance ) ) {\\n\\t\\t\\tdirectLight.color = pointLight.color;\\n\\t\\t\\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tfloat angleCos = dot( directLight.direction, spotLight.direction );\\n\\t\\tif ( all( bvec2( angleCos > spotLight.coneCos, testLightInRange( lightDistance, spotLight.distance ) ) ) ) {\\n\\t\\t\\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\t\\tdirectLight.color = spotLight.color;\\n\\t\\t\\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\\n\\t\\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tirradiance *= PI;\\n\\t\\t#endif\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\\t\\t#include \\n\\t\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\\n\\t\\t#else\\n\\t\\t\\tvec4 envMapColor = vec4( 0.0 );\\n\\t\\t#endif\\n\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t}\\n\\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\tfloat maxMIPLevelScalar = float( maxMIPLevel );\\n\\t\\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\\n\\t\\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\\n\\t}\\n\\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\\n\\t\\t#endif\\n\\t\\t#include \\n\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\\n\\t\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\t\\tvec2 sampleUV;\\n\\t\\t\\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\\n\\t\\t\\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\t\\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#endif\\n\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t}\\n#endif\\n\";\n\n\tvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\\n\";\n\n\tvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\nstruct BlinnPhongMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tvec3\\tspecularColor;\\n\\tfloat\\tspecularShininess;\\n\\tfloat\\tspecularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\\n\";\n\n\tvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\\n#ifdef STANDARD\\n\\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.clearCoat = saturate( clearCoat );\\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\\n#endif\\n\";\n\n\tvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tfloat\\tspecularRoughness;\\n\\tvec3\\tspecularColor;\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoat;\\n\\t\\tfloat clearCoatRoughness;\\n\\t#endif\\n};\\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\\n\\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\\n}\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\\n\\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifndef STANDARD\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\tfloat dotNL = dotNV;\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\\n\";\n\n\tvar lights_template = \"\\nGeometricContext geometry;\\ngeometry.position = - vViewPosition;\\ngeometry.normal = normal;\\ngeometry.viewDir = normalize( vViewPosition );\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tlightMapIrradiance *= PI;\\n\\t\\t#endif\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t}\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t \\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\\n\\t#endif\\n\\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\\n\\t#ifndef STANDARD\\n\\t\\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\\n\\t#else\\n\\t\\tvec3 clearCoatRadiance = vec3( 0.0 );\\n\\t#endif\\n\\t\\t\\n\\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\\n#endif\\n\";\n\n\tvar logdepthbuf_fragment = \"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\\n\\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\\n#endif\";\n\n\tvar logdepthbuf_pars_fragment = \"#ifdef USE_LOGDEPTHBUF\\n\\tuniform float logDepthBufFC;\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n#endif\\n\";\n\n\tvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n\\tuniform float logDepthBufFC;\\n#endif\";\n\n\tvar logdepthbuf_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvFragDepth = 1.0 + gl_Position.w;\\n\\t#else\\n\\t\\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\\n\\t#endif\\n#endif\\n\";\n\n\tvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\ttexelColor = mapTexelToLinear( texelColor );\\n\\tdiffuseColor *= texelColor;\\n#endif\\n\";\n\n\tvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar map_particle_fragment = \"#ifdef USE_MAP\\n\\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\\n\\tdiffuseColor *= mapTexelToLinear( mapTexel );\\n#endif\\n\";\n\n\tvar map_particle_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform vec4 offsetRepeat;\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.r;\\n#endif\\n\";\n\n\tvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\n\tvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\n\\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\n\\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\n\\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\n#endif\\n\";\n\n\tvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_MORPHNORMALS\\n\\tuniform float morphTargetInfluences[ 8 ];\\n\\t#else\\n\\tuniform float morphTargetInfluences[ 4 ];\\n\\t#endif\\n#endif\";\n\n\tvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\n\\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\n\\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\n\\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n\\t#ifndef USE_MORPHNORMALS\\n\\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\n\\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\n\\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\n\\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n\\t#endif\\n#endif\\n\";\n\n\tvar normal_flip = \"#ifdef DOUBLE_SIDED\\n\\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n#else\\n\\tfloat flipNormal = 1.0;\\n#endif\\n\";\n\n\tvar normal_fragment = \"#ifdef FLAT_SHADED\\n\\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\\n\\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal ) * flipNormal;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tnormal = perturbNormal2Arb( -vViewPosition, normal );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\\n#endif\\n\";\n\n\tvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n\\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\\n\\t\\tvec3 q0 = dFdx( eye_pos.xyz );\\n\\t\\tvec3 q1 = dFdy( eye_pos.xyz );\\n\\t\\tvec2 st0 = dFdx( vUv.st );\\n\\t\\tvec2 st1 = dFdy( vUv.st );\\n\\t\\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\\n\\t\\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\\n\\t\\tvec3 N = normalize( surf_norm );\\n\\t\\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t\\tmapN.xy = normalScale * mapN.xy;\\n\\t\\tmat3 tsn = mat3( S, T, N );\\n\\t\\treturn normalize( tsn * mapN );\\n\\t}\\n#endif\\n\";\n\n\tvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n return normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n return 1.0 - 2.0 * rgb.xyz;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n return ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n return linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n return (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n return ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\\n\";\n\n\tvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\\n\";\n\n\tvar project_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 mvPosition = modelViewMatrix * skinned;\\n#else\\n\\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\\n#endif\\ngl_Position = projectionMatrix * mvPosition;\\n\";\n\n\tvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.r;\\n#endif\\n\";\n\n\tvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\n\tvar shadowmap_pars_fragment = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\\n\\t\\tconst vec2 offset = vec2( 0.0, 1.0 );\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / size;\\n\\t\\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\\n\\t\\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\\n\\t\\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\\n\\t\\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\\n\\t\\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\\n\\t\\tvec2 f = fract( uv * size + 0.5 );\\n\\t\\tfloat a = mix( lb, lt, f.y );\\n\\t\\tfloat b = mix( rb, rt, f.y );\\n\\t\\tfloat c = mix( a, b, f.x );\\n\\t\\treturn c;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\n\\t\\tbool inFrustum = all( inFrustumVec );\\n\\t\\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n\\t\\tbool frustumTest = all( frustumTestVec );\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn 1.0;\\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 ) {\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar shadowmap_pars_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n#endif\\n\";\n\n\tvar shadowmap_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n#endif\\n\";\n\n\tvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\tDirectionalLight directionalLight;\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\tSpotLight spotLight;\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\tPointLight pointLight;\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\\n\";\n\n\tvar 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\n\tvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\t#ifdef BONE_TEXTURE\\n\\t\\tuniform sampler2D boneTexture;\\n\\t\\tuniform int boneTextureWidth;\\n\\t\\tuniform int boneTextureHeight;\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tfloat j = i * 4.0;\\n\\t\\t\\tfloat x = mod( j, float( boneTextureWidth ) );\\n\\t\\t\\tfloat y = floor( j / float( boneTextureWidth ) );\\n\\t\\t\\tfloat dx = 1.0 / float( boneTextureWidth );\\n\\t\\t\\tfloat dy = 1.0 / float( boneTextureHeight );\\n\\t\\t\\ty = dy * ( y + 0.5 );\\n\\t\\t\\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n\\t\\t\\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n\\t\\t\\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n\\t\\t\\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n\\t\\t\\tmat4 bone = mat4( v1, v2, v3, v4 );\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#else\\n\\t\\tuniform mat4 boneMatrices[ MAX_BONES ];\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tmat4 bone = boneMatrices[ int(i) ];\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#endif\\n#endif\\n\";\n\n\tvar 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\\tskinned = bindMatrixInverse * skinned;\\n#endif\\n\";\n\n\tvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n#endif\\n\";\n\n\tvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\n\tvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\n\tvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\\n\";\n\n\tvar tonemapping_pars_fragment = \"#define saturate(a) clamp( a, 0.0, 1.0 )\\nuniform float toneMappingExposure;\\nuniform float toneMappingWhitePoint;\\nvec3 LinearToneMapping( vec3 color ) {\\n return toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n color *= toneMappingExposure;\\n return saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\\nvec3 Uncharted2ToneMapping( vec3 color ) {\\n color *= toneMappingExposure;\\n return saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n color *= toneMappingExposure;\\n color = max( vec3( 0.0 ), color - 0.004 );\\n return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\n\";\n\n\tvar uv_pars_fragment = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n#endif\";\n\n\tvar uv_pars_vertex = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n\\tuniform vec4 offsetRepeat;\\n#endif\\n\";\n\n\tvar uv_vertex = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\\n#endif\";\n\n\tvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = uv2;\\n#endif\";\n\n\tvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\\n\\t#ifdef USE_SKINNING\\n\\t\\tvec4 worldPosition = modelMatrix * skinned;\\n\\t#else\\n\\t\\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\\n\\t#endif\\n#endif\\n\";\n\n\tvar cube_frag = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\\n\\tgl_FragColor.a *= opacity;\\n}\\n\";\n\n\tvar cube_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar depth_frag = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\\n\\t#endif\\n}\\n\";\n\n\tvar depth_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar distanceRGBA_frag = \"uniform vec3 lightPos;\\nvarying vec4 vWorldPosition;\\n#include \\n#include \\n#include \\nvoid main () {\\n\\t#include \\n\\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\\n}\\n\";\n\n\tvar distanceRGBA_vert = \"varying vec4 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvWorldPosition = worldPosition;\\n}\\n\";\n\n\tvar equirect_frag = \"uniform sampler2D tEquirect;\\nuniform float tFlip;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvec3 direction = normalize( vWorldPosition );\\n\\tvec2 sampleUV;\\n\\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\\n\\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n}\\n\";\n\n\tvar equirect_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar linedashed_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar linedashed_vert = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvLineDistance = scale * lineDistance;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight;\\n\\treflectedLight.directDiffuse = vec3( 0.0 );\\n\\treflectedLight.directSpecular = vec3( 0.0 );\\n\\treflectedLight.indirectDiffuse = diffuseColor.rgb;\\n\\treflectedLight.indirectSpecular = vec3( 0.0 );\\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_ENVMAP\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshlambert_frag = \"uniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\\n\\t#else\\n\\t\\treflectedLight.directDiffuse = vLightFront;\\n\\t#endif\\n\\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshlambert_vert = \"#define LAMBERT\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphong_frag = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphong_vert = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphysical_frag = \"#define PHYSICAL\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifndef STANDARD\\n\\tuniform float clearCoat;\\n\\tuniform float clearCoatRoughness;\\n#endif\\nuniform float envMapIntensity;\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphysical_vert = \"#define PHYSICAL\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar normal_frag = \"uniform float opacity;\\nvarying vec3 vNormal;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( vNormal ), opacity );\\n\\t#include \\n}\\n\";\n\n\tvar normal_vert = \"varying vec3 vNormal;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvNormal = normalize( normalMatrix * normal );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar points_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar points_vert = \"uniform float size;\\nuniform float scale;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tgl_PointSize = size * ( scale / - mvPosition.z );\\n\\t#else\\n\\t\\tgl_PointSize = size;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar shadow_frag = \"uniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\\n}\\n\";\n\n\tvar shadow_vert = \"#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar ShaderChunk = {\n\t\talphamap_fragment: alphamap_fragment,\n\t\talphamap_pars_fragment: alphamap_pars_fragment,\n\t\talphatest_fragment: alphatest_fragment,\n\t\taomap_fragment: aomap_fragment,\n\t\taomap_pars_fragment: aomap_pars_fragment,\n\t\tbegin_vertex: begin_vertex,\n\t\tbeginnormal_vertex: beginnormal_vertex,\n\t\tbsdfs: bsdfs,\n\t\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\t\tclipping_planes_fragment: clipping_planes_fragment,\n\t\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\t\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\t\tclipping_planes_vertex: clipping_planes_vertex,\n\t\tcolor_fragment: color_fragment,\n\t\tcolor_pars_fragment: color_pars_fragment,\n\t\tcolor_pars_vertex: color_pars_vertex,\n\t\tcolor_vertex: color_vertex,\n\t\tcommon: common,\n\t\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\t\tdefaultnormal_vertex: defaultnormal_vertex,\n\t\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\t\tdisplacementmap_vertex: displacementmap_vertex,\n\t\temissivemap_fragment: emissivemap_fragment,\n\t\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\t\tencodings_fragment: encodings_fragment,\n\t\tencodings_pars_fragment: encodings_pars_fragment,\n\t\tenvmap_fragment: envmap_fragment,\n\t\tenvmap_pars_fragment: envmap_pars_fragment,\n\t\tenvmap_pars_vertex: envmap_pars_vertex,\n\t\tenvmap_vertex: envmap_vertex,\n\t\tfog_fragment: fog_fragment,\n\t\tfog_pars_fragment: fog_pars_fragment,\n\t\tlightmap_fragment: lightmap_fragment,\n\t\tlightmap_pars_fragment: lightmap_pars_fragment,\n\t\tlights_lambert_vertex: lights_lambert_vertex,\n\t\tlights_pars: lights_pars,\n\t\tlights_phong_fragment: lights_phong_fragment,\n\t\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\t\tlights_physical_fragment: lights_physical_fragment,\n\t\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\t\tlights_template: lights_template,\n\t\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\t\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\t\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\t\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\t\tmap_fragment: map_fragment,\n\t\tmap_pars_fragment: map_pars_fragment,\n\t\tmap_particle_fragment: map_particle_fragment,\n\t\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\t\tmetalnessmap_fragment: metalnessmap_fragment,\n\t\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\t\tmorphnormal_vertex: morphnormal_vertex,\n\t\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\t\tmorphtarget_vertex: morphtarget_vertex,\n\t\tnormal_flip: normal_flip,\n\t\tnormal_fragment: normal_fragment,\n\t\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\t\tpacking: packing,\n\t\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\t\tproject_vertex: project_vertex,\n\t\troughnessmap_fragment: roughnessmap_fragment,\n\t\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\t\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\t\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\t\tshadowmap_vertex: shadowmap_vertex,\n\t\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\t\tskinbase_vertex: skinbase_vertex,\n\t\tskinning_pars_vertex: skinning_pars_vertex,\n\t\tskinning_vertex: skinning_vertex,\n\t\tskinnormal_vertex: skinnormal_vertex,\n\t\tspecularmap_fragment: specularmap_fragment,\n\t\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\t\ttonemapping_fragment: tonemapping_fragment,\n\t\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\t\tuv_pars_fragment: uv_pars_fragment,\n\t\tuv_pars_vertex: uv_pars_vertex,\n\t\tuv_vertex: uv_vertex,\n\t\tuv2_pars_fragment: uv2_pars_fragment,\n\t\tuv2_pars_vertex: uv2_pars_vertex,\n\t\tuv2_vertex: uv2_vertex,\n\t\tworldpos_vertex: worldpos_vertex,\n\n\t\tcube_frag: cube_frag,\n\t\tcube_vert: cube_vert,\n\t\tdepth_frag: depth_frag,\n\t\tdepth_vert: depth_vert,\n\t\tdistanceRGBA_frag: distanceRGBA_frag,\n\t\tdistanceRGBA_vert: distanceRGBA_vert,\n\t\tequirect_frag: equirect_frag,\n\t\tequirect_vert: equirect_vert,\n\t\tlinedashed_frag: linedashed_frag,\n\t\tlinedashed_vert: linedashed_vert,\n\t\tmeshbasic_frag: meshbasic_frag,\n\t\tmeshbasic_vert: meshbasic_vert,\n\t\tmeshlambert_frag: meshlambert_frag,\n\t\tmeshlambert_vert: meshlambert_vert,\n\t\tmeshphong_frag: meshphong_frag,\n\t\tmeshphong_vert: meshphong_vert,\n\t\tmeshphysical_frag: meshphysical_frag,\n\t\tmeshphysical_vert: meshphysical_vert,\n\t\tnormal_frag: normal_frag,\n\t\tnormal_vert: normal_vert,\n\t\tpoints_frag: points_frag,\n\t\tpoints_vert: points_vert,\n\t\tshadow_frag: shadow_frag,\n\t\tshadow_vert: shadow_vert\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Color( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\t\t\treturn this.set( r );\n\n\t\t}\n\n\t\treturn this.setRGB( r, g, b );\n\n\t}\n\n\tColor.prototype = {\n\n\t\tconstructor: Color,\n\n\t\tisColor: true,\n\n\t\tr: 1, g: 1, b: 1,\n\n\t\tset: function ( value ) {\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\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.r = scalar;\n\t\t\tthis.g = scalar;\n\t\t\tthis.b = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHex: function ( hex ) {\n\n\t\t\thex = Math.floor( hex );\n\n\t\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetRGB: function ( r, g, b ) {\n\n\t\t\tthis.r = r;\n\t\t\tthis.g = g;\n\t\t\tthis.b = b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHSL: function () {\n\n\t\t\tfunction hue2rgb( p, q, t ) {\n\n\t\t\t\tif ( t < 0 ) t += 1;\n\t\t\t\tif ( t > 1 ) t -= 1;\n\t\t\t\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\t\t\t\tif ( t < 1 / 2 ) return q;\n\t\t\t\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\t\t\t\treturn p;\n\n\t\t\t}\n\n\t\t\treturn function setHSL( h, s, l ) {\n\n\t\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\t\t\th = _Math.euclideanModulo( h, 1 );\n\t\t\t\ts = _Math.clamp( s, 0, 1 );\n\t\t\t\tl = _Math.clamp( l, 0, 1 );\n\n\t\t\t\tif ( s === 0 ) {\n\n\t\t\t\t\tthis.r = this.g = this.b = l;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\t\t\tvar q = ( 2 * l ) - p;\n\n\t\t\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetStyle: function ( style ) {\n\n\t\t\tfunction handleAlpha( string ) {\n\n\t\t\t\tif ( string === undefined ) return;\n\n\t\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tvar m;\n\n\t\t\tif ( m = /^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t\t// rgb / hsl\n\n\t\t\t\tvar color;\n\t\t\t\tvar name = m[ 1 ];\n\t\t\t\tvar components = m[ 2 ];\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'rgb':\n\t\t\t\t\tcase 'rgba':\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'hsl':\n\t\t\t\t\tcase 'hsla':\n\n\t\t\t\t\t\tif ( color = /^([0-9]*\\.?[0-9]+)\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\t\tvar h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\t\tvar s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\t\tvar l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( m = /^\\#([A-Fa-f0-9]+)$/.exec( style ) ) {\n\n\t\t\t\t// hex color\n\n\t\t\t\tvar hex = m[ 1 ];\n\t\t\t\tvar size = hex.length;\n\n\t\t\t\tif ( size === 3 ) {\n\n\t\t\t\t\t// #ff0\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t\t// #ff0000\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( style && style.length > 0 ) {\n\n\t\t\t\t// color keywords\n\t\t\t\tvar hex = ColorKeywords[ style ];\n\n\t\t\t\tif ( hex !== undefined ) {\n\n\t\t\t\t\t// red\n\t\t\t\t\tthis.setHex( hex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// unknown color\n\t\t\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t\t},\n\n\t\tcopy: function ( color ) {\n\n\t\t\tthis.r = color.r;\n\t\t\tthis.g = color.g;\n\t\t\tthis.b = color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyGammaToLinear: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tthis.r = Math.pow( color.r, gammaFactor );\n\t\t\tthis.g = Math.pow( color.g, gammaFactor );\n\t\t\tthis.b = Math.pow( color.b, gammaFactor );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyLinearToGamma: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tvar safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;\n\n\t\t\tthis.r = Math.pow( color.r, safeInverse );\n\t\t\tthis.g = Math.pow( color.g, safeInverse );\n\t\t\tthis.b = Math.pow( color.b, safeInverse );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertGammaToLinear: function () {\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tthis.r = r * r;\n\t\t\tthis.g = g * g;\n\t\t\tthis.b = b * b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertLinearToGamma: function () {\n\n\t\t\tthis.r = Math.sqrt( this.r );\n\t\t\tthis.g = Math.sqrt( this.g );\n\t\t\tthis.b = Math.sqrt( this.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetHex: function () {\n\n\t\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t\t},\n\n\t\tgetHexString: function () {\n\n\t\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t\t},\n\n\t\tgetHSL: function ( optionalTarget ) {\n\n\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\t\tvar hsl = optionalTarget || { h: 0, s: 0, l: 0 };\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tvar max = Math.max( r, g, b );\n\t\t\tvar min = Math.min( r, g, b );\n\n\t\t\tvar hue, saturation;\n\t\t\tvar lightness = ( min + max ) / 2.0;\n\n\t\t\tif ( min === max ) {\n\n\t\t\t\thue = 0;\n\t\t\t\tsaturation = 0;\n\n\t\t\t} else {\n\n\t\t\t\tvar delta = max - min;\n\n\t\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\t\tswitch ( max ) {\n\n\t\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t\t}\n\n\t\t\t\thue /= 6;\n\n\t\t\t}\n\n\t\t\thsl.h = hue;\n\t\t\thsl.s = saturation;\n\t\t\thsl.l = lightness;\n\n\t\t\treturn hsl;\n\n\t\t},\n\n\t\tgetStyle: function () {\n\n\t\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t\t},\n\n\t\toffsetHSL: function ( h, s, l ) {\n\n\t\t\tvar hsl = this.getHSL();\n\n\t\t\thsl.h += h; hsl.s += s; hsl.l += l;\n\n\t\t\tthis.setHSL( hsl.h, hsl.s, hsl.l );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( color ) {\n\n\t\t\tthis.r += color.r;\n\t\t\tthis.g += color.g;\n\t\t\tthis.b += color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddColors: function ( color1, color2 ) {\n\n\t\t\tthis.r = color1.r + color2.r;\n\t\t\tthis.g = color1.g + color2.g;\n\t\t\tthis.b = color1.b + color2.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.r += s;\n\t\t\tthis.g += s;\n\t\t\tthis.b += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function( color ) {\n\n\t\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( color ) {\n\n\t\t\tthis.r *= color.r;\n\t\t\tthis.g *= color.g;\n\t\t\tthis.b *= color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tthis.r *= s;\n\t\t\tthis.g *= s;\n\t\t\tthis.b *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerp: function ( color, alpha ) {\n\n\t\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( c ) {\n\n\t\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.r = array[ offset ];\n\t\t\tthis.g = array[ offset + 1 ];\n\t\t\tthis.b = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.r;\n\t\t\tarray[ offset + 1 ] = this.g;\n\t\t\tarray[ offset + 2 ] = this.b;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\treturn this.getHex();\n\n\t\t}\n\n\t};\n\n\tvar 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, '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\n\t/**\n\t * Uniforms library for shared webgl shaders\n\t */\n\n\tvar UniformsLib = {\n\n\t\tcommon: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) },\n\n\t\t\tspecularMap: { value: null },\n\t\t\talphaMap: { value: null },\n\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: - 1 },\n\t\t\treflectivity: { value: 1.0 },\n\t\t\trefractionRatio: { value: 0.98 }\n\n\t\t},\n\n\t\taomap: {\n\n\t\t\taoMap: { value: null },\n\t\t\taoMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\tlightmap: {\n\n\t\t\tlightMap: { value: null },\n\t\t\tlightMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\temissivemap: {\n\n\t\t\temissiveMap: { value: null }\n\n\t\t},\n\n\t\tbumpmap: {\n\n\t\t\tbumpMap: { value: null },\n\t\t\tbumpScale: { value: 1 }\n\n\t\t},\n\n\t\tnormalmap: {\n\n\t\t\tnormalMap: { value: null },\n\t\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t\t},\n\n\t\tdisplacementmap: {\n\n\t\t\tdisplacementMap: { value: null },\n\t\t\tdisplacementScale: { value: 1 },\n\t\t\tdisplacementBias: { value: 0 }\n\n\t\t},\n\n\t\troughnessmap: {\n\n\t\t\troughnessMap: { value: null }\n\n\t\t},\n\n\t\tmetalnessmap: {\n\n\t\t\tmetalnessMap: { value: null }\n\n\t\t},\n\n\t\tfog: {\n\n\t\t\tfogDensity: { value: 0.00025 },\n\t\t\tfogNear: { value: 1 },\n\t\t\tfogFar: { value: 2000 },\n\t\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t\t},\n\n\t\tlights: {\n\n\t\t\tambientLightColor: { value: [] },\n\n\t\t\tdirectionalLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tcolor: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tdirectionalShadowMap: { value: [] },\n\t\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\t\tspotLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdirection: {},\n\t\t\t\tdistance: {},\n\t\t\t\tconeCos: {},\n\t\t\t\tpenumbraCos: {},\n\t\t\t\tdecay: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tspotShadowMap: { value: [] },\n\t\t\tspotShadowMatrix: { value: [] },\n\n\t\t\tpointLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdecay: {},\n\t\t\t\tdistance: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tpointShadowMap: { value: [] },\n\t\t\tpointShadowMatrix: { value: [] },\n\n\t\t\themisphereLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tskyColor: {},\n\t\t\t\tgroundColor: {}\n\t\t\t} }\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\t\t\tsize: { value: 1.0 },\n\t\t\tscale: { value: 1.0 },\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) }\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t */\n\n\tvar ShaderLib = {\n\n\t\tbasic: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.fog\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t\t},\n\n\t\tlambert: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\n\t\t\t\t{\n\t\t\t\t\temissive : { value: new Color( 0x000000 ) }\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t\t},\n\n\t\tphong: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\n\t\t\t\t{\n\t\t\t\t\temissive : { value: new Color( 0x000000 ) },\n\t\t\t\t\tspecular : { value: new Color( 0x111111 ) },\n\t\t\t\t\tshininess: { value: 30 }\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t\t},\n\n\t\tstandard: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.roughnessmap,\n\t\t\t\tUniformsLib.metalnessmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\n\t\t\t\t{\n\t\t\t\t\temissive : { value: new Color( 0x000000 ) },\n\t\t\t\t\troughness: { value: 0.5 },\n\t\t\t\t\tmetalness: { value: 0 },\n\t\t\t\t\tenvMapIntensity : { value: 1 }, // temporary\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.points,\n\t\t\t\tUniformsLib.fog\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.points_vert,\n\t\t\tfragmentShader: ShaderChunk.points_frag\n\n\t\t},\n\n\t\tdashed: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.fog,\n\n\t\t\t\t{\n\t\t\t\t\tscale : { value: 1 },\n\t\t\t\t\tdashSize : { value: 1 },\n\t\t\t\t\ttotalSize: { value: 2 }\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t\t},\n\n\t\tdepth: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.displacementmap\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.depth_vert,\n\t\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t\t},\n\n\t\tnormal: {\n\n\t\t\tuniforms: {\n\n\t\t\t\topacity : { value: 1.0 }\n\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.normal_vert,\n\t\t\tfragmentShader: ShaderChunk.normal_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tcube: {\n\n\t\t\tuniforms: {\n\t\t\t\ttCube: { value: null },\n\t\t\t\ttFlip: { value: - 1 },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.cube_vert,\n\t\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tequirect: {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t\ttFlip: { value: - 1 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t\t},\n\n\t\tdistanceRGBA: {\n\n\t\t\tuniforms: {\n\n\t\t\t\tlightPos: { value: new Vector3() }\n\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t\t}\n\n\t};\n\n\tShaderLib.physical = {\n\n\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\tShaderLib.standard.uniforms,\n\n\t\t\t{\n\t\t\t\tclearCoat: { value: 0 },\n\t\t\t\tclearCoatRoughness: { value: 0 }\n\t\t\t}\n\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Box2( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );\n\n\t}\n\n\tBox2.prototype = {\n\n\t\tconstructor: Box2,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = + Infinity;\n\t\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\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\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tif ( point.x < this.min.x || point.x > this.max.x ||\n\t\t\t point.y < this.min.y || point.y > this.max.y ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\tif ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) &&\n\t\t\t ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\n\t\t\tif ( box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t box.max.y < this.min.y || box.min.y > this.max.y ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlarePlugin( renderer, flares ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar shader, program, attributes, uniforms;\n\n\t\tvar tempTexture, occlusionTexture;\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 1, - 1, 0, 0,\n\t\t\t\t 1, - 1, 1, 0,\n\t\t\t\t 1, 1, 1, 1,\n\t\t\t\t- 1, 1, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\t// buffers\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\t// textures\n\n\t\t\ttempTexture = gl.createTexture();\n\t\t\tocclusionTexture = gl.createTexture();\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tshader = {\n\n\t\t\t\tvertexShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform vec3 screenPosition;\",\n\t\t\t\t\t\"uniform vec2 scale;\",\n\t\t\t\t\t\"uniform float rotation;\",\n\n\t\t\t\t\t\"uniform sampler2D occlusionMap;\",\n\n\t\t\t\t\t\"attribute vec2 position;\",\n\t\t\t\t\t\"attribute vec2 uv;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t\"vUV = uv;\",\n\n\t\t\t\t\t\t\"vec2 pos = position;\",\n\n\t\t\t\t\t\t\"if ( renderType == 2 ) {\",\n\n\t\t\t\t\t\t\t\"vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\",\n\n\t\t\t\t\t\t\t\"vVisibility = visibility.r / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.g / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= visibility.b / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.a / 9.0;\",\n\n\t\t\t\t\t\t\t\"pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\",\n\t\t\t\t\t\t\t\"pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\t\"gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" ),\n\n\t\t\t\tfragmentShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform sampler2D map;\",\n\t\t\t\t\t\"uniform float opacity;\",\n\t\t\t\t\t\"uniform vec3 color;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t// pink square\n\n\t\t\t\t\t\t\"if ( renderType == 0 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\",\n\n\t\t\t\t\t\t// restore\n\n\t\t\t\t\t\t\"} else if ( renderType == 1 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = texture2D( map, vUV );\",\n\n\t\t\t\t\t\t// flare\n\n\t\t\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\t\t\"vec4 texture = texture2D( map, vUV );\",\n\t\t\t\t\t\t\t\"texture.a *= opacity * vVisibility;\",\n\t\t\t\t\t\t\t\"gl_FragColor = texture;\",\n\t\t\t\t\t\t\t\"gl_FragColor.rgb *= color;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" )\n\n\t\t\t};\n\n\t\t\tprogram = createProgram( shader );\n\n\t\t\tattributes = {\n\t\t\t\tvertex: gl.getAttribLocation ( program, \"position\" ),\n\t\t\t\tuv: gl.getAttribLocation ( program, \"uv\" )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\trenderType: gl.getUniformLocation( program, \"renderType\" ),\n\t\t\t\tmap: gl.getUniformLocation( program, \"map\" ),\n\t\t\t\tocclusionMap: gl.getUniformLocation( program, \"occlusionMap\" ),\n\t\t\t\topacity: gl.getUniformLocation( program, \"opacity\" ),\n\t\t\t\tcolor: gl.getUniformLocation( program, \"color\" ),\n\t\t\t\tscale: gl.getUniformLocation( program, \"scale\" ),\n\t\t\t\trotation: gl.getUniformLocation( program, \"rotation\" ),\n\t\t\t\tscreenPosition: gl.getUniformLocation( program, \"screenPosition\" )\n\t\t\t};\n\n\t\t}\n\n\t\t/*\n\t\t * Render lens flares\n\t\t * Method: renders 16x16 0xff00ff-colored points scattered over the light source area,\n\t\t * reads these back and calculates occlusion.\n\t\t */\n\n\t\tthis.render = function ( scene, camera, viewport ) {\n\n\t\t\tif ( flares.length === 0 ) return;\n\n\t\t\tvar tempPosition = new Vector3();\n\n\t\t\tvar invAspect = viewport.w / viewport.z,\n\t\t\t\thalfViewportWidth = viewport.z * 0.5,\n\t\t\t\thalfViewportHeight = viewport.w * 0.5;\n\n\t\t\tvar size = 16 / viewport.w,\n\t\t\t\tscale = new Vector2( size * invAspect, size );\n\n\t\t\tvar screenPosition = new Vector3( 1, 1, 0 ),\n\t\t\t\tscreenPositionPixels = new Vector2( 1, 1 );\n\n\t\t\tvar validArea = new Box2();\n\n\t\t\tvalidArea.min.set( viewport.x, viewport.y );\n\t\t\tvalidArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) );\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.vertex );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t// loop through all lens flares to update their occlusion and positions\n\t\t\t// setup gl and common used attribs/uniforms\n\n\t\t\tgl.uniform1i( uniforms.occlusionMap, 0 );\n\t\t\tgl.uniform1i( uniforms.map, 1 );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.setDepthWrite( false );\n\n\t\t\tfor ( var i = 0, l = flares.length; i < l; i ++ ) {\n\n\t\t\t\tsize = 16 / viewport.w;\n\t\t\t\tscale.set( size * invAspect, size );\n\n\t\t\t\t// calc object screen position\n\n\t\t\t\tvar flare = flares[ i ];\n\n\t\t\t\ttempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] );\n\n\t\t\t\ttempPosition.applyMatrix4( camera.matrixWorldInverse );\n\t\t\t\ttempPosition.applyProjection( camera.projectionMatrix );\n\n\t\t\t\t// setup arrays for gl programs\n\n\t\t\t\tscreenPosition.copy( tempPosition );\n\n\t\t\t\t// horizontal and vertical coordinate of the lower left corner of the pixels to copy\n\n\t\t\t\tscreenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8;\n\t\t\t\tscreenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8;\n\n\t\t\t\t// screen cull\n\n\t\t\t\tif ( validArea.containsPoint( screenPositionPixels ) === true ) {\n\n\t\t\t\t\t// save current RGB to temp texture\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, null );\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// render pink quad\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\n\t\t\t\t\tstate.disable( gl.BLEND );\n\t\t\t\t\tstate.enable( gl.DEPTH_TEST );\n\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// copy result to occlusionMap\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// restore graphics\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 1 );\n\t\t\t\t\tstate.disable( gl.DEPTH_TEST );\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// update object positions\n\n\t\t\t\t\tflare.positionScreen.copy( screenPosition );\n\n\t\t\t\t\tif ( flare.customUpdateCallback ) {\n\n\t\t\t\t\t\tflare.customUpdateCallback( flare );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tflare.updateLensFlares();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// render flares\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 2 );\n\t\t\t\t\tstate.enable( gl.BLEND );\n\n\t\t\t\t\tfor ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar sprite = flare.lensFlares[ j ];\n\n\t\t\t\t\t\tif ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) {\n\n\t\t\t\t\t\t\tscreenPosition.x = sprite.x;\n\t\t\t\t\t\t\tscreenPosition.y = sprite.y;\n\t\t\t\t\t\t\tscreenPosition.z = sprite.z;\n\n\t\t\t\t\t\t\tsize = sprite.size * sprite.scale / viewport.w;\n\n\t\t\t\t\t\t\tscale.x = size * invAspect;\n\t\t\t\t\t\t\tscale.y = size;\n\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\t\t\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.rotation, sprite.rotation );\n\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.opacity, sprite.opacity );\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b );\n\n\t\t\t\t\t\t\tstate.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst );\n\t\t\t\t\t\t\trenderer.setTexture2D( sprite.texture, 1 );\n\n\t\t\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\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// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.DEPTH_TEST );\n\t\t\tstate.setDepthWrite( true );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram( shader ) {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\n\t\t\tvar prefix = \"precision \" + renderer.getPrecision() + \" float;\\n\";\n\n\t\t\tgl.shaderSource( fragmentShader, prefix + shader.fragmentShader );\n\t\t\tgl.shaderSource( vertexShader, prefix + shader.vertexShader );\n\n\t\t\tgl.compileShader( fragmentShader );\n\t\t\tgl.compileShader( vertexShader );\n\n\t\t\tgl.attachShader( program, fragmentShader );\n\t\t\tgl.attachShader( program, vertexShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpritePlugin( renderer, sprites ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar program, attributes, uniforms;\n\n\t\tvar texture;\n\n\t\t// decompose matrixWorld\n\n\t\tvar spritePosition = new Vector3();\n\t\tvar spriteRotation = new Quaternion();\n\t\tvar spriteScale = new Vector3();\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 0.5, - 0.5, 0, 0,\n\t\t\t\t 0.5, - 0.5, 1, 0,\n\t\t\t\t 0.5, 0.5, 1, 1,\n\t\t\t\t- 0.5, 0.5, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\tprogram = createProgram();\n\n\t\t\tattributes = {\n\t\t\t\tposition:\t\t\tgl.getAttribLocation ( program, 'position' ),\n\t\t\t\tuv:\t\t\t\t\tgl.getAttribLocation ( program, 'uv' )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\tuvOffset:\t\t\tgl.getUniformLocation( program, 'uvOffset' ),\n\t\t\t\tuvScale:\t\t\tgl.getUniformLocation( program, 'uvScale' ),\n\n\t\t\t\trotation:\t\t\tgl.getUniformLocation( program, 'rotation' ),\n\t\t\t\tscale:\t\t\t\tgl.getUniformLocation( program, 'scale' ),\n\n\t\t\t\tcolor:\t\t\t\tgl.getUniformLocation( program, 'color' ),\n\t\t\t\tmap:\t\t\t\tgl.getUniformLocation( program, 'map' ),\n\t\t\t\topacity:\t\t\tgl.getUniformLocation( program, 'opacity' ),\n\n\t\t\t\tmodelViewMatrix: \tgl.getUniformLocation( program, 'modelViewMatrix' ),\n\t\t\t\tprojectionMatrix:\tgl.getUniformLocation( program, 'projectionMatrix' ),\n\n\t\t\t\tfogType:\t\t\tgl.getUniformLocation( program, 'fogType' ),\n\t\t\t\tfogDensity:\t\t\tgl.getUniformLocation( program, 'fogDensity' ),\n\t\t\t\tfogNear:\t\t\tgl.getUniformLocation( program, 'fogNear' ),\n\t\t\t\tfogFar:\t\t\t\tgl.getUniformLocation( program, 'fogFar' ),\n\t\t\t\tfogColor:\t\t\tgl.getUniformLocation( program, 'fogColor' ),\n\n\t\t\t\talphaTest:\t\t\tgl.getUniformLocation( program, 'alphaTest' )\n\t\t\t};\n\n\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\tcanvas.width = 8;\n\t\t\tcanvas.height = 8;\n\n\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\tcontext.fillStyle = 'white';\n\t\t\tcontext.fillRect( 0, 0, 8, 8 );\n\n\t\t\ttexture = new Texture( canvas );\n\t\t\ttexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( sprites.length === 0 ) return;\n\n\t\t\t// setup gl\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.position );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.BLEND );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tgl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );\n\n\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\tgl.uniform1i( uniforms.map, 0 );\n\n\t\t\tvar oldFogType = 0;\n\t\t\tvar sceneFogType = 0;\n\t\t\tvar fog = scene.fog;\n\n\t\t\tif ( fog ) {\n\n\t\t\t\tgl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );\n\n\t\t\t\tif ( (fog && fog.isFog) ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogNear, fog.near );\n\t\t\t\t\tgl.uniform1f( uniforms.fogFar, fog.far );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 1 );\n\t\t\t\t\toldFogType = 1;\n\t\t\t\t\tsceneFogType = 1;\n\n\t\t\t\t} else if ( (fog && fog.isFogExp2) ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogDensity, fog.density );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 2 );\n\t\t\t\t\toldFogType = 2;\n\t\t\t\t\tsceneFogType = 2;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tgl.uniform1i( uniforms.fogType, 0 );\n\t\t\t\toldFogType = 0;\n\t\t\t\tsceneFogType = 0;\n\n\t\t\t}\n\n\n\t\t\t// update positions and sort\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\n\t\t\t\tsprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld );\n\t\t\t\tsprite.z = - sprite.modelViewMatrix.elements[ 14 ];\n\n\t\t\t}\n\n\t\t\tsprites.sort( painterSortStable );\n\n\t\t\t// render all sprites\n\n\t\t\tvar scale = [];\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\t\t\t\tvar material = sprite.material;\n\n\t\t\t\tif ( material.visible === false ) continue;\n\n\t\t\t\tgl.uniform1f( uniforms.alphaTest, material.alphaTest );\n\t\t\t\tgl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements );\n\n\t\t\t\tsprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale );\n\n\t\t\t\tscale[ 0 ] = spriteScale.x;\n\t\t\t\tscale[ 1 ] = spriteScale.y;\n\n\t\t\t\tvar fogType = 0;\n\n\t\t\t\tif ( scene.fog && material.fog ) {\n\n\t\t\t\t\tfogType = sceneFogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( oldFogType !== fogType ) {\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, fogType );\n\t\t\t\t\toldFogType = fogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.map !== null ) {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, 0, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, 1, 1 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.uniform1f( uniforms.opacity, material.opacity );\n\t\t\t\tgl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );\n\n\t\t\t\tgl.uniform1f( uniforms.rotation, material.rotation );\n\t\t\t\tgl.uniform2fv( uniforms.scale, scale );\n\n\t\t\t\tstate.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );\n\t\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\t\tstate.setDepthWrite( material.depthWrite );\n\n\t\t\t\tif ( material.map ) {\n\n\t\t\t\t\trenderer.setTexture2D( material.map, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setTexture2D( texture, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram() {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\n\t\t\tgl.shaderSource( vertexShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform float rotation;',\n\t\t\t\t'uniform vec2 scale;',\n\t\t\t\t'uniform vec2 uvOffset;',\n\t\t\t\t'uniform vec2 uvScale;',\n\n\t\t\t\t'attribute vec2 position;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vUV = uvOffset + uv * uvScale;',\n\n\t\t\t\t\t'vec2 alignedPosition = position * scale;',\n\n\t\t\t\t\t'vec2 rotatedPosition;',\n\t\t\t\t\t'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',\n\t\t\t\t\t'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',\n\n\t\t\t\t\t'vec4 finalPosition;',\n\n\t\t\t\t\t'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',\n\t\t\t\t\t'finalPosition.xy += rotatedPosition;',\n\t\t\t\t\t'finalPosition = projectionMatrix * finalPosition;',\n\n\t\t\t\t\t'gl_Position = finalPosition;',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.shaderSource( fragmentShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform vec3 color;',\n\t\t\t\t'uniform sampler2D map;',\n\t\t\t\t'uniform float opacity;',\n\n\t\t\t\t'uniform int fogType;',\n\t\t\t\t'uniform vec3 fogColor;',\n\t\t\t\t'uniform float fogDensity;',\n\t\t\t\t'uniform float fogNear;',\n\t\t\t\t'uniform float fogFar;',\n\t\t\t\t'uniform float alphaTest;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vec4 texture = texture2D( map, vUV );',\n\n\t\t\t\t\t'if ( texture.a < alphaTest ) discard;',\n\n\t\t\t\t\t'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',\n\n\t\t\t\t\t'if ( fogType > 0 ) {',\n\n\t\t\t\t\t\t'float depth = gl_FragCoord.z / gl_FragCoord.w;',\n\t\t\t\t\t\t'float fogFactor = 0.0;',\n\n\t\t\t\t\t\t'if ( fogType == 1 ) {',\n\n\t\t\t\t\t\t\t'fogFactor = smoothstep( fogNear, fogFar, depth );',\n\n\t\t\t\t\t\t'} else {',\n\n\t\t\t\t\t\t\t'const float LOG2 = 1.442695;',\n\t\t\t\t\t\t\t'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );',\n\t\t\t\t\t\t\t'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',\n\n\t\t\t\t\t\t'}',\n\n\t\t\t\t\t\t'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );',\n\n\t\t\t\t\t'}',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.compileShader( vertexShader );\n\t\t\tgl.compileShader( fragmentShader );\n\n\t\t\tgl.attachShader( program, vertexShader );\n\t\t\tgl.attachShader( program, fragmentShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\t\treturn a.renderOrder - b.renderOrder;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn b.id - a.id;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Material() {\n\n\t\tObject.defineProperty( this, 'id', { value: MaterialIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.fog = true;\n\t\tthis.lights = true;\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading\n\t\tthis.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = 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\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\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.alphaTest = 0;\n\t\tthis.premultipliedAlpha = false;\n\n\t\tthis.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer\n\n\t\tthis.visible = true;\n\n\t\tthis._needsUpdate = true;\n\n\t}\n\n\tMaterial.prototype = {\n\n\t\tconstructor: Material,\n\n\t\tisMaterial: true,\n\n\t\tget needsUpdate() {\n\n\t\t\treturn this._needsUpdate;\n\n\t\t},\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.update();\n\t\t\tthis._needsUpdate = value;\n\n\t\t},\n\n\t\tsetValues: function ( values ) {\n\n\t\t\tif ( values === undefined ) return;\n\n\t\t\tfor ( var key in values ) {\n\n\t\t\t\tvar newValue = values[ key ];\n\n\t\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.Material: '\" + key + \"' parameter is undefined.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar currentValue = this[ key ];\n\n\t\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.\" + this.type + \": '\" + key + \"' is not a property of this material.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tif ( (currentValue && currentValue.isColor) ) {\n\n\t\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t\t} else if ( (currentValue && currentValue.isVector3) && (newValue && newValue.isVector3) ) {\n\n\t\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t\t} else if ( key === 'overdraw' ) {\n\n\t\t\t\t\t// ensure overdraw is backwards-compatible with legacy boolean type\n\t\t\t\t\tthis[ key ] = Number( newValue );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar isRoot = meta === undefined;\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tmeta = {\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Material',\n\t\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Material serialization\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( (this.color && this.color.isColor) ) data.color = this.color.getHex();\n\n\t\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\t\tif ( (this.emissive && this.emissive.isColor) ) data.emissive = this.emissive.getHex();\n\t\t\tif ( (this.specular && this.specular.isColor) ) data.specular = this.specular.getHex();\n\t\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\n\t\t\tif ( (this.map && this.map.isTexture) ) data.map = this.map.toJSON( meta ).uuid;\n\t\t\tif ( (this.alphaMap && this.alphaMap.isTexture) ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.lightMap && this.lightMap.isTexture) ) data.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.bumpMap && this.bumpMap.isTexture) ) {\n\n\t\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t\t}\n\t\t\tif ( (this.normalMap && this.normalMap.isTexture) ) {\n\n\t\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t\t}\n\t\t\tif ( (this.displacementMap && this.displacementMap.isTexture) ) {\n\n\t\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t\t}\n\t\t\tif ( (this.roughnessMap && this.roughnessMap.isTexture) ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.metalnessMap && this.metalnessMap.isTexture) ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\t\tif ( (this.emissiveMap && this.emissiveMap.isTexture) ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.specularMap && this.specularMap.isTexture) ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\n\t\t\tif ( (this.envMap && this.envMap.isTexture) ) {\n\n\t\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\t\t\t\tdata.reflectivity = this.reflectivity; // Scale behind envMap\n\n\t\t\t}\n\n\t\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\t\tif ( this.shading !== SmoothShading ) data.shading = this.shading;\n\t\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\t\tif ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors;\n\n\t\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\t\tdata.depthFunc = this.depthFunc;\n\t\t\tdata.depthTest = this.depthTest;\n\t\t\tdata.depthWrite = this.depthWrite;\n\n\t\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\t\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\t\tdata.skinning = this.skinning;\n\t\t\tdata.morphTargets = this.morphTargets;\n\n\t\t\t// TODO: Copied from Object3D.toJSON\n\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.fog = source.fog;\n\t\t\tthis.lights = source.lights;\n\n\t\t\tthis.blending = source.blending;\n\t\t\tthis.side = source.side;\n\t\t\tthis.shading = source.shading;\n\t\t\tthis.vertexColors = source.vertexColors;\n\n\t\t\tthis.opacity = source.opacity;\n\t\t\tthis.transparent = source.transparent;\n\n\t\t\tthis.blendSrc = source.blendSrc;\n\t\t\tthis.blendDst = source.blendDst;\n\t\t\tthis.blendEquation = source.blendEquation;\n\t\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\t\tthis.depthFunc = source.depthFunc;\n\t\t\tthis.depthTest = source.depthTest;\n\t\t\tthis.depthWrite = source.depthWrite;\n\n\t\t\tthis.colorWrite = source.colorWrite;\n\n\t\t\tthis.precision = source.precision;\n\n\t\t\tthis.polygonOffset = source.polygonOffset;\n\t\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\t\tthis.alphaTest = source.alphaTest;\n\n\t\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\t\tthis.overdraw = source.overdraw;\n\n\t\t\tthis.visible = source.visible;\n\t\t\tthis.clipShadows = source.clipShadows;\n\t\t\tthis.clipIntersection = source.clipIntersection;\n\n\t\t\tvar srcPlanes = source.clippingPlanes,\n\t\t\t\tdstPlanes = null;\n\n\t\t\tif ( srcPlanes !== null ) {\n\n\t\t\t\tvar n = srcPlanes.length;\n\t\t\t\tdstPlanes = new Array( n );\n\n\t\t\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t\tthis.clippingPlanes = dstPlanes;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdate: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'update' } );\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( Material.prototype, EventDispatcher.prototype );\n\n\tvar count$1 = 0;\n\tfunction MaterialIdCount() { return count$1++; }\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * defines: { \"label\" : \"value\" },\n\t * uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n\t *\n\t * fragmentShader: ,\n\t * vertexShader: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * lights: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction ShaderMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\n\t\tthis.vertexShader = 'void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}';\n\t\tthis.fragmentShader = 'void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}';\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.skinning = false; // set to use skinning attribute streams\n\t\tthis.morphTargets = false; // set to use morph targets\n\t\tthis.morphNormals = false; // set to use morph normals\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'uv2': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tShaderMaterial.prototype = Object.create( Material.prototype );\n\tShaderMaterial.prototype.constructor = ShaderMaterial;\n\n\tShaderMaterial.prototype.isShaderMaterial = true;\n\n\tShaderMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = UniformsUtils.clone( source.uniforms );\n\n\t\tthis.defines = source.defines;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.skinning = source.skinning;\n\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\tthis.extensions = source.extensions;\n\n\t\treturn this;\n\n\t};\n\n\tShaderMaterial.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Material.prototype.toJSON.call( this, meta );\n\n\t\tdata.uniforms = this.uniforms;\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / https://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t *\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t * }\n\t */\n\n\tfunction MeshDepthMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\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.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshDepthMaterial.prototype = Object.create( Material.prototype );\n\tMeshDepthMaterial.prototype.constructor = MeshDepthMaterial;\n\n\tMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\n\tMeshDepthMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\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\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Box3( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );\n\n\t}\n\n\tBox3.prototype = {\n\n\t\tconstructor: Box3,\n\n\t\tisBox3: true,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromArray: function ( array ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tvar x = array[ i ];\n\t\t\t\tvar y = array[ i + 1 ];\n\t\t\t\tvar z = array[ i + 2 ];\n\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\t\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromObject: function () {\n\n\t\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t\t// accounting for both the object's, and children's, world transforms\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function setFromObject( object ) {\n\n\t\t\t\tvar scope = this;\n\n\t\t\t\tobject.updateMatrixWorld( true );\n\n\t\t\t\tthis.makeEmpty();\n\n\t\t\t\tobject.traverse( function ( node ) {\n\n\t\t\t\t\tvar geometry = node.geometry;\n\n\t\t\t\t\tif ( geometry !== undefined ) {\n\n\t\t\t\t\t\tif ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\tv1.copy( vertices[ i ] );\n\t\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\t\t\tvar attribute = geometry.attributes.position;\n\n\t\t\t\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\t\t\t\tvar array, offset, stride;\n\n\t\t\t\t\t\t\t\tif ( (attribute && attribute.isInterleavedBufferAttribute) ) {\n\n\t\t\t\t\t\t\t\t\tarray = attribute.data.array;\n\t\t\t\t\t\t\t\t\toffset = attribute.offset;\n\t\t\t\t\t\t\t\t\tstride = attribute.data.stride;\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tarray = attribute.array;\n\t\t\t\t\t\t\t\t\toffset = 0;\n\t\t\t\t\t\t\t\t\tstride = 3;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tfor ( var i = offset, il = array.length; i < il; i += stride ) {\n\n\t\t\t\t\t\t\t\t\tv1.fromArray( array, i );\n\t\t\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\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} );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\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\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tif ( point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\t\t point.y < this.min.y || point.y > this.max.y ||\n\t\t\t\t\t point.z < this.min.z || point.z > this.max.z ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\tif ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) &&\n\t\t\t\t ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) &&\n\t\t\t\t ( this.min.z <= box.min.z ) && ( box.max.z <= this.max.z ) ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\n\t\t\tif ( box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\t\t box.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\t\t\t box.max.z < this.min.z || box.min.z > this.max.z ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tintersectsSphere: ( function () {\n\n\t\t\tvar closestPoint;\n\n\t\t\treturn function intersectsSphere( sphere ) {\n\n\t\t\t\tif ( closestPoint === undefined ) closestPoint = new Vector3();\n\n\t\t\t\t// Find the point on the AABB closest to the sphere center.\n\t\t\t\tthis.clampPoint( sphere.center, closestPoint );\n\n\t\t\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\t\t\treturn closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\t\tvar min, max;\n\n\t\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t\t} else {\n\n\t\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t\t}\n\n\t\t\treturn ( min <= plane.constant && max >= plane.constant );\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetBoundingSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function getBoundingSphere( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Sphere();\n\n\t\t\t\tthis.getCenter( result.center );\n\n\t\t\t\tresult.radius = this.getSize( v1 ).length() * 0.5;\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\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\t\tif( this.isEmpty() ) this.makeEmpty();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar points = [\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3()\n\t\t\t];\n\n\t\t\treturn function applyMatrix4( matrix ) {\n\n\t\t\t\t// transform of empty box is an empty box.\n\t\t\t\tif( this.isEmpty() ) return this;\n\n\t\t\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t\t\tpoints[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t\t\tpoints[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t\t\tpoints[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t\t\tpoints[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t\t\tpoints[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t\t\tpoints[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t\t\tpoints[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t\t\tpoints[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix );\t// 111\n\n\t\t\t\tthis.setFromPoints( points );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Sphere( center, radius ) {\n\n\t\tthis.center = ( center !== undefined ) ? center : new Vector3();\n\t\tthis.radius = ( radius !== undefined ) ? radius : 0;\n\n\t}\n\n\tSphere.prototype = {\n\n\t\tconstructor: Sphere,\n\n\t\tset: function ( center, radius ) {\n\n\t\t\tthis.center.copy( center );\n\t\t\tthis.radius = radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function () {\n\n\t\t\tvar box = new Box3();\n\n\t\t\treturn function setFromPoints( points, optionalCenter ) {\n\n\t\t\t\tvar center = this.center;\n\n\t\t\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\t\t\tcenter.copy( optionalCenter );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbox.setFromPoints( points ).getCenter( center );\n\n\t\t\t\t}\n\n\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( sphere ) {\n\n\t\t\tthis.center.copy( sphere.center );\n\t\t\tthis.radius = sphere.radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tempty: function () {\n\n\t\t\treturn ( this.radius <= 0 );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar radiusSum = this.radius + sphere.radius;\n\n\t\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsSphere( this );\n\n\t\t},\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We use the following equation to compute the signed distance from\n\t\t\t// the center of the sphere to the plane.\n\t\t\t//\n\t\t\t// distance = q * n - d\n\t\t\t//\n\t\t\t// If this distance is greater than the radius of the sphere,\n\t\t\t// then there is no intersection.\n\n\t\t\treturn Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.copy( point );\n\n\t\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t\tresult.sub( this.center ).normalize();\n\t\t\t\tresult.multiplyScalar( this.radius ).add( this.center );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\tgetBoundingBox: function ( optionalTarget ) {\n\n\t\t\tvar box = optionalTarget || new Box3();\n\n\t\t\tbox.set( this.center, this.center );\n\t\t\tbox.expandByScalar( this.radius );\n\n\t\t\treturn box;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.center.applyMatrix4( matrix );\n\t\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.center.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( sphere ) {\n\n\t\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t * @author tschw\n\t */\n\n\tfunction Matrix3() {\n\n\t\tthis.elements = new Float32Array( [\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 ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix3.prototype = {\n\n\t\tconstructor: Matrix3,\n\n\t\tisMatrix3: true,\n\n\t\tset: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0,\n\t\t\t\t0, 1, 0,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 3 ], me[ 6 ],\n\t\t\t\tme[ 1 ], me[ 4 ], me[ 7 ],\n\t\t\t\tme[ 2 ], me[ 5 ], me[ 8 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix4: function( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToVector3Array: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToVector3Array( array, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = array.length;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i += 3, j += 3 ) {\n\n\t\t\t\t\tv1.fromArray( array, j );\n\t\t\t\t\tv1.applyMatrix3( this );\n\t\t\t\t\tv1.toArray( array, j );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyToBuffer: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBuffer( buffer, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = buffer.length / buffer.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i ++, j ++ ) {\n\n\t\t\t\t\tv1.x = buffer.getX( j );\n\t\t\t\t\tv1.y = buffer.getY( j );\n\t\t\t\t\tv1.z = buffer.getZ( j );\n\n\t\t\t\t\tv1.applyMatrix3( this );\n\n\t\t\t\t\tbuffer.setXYZ( j, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn buffer;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t\t},\n\n\t\tgetInverse: function ( matrix, throwOnDegenerate ) {\n\n\t\t\tif ( (matrix && matrix.isMatrix4) ) {\n\n\t\t\t\tconsole.error( \"THREE.Matrix3.getInverse no longer takes a Matrix4 argument.\" );\n\n\t\t\t}\n\n\t\t\tvar me = matrix.elements,\n\t\t\t\tte = this.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],\n\t\t\t\tn12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],\n\t\t\t\tn13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],\n\n\t\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\t\tte[ 3 ] = t12 * detInv;\n\t\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\t\tte[ 6 ] = t13 * detInv;\n\t\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar tmp, m = this.elements;\n\n\t\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset is deprecated \" +\n\t\t\t\t\t\"- just use .toArray instead.\" );\n\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\n\t\tgetNormalMatrix: function ( matrix4 ) {\n\n\t\t\treturn this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();\n\n\t\t},\n\n\t\ttransposeIntoArray: function ( r ) {\n\n\t\t\tvar m = this.elements;\n\n\t\t\tr[ 0 ] = m[ 0 ];\n\t\t\tr[ 1 ] = m[ 3 ];\n\t\t\tr[ 2 ] = m[ 6 ];\n\t\t\tr[ 3 ] = m[ 1 ];\n\t\t\tr[ 4 ] = m[ 4 ];\n\t\t\tr[ 5 ] = m[ 7 ];\n\t\t\tr[ 6 ] = m[ 2 ];\n\t\t\tr[ 7 ] = m[ 5 ];\n\t\t\tr[ 8 ] = m[ 8 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 9; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Plane( normal, constant ) {\n\n\t\tthis.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );\n\t\tthis.constant = ( constant !== undefined ) ? constant : 0;\n\n\t}\n\n\tPlane.prototype = {\n\n\t\tconstructor: Plane,\n\n\t\tset: function ( normal, constant ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponents: function ( x, y, z, w ) {\n\n\t\t\tthis.normal.set( x, y, z );\n\t\t\tthis.constant = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromNormalAndCoplanarPoint: function ( normal, point ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = - point.dot( this.normal );\t// must be this.normal, not normal, as this.normal is normalized\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCoplanarPoints: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function setFromCoplanarPoints( a, b, c ) {\n\n\t\t\t\tvar normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();\n\n\t\t\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\t\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( plane ) {\n\n\t\t\tthis.normal.copy( plane.normal );\n\t\t\tthis.constant = plane.constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\t\tvar inverseNormalLength = 1.0 / this.normal.length();\n\t\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\t\tthis.constant *= inverseNormalLength;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.constant *= - 1;\n\t\t\tthis.normal.negate();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn this.normal.dot( point ) + this.constant;\n\n\t\t},\n\n\t\tdistanceToSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t\t},\n\n\t\tprojectPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn this.orthoPoint( point, optionalTarget ).sub( point ).negate();\n\n\t\t},\n\n\t\torthoPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar perpendicularMagnitude = this.distanceToPoint( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( perpendicularMagnitude );\n\n\t\t},\n\n\t\tintersectLine: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectLine( line, optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tvar direction = line.delta( v1 );\n\n\t\t\t\tvar denominator = this.normal.dot( direction );\n\n\t\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t\t// line is coplanar, return origin\n\t\t\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\t\t\treturn result.copy( line.start );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\tvar t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\t\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\treturn result.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsLine: function ( line ) {\n\n\t\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\t\tvar startSign = this.distanceToPoint( line.start );\n\t\t\tvar endSign = this.distanceToPoint( line.end );\n\n\t\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsPlane( this );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn sphere.intersectsPlane( this );\n\n\t\t},\n\n\t\tcoplanarPoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar m1 = new Matrix3();\n\n\t\t\treturn function applyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\t\t\tvar referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix );\n\n\t\t\t\t// transform normal based on theory here:\n\t\t\t\t// http://www.songho.ca/opengl/gl_normaltransform.html\n\t\t\t\tvar normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix );\n\t\t\t\tvar normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t// recalculate constant (like in setFromNormalAndCoplanarPoint)\n\t\t\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.constant = this.constant - offset.dot( this.normal );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( plane ) {\n\n\t\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Frustum( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tthis.planes = [\n\n\t\t\t( p0 !== undefined ) ? p0 : new Plane(),\n\t\t\t( p1 !== undefined ) ? p1 : new Plane(),\n\t\t\t( p2 !== undefined ) ? p2 : new Plane(),\n\t\t\t( p3 !== undefined ) ? p3 : new Plane(),\n\t\t\t( p4 !== undefined ) ? p4 : new Plane(),\n\t\t\t( p5 !== undefined ) ? p5 : new Plane()\n\n\t\t];\n\n\t}\n\n\tFrustum.prototype = {\n\n\t\tconstructor: Frustum,\n\n\t\tset: function ( p0, p1, p2, p3, p4, p5 ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tplanes[ 0 ].copy( p0 );\n\t\t\tplanes[ 1 ].copy( p1 );\n\t\t\tplanes[ 2 ].copy( p2 );\n\t\t\tplanes[ 3 ].copy( p3 );\n\t\t\tplanes[ 4 ].copy( p4 );\n\t\t\tplanes[ 5 ].copy( p5 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( frustum ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix: function ( m ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar me = m.elements;\n\t\t\tvar me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\t\tvar me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\t\tvar me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\t\tvar me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tintersectsObject: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsObject( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere )\n\t\t\t\t\t.applyMatrix4( object.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSprite: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsSprite( sprite ) {\n\n\t\t\t\tsphere.center.set( 0, 0, 0 );\n\t\t\t\tsphere.radius = 0.7071067811865476;\n\t\t\t\tsphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar center = sphere.center;\n\t\t\tvar negRadius = - sphere.radius;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tvar distance = planes[ i ].distanceToPoint( center );\n\n\t\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tintersectsBox: function () {\n\n\t\t\tvar p1 = new Vector3(),\n\t\t\t\tp2 = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\tvar planes = this.planes;\n\n\t\t\t\tfor ( var i = 0; i < 6 ; i ++ ) {\n\n\t\t\t\t\tvar plane = planes[ i ];\n\n\t\t\t\t\tp1.x = plane.normal.x > 0 ? box.min.x : box.max.x;\n\t\t\t\t\tp2.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t\t\tp1.y = plane.normal.y > 0 ? box.min.y : box.max.y;\n\t\t\t\t\tp2.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t\t\tp1.z = plane.normal.z > 0 ? box.min.z : box.max.z;\n\t\t\t\t\tp2.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\t\t\tvar d1 = plane.distanceToPoint( p1 );\n\t\t\t\t\tvar d2 = plane.distanceToPoint( p2 );\n\n\t\t\t\t\t// if both outside plane, no intersection\n\n\t\t\t\t\tif ( d1 < 0 && d2 < 0 ) {\n\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t};\n\n\t\t}(),\n\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {\n\n\t\tvar _gl = _renderer.context,\n\t\t_state = _renderer.state,\n\t\t_frustum = new Frustum(),\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_lightShadows = _lights.shadows,\n\n\t\t_shadowMapSize = new Vector2(),\n\t\t_maxShadowMapSize = new Vector2( capabilities.maxTextureSize, capabilities.maxTextureSize ),\n\n\t\t_lookTarget = new Vector3(),\n\t\t_lightPositionWorld = new Vector3(),\n\n\t\t_renderList = [],\n\n\t\t_MorphingFlag = 1,\n\t\t_SkinningFlag = 2,\n\n\t\t_NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1,\n\n\t\t_depthMaterials = new Array( _NumberOfMaterialVariants ),\n\t\t_distanceMaterials = new Array( _NumberOfMaterialVariants ),\n\n\t\t_materialCache = {};\n\n\t\tvar 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\tvar 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\tvar cube2DViewPorts = [\n\t\t\tnew Vector4(), new Vector4(), new Vector4(),\n\t\t\tnew Vector4(), new Vector4(), new Vector4()\n\t\t];\n\n\t\t// init\n\n\t\tvar depthMaterialTemplate = new MeshDepthMaterial();\n\t\tdepthMaterialTemplate.depthPacking = RGBADepthPacking;\n\t\tdepthMaterialTemplate.clipping = true;\n\n\t\tvar distanceShader = ShaderLib[ \"distanceRGBA\" ];\n\t\tvar distanceUniforms = UniformsUtils.clone( distanceShader.uniforms );\n\n\t\tfor ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {\n\n\t\t\tvar useMorphing = ( i & _MorphingFlag ) !== 0;\n\t\t\tvar useSkinning = ( i & _SkinningFlag ) !== 0;\n\n\t\t\tvar depthMaterial = depthMaterialTemplate.clone();\n\t\t\tdepthMaterial.morphTargets = useMorphing;\n\t\t\tdepthMaterial.skinning = useSkinning;\n\n\t\t\t_depthMaterials[ i ] = depthMaterial;\n\n\t\t\tvar distanceMaterial = new ShaderMaterial( {\n\t\t\t\tdefines: {\n\t\t\t\t\t'USE_SHADOWMAP': ''\n\t\t\t\t},\n\t\t\t\tuniforms: distanceUniforms,\n\t\t\t\tvertexShader: distanceShader.vertexShader,\n\t\t\t\tfragmentShader: distanceShader.fragmentShader,\n\t\t\t\tmorphTargets: useMorphing,\n\t\t\t\tskinning: useSkinning,\n\t\t\t\tclipping: true\n\t\t\t} );\n\n\t\t\t_distanceMaterials[ i ] = distanceMaterial;\n\n\t\t}\n\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tthis.enabled = false;\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis.type = PCFShadowMap;\n\n\t\tthis.renderReverseSided = true;\n\t\tthis.renderSingleSided = true;\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\t\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\t\tif ( _lightShadows.length === 0 ) return;\n\n\t\t\t// Set GL state for depth map.\n\t\t\t_state.clearColor( 1, 1, 1, 1 );\n\t\t\t_state.disable( _gl.BLEND );\n\t\t\t_state.setDepthTest( true );\n\t\t\t_state.setScissorTest( false );\n\n\t\t\t// render depth map\n\n\t\t\tvar faceCount, isPointLight;\n\n\t\t\tfor ( var i = 0, il = _lightShadows.length; i < il; i ++ ) {\n\n\t\t\t\tvar light = _lightShadows[ i ];\n\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowCamera = shadow.camera;\n\n\t\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\t\t\t\t_shadowMapSize.min( _maxShadowMapSize );\n\n\t\t\t\tif ( (light && light.isPointLight) ) {\n\n\t\t\t\t\tfaceCount = 6;\n\t\t\t\t\tisPointLight = true;\n\n\t\t\t\t\tvar vpWidth = _shadowMapSize.x;\n\t\t\t\t\tvar vpHeight = _shadowMapSize.y;\n\n\t\t\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t\t\t// following orientation:\n\t\t\t\t\t//\n\t\t\t\t\t// xzXZ\n\t\t\t\t\t// y Y\n\t\t\t\t\t//\n\t\t\t\t\t// X - Positive x direction\n\t\t\t\t\t// x - Negative x direction\n\t\t\t\t\t// Y - Positive y direction\n\t\t\t\t\t// y - Negative y direction\n\t\t\t\t\t// Z - Positive z direction\n\t\t\t\t\t// z - Negative z direction\n\n\t\t\t\t\t// positive X\n\t\t\t\t\tcube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative X\n\t\t\t\t\tcube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Z\n\t\t\t\t\tcube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative Z\n\t\t\t\t\tcube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Y\n\t\t\t\t\tcube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight );\n\t\t\t\t\t// negative Y\n\t\t\t\t\tcube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight );\n\n\t\t\t\t\t_shadowMapSize.x *= 4.0;\n\t\t\t\t\t_shadowMapSize.y *= 2.0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfaceCount = 1;\n\t\t\t\t\tisPointLight = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\t\tvar pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\n\t\t\t\t\tshadowCamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tif ( (shadow && shadow.isSpotLightShadow) ) {\n\n\t\t\t\t\tshadow.update( light );\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowMap = shadow.map;\n\t\t\t\tvar shadowMatrix = shadow.matrix;\n\n\t\t\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tshadowCamera.position.copy( _lightPositionWorld );\n\n\t\t\t\t_renderer.setRenderTarget( shadowMap );\n\t\t\t\t_renderer.clear();\n\n\t\t\t\t// render shadow map for each cube face (if omni-directional) or\n\t\t\t\t// run a single pass if not\n\n\t\t\t\tfor ( var face = 0; face < faceCount; face ++ ) {\n\n\t\t\t\t\tif ( isPointLight ) {\n\n\t\t\t\t\t\t_lookTarget.copy( shadowCamera.position );\n\t\t\t\t\t\t_lookTarget.add( cubeDirections[ face ] );\n\t\t\t\t\t\tshadowCamera.up.copy( cubeUps[ face ] );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t\tvar vpDimensions = cube2DViewPorts[ face ];\n\t\t\t\t\t\t_state.viewport( vpDimensions );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_lookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tshadowCamera.updateMatrixWorld();\n\t\t\t\t\tshadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld );\n\n\t\t\t\t\t// compute shadow matrix\n\n\t\t\t\t\tshadowMatrix.set(\n\t\t\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t\t\t);\n\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t\t\t\t\t// update camera matrices and frustum\n\n\t\t\t\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\t\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\t\t\t// set object matrices & frustum culling\n\n\t\t\t\t\t_renderList.length = 0;\n\n\t\t\t\t\tprojectObject( scene, camera, shadowCamera );\n\n\t\t\t\t\t// render shadow map\n\t\t\t\t\t// render regular objects\n\n\t\t\t\t\tfor ( var j = 0, jl = _renderList.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar object = _renderList[ j ];\n\t\t\t\t\t\tvar geometry = _objects.update( object );\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( (material && material.isMultiMaterial) ) {\n\n\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\tfor ( var k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\t\t\tvar group = groups[ k ];\n\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, 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 {\n\n\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, 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\t// Restore GL state.\n\t\t\tvar clearColor = _renderer.getClearColor(),\n\t\t\tclearAlpha = _renderer.getClearAlpha();\n\t\t\t_renderer.setClearColor( clearColor, clearAlpha );\n\n\t\t\tscope.needsUpdate = false;\n\n\t\t};\n\n\t\tfunction getDepthMaterial( object, material, isPointLight, lightPositionWorld ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tvar result = null;\n\n\t\t\tvar materialVariants = _depthMaterials;\n\t\t\tvar customMaterial = object.customDepthMaterial;\n\n\t\t\tif ( isPointLight ) {\n\n\t\t\t\tmaterialVariants = _distanceMaterials;\n\t\t\t\tcustomMaterial = object.customDistanceMaterial;\n\n\t\t\t}\n\n\t\t\tif ( ! customMaterial ) {\n\n\t\t\t\tvar useMorphing = false;\n\n\t\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;\n\n\t\t\t\t\t} else if ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphTargets && geometry.morphTargets.length > 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar useSkinning = object.isSkinnedMesh && material.skinning;\n\n\t\t\t\tvar variantIndex = 0;\n\n\t\t\t\tif ( useMorphing ) variantIndex |= _MorphingFlag;\n\t\t\t\tif ( useSkinning ) variantIndex |= _SkinningFlag;\n\n\t\t\t\tresult = materialVariants[ variantIndex ];\n\n\t\t\t} else {\n\n\t\t\t\tresult = customMaterial;\n\n\t\t\t}\n\n\t\t\tif ( _renderer.localClippingEnabled &&\n\t\t\t\t material.clipShadows === true &&\n\t\t\t\t\tmaterial.clippingPlanes.length !== 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\tvar keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tvar 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\tvar 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\tresult.visible = material.visible;\n\t\t\tresult.wireframe = material.wireframe;\n\n\t\t\tvar side = material.side;\n\n\t\t\tif ( scope.renderSingleSided && side == DoubleSide ) {\n\n\t\t\t\tside = FrontSide;\n\n\t\t\t}\n\n\t\t\tif ( scope.renderReverseSided ) {\n\n\t\t\t\tif ( side === FrontSide ) side = BackSide;\n\t\t\t\telse if ( side === BackSide ) side = FrontSide;\n\n\t\t\t}\n\n\t\t\tresult.side = side;\n\n\t\t\tresult.clipShadows = material.clipShadows;\n\t\t\tresult.clippingPlanes = material.clippingPlanes;\n\n\t\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\t\tresult.linewidth = material.linewidth;\n\n\t\t\tif ( isPointLight && result.uniforms.lightPos !== undefined ) {\n\n\t\t\t\tresult.uniforms.lightPos.value.copy( lightPositionWorld );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera, shadowCamera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\t\tif ( object.castShadow && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) {\n\n\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\t\t\t_renderList.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, shadowCamera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Ray( origin, direction ) {\n\n\t\tthis.origin = ( origin !== undefined ) ? origin : new Vector3();\n\t\tthis.direction = ( direction !== undefined ) ? direction : new Vector3();\n\n\t}\n\n\tRay.prototype = {\n\n\t\tconstructor: Ray,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\tthis.origin.copy( origin );\n\t\t\tthis.direction.copy( direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( ray ) {\n\n\t\t\tthis.origin.copy( ray.origin );\n\t\t\tthis.direction.copy( ray.direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t\t},\n\n\t\tlookAt: function ( v ) {\n\n\t\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trecast: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function recast( t ) {\n\n\t\t\t\tthis.origin.copy( this.at( t, v1 ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\tresult.subVectors( point, this.origin );\n\t\t\tvar directionDistance = result.dot( this.direction );\n\n\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\treturn result.copy( this.origin );\n\n\t\t\t}\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t\t},\n\n\t\tdistanceSqToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceSqToPoint( point ) {\n\n\t\t\t\tvar directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t\t\t// point behind the ray\n\n\t\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t\t\t}\n\n\t\t\t\tv1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t\t\treturn v1.distanceToSquared( point );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdistanceSqToSegment: function () {\n\n\t\t\tvar segCenter = new Vector3();\n\t\t\tvar segDir = new Vector3();\n\t\t\tvar diff = new Vector3();\n\n\t\t\treturn function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t\t\t// It returns the min distance between the ray and the segment\n\t\t\t\t// defined by v0 and v1\n\t\t\t\t// It can also set two optional targets :\n\t\t\t\t// - The closest point on the ray\n\t\t\t\t// - The closest point on the segment\n\n\t\t\t\tsegCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t\t\tsegDir.copy( v1 ).sub( v0 ).normalize();\n\t\t\t\tdiff.copy( this.origin ).sub( segCenter );\n\n\t\t\t\tvar segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\t\t\tvar a01 = - this.direction.dot( segDir );\n\t\t\t\tvar b0 = diff.dot( this.direction );\n\t\t\t\tvar b1 = - diff.dot( segDir );\n\t\t\t\tvar c = diff.lengthSq();\n\t\t\t\tvar det = Math.abs( 1 - a01 * a01 );\n\t\t\t\tvar s0, s1, sqrDist, extDet;\n\n\t\t\t\tif ( det > 0 ) {\n\n\t\t\t\t\t// The ray and segment are not parallel.\n\n\t\t\t\t\ts0 = a01 * b1 - b0;\n\t\t\t\t\ts1 = a01 * b0 - b1;\n\t\t\t\t\textDet = segExtent * det;\n\n\t\t\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\t\t\tvar invDet = 1 / det;\n\t\t\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\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\t// region 5\n\n\t\t\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t\t\t// region 4\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t// region 3\n\n\t\t\t\t\t\t\ts0 = 0;\n\t\t\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 2\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Ray and segment are parallel.\n\n\t\t\t\t\ts1 = ( a01 > 0 ) ? - segExtent : 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\tif ( optionalPointOnRay ) {\n\n\t\t\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnSegment ) {\n\n\t\t\t\t\toptionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter );\n\n\t\t\t\t}\n\n\t\t\t\treturn sqrDist;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectSphere( sphere, optionalTarget ) {\n\n\t\t\t\tv1.subVectors( sphere.center, this.origin );\n\t\t\t\tvar tca = v1.dot( this.direction );\n\t\t\t\tvar d2 = v1.dot( v1 ) - tca * tca;\n\t\t\t\tvar radius2 = sphere.radius * sphere.radius;\n\n\t\t\t\tif ( d2 > radius2 ) return null;\n\n\t\t\t\tvar thc = Math.sqrt( radius2 - d2 );\n\n\t\t\t\t// t0 = first intersect point - entrance on front of sphere\n\t\t\t\tvar t0 = tca - thc;\n\n\t\t\t\t// t1 = second intersect point - exit point on back of sphere\n\t\t\t\tvar t1 = tca + thc;\n\n\t\t\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\t\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t\t\t// test to see if t0 is behind the ray:\n\t\t\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t\t\t// in order to always return an intersect point that is in front of the ray.\n\t\t\t\tif ( t0 < 0 ) return this.at( t1, optionalTarget );\n\n\t\t\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\t\t\treturn this.at( t0, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) <= sphere.radius;\n\n\t\t},\n\n\t\tdistanceToPlane: function ( plane ) {\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t// line is coplanar, return origin\n\t\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\t\treturn 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t\t// Return if the ray never intersects the plane\n\n\t\t\treturn t >= 0 ? t : null;\n\n\t\t},\n\n\t\tintersectPlane: function ( plane, optionalTarget ) {\n\n\t\t\tvar t = this.distanceToPlane( plane );\n\n\t\t\tif ( t === null ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\treturn this.at( t, optionalTarget );\n\n\t\t},\n\n\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// check if the ray lies on the plane first\n\n\t\t\tvar distToPoint = plane.distanceToPoint( this.origin );\n\n\t\t\tif ( distToPoint === 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tintersectBox: function ( box, optionalTarget ) {\n\n\t\t\tvar tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\t\tvar invdirx = 1 / this.direction.x,\n\t\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\t\tvar origin = this.origin;\n\n\t\t\tif ( invdirx >= 0 ) {\n\n\t\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t\t} else {\n\n\t\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t\t}\n\n\t\t\tif ( invdiry >= 0 ) {\n\n\t\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t\t} else {\n\n\t\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\t\tif ( invdirz >= 0 ) {\n\n\t\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t\t} else {\n\n\t\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t\t//return point closest to the ray (positive side)\n\n\t\t\tif ( tmax < 0 ) return null;\n\n\t\t\treturn this.at( tmin >= 0 ? tmin : tmax, optionalTarget );\n\n\t\t},\n\n\t\tintersectsBox: ( function () {\n\n\t\t\tvar v = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\treturn this.intersectBox( box, v ) !== null;\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectTriangle: function () {\n\n\t\t\t// Compute the offset origin, edges, and normal.\n\t\t\tvar diff = new Vector3();\n\t\t\tvar edge1 = new Vector3();\n\t\t\tvar edge2 = new Vector3();\n\t\t\tvar normal = new Vector3();\n\n\t\t\treturn function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t\t\tedge1.subVectors( b, a );\n\t\t\t\tedge2.subVectors( c, a );\n\t\t\t\tnormal.crossVectors( edge1, edge2 );\n\n\t\t\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\t\t\tvar DdN = this.direction.dot( normal );\n\t\t\t\tvar sign;\n\n\t\t\t\tif ( DdN > 0 ) {\n\n\t\t\t\t\tif ( backfaceCulling ) return null;\n\t\t\t\t\tsign = 1;\n\n\t\t\t\t} else if ( DdN < 0 ) {\n\n\t\t\t\t\tsign = - 1;\n\t\t\t\t\tDdN = - DdN;\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\tdiff.subVectors( this.origin, a );\n\t\t\t\tvar DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) );\n\n\t\t\t\t// b1 < 0, no intersection\n\t\t\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tvar DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) );\n\n\t\t\t\t// b2 < 0, no intersection\n\t\t\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// b1+b2 > 1, no intersection\n\t\t\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Line intersects triangle, check if ray does.\n\t\t\t\tvar QdN = - sign * diff.dot( normal );\n\n\t\t\t\t// t < 0, no intersection\n\t\t\t\tif ( QdN < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Ray intersects triangle.\n\t\t\t\treturn this.at( QdN / DdN, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix4: function ( matrix4 ) {\n\n\t\t\tthis.direction.add( this.origin ).applyMatrix4( matrix4 );\n\t\t\tthis.origin.applyMatrix4( matrix4 );\n\t\t\tthis.direction.sub( this.origin );\n\t\t\tthis.direction.normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( ray ) {\n\n\t\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Euler( x, y, z, order ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._order = order || Euler.DefaultOrder;\n\n\t}\n\n\tEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\n\tEuler.DefaultOrder = 'XYZ';\n\n\tEuler.prototype = {\n\n\t\tconstructor: Euler,\n\n\t\tisEuler: true,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget order () {\n\n\t\t\treturn this._order;\n\n\t\t},\n\n\t\tset order ( value ) {\n\n\t\t\tthis._order = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, order ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._order = order || this._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t\t},\n\n\t\tcopy: function ( euler ) {\n\n\t\t\tthis._x = euler._x;\n\t\t\tthis._y = euler._y;\n\t\t\tthis._z = euler._z;\n\t\t\tthis._order = euler._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m, order, update ) {\n\n\t\t\tvar clamp = _Math.clamp;\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements;\n\t\t\tvar m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\t\tvar m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\t\tvar m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\torder = order || this._order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.99999 ) {\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} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.99999 ) {\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} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.99999 ) {\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} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.99999 ) {\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} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.99999 ) {\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} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.99999 ) {\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} else {\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order );\n\n\t\t\t}\n\n\t\t\tthis._order = order;\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromQuaternion: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function setFromQuaternion( q, order, update ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.makeRotationFromQuaternion( q );\n\n\t\t\t\treturn this.setFromRotationMatrix( matrix, order, update );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromVector3: function ( v, order ) {\n\n\t\t\treturn this.set( v.x, v.y, v.z, order || this._order );\n\n\t\t},\n\n\t\treorder: function () {\n\n\t\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t\tvar q = new Quaternion();\n\n\t\t\treturn function reorder( newOrder ) {\n\n\t\t\t\tq.setFromEuler( this );\n\n\t\t\t\treturn this.setFromQuaternion( q, newOrder );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( euler ) {\n\n\t\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t\t},\n\n\t\tfromArray: function ( array ) {\n\n\t\t\tthis._x = array[ 0 ];\n\t\t\tthis._y = array[ 1 ];\n\t\t\tthis._z = array[ 2 ];\n\t\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._order;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoVector3: function ( optionalResult ) {\n\n\t\t\tif ( optionalResult ) {\n\n\t\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t\t} else {\n\n\t\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t\t}\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Layers() {\n\n\t\tthis.mask = 1;\n\n\t}\n\n\tLayers.prototype = {\n\n\t\tconstructor: Layers,\n\n\t\tset: function ( channel ) {\n\n\t\t\tthis.mask = 1 << channel;\n\n\t\t},\n\n\t\tenable: function ( channel ) {\n\n\t\t\tthis.mask |= 1 << channel;\n\n\t\t},\n\n\t\ttoggle: function ( channel ) {\n\n\t\t\tthis.mask ^= 1 << channel;\n\n\t\t},\n\n\t\tdisable: function ( channel ) {\n\n\t\t\tthis.mask &= ~ ( 1 << channel );\n\n\t\t},\n\n\t\ttest: function ( layers ) {\n\n\t\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author elephantatwork / www.elephantatwork.ch\n\t */\n\n\tfunction Object3D() {\n\n\t\tObject.defineProperty( this, 'id', { value: Object3DIdCount() } );\n\n\t\tthis.uuid = _Math.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.DefaultUp.clone();\n\n\t\tvar position = new Vector3();\n\t\tvar rotation = new Euler();\n\t\tvar quaternion = new Quaternion();\n\t\tvar 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\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\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.DefaultMatrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = false;\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.userData = {};\n\n\t\tthis.onBeforeRender = function(){}; \n\t\tthis.onAfterRender = function(){};\n\n\t}\n\n\tObject3D.DefaultUp = new Vector3( 0, 1, 0 );\n\tObject3D.DefaultMatrixAutoUpdate = true;\n\n\tObject.assign( Object3D.prototype, EventDispatcher.prototype, {\n\n\t\tisObject3D: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tthis.matrix.multiplyMatrices( matrix, this.matrix );\n\n\t\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t\t},\n\n\t\tsetRotationFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t\t},\n\n\t\tsetRotationFromEuler: function ( euler ) {\n\n\t\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t\t},\n\n\t\tsetRotationFromMatrix: function ( m ) {\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t\t},\n\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\t// assumes q is normalized\n\n\t\t\tthis.quaternion.copy( q );\n\n\t\t},\n\n\t\trotateOnAxis: function () {\n\n\t\t\t// rotate object on axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar q1 = new Quaternion();\n\n\t\t\treturn function rotateOnAxis( axis, angle ) {\n\n\t\t\t\tq1.setFromAxisAngle( axis, angle );\n\n\t\t\t\tthis.quaternion.multiply( q1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateOnAxis: function () {\n\n\t\t\t// translate object by distance along axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function translateOnAxis( axis, distance ) {\n\n\t\t\t\tv1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\t\t\tthis.position.add( v1.multiplyScalar( distance ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function translateX( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function translateY( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function translateZ( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlocalToWorld: function ( vector ) {\n\n\t\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t\t},\n\n\t\tworldToLocal: function () {\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function worldToLocal( vector ) {\n\n\t\t\t\treturn vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\t// This routine does not support objects with rotated and/or translated parent(s)\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tm1.lookAt( vector, this.position, this.up );\n\n\t\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tadd: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( object === this ) {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object can't be added as a child of itself.\", object );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( (object && object.isObject3D) ) {\n\n\t\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\t\tobject.parent.remove( object );\n\n\t\t\t\t}\n\n\t\t\t\tobject.parent = this;\n\t\t\t\tobject.dispatchEvent( { type: 'added' } );\n\n\t\t\t\tthis.children.push( object );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object not an instance of THREE.Object3D.\", object );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tremove: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar index = this.children.indexOf( object );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tobject.parent = null;\n\n\t\t\t\tobject.dispatchEvent( { type: 'removed' } );\n\n\t\t\t\tthis.children.splice( index, 1 );\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetObjectById: function ( id ) {\n\n\t\t\treturn this.getObjectByProperty( 'id', id );\n\n\t\t},\n\n\t\tgetObjectByName: function ( name ) {\n\n\t\t\treturn this.getObjectByProperty( 'name', name );\n\n\t\t},\n\n\t\tgetObjectByProperty: function ( name, value ) {\n\n\t\t\tif ( this[ name ] === value ) return this;\n\n\t\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = this.children[ i ];\n\t\t\t\tvar object = child.getObjectByProperty( name, value );\n\n\t\t\t\tif ( object !== undefined ) {\n\n\t\t\t\t\treturn object;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\n\t\t},\n\n\t\tgetWorldPosition: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\treturn result.setFromMatrixPosition( this.matrixWorld );\n\n\t\t},\n\n\t\tgetWorldQuaternion: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar scale = new Vector3();\n\n\t\t\treturn function getWorldQuaternion( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Quaternion();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, result, scale );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldRotation: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldRotation( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Euler();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.setFromQuaternion( quaternion, this.rotation.order, false );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldScale: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldScale( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, result );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldDirection: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.set( 0, 0, 1 ).applyQuaternion( quaternion );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\traycast: function () {},\n\n\t\ttraverse: function ( callback ) {\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverse( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseVisible: function ( callback ) {\n\n\t\t\tif ( this.visible === false ) return;\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseAncestors: function ( callback ) {\n\n\t\t\tvar parent = this.parent;\n\n\t\t\tif ( parent !== null ) {\n\n\t\t\t\tcallback( parent );\n\n\t\t\t\tparent.traverseAncestors( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrix: function () {\n\n\t\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t\t},\n\n\t\tupdateMatrixWorld: function ( force ) {\n\n\t\t\tif ( this.matrixAutoUpdate === true ) this.updateMatrix();\n\n\t\t\tif ( this.matrixWorldNeedsUpdate === true || force === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\t\tforce = true;\n\n\t\t\t}\n\n\t\t\t// update children\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\t// meta is '' when called from JSON.stringify\n\t\t\tvar isRootObject = ( meta === undefined || meta === '' );\n\n\t\t\tvar output = {};\n\n\t\t\t// meta is a hash used to collect geometries, materials.\n\t\t\t// not providing it implies that this is the root object\n\t\t\t// being serialized.\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\t// initialize meta obj\n\t\t\t\tmeta = {\n\t\t\t\t\tgeometries: {},\n\t\t\t\t\tmaterials: {},\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t\toutput.metadata = {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Object',\n\t\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t// standard Object3D serialization\n\n\t\t\tvar object = {};\n\n\t\t\tobject.uuid = this.uuid;\n\t\t\tobject.type = this.type;\n\n\t\t\tif ( this.name !== '' ) object.name = this.name;\n\t\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\t\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\t\tif ( this.visible === false ) object.visible = false;\n\n\t\t\tobject.matrix = this.matrix.toArray();\n\n\t\t\t//\n\n\t\t\tif ( this.geometry !== undefined ) {\n\n\t\t\t\tif ( meta.geometries[ this.geometry.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.geometries[ this.geometry.uuid ] = this.geometry.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.geometry = this.geometry.uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.material !== undefined ) {\n\n\t\t\t\tif ( meta.materials[ this.material.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.materials[ this.material.uuid ] = this.material.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = this.material.uuid;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( this.children.length > 0 ) {\n\n\t\t\t\tobject.children = [];\n\n\t\t\t\tfor ( var i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\tvar geometries = extractFromCache( meta.geometries );\n\t\t\t\tvar materials = extractFromCache( meta.materials );\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\t\tif ( images.length > 0 ) output.images = images;\n\n\t\t\t}\n\n\t\t\toutput.object = object;\n\n\t\t\treturn output;\n\n\t\t\t// extract data from the cache hash\n\t\t\t// remove metadata on each item\n\t\t\t// and return as array\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function ( recursive ) {\n\n\t\t\treturn new this.constructor().copy( this, recursive );\n\n\t\t},\n\n\t\tcopy: function ( source, recursive ) {\n\n\t\t\tif ( recursive === undefined ) recursive = true;\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.up.copy( source.up );\n\n\t\t\tthis.position.copy( source.position );\n\t\t\tthis.quaternion.copy( source.quaternion );\n\t\t\tthis.scale.copy( source.scale );\n\n\t\t\tthis.matrix.copy( source.matrix );\n\t\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\t\tthis.visible = source.visible;\n\n\t\t\tthis.castShadow = source.castShadow;\n\t\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\t\tthis.frustumCulled = source.frustumCulled;\n\t\t\tthis.renderOrder = source.renderOrder;\n\n\t\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\t\tif ( recursive === true ) {\n\n\t\t\t\tfor ( var i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\t\tvar child = source.children[ i ];\n\t\t\t\t\tthis.add( child.clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\tvar count$2 = 0;\n\tfunction Object3DIdCount() { return count$2++; }\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Line3( start, end ) {\n\n\t\tthis.start = ( start !== undefined ) ? start : new Vector3();\n\t\tthis.end = ( end !== undefined ) ? end : new Vector3();\n\n\t}\n\n\tLine3.prototype = {\n\n\t\tconstructor: Line3,\n\n\t\tset: function ( start, end ) {\n\n\t\t\tthis.start.copy( start );\n\t\t\tthis.end.copy( end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( line ) {\n\n\t\t\tthis.start.copy( line.start );\n\t\t\tthis.end.copy( line.end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tdelta: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.subVectors( this.end, this.start );\n\n\t\t},\n\n\t\tdistanceSq: function () {\n\n\t\t\treturn this.start.distanceToSquared( this.end );\n\n\t\t},\n\n\t\tdistance: function () {\n\n\t\t\treturn this.start.distanceTo( this.end );\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tclosestPointToPointParameter: function () {\n\n\t\t\tvar startP = new Vector3();\n\t\t\tvar startEnd = new Vector3();\n\n\t\t\treturn function closestPointToPointParameter( point, clampToLine ) {\n\n\t\t\t\tstartP.subVectors( point, this.start );\n\t\t\t\tstartEnd.subVectors( this.end, this.start );\n\n\t\t\t\tvar startEnd2 = startEnd.dot( startEnd );\n\t\t\t\tvar startEnd_startP = startEnd.dot( startP );\n\n\t\t\t\tvar t = startEnd_startP / startEnd2;\n\n\t\t\t\tif ( clampToLine ) {\n\n\t\t\t\t\tt = _Math.clamp( t, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t\treturn t;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, clampToLine, optionalTarget ) {\n\n\t\t\tvar t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.start.applyMatrix4( matrix );\n\t\t\tthis.end.applyMatrix4( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( line ) {\n\n\t\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Triangle( a, b, c ) {\n\n\t\tthis.a = ( a !== undefined ) ? a : new Vector3();\n\t\tthis.b = ( b !== undefined ) ? b : new Vector3();\n\t\tthis.c = ( c !== undefined ) ? c : new Vector3();\n\n\t}\n\n\tTriangle.normal = function () {\n\n\t\tvar v0 = new Vector3();\n\n\t\treturn function normal( a, b, c, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.subVectors( c, b );\n\t\t\tv0.subVectors( a, b );\n\t\t\tresult.cross( v0 );\n\n\t\t\tvar resultLengthSq = result.lengthSq();\n\t\t\tif ( resultLengthSq > 0 ) {\n\n\t\t\t\treturn result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) );\n\n\t\t\t}\n\n\t\t\treturn result.set( 0, 0, 0 );\n\n\t\t};\n\n\t}();\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tTriangle.barycoordFromPoint = function () {\n\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function barycoordFromPoint( point, a, b, c, optionalTarget ) {\n\n\t\t\tv0.subVectors( c, a );\n\t\t\tv1.subVectors( b, a );\n\t\t\tv2.subVectors( point, a );\n\n\t\t\tvar dot00 = v0.dot( v0 );\n\t\t\tvar dot01 = v0.dot( v1 );\n\t\t\tvar dot02 = v0.dot( v2 );\n\t\t\tvar dot11 = v1.dot( v1 );\n\t\t\tvar dot12 = v1.dot( v2 );\n\n\t\t\tvar denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t// collinear or singular triangle\n\t\t\tif ( denom === 0 ) {\n\n\t\t\t\t// arbitrary location outside of triangle?\n\t\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\t\treturn result.set( - 2, - 1, - 1 );\n\n\t\t\t}\n\n\t\t\tvar invDenom = 1 / denom;\n\t\t\tvar u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\t\tvar v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t\t// barycentric coordinates must always sum to 1\n\t\t\treturn result.set( 1 - u - v, v, u );\n\n\t\t};\n\n\t}();\n\n\tTriangle.containsPoint = function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function containsPoint( point, a, b, c ) {\n\n\t\t\tvar result = Triangle.barycoordFromPoint( point, a, b, c, v1 );\n\n\t\t\treturn ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 );\n\n\t\t};\n\n\t}();\n\n\tTriangle.prototype = {\n\n\t\tconstructor: Triangle,\n\n\t\tset: function ( a, b, c ) {\n\n\t\t\tthis.a.copy( a );\n\t\t\tthis.b.copy( b );\n\t\t\tthis.c.copy( c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPointsAndIndices: function ( points, i0, i1, i2 ) {\n\n\t\t\tthis.a.copy( points[ i0 ] );\n\t\t\tthis.b.copy( points[ i1 ] );\n\t\t\tthis.c.copy( points[ i2 ] );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( triangle ) {\n\n\t\t\tthis.a.copy( triangle.a );\n\t\t\tthis.b.copy( triangle.b );\n\t\t\tthis.c.copy( triangle.c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tarea: function () {\n\n\t\t\tvar v0 = new Vector3();\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function area() {\n\n\t\t\t\tv0.subVectors( this.c, this.b );\n\t\t\t\tv1.subVectors( this.a, this.b );\n\n\t\t\t\treturn v0.cross( v1 ).length() * 0.5;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmidpoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t\t},\n\n\t\tnormal: function ( optionalTarget ) {\n\n\t\t\treturn Triangle.normal( this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tplane: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Plane();\n\n\t\t\treturn result.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t\t},\n\n\t\tbarycoordFromPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t\t},\n\n\t\tclosestPointToPoint: function () {\n\n\t\t\tvar plane, edgeList, projectedPoint, closestPoint;\n\n\t\t\treturn function closestPointToPoint( point, optionalTarget ) {\n\n\t\t\t\tif ( plane === undefined ) {\n\n\t\t\t\t\tplane = new Plane();\n\t\t\t\t\tedgeList = [ new Line3(), new Line3(), new Line3() ];\n\t\t\t\t\tprojectedPoint = new Vector3();\n\t\t\t\t\tclosestPoint = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\t\tvar minDistance = Infinity;\n\n\t\t\t\t// project the point onto the plane of the triangle\n\n\t\t\t\tplane.setFromCoplanarPoints( this.a, this.b, this.c );\n\t\t\t\tplane.projectPoint( point, projectedPoint );\n\n\t\t\t\t// check if the projection lies within the triangle\n\n\t\t\t\tif( this.containsPoint( projectedPoint ) === true ) {\n\n\t\t\t\t\t// if so, this is the closest point\n\n\t\t\t\t\tresult.copy( projectedPoint );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// if not, the point falls outside the triangle. the result is the closest point to the triangle's edges or vertices\n\n\t\t\t\t\tedgeList[ 0 ].set( this.a, this.b );\n\t\t\t\t\tedgeList[ 1 ].set( this.b, this.c );\n\t\t\t\t\tedgeList[ 2 ].set( this.c, this.a );\n\n\t\t\t\t\tfor( var i = 0; i < edgeList.length; i ++ ) {\n\n\t\t\t\t\t\tedgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint );\n\n\t\t\t\t\t\tvar distance = projectedPoint.distanceToSquared( closestPoint );\n\n\t\t\t\t\t\tif( distance < minDistance ) {\n\n\t\t\t\t\t\t\tminDistance = distance;\n\n\t\t\t\t\t\t\tresult.copy( closestPoint );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( triangle ) {\n\n\t\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Face3( a, b, c, normal, color, materialIndex ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t\tthis.normal = (normal && normal.isVector3) ? normal : new Vector3();\n\t\tthis.vertexNormals = Array.isArray( normal ) ? normal : [];\n\n\t\tthis.color = (color && color.isColor) ? color : new Color();\n\t\tthis.vertexColors = Array.isArray( color ) ? color : [];\n\n\t\tthis.materialIndex = materialIndex !== undefined ? materialIndex : 0;\n\n\t}\n\n\tFace3.prototype = {\n\n\t\tconstructor: Face3,\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.a = source.a;\n\t\t\tthis.b = source.b;\n\t\t\tthis.c = source.c;\n\n\t\t\tthis.normal.copy( source.normal );\n\t\t\tthis.color.copy( source.color );\n\n\t\t\tthis.materialIndex = source.materialIndex;\n\n\t\t\tfor ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexNormals[ i ] = source.vertexNormals[ i ].clone();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexColors[ i ] = source.vertexColors[ i ].clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * shading: THREE.SmoothShading,\n\t * depthTest: ,\n\t * depthWrite: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: \n\t * }\n\t */\n\n\tfunction MeshBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\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.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.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshBasicMaterial.prototype = Object.create( Material.prototype );\n\tMeshBasicMaterial.prototype.constructor = MeshBasicMaterial;\n\n\tMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\n\tMeshBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\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.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferAttribute( array, itemSize, normalized ) {\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.uuid = _Math.generateUUID();\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 === true;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t}\n\n\tBufferAttribute.prototype = {\n\n\t\tconstructor: BufferAttribute,\n\n\t\tisBufferAttribute: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.itemSize : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.itemSize = source.itemSize;\n\t\t\tthis.count = source.count;\n\t\t\tthis.normalized = source.normalized;\n\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.itemSize;\n\t\t\tindex2 *= attribute.itemSize;\n\n\t\t\tfor ( var i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyArray: function ( array ) {\n\n\t\t\tthis.array.set( array );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyColorsArray: function ( colors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\t\tvar color = colors[ i ];\n\n\t\t\t\tif ( color === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\t\tcolor = new Color();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = color.r;\n\t\t\t\tarray[ offset ++ ] = color.g;\n\t\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyIndicesArray: function ( indices ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tvar index = indices[ i ];\n\n\t\t\t\tarray[ offset ++ ] = index.a;\n\t\t\t\tarray[ offset ++ ] = index.b;\n\t\t\t\tarray[ offset ++ ] = index.c;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector2sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector3sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector4sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize ];\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\t\t\tthis.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Int8Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Int8Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint8Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint8Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint8ClampedAttribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint8ClampedArray( array ), itemSize );\n\n\t}\n\n\tfunction Int16Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Int16Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint16Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint16Array( array ), itemSize );\n\n\t}\n\n\tfunction Int32Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Int32Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint32Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint32Array( array ), itemSize );\n\n\t}\n\n\tfunction Float32Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Float32Array( array ), itemSize );\n\n\t}\n\n\tfunction Float64Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Float64Array( array ), itemSize );\n\n\t}\n\n\t// Deprecated\n\n\tfunction DynamicBufferAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' );\n\t\treturn new BufferAttribute( array, itemSize ).setDynamic( true );\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author kile / http://kile.stravaganza.org/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Geometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Geometry';\n\n\t\tthis.vertices = [];\n\t\tthis.colors = [];\n\t\tthis.faces = [];\n\t\tthis.faceVertexUvs = [ [] ];\n\n\t\tthis.morphTargets = [];\n\t\tthis.morphNormals = [];\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\tthis.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.elementsNeedUpdate = false;\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.lineDistancesNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tObject.assign( Geometry.prototype, EventDispatcher.prototype, {\n\n\t\tisGeometry: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tfor ( var i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertex.applyMatrix4( matrix );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\t\t\t\tface.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tface.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\tthis.verticesNeedUpdate = true;\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfromBufferGeometry: function ( geometry ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar indices = geometry.index !== null ? geometry.index.array : undefined;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tvar positions = attributes.position.array;\n\t\t\tvar normals = attributes.normal !== undefined ? attributes.normal.array : undefined;\n\t\t\tvar colors = attributes.color !== undefined ? attributes.color.array : undefined;\n\t\t\tvar uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;\n\t\t\tvar uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;\n\n\t\t\tif ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = [];\n\n\t\t\tvar tempNormals = [];\n\t\t\tvar tempUVs = [];\n\t\t\tvar tempUVs2 = [];\n\n\t\t\tfor ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {\n\n\t\t\t\tscope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) );\n\n\t\t\t\tif ( normals !== undefined ) {\n\n\t\t\t\t\ttempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( colors !== undefined ) {\n\n\t\t\t\t\tscope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\ttempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\ttempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction addFace( a, b, c, materialIndex ) {\n\n\t\t\t\tvar vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : [];\n\t\t\t\tvar vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : [];\n\n\t\t\t\tvar face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );\n\n\t\t\t\tscope.faces.push( face );\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( indices !== undefined ) {\n\n\t\t\t\tvar groups = geometry.groups;\n\n\t\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\t\tfor ( var i = 0; i < groups.length; i ++ ) {\n\n\t\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\taddFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t\t\taddFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( var i = 0; i < positions.length / 3; i += 3 ) {\n\n\t\t\t\t\taddFace( i, i + 1, i + 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t\tvar center = this.boundingSphere.center;\n\t\t\tvar radius = this.boundingSphere.radius;\n\n\t\t\tvar s = radius === 0 ? 1 : 1.0 / radius;\n\n\t\t\tvar matrix = new Matrix4();\n\t\t\tmatrix.set(\n\t\t\t\ts, 0, 0, - s * center.x,\n\t\t\t\t0, s, 0, - s * center.y,\n\t\t\t\t0, 0, s, - s * center.z,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\tthis.applyMatrix( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\tfor ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tvar face = this.faces[ f ];\n\n\t\t\t\tvar vA = this.vertices[ face.a ];\n\t\t\t\tvar vB = this.vertices[ face.b ];\n\t\t\t\tvar vC = this.vertices[ face.c ];\n\n\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\tcb.cross( ab );\n\n\t\t\t\tcb.normalize();\n\n\t\t\t\tface.normal.copy( cb );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeVertexNormals: function ( areaWeighted ) {\n\n\t\t\tif ( areaWeighted === undefined ) areaWeighted = true;\n\n\t\t\tvar v, vl, f, fl, face, vertices;\n\n\t\t\tvertices = new Array( this.vertices.length );\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ] = new Vector3();\n\n\t\t\t}\n\n\t\t\tif ( areaWeighted ) {\n\n\t\t\t\t// vertex normals weighted by triangle areas\n\t\t\t\t// http://www.iquilezles.org/www/articles/normals/normals.htm\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvA = this.vertices[ face.a ];\n\t\t\t\t\tvB = this.vertices[ face.b ];\n\t\t\t\t\tvC = this.vertices[ face.c ];\n\n\t\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tvertices[ face.a ].add( cb );\n\t\t\t\t\tvertices[ face.b ].add( cb );\n\t\t\t\t\tvertices[ face.c ].add( cb );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.computeFaceNormals();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvertices[ face.a ].add( face.normal );\n\t\t\t\t\tvertices[ face.b ].add( face.normal );\n\t\t\t\t\tvertices[ face.c ].add( face.normal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ].normalize();\n\n\t\t\t}\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( vertices[ face.a ] );\n\t\t\t\t\tvertexNormals[ 1 ].copy( vertices[ face.b ] );\n\t\t\t\t\tvertexNormals[ 2 ].copy( vertices[ face.c ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = vertices[ face.a ].clone();\n\t\t\t\t\tvertexNormals[ 1 ] = vertices[ face.b ].clone();\n\t\t\t\t\tvertexNormals[ 2 ] = vertices[ face.c ].clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeFlatVertexNormals: function () {\n\n\t\t\tvar f, fl, face;\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 1 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 2 ].copy( face.normal );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 1 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 2 ] = face.normal.clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeMorphNormals: function () {\n\n\t\t\tvar i, il, f, fl, face;\n\n\t\t\t// save original normals\n\t\t\t// - create temp variables on first access\n\t\t\t// otherwise just copy (for faster repeated calls)\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tif ( ! face.__originalFaceNormal ) {\n\n\t\t\t\t\tface.__originalFaceNormal = face.normal.clone();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface.__originalFaceNormal.copy( face.normal );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];\n\n\t\t\t\tfor ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\t\tif ( ! face.__originalVertexNormals[ i ] ) {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// use temp geometry to compute face and vertex normals for each morph\n\n\t\t\tvar tmpGeo = new Geometry();\n\t\t\ttmpGeo.faces = this.faces;\n\n\t\t\tfor ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\t// create on first access\n\n\t\t\t\tif ( ! this.morphNormals[ i ] ) {\n\n\t\t\t\t\tthis.morphNormals[ i ] = {};\n\t\t\t\t\tthis.morphNormals[ i ].faceNormals = [];\n\t\t\t\t\tthis.morphNormals[ i ].vertexNormals = [];\n\n\t\t\t\t\tvar dstNormalsFace = this.morphNormals[ i ].faceNormals;\n\t\t\t\t\tvar dstNormalsVertex = this.morphNormals[ i ].vertexNormals;\n\n\t\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tfaceNormal = new Vector3();\n\t\t\t\t\t\tvertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };\n\n\t\t\t\t\t\tdstNormalsFace.push( faceNormal );\n\t\t\t\t\t\tdstNormalsVertex.push( vertexNormals );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar morphNormals = this.morphNormals[ i ];\n\n\t\t\t\t// set vertices to morph target\n\n\t\t\t\ttmpGeo.vertices = this.morphTargets[ i ].vertices;\n\n\t\t\t\t// compute morph normals\n\n\t\t\t\ttmpGeo.computeFaceNormals();\n\t\t\t\ttmpGeo.computeVertexNormals();\n\n\t\t\t\t// store morph normals\n\n\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tfaceNormal = morphNormals.faceNormals[ f ];\n\t\t\t\t\tvertexNormals = morphNormals.vertexNormals[ f ];\n\n\t\t\t\t\tfaceNormal.copy( face.normal );\n\n\t\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\n\t\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\n\t\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore original normals\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tface.normal = face.__originalFaceNormal;\n\t\t\t\tface.vertexNormals = face.__originalVertexNormals;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeTangents: function () {\n\n\t\t\tconsole.warn( 'THREE.Geometry: .computeTangents() has been removed.' );\n\n\t\t},\n\n\t\tcomputeLineDistances: function () {\n\n\t\t\tvar d = 0;\n\t\t\tvar vertices = this.vertices;\n\n\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tif ( i > 0 ) {\n\n\t\t\t\t\td += vertices[ i ].distanceTo( vertices[ i - 1 ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.lineDistances[ i ] = d;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tthis.boundingBox.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tmerge: function ( geometry, matrix, materialIndexOffset ) {\n\n\t\t\tif ( (geometry && geometry.isGeometry) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar normalMatrix,\n\t\t\tvertexOffset = this.vertices.length,\n\t\t\tvertices1 = this.vertices,\n\t\t\tvertices2 = geometry.vertices,\n\t\t\tfaces1 = this.faces,\n\t\t\tfaces2 = geometry.faces,\n\t\t\tuvs1 = this.faceVertexUvs[ 0 ],\n\t\t\tuvs2 = geometry.faceVertexUvs[ 0 ],\n\t\t\tcolors1 = this.colors,\n\t\t\tcolors2 = geometry.colors;\n\n\t\t\tif ( materialIndexOffset === undefined ) materialIndexOffset = 0;\n\n\t\t\tif ( matrix !== undefined ) {\n\n\t\t\t\tnormalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t}\n\n\t\t\t// vertices\n\n\t\t\tfor ( var i = 0, il = vertices2.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = vertices2[ i ];\n\n\t\t\t\tvar vertexCopy = vertex.clone();\n\n\t\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\n\n\t\t\t\tvertices1.push( vertexCopy );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tfor ( var i = 0, il = colors2.length; i < il; i ++ ) {\n\n\t\t\t\tcolors1.push( colors2[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tfor ( i = 0, il = faces2.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = faces2[ i ], faceCopy, normal, color,\n\t\t\t\tfaceVertexNormals = face.vertexNormals,\n\t\t\t\tfaceVertexColors = face.vertexColors;\n\n\t\t\t\tfaceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );\n\t\t\t\tfaceCopy.normal.copy( face.normal );\n\n\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\tfaceCopy.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tnormal = faceVertexNormals[ j ].clone();\n\n\t\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCopy.vertexNormals.push( normal );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.color.copy( face.color );\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {\n\n\t\t\t\t\tcolor = faceVertexColors[ j ];\n\t\t\t\t\tfaceCopy.vertexColors.push( color.clone() );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\n\n\t\t\t\tfaces1.push( faceCopy );\n\n\t\t\t}\n\n\t\t\t// uvs\n\n\t\t\tfor ( i = 0, il = uvs2.length; i < il; i ++ ) {\n\n\t\t\t\tvar uv = uvs2[ i ], uvCopy = [];\n\n\t\t\t\tif ( uv === undefined ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = uv.length; j < jl; j ++ ) {\n\n\t\t\t\t\tuvCopy.push( uv[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tuvs1.push( uvCopy );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmergeMesh: function ( mesh ) {\n\n\t\t\tif ( (mesh && mesh.isMesh) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tmesh.matrixAutoUpdate && mesh.updateMatrix();\n\n\t\t\tthis.merge( mesh.geometry, mesh.matrix );\n\n\t\t},\n\n\t\t/*\n\t\t * Checks for duplicate vertices with hashmap.\n\t\t * Duplicated vertices are removed\n\t\t * and faces' vertices are updated.\n\t\t */\n\n\t\tmergeVertices: function () {\n\n\t\t\tvar verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n\t\t\tvar unique = [], changes = [];\n\n\t\t\tvar v, key;\n\t\t\tvar precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n\t\t\tvar precision = Math.pow( 10, precisionPoints );\n\t\t\tvar i, il, face;\n\t\t\tvar indices, j, jl;\n\n\t\t\tfor ( i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tv = this.vertices[ i ];\n\t\t\t\tkey = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );\n\n\t\t\t\tif ( verticesMap[ key ] === undefined ) {\n\n\t\t\t\t\tverticesMap[ key ] = i;\n\t\t\t\t\tunique.push( this.vertices[ i ] );\n\t\t\t\t\tchanges[ i ] = unique.length - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\n\t\t\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// if faces are completely degenerate after merging vertices, we\n\t\t\t// have to remove them from the geometry.\n\t\t\tvar faceIndicesToRemove = [];\n\n\t\t\tfor ( i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tface = this.faces[ i ];\n\n\t\t\t\tface.a = changes[ face.a ];\n\t\t\t\tface.b = changes[ face.b ];\n\t\t\t\tface.c = changes[ face.c ];\n\n\t\t\t\tindices = [ face.a, face.b, face.c ];\n\n\t\t\t\tvar dupIndex = - 1;\n\n\t\t\t\t// if any duplicate vertices are found in a Face3\n\t\t\t\t// we have to remove the face as nothing can be saved\n\t\t\t\tfor ( var n = 0; n < 3; n ++ ) {\n\n\t\t\t\t\tif ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {\n\n\t\t\t\t\t\tdupIndex = n;\n\t\t\t\t\t\tfaceIndicesToRemove.push( i );\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\tfor ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\n\n\t\t\t\tvar idx = faceIndicesToRemove[ i ];\n\n\t\t\t\tthis.faces.splice( idx, 1 );\n\n\t\t\t\tfor ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ j ].splice( idx, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Use unique set of vertices\n\n\t\t\tvar diff = this.vertices.length - unique.length;\n\t\t\tthis.vertices = unique;\n\t\t\treturn diff;\n\n\t\t},\n\n\t\tsortFacesByMaterialIndex: function () {\n\n\t\t\tvar faces = this.faces;\n\t\t\tvar length = faces.length;\n\n\t\t\t// tag faces\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tfaces[ i ]._id = i;\n\n\t\t\t}\n\n\t\t\t// sort faces\n\n\t\t\tfunction materialIndexSort( a, b ) {\n\n\t\t\t\treturn a.materialIndex - b.materialIndex;\n\n\t\t\t}\n\n\t\t\tfaces.sort( materialIndexSort );\n\n\t\t\t// sort uvs\n\n\t\t\tvar uvs1 = this.faceVertexUvs[ 0 ];\n\t\t\tvar uvs2 = this.faceVertexUvs[ 1 ];\n\n\t\t\tvar newUvs1, newUvs2;\n\n\t\t\tif ( uvs1 && uvs1.length === length ) newUvs1 = [];\n\t\t\tif ( uvs2 && uvs2.length === length ) newUvs2 = [];\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tvar id = faces[ i ]._id;\n\n\t\t\t\tif ( newUvs1 ) newUvs1.push( uvs1[ id ] );\n\t\t\t\tif ( newUvs2 ) newUvs2.push( uvs2[ id ] );\n\n\t\t\t}\n\n\t\t\tif ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;\n\t\t\tif ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Geometry',\n\t\t\t\t\tgenerator: 'Geometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Geometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tvar vertices = [];\n\n\t\t\tfor ( var i = 0; i < this.vertices.length; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t\tvar faces = [];\n\t\t\tvar normals = [];\n\t\t\tvar normalsHash = {};\n\t\t\tvar colors = [];\n\t\t\tvar colorsHash = {};\n\t\t\tvar uvs = [];\n\t\t\tvar uvsHash = {};\n\n\t\t\tfor ( var i = 0; i < this.faces.length; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\n\t\t\t\tvar hasMaterial = true;\n\t\t\t\tvar hasFaceUv = false; // deprecated\n\t\t\t\tvar hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;\n\t\t\t\tvar hasFaceNormal = face.normal.length() > 0;\n\t\t\t\tvar hasFaceVertexNormal = face.vertexNormals.length > 0;\n\t\t\t\tvar hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;\n\t\t\t\tvar hasFaceVertexColor = face.vertexColors.length > 0;\n\n\t\t\t\tvar faceType = 0;\n\n\t\t\t\tfaceType = setBit( faceType, 0, 0 ); // isQuad\n\t\t\t\tfaceType = setBit( faceType, 1, hasMaterial );\n\t\t\t\tfaceType = setBit( faceType, 2, hasFaceUv );\n\t\t\t\tfaceType = setBit( faceType, 3, hasFaceVertexUv );\n\t\t\t\tfaceType = setBit( faceType, 4, hasFaceNormal );\n\t\t\t\tfaceType = setBit( faceType, 5, hasFaceVertexNormal );\n\t\t\t\tfaceType = setBit( faceType, 6, hasFaceColor );\n\t\t\t\tfaceType = setBit( faceType, 7, hasFaceVertexColor );\n\n\t\t\t\tfaces.push( faceType );\n\t\t\t\tfaces.push( face.a, face.b, face.c );\n\t\t\t\tfaces.push( face.materialIndex );\n\n\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\tvar faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 0 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 1 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\tfaces.push( getNormalIndex( face.normal ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 0 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 1 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\tfaces.push( getColorIndex( face.color ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 0 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 1 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction setBit( value, position, enabled ) {\n\n\t\t\t\treturn enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );\n\n\t\t\t}\n\n\t\t\tfunction getNormalIndex( normal ) {\n\n\t\t\t\tvar hash = normal.x.toString() + normal.y.toString() + normal.z.toString();\n\n\t\t\t\tif ( normalsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tnormalsHash[ hash ] = normals.length / 3;\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getColorIndex( color ) {\n\n\t\t\t\tvar hash = color.r.toString() + color.g.toString() + color.b.toString();\n\n\t\t\t\tif ( colorsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tcolorsHash[ hash ] = colors.length;\n\t\t\t\tcolors.push( color.getHex() );\n\n\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getUvIndex( uv ) {\n\n\t\t\t\tvar hash = uv.x.toString() + uv.y.toString();\n\n\t\t\t\tif ( uvsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tuvsHash[ hash ] = uvs.length / 2;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tdata.data = {};\n\n\t\t\tdata.data.vertices = vertices;\n\t\t\tdata.data.normals = normals;\n\t\t\tif ( colors.length > 0 ) data.data.colors = colors;\n\t\t\tif ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility\n\t\t\tdata.data.faces = faces;\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new Geometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.vertices = [];\n\t\t\tthis.faces = [];\n\t\t\tthis.faceVertexUvs = [ [] ];\n\t\t\tthis.colors = [];\n\n\t\t\tvar vertices = source.vertices;\n\n\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertices.push( vertices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tvar colors = source.colors;\n\n\t\t\tfor ( var i = 0, il = colors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.colors.push( colors[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tvar faces = source.faces;\n\n\t\t\tfor ( var i = 0, il = faces.length; i < il; i ++ ) {\n\n\t\t\t\tthis.faces.push( faces[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\t\t\tvar faceVertexUvs = source.faceVertexUvs[ i ];\n\n\t\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar uvs = faceVertexUvs[ j ], uvsCopy = [];\n\n\t\t\t\t\tfor ( var k = 0, kl = uvs.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tvar uv = uvs[ k ];\n\n\t\t\t\t\t\tuvsCopy.push( uv.clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\tvar count$3 = 0;\n\tfunction GeometryIdCount() { return count$3++; }\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectGeometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'DirectGeometry';\n\n\t\tthis.indices = [];\n\t\tthis.vertices = [];\n\t\tthis.normals = [];\n\t\tthis.colors = [];\n\t\tthis.uvs = [];\n\t\tthis.uvs2 = [];\n\n\t\tthis.groups = [];\n\n\t\tthis.morphTargets = {};\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\t// this.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tObject.assign( DirectGeometry.prototype, EventDispatcher.prototype, {\n\n\t\tcomputeBoundingBox: Geometry.prototype.computeBoundingBox,\n\t\tcomputeBoundingSphere: Geometry.prototype.computeBoundingSphere,\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\tconsole.warn( 'THREE.DirectGeometry: computeFaceNormals() is not a method of this type of geometry.' );\n\n\t\t},\n\n\t\tcomputeVertexNormals: function () {\n\n\t\t\tconsole.warn( 'THREE.DirectGeometry: computeVertexNormals() is not a method of this type of geometry.' );\n\n\t\t},\n\n\t\tcomputeGroups: function ( geometry ) {\n\n\t\t\tvar group;\n\t\t\tvar groups = [];\n\t\t\tvar materialIndex;\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t// materials\n\n\t\t\t\tif ( face.materialIndex !== materialIndex ) {\n\n\t\t\t\t\tmaterialIndex = face.materialIndex;\n\n\t\t\t\t\tif ( group !== undefined ) {\n\n\t\t\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\t\t\tgroups.push( group );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgroup = {\n\t\t\t\t\t\tstart: i * 3,\n\t\t\t\t\t\tmaterialIndex: materialIndex\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( group !== undefined ) {\n\n\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\tgroups.push( group );\n\n\t\t\t}\n\n\t\t\tthis.groups = groups;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tvar faces = geometry.faces;\n\t\t\tvar vertices = geometry.vertices;\n\t\t\tvar faceVertexUvs = geometry.faceVertexUvs;\n\n\t\t\tvar hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;\n\t\t\tvar hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;\n\n\t\t\t// morphs\n\n\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\tvar morphTargetsLength = morphTargets.length;\n\n\t\t\tvar morphTargetsPosition;\n\n\t\t\tif ( morphTargetsLength > 0 ) {\n\n\t\t\t\tmorphTargetsPosition = [];\n\n\t\t\t\tfor ( var i = 0; i < morphTargetsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsPosition[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.position = morphTargetsPosition;\n\n\t\t\t}\n\n\t\t\tvar morphNormals = geometry.morphNormals;\n\t\t\tvar morphNormalsLength = morphNormals.length;\n\n\t\t\tvar morphTargetsNormal;\n\n\t\t\tif ( morphNormalsLength > 0 ) {\n\n\t\t\t\tmorphTargetsNormal = [];\n\n\t\t\t\tfor ( var i = 0; i < morphNormalsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsNormal[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.normal = morphTargetsNormal;\n\n\t\t\t}\n\n\t\t\t// skins\n\n\t\t\tvar skinIndices = geometry.skinIndices;\n\t\t\tvar skinWeights = geometry.skinWeights;\n\n\t\t\tvar hasSkinIndices = skinIndices.length === vertices.length;\n\t\t\tvar hasSkinWeights = skinWeights.length === vertices.length;\n\n\t\t\t//\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tthis.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tthis.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar normal = face.normal;\n\n\t\t\t\t\tthis.normals.push( normal, normal, normal );\n\n\t\t\t\t}\n\n\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\tif ( vertexColors.length === 3 ) {\n\n\t\t\t\t\tthis.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar color = face.color;\n\n\t\t\t\t\tthis.colors.push( color, color, color );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );\n\n\t\t\t\t\t\tthis.uvs.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv2 === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 1 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );\n\n\t\t\t\t\t\tthis.uvs2.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// morphs\n\n\t\t\t\tfor ( var j = 0; j < morphTargetsLength; j ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ j ].vertices;\n\n\t\t\t\t\tmorphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0; j < morphNormalsLength; j ++ ) {\n\n\t\t\t\t\tvar morphNormal = morphNormals[ j ].vertexNormals[ i ];\n\n\t\t\t\t\tmorphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );\n\n\t\t\t\t}\n\n\t\t\t\t// skins\n\n\t\t\t\tif ( hasSkinIndices ) {\n\n\t\t\t\t\tthis.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasSkinWeights ) {\n\n\t\t\t\t\tthis.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeGroups( geometry );\n\n\t\t\tthis.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.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\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}\n\n\tObject.assign( BufferGeometry.prototype, EventDispatcher.prototype, {\n\n\t\tisBufferGeometry: true,\n\n\t\tgetIndex: function () {\n\n\t\t\treturn this.index;\n\n\t\t},\n\n\t\tsetIndex: function ( index ) {\n\n\t\t\tthis.index = index;\n\n\t\t},\n\n\t\taddAttribute: function ( name, attribute ) {\n\n\t\t\tif ( (attribute && attribute.isBufferAttribute) === false && (attribute && attribute.isInterleavedBufferAttribute) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\n\n\t\t\t\tthis.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( name === 'index' ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\n\t\t\t\tthis.setIndex( attribute );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.attributes[ name ] = attribute;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetAttribute: function ( name ) {\n\n\t\t\treturn this.attributes[ name ];\n\n\t\t},\n\n\t\tremoveAttribute: function ( name ) {\n\n\t\t\tdelete this.attributes[ name ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddGroup: function ( start, count, materialIndex ) {\n\n\t\t\tthis.groups.push( {\n\n\t\t\t\tstart: start,\n\t\t\t\tcount: count,\n\t\t\t\tmaterialIndex: materialIndex !== undefined ? materialIndex : 0\n\n\t\t\t} );\n\n\t\t},\n\n\t\tclearGroups: function () {\n\n\t\t\tthis.groups = [];\n\n\t\t},\n\n\t\tsetDrawRange: function ( start, count ) {\n\n\t\t\tthis.drawRange.start = start;\n\t\t\tthis.drawRange.count = count;\n\n\t\t},\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tmatrix.applyToVector3Array( position.array );\n\t\t\t\tposition.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tvar normal = this.attributes.normal;\n\n\t\t\tif ( normal !== undefined ) {\n\n\t\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t\tnormalMatrix.applyToVector3Array( normal.array );\n\t\t\t\tnormal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\t// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( (object && object.isPoints) || (object && object.isLine) ) {\n\n\t\t\t\tvar positions = new Float32Attribute( geometry.vertices.length * 3, 3 );\n\t\t\t\tvar colors = new Float32Attribute( geometry.colors.length * 3, 3 );\n\n\t\t\t\tthis.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\n\t\t\t\tthis.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\n\n\t\t\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\n\n\t\t\t\t\tvar lineDistances = new Float32Attribute( geometry.lineDistances.length, 1 );\n\n\t\t\t\t\tthis.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( (object && object.isMesh) ) {\n\n\t\t\t\tif ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\tthis.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateFromObject: function ( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( (object && object.isMesh) ) {\n\n\t\t\t\tvar direct = geometry.__directGeometry;\n\n\t\t\t\tif ( geometry.elementsNeedUpdate === true ) {\n\n\t\t\t\t\tdirect = undefined;\n\t\t\t\t\tgeometry.elementsNeedUpdate = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( direct === undefined ) {\n\n\t\t\t\t\treturn this.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t\tdirect.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\t\tdirect.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\t\tdirect.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\t\tdirect.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\t\tdirect.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t\tgeometry = direct;\n\n\t\t\t}\n\n\t\t\tvar attribute;\n\n\t\t\tif ( geometry.verticesNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.position;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.vertices );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.normalsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.normal;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.normals );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.colorsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.color;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyColorsArray( geometry.colors );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvsNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.uv;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector2sArray( geometry.uvs );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.lineDistancesNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.lineDistance;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyArray( geometry.lineDistances );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.lineDistancesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.groupsNeedUpdate ) {\n\n\t\t\t\tgeometry.computeGroups( object.geometry );\n\t\t\t\tthis.groups = geometry.groups;\n\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tgeometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );\n\n\t\t\treturn this.fromDirectGeometry( geometry.__directGeometry );\n\n\t\t},\n\n\t\tfromDirectGeometry: function ( geometry ) {\n\n\t\t\tvar positions = new Float32Array( geometry.vertices.length * 3 );\n\t\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );\n\n\t\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\t\tvar normals = new Float32Array( geometry.normals.length * 3 );\n\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\t\tvar colors = new Float32Array( geometry.colors.length * 3 );\n\t\t\t\tthis.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs.length > 0 ) {\n\n\t\t\t\tvar uvs = new Float32Array( geometry.uvs.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs2.length > 0 ) {\n\n\t\t\t\tvar uvs2 = new Float32Array( geometry.uvs2.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.indices.length > 0 ) {\n\n\t\t\t\tvar TypeArray = geometry.vertices.length > 65535 ? Uint32Array : Uint16Array;\n\t\t\t\tvar indices = new TypeArray( geometry.indices.length * 3 );\n\t\t\t\tthis.setIndex( new BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) );\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tthis.groups = geometry.groups;\n\n\t\t\t// morphs\n\n\t\t\tfor ( var name in geometry.morphTargets ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphTargets = geometry.morphTargets[ name ];\n\n\t\t\t\tfor ( var i = 0, l = morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ i ];\n\n\t\t\t\t\tvar attribute = new Float32Attribute( morphTarget.length * 3, 3 );\n\n\t\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// skinning\n\n\t\t\tif ( geometry.skinIndices.length > 0 ) {\n\n\t\t\t\tvar skinIndices = new Float32Attribute( geometry.skinIndices.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.skinWeights.length > 0 ) {\n\n\t\t\t\tvar skinWeights = new Float32Attribute( geometry.skinWeights.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tvar positions = this.attributes.position.array;\n\n\t\t\tif ( positions !== undefined ) {\n\n\t\t\t\tthis.boundingBox.setFromArray( positions );\n\n\t\t\t} else {\n\n\t\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t\t}\n\n\t\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\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\t}\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tvar box = new Box3();\n\t\t\tvar vector = new Vector3();\n\n\t\t\treturn function computeBoundingSphere() {\n\n\t\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t\t}\n\n\t\t\t\tvar positions = this.attributes.position;\n\n\t\t\t\tif ( positions ) {\n\n\t\t\t\t\tvar array = positions.array;\n\t\t\t\t\tvar center = this.boundingSphere.center;\n\n\t\t\t\t\tbox.setFromArray( array );\n\t\t\t\t\tbox.getCenter( center );\n\n\t\t\t\t\t// hoping to find a boundingSphere with a radius smaller than the\n\t\t\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\t\tfor ( var i = 0, il = array.length; i < il; i += 3 ) {\n\n\t\t\t\t\t\tvector.fromArray( array, i );\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\t// backwards compatibility\n\n\t\t},\n\n\t\tcomputeVertexNormals: function () {\n\n\t\t\tvar index = this.index;\n\t\t\tvar attributes = this.attributes;\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( attributes.position ) {\n\n\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\tif ( attributes.normal === undefined ) {\n\n\t\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// reset existing normals to zero\n\n\t\t\t\t\tvar array = attributes.normal.array;\n\n\t\t\t\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tarray[ i ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar normals = attributes.normal.array;\n\n\t\t\t\tvar vA, vB, vC,\n\n\t\t\t\tpA = new Vector3(),\n\t\t\t\tpB = new Vector3(),\n\t\t\t\tpC = new Vector3(),\n\n\t\t\t\tcb = new Vector3(),\n\t\t\t\tab = new Vector3();\n\n\t\t\t\t// indexed elements\n\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\t\tthis.addGroup( 0, indices.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var j = 0, jl = groups.length; j < jl; ++ j ) {\n\n\t\t\t\t\t\tvar group = groups[ j ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\t\tvA = indices[ i + 0 ] * 3;\n\t\t\t\t\t\t\tvB = indices[ i + 1 ] * 3;\n\t\t\t\t\t\t\tvC = indices[ i + 2 ] * 3;\n\n\t\t\t\t\t\t\tpA.fromArray( positions, vA );\n\t\t\t\t\t\t\tpB.fromArray( positions, vB );\n\t\t\t\t\t\t\tpC.fromArray( positions, vC );\n\n\t\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\t\tnormals[ vA ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vA + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vA + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vB ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vB + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vB + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vC ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vC + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vC + 2 ] += cb.z;\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\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\t\tfor ( var i = 0, il = positions.length; i < il; i += 9 ) {\n\n\t\t\t\t\t\tpA.fromArray( positions, i );\n\t\t\t\t\t\tpB.fromArray( positions, i + 3 );\n\t\t\t\t\t\tpC.fromArray( positions, i + 6 );\n\n\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\tnormals[ i ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 1 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 2 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 3 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 4 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 5 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 6 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 7 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 8 ] = cb.z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.normalizeNormals();\n\n\t\t\t\tattributes.normal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tmerge: function ( geometry, offset ) {\n\n\t\t\tif ( (geometry && geometry.isBufferGeometry) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\t\tvar attribute1 = attributes[ key ];\n\t\t\t\tvar attributeArray1 = attribute1.array;\n\n\t\t\t\tvar attribute2 = geometry.attributes[ key ];\n\t\t\t\tvar attributeArray2 = attribute2.array;\n\n\t\t\t\tvar attributeSize = attribute2.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) {\n\n\t\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalizeNormals: function () {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\n\t\t\tvar x, y, z, n;\n\n\t\t\tfor ( var i = 0, il = normals.length; i < il; i += 3 ) {\n\n\t\t\t\tx = normals[ i ];\n\t\t\t\ty = normals[ i + 1 ];\n\t\t\t\tz = normals[ i + 2 ];\n\n\t\t\t\tn = 1.0 / Math.sqrt( x * x + y * y + z * z );\n\n\t\t\t\tnormals[ i ] *= n;\n\t\t\t\tnormals[ i + 1 ] *= n;\n\t\t\t\tnormals[ i + 2 ] *= n;\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoNonIndexed: function () {\n\n\t\t\tif ( this.index === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar geometry2 = new BufferGeometry();\n\n\t\t\tvar indices = this.index.array;\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\n\t\t\t\tvar array = attribute.array;\n\t\t\t\tvar itemSize = attribute.itemSize;\n\n\t\t\t\tvar array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\t\tvar index = 0, index2 = 0;\n\n\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t\tfor ( var j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) );\n\n\t\t\t}\n\n\t\t\treturn geometry2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard BufferGeometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tdata.data = { attributes: {} };\n\n\t\t\tvar index = this.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar array = Array.prototype.slice.call( index.array );\n\n\t\t\t\tdata.data.index = {\n\t\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\t\tarray: array\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\n\t\t\t\tvar array = Array.prototype.slice.call( attribute.array );\n\n\t\t\t\tdata.data.attributes[ key ] = {\n\t\t\t\t\titemSize: attribute.itemSize,\n\t\t\t\t\ttype: attribute.array.constructor.name,\n\t\t\t\t\tarray: array,\n\t\t\t\t\tnormalized: attribute.normalized\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = this.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tdata.data.boundingSphere = {\n\t\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\t\tradius: boundingSphere.radius\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new BufferGeometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar index = source.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tthis.setIndex( index.clone() );\n\n\t\t\t}\n\n\t\t\tvar attributes = source.attributes;\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\t\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t\t}\n\n\t\t\tvar groups = source.groups;\n\n\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\tvar group = groups[ i ];\n\t\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\tBufferGeometry.MaxIndex = 65535;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author jonobr1 / http://jonobr1.com/\n\t */\n\n\tfunction Mesh( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t\tthis.drawMode = TrianglesDrawMode;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tMesh.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Mesh,\n\n\t\tisMesh: true,\n\n\t\tsetDrawMode: function ( value ) {\n\n\t\t\tthis.drawMode = value;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.drawMode = source.drawMode;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateMorphTargets: function () {\n\n\t\t\tvar morphTargets = this.geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( var m = 0, ml = morphTargets.length; m < ml; m ++ ) {\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ morphTargets[ m ].name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\tvar vA = new Vector3();\n\t\t\tvar vB = new Vector3();\n\t\t\tvar vC = new Vector3();\n\n\t\t\tvar tempA = new Vector3();\n\t\t\tvar tempB = new Vector3();\n\t\t\tvar tempC = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tvar barycoord = new Vector3();\n\n\t\t\tvar intersectionPoint = new Vector3();\n\t\t\tvar intersectionPointWorld = new Vector3();\n\n\t\t\tfunction uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) {\n\n\t\t\t\tTriangle.barycoordFromPoint( point, p1, p2, p3, barycoord );\n\n\t\t\t\tuv1.multiplyScalar( barycoord.x );\n\t\t\t\tuv2.multiplyScalar( barycoord.y );\n\t\t\t\tuv3.multiplyScalar( barycoord.z );\n\n\t\t\t\tuv1.add( uv2 ).add( uv3 );\n\n\t\t\t\treturn uv1.clone();\n\n\t\t\t}\n\n\t\t\tfunction checkIntersection( object, raycaster, ray, pA, pB, pC, point ) {\n\n\t\t\t\tvar intersect;\n\t\t\t\tvar material = object.material;\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t\t\t\t}\n\n\t\t\t\tif ( intersect === null ) return null;\n\n\t\t\t\tintersectionPointWorld.copy( point );\n\t\t\t\tintersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\t\t\t\treturn {\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\tpoint: intersectionPointWorld.clone(),\n\t\t\t\t\tobject: object\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tfunction checkBufferGeometryIntersection( object, raycaster, ray, positions, uvs, a, b, c ) {\n\n\t\t\t\tvA.fromArray( positions, a * 3 );\n\t\t\t\tvB.fromArray( positions, b * 3 );\n\t\t\t\tvC.fromArray( positions, c * 3 );\n\n\t\t\t\tvar intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint );\n\n\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\t\tuvA.fromArray( uvs, a * 2 );\n\t\t\t\t\t\tuvB.fromArray( uvs, b * 2 );\n\t\t\t\t\t\tuvC.fromArray( uvs, c * 2 );\n\n\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tintersection.face = new Face3( a, b, c, Triangle.normal( vA, vB, vC ) );\n\t\t\t\t\tintersection.faceIndex = a;\n\n\t\t\t\t}\n\n\t\t\t\treturn intersection;\n\n\t\t\t}\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar material = this.material;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\tif ( material === undefined ) return;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\t// Check boundingBox before continuing\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tif ( ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t\t\t}\n\n\t\t\t\tvar uvs, intersection;\n\n\t\t\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\tvar a, b, c;\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( attributes.uv !== undefined ) {\n\n\t\t\t\t\t\tuvs = attributes.uv.array;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = indices[ i ];\n\t\t\t\t\t\t\tb = indices[ i + 1 ];\n\t\t\t\t\t\t\tc = indices[ i + 2 ];\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\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\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length; i < l; i += 9 ) {\n\n\t\t\t\t\t\t\ta = i / 3;\n\t\t\t\t\t\t\tb = a + 1;\n\t\t\t\t\t\t\tc = a + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.index = a; // triangle number in positions buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\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 if ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\tvar fvA, fvB, fvC;\n\t\t\t\t\tvar isFaceMaterial = (material && material.isMultiMaterial);\n\t\t\t\t\tvar materials = isFaceMaterial === true ? material.materials : null;\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar faceVertexUvs = geometry.faceVertexUvs[ 0 ];\n\t\t\t\t\tif ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;\n\n\t\t\t\t\tfor ( var f = 0, fl = faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tvar face = faces[ f ];\n\t\t\t\t\t\tvar faceMaterial = isFaceMaterial === true ? materials[ face.materialIndex ] : material;\n\n\t\t\t\t\t\tif ( faceMaterial === undefined ) continue;\n\n\t\t\t\t\t\tfvA = vertices[ face.a ];\n\t\t\t\t\t\tfvB = vertices[ face.b ];\n\t\t\t\t\t\tfvC = vertices[ face.c ];\n\n\t\t\t\t\t\tif ( faceMaterial.morphTargets === true ) {\n\n\t\t\t\t\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\t\t\t\t\tvar morphInfluences = this.morphTargetInfluences;\n\n\t\t\t\t\t\t\tvA.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvB.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvC.set( 0, 0, 0 );\n\n\t\t\t\t\t\t\tfor ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {\n\n\t\t\t\t\t\t\t\tvar influence = morphInfluences[ t ];\n\n\t\t\t\t\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t\t\t\t\tvar targets = morphTargets[ t ].vertices;\n\n\t\t\t\t\t\t\t\tvA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence );\n\t\t\t\t\t\t\t\tvB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence );\n\t\t\t\t\t\t\t\tvC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvA.add( fvA );\n\t\t\t\t\t\t\tvB.add( fvB );\n\t\t\t\t\t\t\tvC.add( fvC );\n\n\t\t\t\t\t\t\tfvA = vA;\n\t\t\t\t\t\t\tfvB = vB;\n\t\t\t\t\t\t\tfvC = vC;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tintersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\t\t\t\tvar uvs_f = uvs[ f ];\n\t\t\t\t\t\t\t\tuvA.copy( uvs_f[ 0 ] );\n\t\t\t\t\t\t\t\tuvB.copy( uvs_f[ 1 ] );\n\t\t\t\t\t\t\t\tuvC.copy( uvs_f[ 2 ] );\n\n\t\t\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tintersection.face = face;\n\t\t\t\t\t\t\tintersection.faceIndex = f;\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};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'BoxBufferGeometry';\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\tvar scope = this;\n\n\t\t// segments\n\t\twidthSegments = Math.floor( widthSegments ) || 1;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\t\tdepthSegments = Math.floor( depthSegments ) || 1;\n\n\t\t// these are used to calculate buffer length\n\t\tvar vertexCount = calculateVertexCount( widthSegments, heightSegments, depthSegments );\n\t\tvar indexCount = calculateIndexCount( widthSegments, heightSegments, depthSegments );\n\n\t\t// buffers\n\t\tvar indices = new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount );\n\t\tvar vertices = new Float32Array( vertexCount * 3 );\n\t\tvar normals = new Float32Array( vertexCount * 3 );\n\t\tvar uvs = new Float32Array( vertexCount * 2 );\n\n\t\t// offset variables\n\t\tvar vertexBufferOffset = 0;\n\t\tvar uvBufferOffset = 0;\n\t\tvar indexBufferOffset = 0;\n\t\tvar numberOfVertices = 0;\n\n\t\t// group variables\n\t\tvar groupStart = 0;\n\n\t\t// build each side of the box geometry\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\t\tthis.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t\t// helper functions\n\n\t\tfunction calculateVertexCount( w, h, d ) {\n\n\t\t\tvar vertices = 0;\n\n\t\t\t// calculate the amount of vertices for each side (plane)\n\t\t\tvertices += (w + 1) * (h + 1) * 2; // xy\n\t\t\tvertices += (w + 1) * (d + 1) * 2; // xz\n\t\t\tvertices += (d + 1) * (h + 1) * 2; // zy\n\n\t\t\treturn vertices;\n\n\t\t}\n\n\t\tfunction calculateIndexCount( w, h, d ) {\n\n\t\t\tvar index = 0;\n\n\t\t\t// calculate the amount of squares for each side\n\t\t\tindex += w * h * 2; // xy\n\t\t\tindex += w * d * 2; // xz\n\t\t\tindex += d * h * 2; // zy\n\n\t\t\treturn index * 6; // two triangles per square => six vertices per square\n\n\t\t}\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tvar segmentWidth\t= width / gridX;\n\t\t\tvar segmentHeight = height / gridY;\n\n\t\t\tvar widthHalf = width / 2;\n\t\t\tvar heightHalf = height / 2;\n\t\t\tvar depthHalf = depth / 2;\n\n\t\t\tvar gridX1 = gridX + 1;\n\t\t\tvar gridY1 = gridY + 1;\n\n\t\t\tvar vertexCounter = 0;\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( var iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tvar y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( var ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tvar x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\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\t\t\t\t\tvertices[ vertexBufferOffset ] = vector.x;\n\t\t\t\t\tvertices[ vertexBufferOffset + 1 ] = vector.y;\n\t\t\t\t\tvertices[ vertexBufferOffset + 2 ] = vector.z;\n\n\t\t\t\t\t// set values to correct vector component\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\t\t\t\t\tnormals[ vertexBufferOffset ] = vector.x;\n\t\t\t\t\tnormals[ vertexBufferOffset + 1 ] = vector.y;\n\t\t\t\t\tnormals[ vertexBufferOffset + 2 ] = vector.z;\n\n\t\t\t\t\t// uvs\n\t\t\t\t\tuvs[ uvBufferOffset ] = ix / gridX;\n\t\t\t\t\tuvs[ uvBufferOffset + 1 ] = 1 - ( iy / gridY );\n\n\t\t\t\t\t// update offsets and counters\n\t\t\t\t\tvertexBufferOffset += 3;\n\t\t\t\t\tuvBufferOffset += 2;\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\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 ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\t// indices\n\t\t\t\t\tvar a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tvar b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// face one\n\t\t\t\t\tindices[ indexBufferOffset ] = a;\n\t\t\t\t\tindices[ indexBufferOffset + 1 ] = b;\n\t\t\t\t\tindices[ indexBufferOffset + 2 ] = d;\n\n\t\t\t\t\t// face two\n\t\t\t\t\tindices[ indexBufferOffset + 3 ] = b;\n\t\t\t\t\tindices[ indexBufferOffset + 4 ] = c;\n\t\t\t\t\tindices[ indexBufferOffset + 5 ] = d;\n\n\t\t\t\t\t// update offsets and counters\n\t\t\t\t\tindexBufferOffset += 6;\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\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tBoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tBoxBufferGeometry.prototype.constructor = BoxBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PlaneBufferGeometry';\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\tvar width_half = width / 2;\n\t\tvar height_half = height / 2;\n\n\t\tvar gridX = Math.floor( widthSegments ) || 1;\n\t\tvar gridY = Math.floor( heightSegments ) || 1;\n\n\t\tvar gridX1 = gridX + 1;\n\t\tvar gridY1 = gridY + 1;\n\n\t\tvar segment_width = width / gridX;\n\t\tvar segment_height = height / gridY;\n\n\t\tvar vertices = new Float32Array( gridX1 * gridY1 * 3 );\n\t\tvar normals = new Float32Array( gridX1 * gridY1 * 3 );\n\t\tvar uvs = new Float32Array( gridX1 * gridY1 * 2 );\n\n\t\tvar offset = 0;\n\t\tvar offset2 = 0;\n\n\t\tfor ( var iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tvar y = iy * segment_height - height_half;\n\n\t\t\tfor ( var ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tvar x = ix * segment_width - width_half;\n\n\t\t\t\tvertices[ offset ] = x;\n\t\t\t\tvertices[ offset + 1 ] = - y;\n\n\t\t\t\tnormals[ offset + 2 ] = 1;\n\n\t\t\t\tuvs[ offset2 ] = ix / gridX;\n\t\t\t\tuvs[ offset2 + 1 ] = 1 - ( iy / gridY );\n\n\t\t\t\toffset += 3;\n\t\t\t\toffset2 += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\toffset = 0;\n\n\t\tvar indices = new ( ( vertices.length / 3 ) > 65535 ? Uint32Array : Uint16Array )( gridX * gridY * 6 );\n\n\t\tfor ( var iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( var ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tvar a = ix + gridX1 * iy;\n\t\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices[ offset ] = a;\n\t\t\t\tindices[ offset + 1 ] = b;\n\t\t\t\tindices[ offset + 2 ] = d;\n\n\t\t\t\tindices[ offset + 3 ] = b;\n\t\t\t\tindices[ offset + 4 ] = c;\n\t\t\t\tindices[ offset + 5 ] = d;\n\n\t\t\t\toffset += 6;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tPlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction Camera() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t}\n\n\tCamera.prototype = Object.create( Object3D.prototype );\n\tCamera.prototype.constructor = Camera;\n\n\tCamera.prototype.isCamera = true;\n\n\tCamera.prototype.getWorldDirection = function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\treturn result.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.lookAt = function () {\n\n\t\t// This routine does not support cameras with rotated and/or translated parent(s)\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function lookAt( vector ) {\n\n\t\t\tm1.lookAt( this.position, vector, this.up );\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.clone = function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t};\n\n\tCamera.prototype.copy = function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author greggman / http://games.greggman.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author tschw\n\t */\n\n\tfunction PerspectiveCamera( fov, aspect, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov !== undefined ? fov : 50;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near !== undefined ? near : 0.1;\n\t\tthis.far = far !== undefined ? far : 2000;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect !== undefined ? aspect : 1;\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\tPerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: PerspectiveCamera,\n\n\t\tisPerspectiveCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.fov = source.fov;\n\t\t\tthis.zoom = source.zoom;\n\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\t\t\tthis.focus = source.focus;\n\n\t\t\tthis.aspect = source.aspect;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\tthis.filmGauge = source.filmGauge;\n\t\t\tthis.filmOffset = source.filmOffset;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t\t *\n\t\t * The default film gauge is 35, so that the focal length can be specified for\n\t\t * a 35mm (full frame) camera.\n\t\t *\n\t\t * Values for focal length and film gauge must have the same unit.\n\t\t */\n\t\tsetFocalLength: function ( focalLength ) {\n\n\t\t\t// see http://www.bobatkins.com/photography/technical/field_of_view.html\n\t\t\tvar vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\t\tthis.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\t/**\n\t\t * Calculates the focal length from the current .fov and .filmGauge.\n\t\t */\n\t\tgetFocalLength: function () {\n\n\t\t\tvar vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov );\n\n\t\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t\t},\n\n\t\tgetEffectiveFOV: function () {\n\n\t\t\treturn _Math.RAD2DEG * 2 * Math.atan(\n\t\t\t\t\tMath.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t\t},\n\n\t\tgetFilmWidth: function () {\n\n\t\t\t// film not completely covered in portrait format (aspect < 1)\n\t\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t\t},\n\n\t\tgetFilmHeight: function () {\n\n\t\t\t// film not completely covered in landscape format (aspect > 1)\n\t\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t\t},\n\n\t\t/**\n\t\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t\t * multi-monitor/multi-machine setups.\n\t\t *\n\t\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t\t * the monitors are in grid like this\n\t\t *\n\t\t * +---+---+---+\n\t\t * | A | B | C |\n\t\t * +---+---+---+\n\t\t * | D | E | F |\n\t\t * +---+---+---+\n\t\t *\n\t\t * then for each monitor you would call it like this\n\t\t *\n\t\t * var w = 1920;\n\t\t * var h = 1080;\n\t\t * var fullWidth = w * 3;\n\t\t * var fullHeight = h * 2;\n\t\t *\n\t\t * --A--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t\t * --B--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t\t * --C--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t\t * --D--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t\t * --E--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t\t * --F--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t\t *\n\t\t * Note there is no reason monitors have to be the same size or in a grid.\n\t\t */\n\t\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar near = this.near,\n\t\t\t\ttop = near * Math.tan(\n\t\t\t\t\t\t_Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,\n\t\t\t\theight = 2 * top,\n\t\t\t\twidth = this.aspect * height,\n\t\t\t\tleft = - 0.5 * width,\n\t\t\t\tview = this.view;\n\n\t\t\tif ( view !== null ) {\n\n\t\t\t\tvar fullWidth = view.fullWidth,\n\t\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\t\twidth *= view.width / fullWidth;\n\t\t\t\theight *= view.height / fullHeight;\n\n\t\t\t}\n\n\t\t\tvar skew = this.filmOffset;\n\t\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\t\tthis.projectionMatrix.makeFrustum(\n\t\t\t\t\tleft, left + width, top - height, top, near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.fov = this.fov;\n\t\t\tdata.object.zoom = this.zoom;\n\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\t\t\tdata.object.focus = this.focus;\n\n\t\t\tdata.object.aspect = this.aspect;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\tdata.object.filmGauge = this.filmGauge;\n\t\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author arose / http://github.com/arose\n\t */\n\n\tfunction OrthographicCamera( left, right, top, bottom, near, far ) {\n\n\t\tCamera.call( this );\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 !== undefined ) ? near : 0.1;\n\t\tthis.far = ( far !== undefined ) ? far : 2000;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tOrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: OrthographicCamera,\n\n\t\tisOrthographicCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.left = source.left;\n\t\t\tthis.right = source.right;\n\t\t\tthis.top = source.top;\n\t\t\tthis.bottom = source.bottom;\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\n\t\t\tthis.zoom = source.zoom;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetViewOffset: function( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\t\tvar dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\t\tvar cx = ( this.right + this.left ) / 2;\n\t\t\tvar cy = ( this.top + this.bottom ) / 2;\n\n\t\t\tvar left = cx - dx;\n\t\t\tvar right = cx + dx;\n\t\t\tvar top = cy + dy;\n\t\t\tvar bottom = cy - dy;\n\n\t\t\tif ( this.view !== null ) {\n\n\t\t\t\tvar zoomW = this.zoom / ( this.view.width / this.view.fullWidth );\n\t\t\t\tvar zoomH = this.zoom / ( this.view.height / this.view.fullHeight );\n\t\t\t\tvar scaleW = ( this.right - this.left ) / this.view.width;\n\t\t\t\tvar scaleH = ( this.top - this.bottom ) / this.view.height;\n\n\t\t\t\tleft += scaleW * ( this.view.offsetX / zoomW );\n\t\t\t\tright = left + scaleW * ( this.view.width / zoomW );\n\t\t\t\ttop -= scaleH * ( this.view.offsetY / zoomH );\n\t\t\t\tbottom = top - scaleH * ( this.view.height / zoomH );\n\n\t\t\t}\n\n\t\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.zoom = this.zoom;\n\t\t\tdata.object.left = this.left;\n\t\t\tdata.object.right = this.right;\n\t\t\tdata.object.top = this.top;\n\t\t\tdata.object.bottom = this.bottom;\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLIndexedBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tvar type, size;\n\n\t\tfunction setIndex( index ) {\n\n\t\t\tif ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\t\ttype = gl.UNSIGNED_INT;\n\t\t\t\tsize = 4;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\t\t\t\tsize = 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawElements( mode, count, type, start * size );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry, start, count ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\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\textension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tsetMode: setMode,\n\t\t\tsetIndex: setIndex,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawArrays( mode, start, count );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\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\tvar position = geometry.attributes.position;\n\n\t\t\tvar count = 0;\n\n\t\t\tif ( (position && position.isInterleavedBufferAttribute) ) {\n\n\t\t\t\tcount = position.data.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t} else {\n\n\t\t\t\tcount = position.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t}\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\t\t\tsetMode: setMode,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLLights() {\n\n\t\tvar lights = {};\n\n\t\treturn {\n\n\t\t\tget: function ( light ) {\n\n\t\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\t\treturn lights[ light.id ];\n\n\t\t\t\t}\n\n\t\t\t\tvar uniforms;\n\n\t\t\t\tswitch ( light.type ) {\n\n\t\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\t\treturn uniforms;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction addLineNumbers( string ) {\n\n\t\tvar lines = string.split( '\\n' );\n\n\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t\t}\n\n\t\treturn lines.join( '\\n' );\n\n\t}\n\n\tfunction WebGLShader( gl, type, string ) {\n\n\t\tvar shader = gl.createShader( type );\n\n\t\tgl.shaderSource( shader, string );\n\t\tgl.compileShader( shader );\n\n\t\tif ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {\n\n\t\t\tconsole.error( 'THREE.WebGLShader: Shader couldn\\'t compile.' );\n\n\t\t}\n\n\t\tif ( gl.getShaderInfoLog( shader ) !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );\n\n\t\t}\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\treturn shader;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar programIdCount = 0;\n\n\tfunction getEncodingComponents( encoding ) {\n\n\t\tswitch ( encoding ) {\n\n\t\t\tcase LinearEncoding:\n\t\t\t\treturn [ 'Linear','( value )' ];\n\t\t\tcase sRGBEncoding:\n\t\t\t\treturn [ 'sRGB','( value )' ];\n\t\t\tcase RGBEEncoding:\n\t\t\t\treturn [ 'RGBE','( value )' ];\n\t\t\tcase RGBM7Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 7.0 )' ];\n\t\t\tcase RGBM16Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 16.0 )' ];\n\t\t\tcase RGBDEncoding:\n\t\t\t\treturn [ 'RGBD','( value, 256.0 )' ];\n\t\t\tcase GammaEncoding:\n\t\t\t\treturn [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ];\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported encoding: ' + encoding );\n\n\t\t}\n\n\t}\n\n\tfunction getTexelDecodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return \" + components[ 0 ] + \"ToLinear\" + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return LinearTo\" + components[ 0 ] + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\t\tvar toneMappingName;\n\n\t\tswitch ( toneMapping ) {\n\n\t\t\tcase LinearToneMapping:\n\t\t\t\ttoneMappingName = \"Linear\";\n\t\t\t\tbreak;\n\n\t\t\tcase ReinhardToneMapping:\n\t\t\t\ttoneMappingName = \"Reinhard\";\n\t\t\t\tbreak;\n\n\t\t\tcase Uncharted2ToneMapping:\n\t\t\t\ttoneMappingName = \"Uncharted2\";\n\t\t\t\tbreak;\n\n\t\t\tcase CineonToneMapping:\n\t\t\t\ttoneMappingName = \"OptimizedCineon\";\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported toneMapping: ' + toneMapping );\n\n\t\t}\n\n\t\treturn \"vec3 \" + functionName + \"( vec3 color ) { return \" + toneMappingName + \"ToneMapping( color ); }\";\n\n\t}\n\n\tfunction generateExtensions( extensions, parameters, rendererExtensions ) {\n\n\t\textensions = extensions || {};\n\n\t\tvar chunks = [\n\t\t\t( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t\t( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t\t( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t\t( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '',\n\t\t];\n\n\t\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tfunction generateDefines( defines ) {\n\n\t\tvar chunks = [];\n\n\t\tfor ( var name in defines ) {\n\n\t\t\tvar value = defines[ name ];\n\n\t\t\tif ( value === false ) continue;\n\n\t\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t\t}\n\n\t\treturn chunks.join( '\\n' );\n\n\t}\n\n\tfunction fetchAttributeLocations( gl, program, identifiers ) {\n\n\t\tvar attributes = {};\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\t\tfor ( var i = 0; i < n; i ++ ) {\n\n\t\t\tvar info = gl.getActiveAttrib( program, i );\n\t\t\tvar name = info.name;\n\n\t\t\t// console.log(\"THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:\", name, i );\n\n\t\t\tattributes[ name ] = gl.getAttribLocation( program, name );\n\n\t\t}\n\n\t\treturn attributes;\n\n\t}\n\n\tfunction filterEmptyLine( string ) {\n\n\t\treturn string !== '';\n\n\t}\n\n\tfunction replaceLightNums( string, parameters ) {\n\n\t\treturn string\n\t\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );\n\n\t}\n\n\tfunction parseIncludes( string ) {\n\n\t\tvar pattern = /#include +<([\\w\\d.]+)>/g;\n\n\t\tfunction replace( match, include ) {\n\n\t\t\tvar replace = ShaderChunk[ include ];\n\n\t\t\tif ( replace === undefined ) {\n\n\t\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t\t}\n\n\t\t\treturn parseIncludes( replace );\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction unrollLoops( string ) {\n\n\t\tvar pattern = /for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\n\n\t\tfunction replace( match, start, end, snippet ) {\n\n\t\t\tvar unroll = '';\n\n\t\t\tfor ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\t\t\tunroll += snippet.replace( /\\[ i \\]/g, '[ ' + i + ' ]' );\n\n\t\t\t}\n\n\t\t\treturn unroll;\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction WebGLProgram( renderer, code, material, parameters ) {\n\n\t\tvar gl = renderer.context;\n\n\t\tvar extensions = material.extensions;\n\t\tvar defines = material.defines;\n\n\t\tvar vertexShader = material.__webglShader.vertexShader;\n\t\tvar fragmentShader = material.__webglShader.fragmentShader;\n\n\t\tvar shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\t\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t\t}\n\n\t\tvar envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\tvar envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\t\tvar envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\n\t\tif ( parameters.envMap ) {\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeReflectionMapping:\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EquirectangularReflectionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SphericalReflectionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_SPHERE';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.combine ) {\n\n\t\t\t\tcase MultiplyOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MixOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AddOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;\n\n\t\t// console.log( 'building new program ' );\n\n\t\t//\n\n\t\tvar customExtensions = generateExtensions( extensions, parameters, renderer.extensions );\n\n\t\tvar customDefines = generateDefines( defines );\n\n\t\t//\n\n\t\tvar program = gl.createProgram();\n\n\t\tvar prefixVertex, prefixFragment;\n\n\t\tif ( material.isRawShaderMaterial ) {\n\n\t\t\tprefixVertex = [\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t} else {\n\n\t\t\tprefixVertex = [\n\n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t'attribute vec3 position;',\n\t\t\t\t'attribute vec3 normal;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'#ifdef USE_COLOR',\n\n\t\t\t\t'\tattribute vec3 color;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_MORPHTARGETS',\n\n\t\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t\t'\t#else',\n\n\t\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t\t'\t#endif',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\t\t\t\t'#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection),\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.premultipliedAlpha ? \"#define PREMULTIPLIED_ALPHA\" : '',\n\n\t\t\t\tparameters.physicallyCorrectLights ? \"#define PHYSICALLY_CORRECT_LIGHTS\" : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\tparameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? \"#define TONE_MAPPING\" : '',\n\t\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\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( \"toneMapping\", parameters.toneMapping ) : '',\n\n\t\t\t\t( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\t\tparameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',\n\t\t\t\tparameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',\n\t\t\t\tparameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',\n\t\t\t\tparameters.outputEncoding ? getTexelEncodingFunction( \"linearToOutputTexel\", parameters.outputEncoding ) : '',\n\n\t\t\t\tparameters.depthPacking ? \"#define DEPTH_PACKING \" + material.depthPacking : '',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t}\n\n\t\tvertexShader = parseIncludes( vertexShader, parameters );\n\t\tvertexShader = replaceLightNums( vertexShader, parameters );\n\n\t\tfragmentShader = parseIncludes( fragmentShader, parameters );\n\t\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\n\t\tif ( ! material.isShaderMaterial ) {\n\n\t\t\tvertexShader = unrollLoops( vertexShader );\n\t\t\tfragmentShader = unrollLoops( fragmentShader );\n\n\t\t}\n\n\t\tvar vertexGlsl = prefixVertex + vertexShader;\n\t\tvar fragmentGlsl = prefixFragment + fragmentShader;\n\n\t\t// console.log( '*VERTEX*', vertexGlsl );\n\t\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\t\tvar glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\t\tvar glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\t\tgl.attachShader( program, glVertexShader );\n\t\tgl.attachShader( program, glFragmentShader );\n\n\t\t// Force a particular attribute to index 0.\n\n\t\tif ( material.index0AttributeName !== undefined ) {\n\n\t\t\tgl.bindAttribLocation( program, 0, material.index0AttributeName );\n\n\t\t} else if ( parameters.morphTargets === true ) {\n\n\t\t\t// programs with morphTargets displace position out of attribute 0\n\t\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t\t}\n\n\t\tgl.linkProgram( program );\n\n\t\tvar programLog = gl.getProgramInfoLog( program );\n\t\tvar vertexLog = gl.getShaderInfoLog( glVertexShader );\n\t\tvar fragmentLog = gl.getShaderInfoLog( glFragmentShader );\n\n\t\tvar runnable = true;\n\t\tvar haveDiagnostics = true;\n\n\t\t// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );\n\t\t// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );\n\n\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\trunnable = false;\n\n\t\t\tconsole.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog );\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\t\t\t\tmaterial: material,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t// clean up\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\t// set up caching for uniform locations\n\n\t\tvar cachedUniforms;\n\n\t\tthis.getUniforms = function() {\n\n\t\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t\tcachedUniforms =\n\t\t\t\t\t\tnew WebGLUniforms( gl, program, renderer );\n\n\t\t\t}\n\n\t\t\treturn cachedUniforms;\n\n\t\t};\n\n\t\t// set up caching for attribute locations\n\n\t\tvar cachedAttributes;\n\n\t\tthis.getAttributes = function() {\n\n\t\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t\t}\n\n\t\t\treturn cachedAttributes;\n\n\t\t};\n\n\t\t// free resource\n\n\t\tthis.destroy = function() {\n\n\t\t\tgl.deleteProgram( program );\n\t\t\tthis.program = undefined;\n\n\t\t};\n\n\t\t// DEPRECATED\n\n\t\tObject.defineProperties( this, {\n\n\t\t\tuniforms: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );\n\t\t\t\t\treturn this.getUniforms();\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tattributes: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );\n\t\t\t\t\treturn this.getAttributes();\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t} );\n\n\n\t\t//\n\n\t\tthis.id = programIdCount ++;\n\t\tthis.code = code;\n\t\tthis.usedTimes = 1;\n\t\tthis.program = program;\n\t\tthis.vertexShader = glVertexShader;\n\t\tthis.fragmentShader = glFragmentShader;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLPrograms( renderer, capabilities ) {\n\n\t\tvar programs = [];\n\n\t\tvar shaderIDs = {\n\t\t\tMeshDepthMaterial: 'depth',\n\t\t\tMeshNormalMaterial: 'normal',\n\t\t\tMeshBasicMaterial: 'basic',\n\t\t\tMeshLambertMaterial: 'lambert',\n\t\t\tMeshPhongMaterial: 'phong',\n\t\t\tMeshStandardMaterial: 'physical',\n\t\t\tMeshPhysicalMaterial: 'physical',\n\t\t\tLineBasicMaterial: 'basic',\n\t\t\tLineDashedMaterial: 'dashed',\n\t\t\tPointsMaterial: 'points'\n\t\t};\n\n\t\tvar parameterNames = [\n\t\t\t\"precision\", \"supportsVertexTextures\", \"map\", \"mapEncoding\", \"envMap\", \"envMapMode\", \"envMapEncoding\",\n\t\t\t\"lightMap\", \"aoMap\", \"emissiveMap\", \"emissiveMapEncoding\", \"bumpMap\", \"normalMap\", \"displacementMap\", \"specularMap\",\n\t\t\t\"roughnessMap\", \"metalnessMap\",\n\t\t\t\"alphaMap\", \"combine\", \"vertexColors\", \"fog\", \"useFog\", \"fogExp\",\n\t\t\t\"flatShading\", \"sizeAttenuation\", \"logarithmicDepthBuffer\", \"skinning\",\n\t\t\t\"maxBones\", \"useVertexTexture\", \"morphTargets\", \"morphNormals\",\n\t\t\t\"maxMorphTargets\", \"maxMorphNormals\", \"premultipliedAlpha\",\n\t\t\t\"numDirLights\", \"numPointLights\", \"numSpotLights\", \"numHemiLights\",\n\t\t\t\"shadowMapEnabled\", \"shadowMapType\", \"toneMapping\", 'physicallyCorrectLights',\n\t\t\t\"alphaTest\", \"doubleSided\", \"flipSided\", \"numClippingPlanes\", \"numClipIntersection\", \"depthPacking\"\n\t\t];\n\n\n\t\tfunction allocateBones( object ) {\n\n\t\t\tif ( capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture ) {\n\n\t\t\t\treturn 1024;\n\n\t\t\t} else {\n\n\t\t\t\t// default for when object is not specified\n\t\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t\t//\n\t\t\t\t// - leave some extra space for other uniforms\n\t\t\t\t// - limit here is ANGLE's 254 max uniform vectors\n\t\t\t\t// (up to 54 should be safe)\n\n\t\t\t\tvar nVertexUniforms = capabilities.maxVertexUniforms;\n\t\t\t\tvar nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\t\tvar maxBones = nVertexMatrices;\n\n\t\t\t\tif ( object !== undefined && (object && object.isSkinnedMesh) ) {\n\n\t\t\t\t\tmaxBones = Math.min( object.skeleton.bones.length, maxBones );\n\n\t\t\t\t\tif ( maxBones < object.skeleton.bones.length ) {\n\n\t\t\t\t\t\tconsole.warn( 'WebGLRenderer: too many bones - ' + object.skeleton.bones.length + ', this GPU supports just ' + maxBones + ' (try OpenGL instead of ANGLE)' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn maxBones;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getTextureEncodingFromMap( map, gammaOverrideLinear ) {\n\n\t\t\tvar encoding;\n\n\t\t\tif ( ! map ) {\n\n\t\t\t\tencoding = LinearEncoding;\n\n\t\t\t} else if ( (map && map.isTexture) ) {\n\n\t\t\t\tencoding = map.encoding;\n\n\t\t\t} else if ( (map && map.isWebGLRenderTarget) ) {\n\n\t\t\t\tconsole.warn( \"THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\tencoding = map.texture.encoding;\n\n\t\t\t}\n\n\t\t\t// add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.\n\t\t\tif ( encoding === LinearEncoding && gammaOverrideLinear ) {\n\n\t\t\t\tencoding = GammaEncoding;\n\n\t\t\t}\n\n\t\t\treturn encoding;\n\n\t\t}\n\n\t\tthis.getParameters = function ( material, lights, fog, nClipPlanes, nClipIntersection, object ) {\n\n\t\t\tvar shaderID = shaderIDs[ material.type ];\n\n\t\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t\t// (not to blow over maxLights budget)\n\n\t\t\tvar maxBones = allocateBones( object );\n\t\t\tvar precision = renderer.getPrecision();\n\n\t\t\tif ( material.precision !== null ) {\n\n\t\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar currentRenderTarget = renderer.getCurrentRenderTarget();\n\n\t\t\tvar parameters = {\n\n\t\t\t\tshaderID: shaderID,\n\n\t\t\t\tprecision: precision,\n\t\t\t\tsupportsVertexTextures: capabilities.vertexTextures,\n\t\t\t\toutputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ),\n\t\t\t\tmap: !! material.map,\n\t\t\t\tmapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),\n\t\t\t\tenvMap: !! material.envMap,\n\t\t\t\tenvMapMode: material.envMap && material.envMap.mapping,\n\t\t\t\tenvMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),\n\t\t\t\tenvMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\t\tlightMap: !! material.lightMap,\n\t\t\t\taoMap: !! material.aoMap,\n\t\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\t\temissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),\n\t\t\t\tbumpMap: !! material.bumpMap,\n\t\t\t\tnormalMap: !! material.normalMap,\n\t\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\t\tspecularMap: !! material.specularMap,\n\t\t\t\talphaMap: !! material.alphaMap,\n\n\t\t\t\tcombine: material.combine,\n\n\t\t\t\tvertexColors: material.vertexColors,\n\n\t\t\t\tfog: !! fog,\n\t\t\t\tuseFog: material.fog,\n\t\t\t\tfogExp: (fog && fog.isFogExp2),\n\n\t\t\t\tflatShading: material.shading === FlatShading,\n\n\t\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\t\tlogarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,\n\n\t\t\t\tskinning: material.skinning,\n\t\t\t\tmaxBones: maxBones,\n\t\t\t\tuseVertexTexture: capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture,\n\n\t\t\t\tmorphTargets: material.morphTargets,\n\t\t\t\tmorphNormals: material.morphNormals,\n\t\t\t\tmaxMorphTargets: renderer.maxMorphTargets,\n\t\t\t\tmaxMorphNormals: renderer.maxMorphNormals,\n\n\t\t\t\tnumDirLights: lights.directional.length,\n\t\t\t\tnumPointLights: lights.point.length,\n\t\t\t\tnumSpotLights: lights.spot.length,\n\t\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\t\tnumClippingPlanes: nClipPlanes,\n\t\t\t\tnumClipIntersection: nClipIntersection,\n\n\t\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0,\n\t\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\t\ttoneMapping: renderer.toneMapping,\n\t\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\t\talphaTest: material.alphaTest,\n\t\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\t\tflipSided: material.side === BackSide,\n\n\t\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false\n\n\t\t\t};\n\n\t\t\treturn parameters;\n\n\t\t};\n\n\t\tthis.getProgramCode = function ( material, parameters ) {\n\n\t\t\tvar array = [];\n\n\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\tarray.push( parameters.shaderID );\n\n\t\t\t} else {\n\n\t\t\t\tarray.push( material.fragmentShader );\n\t\t\t\tarray.push( material.vertexShader );\n\n\t\t\t}\n\n\t\t\tif ( material.defines !== undefined ) {\n\n\t\t\t\tfor ( var name in material.defines ) {\n\n\t\t\t\t\tarray.push( name );\n\t\t\t\t\tarray.push( material.defines[ name ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < parameterNames.length; i ++ ) {\n\n\t\t\t\tarray.push( parameters[ parameterNames[ i ] ] );\n\n\t\t\t}\n\n\t\t\treturn array.join();\n\n\t\t};\n\n\t\tthis.acquireProgram = function ( material, parameters, code ) {\n\n\t\t\tvar program;\n\n\t\t\t// Check if code has been already compiled\n\t\t\tfor ( var p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\t\tvar programInfo = programs[ p ];\n\n\t\t\t\tif ( programInfo.code === code ) {\n\n\t\t\t\t\tprogram = programInfo;\n\t\t\t\t\t++ program.usedTimes;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tprogram = new WebGLProgram( renderer, code, material, parameters );\n\t\t\t\tprograms.push( program );\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t};\n\n\t\tthis.releaseProgram = function( program ) {\n\n\t\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t\t// Remove from unordered set\n\t\t\t\tvar i = programs.indexOf( program );\n\t\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\t\tprograms.pop();\n\n\t\t\t\t// Free WebGL resources\n\t\t\t\tprogram.destroy();\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tthis.programs = programs;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLGeometries( gl, properties, info ) {\n\n\t\tvar geometries = {};\n\n\t\tfunction onGeometryDispose( event ) {\n\n\t\t\tvar geometry = event.target;\n\t\t\tvar buffergeometry = geometries[ geometry.id ];\n\n\t\t\tif ( buffergeometry.index !== null ) {\n\n\t\t\t\tdeleteAttribute( buffergeometry.index );\n\n\t\t\t}\n\n\t\t\tdeleteAttributes( buffergeometry.attributes );\n\n\t\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\t\tdelete geometries[ geometry.id ];\n\n\t\t\t// TODO\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe ) {\n\n\t\t\t\tdeleteAttribute( property.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( geometry );\n\n\t\t\tvar bufferproperty = properties.get( buffergeometry );\n\n\t\t\tif ( bufferproperty.wireframe ) {\n\n\t\t\t\tdeleteAttribute( bufferproperty.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( buffergeometry );\n\n\t\t\t//\n\n\t\t\tinfo.memory.geometries --;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction deleteAttribute( attribute ) {\n\n\t\t\tvar buffer = getAttributeBuffer( attribute );\n\n\t\t\tif ( buffer !== undefined ) {\n\n\t\t\t\tgl.deleteBuffer( buffer );\n\t\t\t\tremoveAttributeBuffer( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction deleteAttributes( attributes ) {\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tdeleteAttribute( attributes[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction removeAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tproperties.delete( attribute.data );\n\n\t\t\t} else {\n\n\t\t\t\tproperties.delete( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometries[ geometry.id ] !== undefined ) {\n\n\t\t\t\t\treturn geometries[ geometry.id ];\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\t\t\tvar buffergeometry;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tbuffergeometry = geometry;\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tif ( geometry._bufferGeometry === undefined ) {\n\n\t\t\t\t\t\tgeometry._bufferGeometry = new BufferGeometry().setFromObject( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbuffergeometry = geometry._bufferGeometry;\n\n\t\t\t\t}\n\n\t\t\t\tgeometries[ geometry.id ] = buffergeometry;\n\n\t\t\t\tinfo.memory.geometries ++;\n\n\t\t\t\treturn buffergeometry;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLObjects( gl, properties, info ) {\n\n\t\tvar geometries = new WebGLGeometries( gl, properties, info );\n\n\t\t//\n\n\t\tfunction update( object ) {\n\n\t\t\t// TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter.\n\n\t\t\tvar geometry = geometries.get( object );\n\n\t\t\tif ( object.geometry.isGeometry ) {\n\n\t\t\t\tgeometry.updateFromObject( object );\n\n\t\t\t}\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tupdateAttribute( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tupdateAttribute( attributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\tfor ( var name in morphAttributes ) {\n\n\t\t\t\tvar array = morphAttributes[ name ];\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\t\tupdateAttribute( array[ i ], gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction updateAttribute( attribute, bufferType ) {\n\n\t\t\tvar data = ( attribute.isInterleavedBufferAttribute ) ? attribute.data : attribute;\n\n\t\t\tvar attributeProperties = properties.get( data );\n\n\t\t\tif ( attributeProperties.__webglBuffer === undefined ) {\n\n\t\t\t\tcreateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t} else if ( attributeProperties.version !== data.version ) {\n\n\t\t\t\tupdateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tattributeProperties.__webglBuffer = gl.createBuffer();\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tvar usage = data.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;\n\n\t\t\tgl.bufferData( bufferType, data.array, usage );\n\n\t\t\tattributeProperties.version = data.version;\n\n\t\t}\n\n\t\tfunction updateBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tif ( data.dynamic === false ) {\n\n\t\t\t\tgl.bufferData( bufferType, data.array, gl.STATIC_DRAW );\n\n\t\t\t} else if ( data.updateRange.count === - 1 ) {\n\n\t\t\t\t// Not using update ranges\n\n\t\t\t\tgl.bufferSubData( bufferType, 0, data.array );\n\n\t\t\t} else if ( data.updateRange.count === 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, data.updateRange.offset * data.array.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t data.array.subarray( data.updateRange.offset, data.updateRange.offset + data.updateRange.count ) );\n\n\t\t\t\tdata.updateRange.count = 0; // reset range\n\n\t\t\t}\n\n\t\t\tattributeProperties.version = data.version;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction getWireframeAttribute( geometry ) {\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe !== undefined ) {\n\n\t\t\t\treturn property.wireframe;\n\n\t\t\t}\n\n\t\t\tvar indices = [];\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\t\t\tvar position = attributes.position;\n\n\t\t\t// console.time( 'wireframe' );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar edges = {};\n\t\t\t\tvar array = index.array;\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = array[ i + 0 ];\n\t\t\t\t\tvar b = array[ i + 1 ];\n\t\t\t\t\tvar c = array[ i + 2 ];\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar array = attributes.position.array;\n\n\t\t\t\tfor ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = i + 0;\n\t\t\t\t\tvar b = i + 1;\n\t\t\t\t\tvar c = i + 2;\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// console.timeEnd( 'wireframe' );\n\n\t\t\tvar TypeArray = position.count > 65535 ? Uint32Array : Uint16Array;\n\t\t\tvar attribute = new BufferAttribute( new TypeArray( indices ), 1 );\n\n\t\t\tupdateAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\tproperty.wireframe = attribute;\n\n\t\t\treturn attribute;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tgetAttributeBuffer: getAttributeBuffer,\n\t\t\tgetWireframeAttribute: getWireframeAttribute,\n\n\t\t\tupdate: update\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, info ) {\n\n\t\tvar _infoMemory = info.memory;\n\t\tvar _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext );\n\n\t\t//\n\n\t\tfunction clampToMaxSize( image, maxSize ) {\n\n\t\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\t\t// Warning: Scaling through the canvas will only work with images that use\n\t\t\t\t// premultiplied alpha.\n\n\t\t\t\tvar scale = maxSize / Math.max( image.width, image.height );\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = Math.floor( image.width * scale );\n\t\t\t\tcanvas.height = Math.floor( image.height * scale );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction isPowerOfTwo( image ) {\n\n\t\t\treturn _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height );\n\n\t\t}\n\n\t\tfunction makePowerOfTwo( image ) {\n\n\t\t\tif ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) {\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = _Math.nearestPowerOfTwo( image.width );\n\t\t\t\tcanvas.height = _Math.nearestPowerOfTwo( image.height );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) return true;\n\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) return true;\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// Fallback filters for non-power-of-2 textures\n\n\t\tfunction filterFallback( f ) {\n\n\t\t\tif ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) {\n\n\t\t\t\treturn _gl.NEAREST;\n\n\t\t\t}\n\n\t\t\treturn _gl.LINEAR;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction onTextureDispose( event ) {\n\n\t\t\tvar texture = event.target;\n\n\t\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\t\tdeallocateTexture( texture );\n\n\t\t\t_infoMemory.textures --;\n\n\n\t\t}\n\n\t\tfunction onRenderTargetDispose( event ) {\n\n\t\t\tvar renderTarget = event.target;\n\n\t\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\tdeallocateRenderTarget( renderTarget );\n\n\t\t\t_infoMemory.textures --;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction deallocateTexture( texture ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image && textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__image__webglTextureCube );\n\n\t\t\t} else {\n\n\t\t\t\t// 2D texture\n\n\t\t\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\t// remove all webgl properties\n\t\t\tproperties.delete( texture );\n\n\t\t}\n\n\t\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\tif ( ! renderTarget ) return;\n\n\t\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\t}\n\n\t\t\tif ( (renderTarget && renderTarget.isWebGLRenderTargetCube) ) {\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\n\t\t\t}\n\n\t\t\tproperties.delete( renderTarget.texture );\n\t\t\tproperties.delete( renderTarget );\n\n\t\t}\n\n\t\t//\n\n\n\n\t\tfunction setTexture2D( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\tvar image = texture.image;\n\n\t\t\t\tif ( image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture );\n\n\t\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureCube( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image.length === 6 ) {\n\n\t\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\t\tif ( ! textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\ttextureProperties.__image__webglTextureCube = _gl.createTexture();\n\n\t\t\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\n\t\t\t\t\tvar isCompressed = (texture && texture.isCompressedTexture);\n\t\t\t\t\tvar isDataTexture = (texture.image[ 0 ] && texture.image[ 0 ].isDataTexture);\n\n\t\t\t\t\tvar cubeImage = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar image = cubeImage[ 0 ],\n\t\t\t\t\tisPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage );\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed ) {\n\n\t\t\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar mipmap, mipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\t\t\tfor ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\t\tmipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()\" );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\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\tif ( texture.generateMipmaps && isPowerOfTwoImage ) {\n\n\t\t\t\t\t\t_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setTextureCubeDynamic( texture, slot ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureParameters( textureType, texture, isPowerOfTwoImage ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( isPowerOfTwoImage ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) );\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\n\n\t\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );\n\n\t\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\textension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension ) {\n\n\t\t\t\tif ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;\n\t\t\t\tif ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return;\n\n\t\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\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\n\t\t\tvar image = clampToMaxSize( texture.image, capabilities.maxTextureSize );\n\n\t\t\tif ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) {\n\n\t\t\t\timage = makePowerOfTwo( image );\n\n\t\t\t}\n\n\t\t\tvar isPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage );\n\n\t\t\tvar mipmap, mipmaps = texture.mipmaps;\n\n\t\t\tif ( (texture && texture.isDepthTexture) ) {\n\n\t\t\t\t// populate depth texture with dummy data\n\n\t\t\t\tvar internalFormat = _gl.DEPTH_COMPONENT;\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tif ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0');\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t} else if ( _isWebGL2 ) {\n\n\t\t\t\t\t// WebGL 2.0 requires signed internalformat for glTexImage2D\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t\t}\n\n\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.format === DepthStencilFormat ) {\n\n\t\t\t\t\tinternalFormat = _gl.DEPTH_STENCIL;\n\n\t\t\t\t}\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t} else if ( (texture && 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 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( (texture && texture.isCompressedTexture) ) {\n\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\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}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\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 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );\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\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\n\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\t// Render targets\n\n\t\t// Setup storage for target texture and bind it to correct framebuffer\n\t\tfunction setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {\n\n\t\t\tvar glFormat = paramThreeToGL( renderTarget.texture.format );\n\t\t\tvar glType = paramThreeToGL( renderTarget.texture.type );\n\t\t\tstate.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\t\tfunction setupRenderBufferStorage( renderbuffer, renderTarget ) {\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else {\n\n\t\t\t\t// FIXME: We don't support !depth !stencil\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t}\n\n\t\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\t\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\t\tvar isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) );\n\t\t\tif ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!');\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( !( (renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture) ) ) {\n\n\t\t\t\tthrow new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture');\n\n\t\t\t}\n\n\t\t\t// upload an empty depth texture with framebuffer size\n\t\t\tif ( !properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\t\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\t\t\t}\n\n\t\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\t\tvar webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\n\t\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error('Unknown depthTexture format')\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup GL resources for a non-texture depth buffer\n\t\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\tvar isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) );\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\tif ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets');\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Set up GL resources for the render target\n\t\tfunction setupRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t_infoMemory.textures ++;\n\n\t\t\tvar isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) );\n\t\t\tvar isTargetPowerOfTwo = isPowerOfTwo( renderTarget );\n\n\t\t\t// Setup framebuffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _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\t// Setup color buffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, null );\n\n\t\t\t}\n\n\t\t\t// Setup depth and stencil buffers\n\n\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\t\tvar texture = renderTarget.texture;\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) &&\n\t\t\t\t\ttexture.minFilter !== NearestFilter &&\n\t\t\t\t\ttexture.minFilter !== LinearFilter ) {\n\n\t\t\t\tvar target = (renderTarget && renderTarget.isWebGLRenderTargetCube) ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\t\t\t\tvar webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\t_gl.generateMipmap( target );\n\t\t\t\tstate.bindTexture( target, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setTexture2D = setTexture2D;\n\t\tthis.setTextureCube = setTextureCube;\n\t\tthis.setTextureCubeDynamic = setTextureCubeDynamic;\n\t\tthis.setupRenderTarget = setupRenderTarget;\n\t\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\n\t}\n\n\t/**\n\t * @author fordacious / fordacious.github.io\n\t */\n\n\tfunction WebGLProperties() {\n\n\t\tvar properties = {};\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar uuid = object.uuid;\n\t\t\t\tvar map = properties[ uuid ];\n\n\t\t\t\tif ( map === undefined ) {\n\n\t\t\t\t\tmap = {};\n\t\t\t\t\tproperties[ uuid ] = map;\n\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\n\t\t\t},\n\n\t\t\tdelete: function ( object ) {\n\n\t\t\t\tdelete properties[ object.uuid ];\n\n\t\t\t},\n\n\t\t\tclear: function () {\n\n\t\t\t\tproperties = {};\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLState( gl, extensions, paramThreeToGL ) {\n\n\t\tfunction ColorBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar color = new Vector4();\n\t\t\tvar currentColorMask = null;\n\t\t\tvar currentColorClear = new Vector4();\n\n\t\t\treturn {\n\n\t\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( r, g, b, a ) {\n\n\t\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentColorMask = null;\n\t\t\t\t\tcurrentColorClear.set( 0, 0, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction DepthBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentDepthMask = null;\n\t\t\tvar currentDepthFunc = null;\n\t\t\tvar currentDepthClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\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\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentDepthMask = null;\n\t\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction StencilBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentStencilMask = null;\n\t\t\tvar currentStencilFunc = null;\n\t\t\tvar currentStencilRef = null;\n\t\t\tvar currentStencilFuncMask = null;\n\t\t\tvar currentStencilFail = null;\n\t\t\tvar currentStencilZFail = null;\n\t\t\tvar currentStencilZPass = null;\n\t\t\tvar currentStencilClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( stencilTest ) {\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\tsetMask: function ( stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t\t currentStencilRef \t!== stencilRef \t||\n\t\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\t\tif ( currentStencilFail\t !== stencilFail \t||\n\t\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentStencilMask = null;\n\t\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\t\tcurrentStencilRef = null;\n\t\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\t\tcurrentStencilFail = null;\n\t\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t//\n\n\t\tvar colorBuffer = new ColorBuffer();\n\t\tvar depthBuffer = new DepthBuffer();\n\t\tvar stencilBuffer = new StencilBuffer();\n\n\t\tvar maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar newAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar enabledAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar attributeDivisors = new Uint8Array( maxVertexAttributes );\n\n\t\tvar capabilities = {};\n\n\t\tvar compressedTextureFormats = null;\n\n\t\tvar currentBlending = null;\n\t\tvar currentBlendEquation = null;\n\t\tvar currentBlendSrc = null;\n\t\tvar currentBlendDst = null;\n\t\tvar currentBlendEquationAlpha = null;\n\t\tvar currentBlendSrcAlpha = null;\n\t\tvar currentBlendDstAlpha = null;\n\t\tvar currentPremultipledAlpha = false;\n\n\t\tvar currentFlipSided = null;\n\t\tvar currentCullFace = null;\n\n\t\tvar currentLineWidth = null;\n\n\t\tvar currentPolygonOffsetFactor = null;\n\t\tvar currentPolygonOffsetUnits = null;\n\n\t\tvar currentScissorTest = null;\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\n\t\tvar currentTextureSlot = null;\n\t\tvar currentBoundTextures = {};\n\n\t\tvar currentScissor = new Vector4();\n\t\tvar currentViewport = new Vector4();\n\n\t\tfunction createTexture( type, target, count ) {\n\n\t\t\tvar data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\t\tvar texture = gl.createTexture();\n\n\t\t\tgl.bindTexture( type, texture );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\t\tfor ( var i = 0; i < count; i ++ ) {\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\treturn texture;\n\n\t\t}\n\n\t\tvar emptyTextures = {};\n\t\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\t\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\n\t\t//\n\n\t\tfunction init() {\n\n\t\t\tclearColor( 0, 0, 0, 1 );\n\t\t\tclearDepth( 1 );\n\t\t\tclearStencil( 0 );\n\n\t\t\tenable( gl.DEPTH_TEST );\n\t\t\tsetDepthFunc( LessEqualDepth );\n\n\t\t\tsetFlipSided( false );\n\t\t\tsetCullFace( CullFaceBack );\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tenable( gl.BLEND );\n\t\t\tsetBlending( NormalBlending );\n\n\t\t}\n\n\t\tfunction initAttributes() {\n\n\t\t\tfor ( var i = 0, l = newAttributes.length; i < l; i ++ ) {\n\n\t\t\t\tnewAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttribute( attribute ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== 0 ) {\n\n\t\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, 0 );\n\t\t\t\tattributeDivisors[ attribute ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute, extension ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, meshPerAttribute );\n\t\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disableUnusedAttributes() {\n\n\t\t\tfor ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== true ) {\n\n\t\t\t\tgl.enable( id );\n\t\t\t\tcapabilities[ id ] = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== false ) {\n\n\t\t\t\tgl.disable( id );\n\t\t\t\tcapabilities[ id ] = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getCompressedTextureFormats() {\n\n\t\t\tif ( compressedTextureFormats === null ) {\n\n\t\t\t\tcompressedTextureFormats = [];\n\n\t\t\t\tif ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_s3tc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_etc1' ) ) {\n\n\t\t\t\t\tvar formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS );\n\n\t\t\t\t\tfor ( var i = 0; i < formats.length; i ++ ) {\n\n\t\t\t\t\t\tcompressedTextureFormats.push( formats[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn compressedTextureFormats;\n\n\t\t}\n\n\t\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\t\tif ( blending !== NoBlending ) {\n\n\t\t\t\tenable( gl.BLEND );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.BLEND );\n\n\t\t\t}\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( blending === AdditiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === SubtractiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === MultiplyBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\tif ( blending === CustomBlending ) {\n\n\t\t\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\t\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\t\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\t\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\t\t\tgl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) );\n\n\t\t\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t\t\t}\n\n\t\t\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\t\t\tgl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) );\n\n\t\t\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\t\t\tcurrentBlendDst = blendDst;\n\t\t\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tcurrentBlendEquation = null;\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendEquationAlpha = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Deprecate\n\n\t\tfunction setColorWrite( colorWrite ) {\n\n\t\t\tcolorBuffer.setMask( colorWrite );\n\n\t\t}\n\n\t\tfunction setDepthTest( depthTest ) {\n\n\t\t\tdepthBuffer.setTest( depthTest );\n\n\t\t}\n\n\t\tfunction setDepthWrite( depthWrite ) {\n\n\t\t\tdepthBuffer.setMask( depthWrite );\n\n\t\t}\n\n\t\tfunction setDepthFunc( depthFunc ) {\n\n\t\t\tdepthBuffer.setFunc( depthFunc );\n\n\t\t}\n\n\t\tfunction setStencilTest( stencilTest ) {\n\n\t\t\tstencilBuffer.setTest( stencilTest );\n\n\t\t}\n\n\t\tfunction setStencilWrite( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( stencilWrite );\n\n\t\t}\n\n\t\tfunction setStencilFunc( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\tstencilBuffer.setFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t}\n\n\t\tfunction setStencilOp( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\tstencilBuffer.setOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction setFlipSided( flipSided ) {\n\n\t\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\t\tif ( flipSided ) {\n\n\t\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t\t}\n\n\t\t\t\tcurrentFlipSided = flipSided;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setCullFace( cullFace ) {\n\n\t\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\t\tenable( gl.CULL_FACE );\n\n\t\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.CULL_FACE );\n\n\t\t\t}\n\n\t\t\tcurrentCullFace = cullFace;\n\n\t\t}\n\n\t\tfunction setLineWidth( width ) {\n\n\t\t\tif ( width !== currentLineWidth ) {\n\n\t\t\t\tgl.lineWidth( width );\n\n\t\t\t\tcurrentLineWidth = width;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\t\tif ( polygonOffset ) {\n\n\t\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getScissorTest() {\n\n\t\t\treturn currentScissorTest;\n\n\t\t}\n\n\t\tfunction setScissorTest( scissorTest ) {\n\n\t\t\tcurrentScissorTest = scissorTest;\n\n\t\t\tif ( scissorTest ) {\n\n\t\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// texture\n\n\t\tfunction activeTexture( webglSlot ) {\n\n\t\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\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}\n\n\t\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\tactiveTexture();\n\n\t\t\t}\n\n\t\t\tvar boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\t\tif ( boundTexture === undefined ) {\n\n\t\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t\t}\n\n\t\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\t\tboundTexture.type = webglType;\n\t\t\t\tboundTexture.texture = webglTexture;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction compressedTexImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction texImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Deprecate\n\n\t\tfunction clearColor( r, g, b, a ) {\n\n\t\t\tcolorBuffer.setClear( r, g, b, a );\n\n\t\t}\n\n\t\tfunction clearDepth( depth ) {\n\n\t\t\tdepthBuffer.setClear( depth );\n\n\t\t}\n\n\t\tfunction clearStencil( stencil ) {\n\n\t\t\tstencilBuffer.setClear( stencil );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction scissor( scissor ) {\n\n\t\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\t\tcurrentScissor.copy( scissor );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction viewport( viewport ) {\n\n\t\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\t\tcurrentViewport.copy( viewport );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction reset() {\n\n\t\t\tfor ( var i = 0; i < enabledAttributes.length; i ++ ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] === 1 ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcapabilities = {};\n\n\t\t\tcompressedTextureFormats = null;\n\n\t\t\tcurrentTextureSlot = null;\n\t\t\tcurrentBoundTextures = {};\n\n\t\t\tcurrentBlending = null;\n\n\t\t\tcurrentFlipSided = null;\n\t\t\tcurrentCullFace = null;\n\n\t\t\tcolorBuffer.reset();\n\t\t\tdepthBuffer.reset();\n\t\t\tstencilBuffer.reset();\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tbuffers: {\n\t\t\t\tcolor: colorBuffer,\n\t\t\t\tdepth: depthBuffer,\n\t\t\t\tstencil: stencilBuffer\n\t\t\t},\n\n\t\t\tinit: init,\n\t\t\tinitAttributes: initAttributes,\n\t\t\tenableAttribute: enableAttribute,\n\t\t\tenableAttributeAndDivisor: enableAttributeAndDivisor,\n\t\t\tdisableUnusedAttributes: disableUnusedAttributes,\n\t\t\tenable: enable,\n\t\t\tdisable: disable,\n\t\t\tgetCompressedTextureFormats: getCompressedTextureFormats,\n\n\t\t\tsetBlending: setBlending,\n\n\t\t\tsetColorWrite: setColorWrite,\n\t\t\tsetDepthTest: setDepthTest,\n\t\t\tsetDepthWrite: setDepthWrite,\n\t\t\tsetDepthFunc: setDepthFunc,\n\t\t\tsetStencilTest: setStencilTest,\n\t\t\tsetStencilWrite: setStencilWrite,\n\t\t\tsetStencilFunc: setStencilFunc,\n\t\t\tsetStencilOp: setStencilOp,\n\n\t\t\tsetFlipSided: setFlipSided,\n\t\t\tsetCullFace: setCullFace,\n\n\t\t\tsetLineWidth: setLineWidth,\n\t\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\t\tgetScissorTest: getScissorTest,\n\t\t\tsetScissorTest: setScissorTest,\n\n\t\t\tactiveTexture: activeTexture,\n\t\t\tbindTexture: bindTexture,\n\t\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\t\ttexImage2D: texImage2D,\n\n\t\t\tclearColor: clearColor,\n\t\t\tclearDepth: clearDepth,\n\t\t\tclearStencil: clearStencil,\n\n\t\t\tscissor: scissor,\n\t\t\tviewport: viewport,\n\n\t\t\treset: reset\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\t\tvar maxAnisotropy;\n\n\t\tfunction getMaxAnisotropy() {\n\n\t\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\t\tvar extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t\t} else {\n\n\t\t\t\tmaxAnisotropy = 0;\n\n\t\t\t}\n\n\t\t\treturn maxAnisotropy;\n\n\t\t}\n\n\t\tfunction getMaxPrecision( precision ) {\n\n\t\t\tif ( precision === 'highp' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'highp';\n\n\t\t\t\t}\n\n\t\t\t\tprecision = 'mediump';\n\n\t\t\t}\n\n\t\t\tif ( precision === 'mediump' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'mediump';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn 'lowp';\n\n\t\t}\n\n\t\tvar precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\t\tvar maxPrecision = getMaxPrecision( precision );\n\n\t\tif ( maxPrecision !== precision ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\t\tprecision = maxPrecision;\n\n\t\t}\n\n\t\tvar logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' );\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\t\tvar maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\t\tvar maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\t\tvar maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\t\tvar maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\t\tvar vertexTextures = maxVertexTextures > 0;\n\t\tvar floatFragmentTextures = !! extensions.get( 'OES_texture_float' );\n\t\tvar floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\t\treturn {\n\n\t\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\t\tprecision: precision,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tmaxTextures: maxTextures,\n\t\t\tmaxVertexTextures: maxVertexTextures,\n\t\t\tmaxTextureSize: maxTextureSize,\n\t\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\t\tmaxAttributes: maxAttributes,\n\t\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\t\tmaxVaryings: maxVaryings,\n\t\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\t\tvertexTextures: vertexTextures,\n\t\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\t\tfloatVertexTextures: floatVertexTextures\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLExtensions( gl ) {\n\n\t\tvar extensions = {};\n\n\t\treturn {\n\n\t\t\tget: function ( name ) {\n\n\t\t\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\t\t\treturn extensions[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tvar extension;\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_etc1':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_etc1' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\textension = gl.getExtension( name );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t\t}\n\n\t\t\t\textensions[ name ] = extension;\n\n\t\t\t\treturn extension;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction WebGLClipping() {\n\n\t\tvar scope = this,\n\n\t\t\tglobalState = null,\n\t\t\tnumGlobalPlanes = 0,\n\t\t\tlocalClippingEnabled = false,\n\t\t\trenderingShadows = false,\n\n\t\t\tplane = new Plane(),\n\t\t\tviewNormalMatrix = new Matrix3(),\n\n\t\t\tuniform = { value: null, needsUpdate: false };\n\n\t\tthis.uniform = uniform;\n\t\tthis.numPlanes = 0;\n\t\tthis.numIntersection = 0;\n\n\t\tthis.init = function( planes, enableLocalClipping, camera ) {\n\n\t\t\tvar enabled =\n\t\t\t\tplanes.length !== 0 ||\n\t\t\t\tenableLocalClipping ||\n\t\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t\t// run another frame in order to reset the state:\n\t\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\t\tlocalClippingEnabled;\n\n\t\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\t\tnumGlobalPlanes = planes.length;\n\n\t\t\treturn enabled;\n\n\t\t};\n\n\t\tthis.beginShadows = function() {\n\n\t\t\trenderingShadows = true;\n\t\t\tprojectPlanes( null );\n\n\t\t};\n\n\t\tthis.endShadows = function() {\n\n\t\t\trenderingShadows = false;\n\t\t\tresetGlobalState();\n\n\t\t};\n\n\t\tthis.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) {\n\n\t\t\tif ( ! localClippingEnabled ||\n\t\t\t\t\tplanes === null || planes.length === 0 ||\n\t\t\t\t\trenderingShadows && ! clipShadows ) {\n\t\t\t\t// there's no local clipping\n\n\t\t\t\tif ( renderingShadows ) {\n\t\t\t\t\t// there's no global clipping\n\n\t\t\t\t\tprojectPlanes( null );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tresetGlobalState();\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\t\tlGlobal = nGlobal * 4,\n\n\t\t\t\t\tdstArray = cache.clippingState || null;\n\n\t\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, fromCache );\n\n\t\t\t\tfor ( var i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcache.clippingState = dstArray;\n\t\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\t\tthis.numPlanes += nGlobal;\n\n\t\t\t}\n\n\n\t\t};\n\n\t\tfunction resetGlobalState() {\n\n\t\t\tif ( uniform.value !== globalState ) {\n\n\t\t\t\tuniform.value = globalState;\n\t\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = numGlobalPlanes;\n\t\t\tscope.numIntersection = 0;\n\n\t\t}\n\n\t\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\t\tvar nPlanes = planes !== null ? planes.length : 0,\n\t\t\t\tdstArray = null;\n\n\t\t\tif ( nPlanes !== 0 ) {\n\n\t\t\t\tdstArray = uniform.value;\n\n\t\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\t\tvar flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0, i4 = dstOffset;\n\t\t\t\t\t\t\t\t\t\ti !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\t\tplane.copy( planes[ i ] ).\n\t\t\t\t\t\t\t\tapplyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tuniform.value = dstArray;\n\t\t\t\tuniform.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = nPlanes;\n\t\t\t\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t * @author tschw\n\t */\n\n\tfunction WebGLRenderer( parameters ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer', REVISION );\n\n\t\tparameters = parameters || {};\n\n\t\tvar _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),\n\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;\n\n\t\tvar lights = [];\n\n\t\tvar opaqueObjects = [];\n\t\tvar opaqueObjectsLastIndex = - 1;\n\t\tvar transparentObjects = [];\n\t\tvar transparentObjectsLastIndex = - 1;\n\n\t\tvar morphInfluences = new Float32Array( 8 );\n\n\t\tvar sprites = [];\n\t\tvar lensFlares = [];\n\n\t\t// public properties\n\n\t\tthis.domElement = _canvas;\n\t\tthis.context = null;\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.gammaFactor = 2.0;\t// for backwards compatibility\n\t\tthis.gammaInput = false;\n\t\tthis.gammaOutput = false;\n\n\t\t// physical lights\n\n\t\tthis.physicallyCorrectLights = false;\n\n\t\t// tone mapping\n\n\t\tthis.toneMapping = LinearToneMapping;\n\t\tthis.toneMappingExposure = 1.0;\n\t\tthis.toneMappingWhitePoint = 1.0;\n\n\t\t// morphs\n\n\t\tthis.maxMorphTargets = 8;\n\t\tthis.maxMorphNormals = 4;\n\n\t\t// internal properties\n\n\t\tvar _this = this,\n\n\t\t// internal state cache\n\n\t\t_currentProgram = null,\n\t\t_currentRenderTarget = null,\n\t\t_currentFramebuffer = null,\n\t\t_currentMaterialId = - 1,\n\t\t_currentGeometryProgram = '',\n\t\t_currentCamera = null,\n\n\t\t_currentScissor = new Vector4(),\n\t\t_currentScissorTest = null,\n\n\t\t_currentViewport = new Vector4(),\n\n\t\t//\n\n\t\t_usedTextureUnits = 0,\n\n\t\t//\n\n\t\t_clearColor = new Color( 0x000000 ),\n\t\t_clearAlpha = 0,\n\n\t\t_width = _canvas.width,\n\t\t_height = _canvas.height,\n\n\t\t_pixelRatio = 1,\n\n\t\t_scissor = new Vector4( 0, 0, _width, _height ),\n\t\t_scissorTest = false,\n\n\t\t_viewport = new Vector4( 0, 0, _width, _height ),\n\n\t\t// frustum\n\n\t\t_frustum = new Frustum(),\n\n\t\t// clipping\n\n\t\t_clipping = new WebGLClipping(),\n\t\t_clippingEnabled = false,\n\t\t_localClippingEnabled = false,\n\n\t\t_sphere = new Sphere(),\n\n\t\t// camera matrices cache\n\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_vector3 = new Vector3(),\n\n\t\t// light arrays cache\n\n\t\t_lights = {\n\n\t\t\thash: '',\n\n\t\t\tambient: [ 0, 0, 0 ],\n\t\t\tdirectional: [],\n\t\t\tdirectionalShadowMap: [],\n\t\t\tdirectionalShadowMatrix: [],\n\t\t\tspot: [],\n\t\t\tspotShadowMap: [],\n\t\t\tspotShadowMatrix: [],\n\t\t\tpoint: [],\n\t\t\tpointShadowMap: [],\n\t\t\tpointShadowMatrix: [],\n\t\t\themi: [],\n\n\t\t\tshadows: []\n\n\t\t},\n\n\t\t// info\n\n\t\t_infoRender = {\n\n\t\t\tcalls: 0,\n\t\t\tvertices: 0,\n\t\t\tfaces: 0,\n\t\t\tpoints: 0\n\n\t\t};\n\n\t\tthis.info = {\n\n\t\t\trender: _infoRender,\n\t\t\tmemory: {\n\n\t\t\t\tgeometries: 0,\n\t\t\t\ttextures: 0\n\n\t\t\t},\n\t\t\tprograms: null\n\n\t\t};\n\n\n\t\t// initialize\n\n\t\tvar _gl;\n\n\t\ttry {\n\n\t\t\tvar attributes = {\n\t\t\t\talpha: _alpha,\n\t\t\t\tdepth: _depth,\n\t\t\t\tstencil: _stencil,\n\t\t\t\tantialias: _antialias,\n\t\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer\n\t\t\t};\n\n\t\t\t_gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( _canvas.getContext( 'webgl' ) !== null ) {\n\n\t\t\t\t\tthrow 'Error creating WebGL context with your selected attributes.';\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow 'Error creating WebGL context.';\n\n\t\t\t\t}\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\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: ' + error );\n\n\t\t}\n\n\t\tvar extensions = new WebGLExtensions( _gl );\n\n\t\textensions.get( 'WEBGL_depth_texture' );\n\t\textensions.get( 'OES_texture_float' );\n\t\textensions.get( 'OES_texture_float_linear' );\n\t\textensions.get( 'OES_texture_half_float' );\n\t\textensions.get( 'OES_texture_half_float_linear' );\n\t\textensions.get( 'OES_standard_derivatives' );\n\t\textensions.get( 'ANGLE_instanced_arrays' );\n\n\t\tif ( extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\tBufferGeometry.MaxIndex = 4294967296;\n\n\t\t}\n\n\t\tvar capabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\tvar state = new WebGLState( _gl, extensions, paramThreeToGL );\n\t\tvar properties = new WebGLProperties();\n\t\tvar textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, this.info );\n\t\tvar objects = new WebGLObjects( _gl, properties, this.info );\n\t\tvar programCache = new WebGLPrograms( this, capabilities );\n\t\tvar lightCache = new WebGLLights();\n\n\t\tthis.info.programs = programCache.programs;\n\n\t\tvar bufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender );\n\t\tvar indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );\n\n\t\t//\n\n\t\tvar backgroundCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\t\tvar backgroundCamera2 = new PerspectiveCamera();\n\t\tvar backgroundPlaneMesh = new Mesh(\n\t\t\tnew PlaneBufferGeometry( 2, 2 ),\n\t\t\tnew MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } )\n\t\t);\n\t\tvar backgroundBoxShader = ShaderLib[ 'cube' ];\n\t\tvar backgroundBoxMesh = new Mesh(\n\t\t\tnew BoxBufferGeometry( 5, 5, 5 ),\n\t\t\tnew ShaderMaterial( {\n\t\t\t\tuniforms: backgroundBoxShader.uniforms,\n\t\t\t\tvertexShader: backgroundBoxShader.vertexShader,\n\t\t\t\tfragmentShader: backgroundBoxShader.fragmentShader,\n\t\t\t\tside: BackSide,\n\t\t\t\tdepthTest: false,\n\t\t\t\tdepthWrite: false,\n\t\t\t\tfog: false\n\t\t\t} )\n\t\t);\n\n\t\t//\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\tfunction glClearColor( r, g, b, a ) {\n\n\t\t\tif ( _premultipliedAlpha === true ) {\n\n\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t}\n\n\t\t\tstate.clearColor( r, g, b, a );\n\n\t\t}\n\n\t\tfunction setDefaultGLState() {\n\n\t\t\tstate.init();\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );\n\n\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t}\n\n\t\tfunction resetGLState() {\n\n\t\t\t_currentProgram = null;\n\t\t\t_currentCamera = null;\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\n\t\t\tstate.reset();\n\n\t\t}\n\n\t\tsetDefaultGLState();\n\n\t\tthis.context = _gl;\n\t\tthis.capabilities = capabilities;\n\t\tthis.extensions = extensions;\n\t\tthis.properties = properties;\n\t\tthis.state = state;\n\n\t\t// shadow map\n\n\t\tvar shadowMap = new WebGLShadowMap( this, _lights, objects, capabilities );\n\n\t\tthis.shadowMap = shadowMap;\n\n\n\t\t// Plugins\n\n\t\tvar spritePlugin = new SpritePlugin( this, sprites );\n\t\tvar lensFlarePlugin = new LensFlarePlugin( this, lensFlares );\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\textensions.get( 'WEBGL_lose_context' ).loseContext();\n\n\t\t};\n\n\t\tthis.getMaxAnisotropy = function () {\n\n\t\t\treturn capabilities.getMaxAnisotropy();\n\n\t\t};\n\n\t\tthis.getPrecision = function () {\n\n\t\t\treturn capabilities.precision;\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( _viewport.z, _viewport.w, false );\n\n\t\t};\n\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_canvas.width = width * _pixelRatio;\n\t\t\t_canvas.height = height * _pixelRatio;\n\n\t\t\tif ( updateStyle !== false ) {\n\n\t\t\t\t_canvas.style.width = width + 'px';\n\t\t\t\t_canvas.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.setViewport = function ( x, y, width, height ) {\n\n\t\t\tstate.viewport( _viewport.set( x, y, width, height ) );\n\n\t\t};\n\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tstate.scissor( _scissor.set( x, y, width, height ) );\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\t// Clearing\n\n\t\tthis.getClearColor = function () {\n\n\t\t\treturn _clearColor;\n\n\t\t};\n\n\t\tthis.setClearColor = function ( color, alpha ) {\n\n\t\t\t_clearColor.set( color );\n\n\t\t\t_clearAlpha = alpha !== undefined ? alpha : 1;\n\n\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t};\n\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn _clearAlpha;\n\n\t\t};\n\n\t\tthis.setClearAlpha = function ( alpha ) {\n\n\t\t\t_clearAlpha = alpha;\n\n\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t};\n\n\t\tthis.clear = function ( color, depth, stencil ) {\n\n\t\t\tvar bits = 0;\n\n\t\t\tif ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;\n\t\t\tif ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\t\tif ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;\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\tthis.clearTarget = function ( renderTarget, color, depth, stencil ) {\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\t\t\tthis.clear( color, depth, stencil );\n\n\t\t};\n\n\t\t// Reset\n\n\t\tthis.resetGLState = resetGLState;\n\n\t\tthis.dispose = function() {\n\n\t\t\ttransparentObjects = [];\n\t\t\ttransparentObjectsLastIndex = -1;\n\t\t\topaqueObjects = [];\n\t\t\topaqueObjectsLastIndex = -1;\n\n\t\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\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\tresetGLState();\n\t\t\tsetDefaultGLState();\n\n\t\t\tproperties.clear();\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tvar 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\treleaseMaterialProgramReference( material );\n\n\t\t\tproperties.delete( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReference( material ) {\n\n\t\t\tvar programInfo = properties.get( material ).program;\n\n\t\t\tmaterial.program = undefined;\n\n\t\t\tif ( programInfo !== undefined ) {\n\n\t\t\t\tprogramCache.releaseProgram( programInfo );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferImmediate = function ( object, program, material ) {\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar buffers = properties.get( object );\n\n\t\t\tif ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();\n\t\t\tif ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();\n\t\t\tif ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();\n\t\t\tif ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( object.hasPositions ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.position );\n\t\t\t\t_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasNormals ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal );\n\n\t\t\t\tif ( ! material.isMeshPhongMaterial &&\n\t\t\t\t ! material.isMeshStandardMaterial &&\n\t\t\t\t material.shading === FlatShading ) {\n\n\t\t\t\t\tfor ( var i = 0, l = object.count * 3; i < l; i += 9 ) {\n\n\t\t\t\t\t\tvar array = object.normalArray;\n\n\t\t\t\t\t\tvar nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3;\n\t\t\t\t\t\tvar ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3;\n\t\t\t\t\t\tvar nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3;\n\n\t\t\t\t\t\tarray[ i + 0 ] = nx;\n\t\t\t\t\t\tarray[ i + 1 ] = ny;\n\t\t\t\t\t\tarray[ i + 2 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 3 ] = nx;\n\t\t\t\t\t\tarray[ i + 4 ] = ny;\n\t\t\t\t\t\tarray[ i + 5 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 6 ] = nx;\n\t\t\t\t\t\tarray[ i + 7 ] = ny;\n\t\t\t\t\t\tarray[ i + 8 ] = nz;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.normal );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasUvs && material.map ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.uv );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasColors && material.vertexColors !== NoColors ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.color );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t_gl.drawArrays( _gl.TRIANGLES, 0, object.count );\n\n\t\t\tobject.count = 0;\n\n\t\t};\n\n\t\tthis.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {\n\n\t\t\tsetMaterial( material );\n\n\t\t\tvar program = setProgram( camera, fog, material, object );\n\n\t\t\tvar updateBuffers = false;\n\t\t\tvar geometryProgram = geometry.id + '_' + program.id + '_' + material.wireframe;\n\n\t\t\tif ( geometryProgram !== _currentGeometryProgram ) {\n\n\t\t\t\t_currentGeometryProgram = geometryProgram;\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphTargetInfluences = object.morphTargetInfluences;\n\n\t\t\tif ( morphTargetInfluences !== undefined ) {\n\n\t\t\t\tvar activeInfluences = [];\n\n\t\t\t\tfor ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = morphTargetInfluences[ i ];\n\t\t\t\t\tactiveInfluences.push( [ influence, i ] );\n\n\t\t\t\t}\n\n\t\t\t\tactiveInfluences.sort( absNumericalSort );\n\n\t\t\t\tif ( activeInfluences.length > 8 ) {\n\n\t\t\t\t\tactiveInfluences.length = 8;\n\n\t\t\t\t}\n\n\t\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\t\tfor ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = activeInfluences[ i ];\n\t\t\t\t\tmorphInfluences[ i ] = influence[ 0 ];\n\n\t\t\t\t\tif ( influence[ 0 ] !== 0 ) {\n\n\t\t\t\t\t\tvar index = influence[ 1 ];\n\n\t\t\t\t\t\tif ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] );\n\t\t\t\t\t\tif ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i );\n\t\t\t\t\t\tif ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) {\n\n\t\t\t\t\tmorphInfluences[ i ] = 0.0;\n\n\t\t\t\t}\n\n\t\t\t\tprogram.getUniforms().setValue(\n\t\t\t\t\t\t_gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar position = geometry.attributes.position;\n\t\t\tvar rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = objects.getWireframeAttribute( geometry );\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\tvar renderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( index );\n\n\t\t\t} else {\n\n\t\t\t\trenderer = bufferRenderer;\n\n\t\t\t}\n\n\t\t\tif ( updateBuffers ) {\n\n\t\t\t\tsetupVertexAttributes( material, program, geometry );\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, objects.getAttributeBuffer( index ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar dataCount = 0;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdataCount = index.count;\n\n\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\tdataCount = position.count;\n\n\t\t\t}\n\n\t\t\tvar rangeStart = geometry.drawRange.start * rangeFactor;\n\t\t\tvar rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\t\tvar groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\t\tvar groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\t\tvar drawStart = Math.max( rangeStart, groupStart );\n\t\t\tvar drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\t\tvar drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\t\tif ( drawCount === 0 ) return;\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\tswitch ( object.drawMode ) {\n\n\t\t\t\t\t\tcase TrianglesDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleStripDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_STRIP );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleFanDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_FAN );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tvar 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 {\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}\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tif ( geometry.maxInstancedCount > 0 ) {\n\n\t\t\t\t\trenderer.renderInstances( geometry, drawStart, drawCount );\n\n\t\t\t\t}\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\tfunction setupVertexAttributes( material, program, geometry, startIndex ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( startIndex === undefined ) startIndex = 0;\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar geometryAttributes = geometry.attributes;\n\n\t\t\tvar programAttributes = program.getAttributes();\n\n\t\t\tvar materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\t\tfor ( var name in programAttributes ) {\n\n\t\t\t\tvar programAttribute = programAttributes[ name ];\n\n\t\t\t\tif ( programAttribute >= 0 ) {\n\n\t\t\t\t\tvar geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\t\tvar type = _gl.FLOAT;\n\t\t\t\t\t\tvar array = geometryAttribute.array;\n\t\t\t\t\t\tvar normalized = geometryAttribute.normalized;\n\n\t\t\t\t\t\tif ( array instanceof Float32Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.FLOAT;\n\n\t\t\t\t\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\t\t\t\t\tconsole.warn( \"Unsupported data buffer format: Float64Array\" );\n\n\t\t\t\t\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.UNSIGNED_SHORT;\n\n\t\t\t\t\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.SHORT;\n\n\t\t\t\t\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.UNSIGNED_INT;\n\n\t\t\t\t\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.INT;\n\n\t\t\t\t\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.BYTE;\n\n\t\t\t\t\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.UNSIGNED_BYTE;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar size = geometryAttribute.itemSize;\n\t\t\t\t\t\tvar buffer = objects.getAttributeBuffer( geometryAttribute );\n\n\t\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\t\tvar data = geometryAttribute.data;\n\t\t\t\t\t\t\tvar stride = data.stride;\n\t\t\t\t\t\t\tvar offset = geometryAttribute.offset;\n\n\t\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * data.array.BYTES_PER_ELEMENT, ( startIndex * stride + offset ) * data.array.BYTES_PER_ELEMENT );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * geometryAttribute.array.BYTES_PER_ELEMENT );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\t\tvar value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib2fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib3fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib4fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib1fv( programAttribute, value );\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\tstate.disableUnusedAttributes();\n\n\t\t}\n\n\t\t// Sorting\n\n\t\tfunction absNumericalSort( a, b ) {\n\n\t\t\treturn Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] );\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} else if ( a.material.program && b.material.program && a.material.program !== b.material.program ) {\n\n\t\t\t\treturn a.material.program.id - b.material.program.id;\n\n\t\t\t} else if ( a.material.id !== b.material.id ) {\n\n\t\t\t\treturn a.material.id - b.material.id;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn a.z - b.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction reversePainterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Rendering\n\n\t\tthis.render = function ( scene, camera, renderTarget, forceClear ) {\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\t// reset caching for this frame\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\t\t\t_currentCamera = null;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\tlights.length = 0;\n\n\t\t\topaqueObjectsLastIndex = - 1;\n\t\t\ttransparentObjectsLastIndex = - 1;\n\n\t\t\tsprites.length = 0;\n\t\t\tlensFlares.length = 0;\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\t\tprojectObject( scene, camera );\n\n\t\t\topaqueObjects.length = opaqueObjectsLastIndex + 1;\n\t\t\ttransparentObjects.length = transparentObjectsLastIndex + 1;\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\topaqueObjects.sort( painterSortStable );\n\t\t\t\ttransparentObjects.sort( reversePainterSortStable );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _clippingEnabled ) _clipping.beginShadows();\n\n\t\t\tsetupShadows( lights );\n\n\t\t\tshadowMap.render( scene, camera );\n\n\t\t\tsetupLights( lights, camera );\n\n\t\t\tif ( _clippingEnabled ) _clipping.endShadows();\n\n\t\t\t//\n\n\t\t\t_infoRender.calls = 0;\n\t\t\t_infoRender.vertices = 0;\n\t\t\t_infoRender.faces = 0;\n\t\t\t_infoRender.points = 0;\n\n\t\t\tif ( renderTarget === undefined ) {\n\n\t\t\t\trenderTarget = null;\n\n\t\t\t}\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\n\t\t\t//\n\n\t\t\tvar background = scene.background;\n\n\t\t\tif ( background === null ) {\n\n\t\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t\t} else if ( background && background.isColor ) {\n\n\t\t\t\tglClearColor( background.r, background.g, background.b, 1 );\n\t\t\t\tforceClear = true;\n\n\t\t\t}\n\n\t\t\tif ( this.autoClear || forceClear ) {\n\n\t\t\t\tthis.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil );\n\n\t\t\t}\n\n\t\t\tif ( background && background.isCubeTexture ) {\n\n\t\t\t\tbackgroundCamera2.projectionMatrix.copy( camera.projectionMatrix );\n\n\t\t\t\tbackgroundCamera2.matrixWorld.extractRotation( camera.matrixWorld );\n\t\t\t\tbackgroundCamera2.matrixWorldInverse.getInverse( backgroundCamera2.matrixWorld );\n\n\t\t\t\tbackgroundBoxMesh.material.uniforms[ \"tCube\" ].value = background;\n\t\t\t\tbackgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundCamera2.matrixWorldInverse, backgroundBoxMesh.matrixWorld );\n\n\t\t\t\tobjects.update( backgroundBoxMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundCamera2, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null );\n\n\t\t\t} else if ( background && background.isTexture ) {\n\n\t\t\t\tbackgroundPlaneMesh.material.map = background;\n\n\t\t\t\tobjects.update( backgroundPlaneMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.overrideMaterial ) {\n\n\t\t\t\tvar overrideMaterial = scene.overrideMaterial;\n\n\t\t\t\trenderObjects( opaqueObjects, scene, camera, overrideMaterial );\n\t\t\t\trenderObjects( transparentObjects, scene, camera, overrideMaterial );\n\n\t\t\t} else {\n\n\t\t\t\t// opaque pass (front-to-back order)\n\n\t\t\t\tstate.setBlending( NoBlending );\n\t\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\t\t// transparent pass (back-to-front order)\n\n\t\t\t\trenderObjects( transparentObjects, scene, camera );\n\n\t\t\t}\n\n\t\t\t// custom render plugins (post pass)\n\n\t\t\tspritePlugin.render( scene, camera );\n\t\t\tlensFlarePlugin.render( scene, camera, _currentViewport );\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\ttextures.updateRenderTargetMipmap( renderTarget );\n\n\t\t\t}\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.setDepthTest( true );\n\t\t\tstate.setDepthWrite( true );\n\t\t\tstate.setColorWrite( true );\n\n\t\t\t// _gl.finish();\n\n\t\t};\n\n\t\tfunction pushRenderItem( object, geometry, material, z, group ) {\n\n\t\t\tvar array, index;\n\n\t\t\t// allocate the next position in the appropriate array\n\n\t\t\tif ( material.transparent ) {\n\n\t\t\t\tarray = transparentObjects;\n\t\t\t\tindex = ++ transparentObjectsLastIndex;\n\n\t\t\t} else {\n\n\t\t\t\tarray = opaqueObjects;\n\t\t\t\tindex = ++ opaqueObjectsLastIndex;\n\n\t\t\t}\n\n\t\t\t// recycle existing render item or grow the array\n\n\t\t\tvar renderItem = array[ index ];\n\n\t\t\tif ( renderItem !== undefined ) {\n\n\t\t\t\trenderItem.id = object.id;\n\t\t\t\trenderItem.object = object;\n\t\t\t\trenderItem.geometry = geometry;\n\t\t\t\trenderItem.material = material;\n\t\t\t\trenderItem.z = _vector3.z;\n\t\t\t\trenderItem.group = group;\n\n\t\t\t} else {\n\n\t\t\t\trenderItem = {\n\t\t\t\t\tid: object.id,\n\t\t\t\t\tobject: object,\n\t\t\t\t\tgeometry: geometry,\n\t\t\t\t\tmaterial: material,\n\t\t\t\t\tz: _vector3.z,\n\t\t\t\t\tgroup: group\n\t\t\t\t};\n\n\t\t\t\t// assert( index === array.length );\n\t\t\t\tarray.push( renderItem );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Duplicated code (Frustum)\n\n\t\tfunction isObjectViewable( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t_sphere.copy( geometry.boundingSphere ).\n\t\t\t\tapplyMatrix4( object.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSpriteViewable( sprite ) {\n\n\t\t\t_sphere.center.set( 0, 0, 0 );\n\t\t\t_sphere.radius = 0.7071067811865476;\n\t\t\t_sphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSphereViewable( sphere ) {\n\n\t\t\tif ( ! _frustum.intersectsSphere( sphere ) ) return false;\n\n\t\t\tvar numPlanes = _clipping.numPlanes;\n\n\t\t\tif ( numPlanes === 0 ) return true;\n\n\t\t\tvar planes = _this.clippingPlanes,\n\n\t\t\t\tcenter = sphere.center,\n\t\t\t\tnegRad = - sphere.radius,\n\t\t\t\ti = 0;\n\n\t\t\tdo {\n\n\t\t\t\t// out when deeper than radius in the negative halfspace\n\t\t\t\tif ( planes[ i ].distanceToPoint( center ) < negRad ) return false;\n\n\t\t\t} while ( ++ i !== numPlanes );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isLight ) {\n\n\t\t\t\t\tlights.push( object );\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( object.frustumCulled === false || isSpriteViewable( object ) === true ) {\n\n\t\t\t\t\t\tsprites.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isLensFlare ) {\n\n\t\t\t\t\tlensFlares.push( object );\n\n\t\t\t\t} else if ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t_vector3.applyProjection( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpushRenderItem( object, null, object.material, _vector3.z, null );\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( object.frustumCulled === false || isObjectViewable( object ) === true ) {\n\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t\t\t_vector3.applyProjection( _projScreenMatrix );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar geometry = objects.update( object );\n\n\t\t\t\t\t\t\tif ( material.isMultiMaterial ) {\n\n\t\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tvar group = groups[ i ];\n\t\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, groupMaterial, _vector3.z, group );\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} else {\n\n\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, material, _vector3.z, null );\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\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera, overrideMaterial ) {\n\n\t\t\tfor ( var i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tvar renderItem = renderList[ i ];\n\n\t\t\t\tvar object = renderItem.object;\n\t\t\t\tvar geometry = renderItem.geometry;\n\t\t\t\tvar material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;\n\t\t\t\tvar group = renderItem.group;\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\t\tif ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tsetMaterial( material );\n\n\t\t\t\t\tvar program = setProgram( camera, scene.fog, material, object );\n\n\t\t\t\t\t_currentGeometryProgram = '';\n\n\t\t\t\t\tobject.render( function ( object ) {\n\n\t\t\t\t\t\t_this.renderBufferImmediate( object, program, material );\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );\n\n\t\t\t\t}\n\n\t\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction initMaterial( material, fog, object ) {\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tvar parameters = programCache.getParameters(\n\t\t\t\t\tmaterial, _lights, fog, _clipping.numPlanes, _clipping.numIntersection, object );\n\n\t\t\tvar code = programCache.getProgramCode( material, parameters );\n\n\t\t\tvar program = materialProperties.program;\n\t\t\tvar programChange = true;\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\t// new material\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t} else if ( program.code !== code ) {\n\n\t\t\t\t// changed glsl or parameters\n\t\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\t} else if ( parameters.shaderID !== undefined ) {\n\n\t\t\t\t// same glsl and uniform list\n\t\t\t\treturn;\n\n\t\t\t} else {\n\n\t\t\t\t// only rebuild uniform list\n\t\t\t\tprogramChange = false;\n\n\t\t\t}\n\n\t\t\tif ( programChange ) {\n\n\t\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\t\tvar shader = ShaderLib[ parameters.shaderID ];\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\t\t\tfragmentShader: shader.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: material.uniforms,\n\t\t\t\t\t\tvertexShader: material.vertexShader,\n\t\t\t\t\t\tfragmentShader: material.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.__webglShader = materialProperties.__webglShader;\n\n\t\t\t\tprogram = programCache.acquireProgram( material, parameters, code );\n\n\t\t\t\tmaterialProperties.program = program;\n\t\t\t\tmaterial.program = program;\n\n\t\t\t}\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\tmaterial.numSupportedMorphTargets = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphTargets; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphTarget' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphTargets ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.morphNormals ) {\n\n\t\t\t\tmaterial.numSupportedMorphNormals = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphNormals; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphNormal' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphNormals ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( ! material.isShaderMaterial &&\n\t\t\t ! material.isRawShaderMaterial ||\n\t\t\t material.clipping === true ) {\n\n\t\t\t\tmaterialProperties.numClippingPlanes = _clipping.numPlanes;\n\t\t\t\tmaterialProperties.numIntersection = _clipping.numIntersection;\n\t\t\t\tuniforms.clippingPlanes = _clipping.uniform;\n\n\t\t\t}\n\n\t\t\tmaterialProperties.fog = fog;\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.lightsHash = _lights.hash;\n\n\t\t\tif ( material.lights ) {\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.ambient;\n\t\t\t\tuniforms.directionalLights.value = _lights.directional;\n\t\t\t\tuniforms.spotLights.value = _lights.spot;\n\t\t\t\tuniforms.pointLights.value = _lights.point;\n\t\t\t\tuniforms.hemisphereLights.value = _lights.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = _lights.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = _lights.spotShadowMap;\n\t\t\t\tuniforms.spotShadowMatrix.value = _lights.spotShadowMatrix;\n\t\t\t\tuniforms.pointShadowMap.value = _lights.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = _lights.pointShadowMatrix;\n\n\t\t\t}\n\n\t\t\tvar progUniforms = materialProperties.program.getUniforms(),\n\t\t\t\tuniformsList =\n\t\t\t\t\t\tWebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t\t}\n\n\t\tfunction setMaterial( material ) {\n\n\t\t\tmaterial.side === DoubleSide\n\t\t\t\t? state.disable( _gl.CULL_FACE )\n\t\t\t\t: state.enable( _gl.CULL_FACE );\n\n\t\t\tstate.setFlipSided( material.side === BackSide );\n\n\t\t\tmaterial.transparent === true\n\t\t\t\t? state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )\n\t\t\t\t: state.setBlending( NoBlending );\n\n\t\t\tstate.setDepthFunc( material.depthFunc );\n\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\tstate.setDepthWrite( material.depthWrite );\n\t\t\tstate.setColorWrite( material.colorWrite );\n\t\t\tstate.setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\t}\n\n\t\tfunction setProgram( camera, fog, material, object ) {\n\n\t\t\t_usedTextureUnits = 0;\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tif ( _clippingEnabled ) {\n\n\t\t\t\tif ( _localClippingEnabled || camera !== _currentCamera ) {\n\n\t\t\t\t\tvar useCache =\n\t\t\t\t\t\t\tcamera === _currentCamera &&\n\t\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\t_clipping.setState(\n\t\t\t\t\t\t\tmaterial.clippingPlanes, material.clipIntersection, material.clipShadows,\n\t\t\t\t\t\t\tcamera, materialProperties, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate === false ) {\n\n\t\t\t\tif ( materialProperties.program === undefined ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.lights && materialProperties.lightsHash !== _lights.hash ) {\n\n\t\t\t\t\tmaterial.needsUpdate = 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\t materialProperties.numIntersection !== _clipping.numIntersection ) ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate ) {\n\n\t\t\t\tinitMaterial( material, fog, object );\n\t\t\t\tmaterial.needsUpdate = false;\n\n\t\t\t}\n\n\t\t\tvar refreshProgram = false;\n\t\t\tvar refreshMaterial = false;\n\t\t\tvar refreshLights = false;\n\n\t\t\tvar program = materialProperties.program,\n\t\t\t\tp_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( program.id !== _currentProgram ) {\n\n\t\t\t\t_gl.useProgram( program.program );\n\t\t\t\t_currentProgram = program.id;\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 || camera !== _currentCamera ) {\n\n\t\t\t\tp_uniforms.set( _gl, camera, 'projectionMatrix' );\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\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( camera !== _currentCamera ) {\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\t// load material specific uniforms\n\t\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\t material.isMeshPhongMaterial ||\n\t\t\t\t material.isMeshStandardMaterial ||\n\t\t\t\t material.envMap ) {\n\n\t\t\t\t\tvar uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t material.isMeshLambertMaterial ||\n\t\t\t\t material.isMeshBasicMaterial ||\n\t\t\t\t material.isMeshStandardMaterial ||\n\t\t\t\t material.isShaderMaterial ||\n\t\t\t\t material.skinning ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingExposure' );\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingWhitePoint' );\n\n\t\t\t}\n\n\t\t\t// skinning uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone texture must go before other textures\n\t\t\t// not sure why, but otherwise weird things happen\n\n\t\t\tif ( material.skinning ) {\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\tvar skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( capabilities.floatVertexTextures && skeleton.useVertexTexture ) {\n\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTexture' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureWidth' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureHeight' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tif ( material.lights ) {\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 ) {\n\n\t\t\t\t\trefreshUniformsFog( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshBasicMaterial ||\n\t\t\t\t material.isMeshLambertMaterial ||\n\t\t\t\t material.isMeshPhongMaterial ||\n\t\t\t\t material.isMeshStandardMaterial ||\n\t\t\t\t material.isMeshDepthMaterial ) {\n\n\t\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh single material specific uniforms\n\n\t\t\t\tif ( material.isLineBasicMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isLineDashedMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\t\t\t\t\trefreshUniformsDash( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\t\t\trefreshUniformsPoints( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\t\t\trefreshUniformsLambert( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhong( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhysical( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\t\t\trefreshUniformsStandard( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\t\t\tm_uniforms.displacementMap.value = material.displacementMap;\n\t\t\t\t\t\tm_uniforms.displacementScale.value = material.displacementScale;\n\t\t\t\t\t\tm_uniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\t\t\tm_uniforms.opacity.value = material.opacity;\n\n\t\t\t\t}\n\n\t\t\t\tWebGLUniforms.upload(\n\t\t\t\t\t\t_gl, materialProperties.uniformsList, m_uniforms, _this );\n\n\t\t\t}\n\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.set( _gl, object, 'modelViewMatrix' );\n\t\t\tp_uniforms.set( _gl, object, 'normalMatrix' );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// Uniforms (refresh uniforms objects)\n\n\t\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t\tuniforms.diffuse.value = material.color;\n\n\t\t\tif ( material.emissive ) {\n\n\t\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t\t}\n\n\t\t\tuniforms.map.value = material.map;\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\tif ( material.aoMap ) {\n\n\t\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\t}\n\n\t\t\t// uv repeat and offset setting priorities\n\t\t\t// 1. color map\n\t\t\t// 2. specular map\n\t\t\t// 3. normal map\n\t\t\t// 4. bump map\n\t\t\t// 5. alpha map\n\t\t\t// 6. emissive map\n\n\t\t\tvar uvScaleMap;\n\n\t\t\tif ( material.map ) {\n\n\t\t\t\tuvScaleMap = material.map;\n\n\t\t\t} else if ( material.specularMap ) {\n\n\t\t\t\tuvScaleMap = material.specularMap;\n\n\t\t\t} else if ( material.displacementMap ) {\n\n\t\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t\t} else if ( material.normalMap ) {\n\n\t\t\t\tuvScaleMap = material.normalMap;\n\n\t\t\t} else if ( material.bumpMap ) {\n\n\t\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t\t} else if ( material.roughnessMap ) {\n\n\t\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t\t} else if ( material.metalnessMap ) {\n\n\t\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t\t} else if ( material.alphaMap ) {\n\n\t\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t\t} else if ( material.emissiveMap ) {\n\n\t\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t\t// backwards compatibility\n\t\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t\t}\n\n\t\t\t\tvar offset = uvScaleMap.offset;\n\t\t\t\tvar repeat = uvScaleMap.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t\tuniforms.envMap.value = material.envMap;\n\n\t\t\t// don't flip CubeTexture envMaps, flip everything else:\n\t\t\t// WebGLRenderTargetCube will be flipped for backwards compatibility\n\t\t\t// WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture\n\t\t\t// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future\n\t\t\tuniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t}\n\n\t\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\t\tuniforms.dashSize.value = material.dashSize;\n\t\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\t\tuniforms.scale.value = material.scale;\n\n\t\t}\n\n\t\tfunction refreshUniformsPoints( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\t\t\tuniforms.size.value = material.size * _pixelRatio;\n\t\t\tuniforms.scale.value = _height * 0.5;\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\tif ( material.map !== null ) {\n\n\t\t\t\tvar offset = material.map.offset;\n\t\t\t\tvar repeat = material.map.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsFog( uniforms, fog ) {\n\n\t\t\tuniforms.fogColor.value = fog.color;\n\n\t\t\tif ( fog.isFog ) {\n\n\t\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\t\tuniforms.specular.value = material.specular;\n\t\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\t\tuniforms.roughness.value = material.roughness;\n\t\t\tuniforms.metalness.value = material.metalness;\n\n\t\t\tif ( material.roughnessMap ) {\n\n\t\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.metalnessMap ) {\n\n\t\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t\tif ( material.envMap ) {\n\n\t\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhysical( uniforms, material ) {\n\n\t\t\tuniforms.clearCoat.value = material.clearCoat;\n\t\t\tuniforms.clearCoatRoughness.value = material.clearCoatRoughness;\n\n\t\t\trefreshUniformsStandard( uniforms, material );\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\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\t// Lighting\n\n\t\tfunction setupShadows( lights ) {\n\n\t\t\tvar lightShadowsLength = 0;\n\n\t\t\tfor ( var i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\t\tvar light = lights[ i ];\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t_lights.shadows[ lightShadowsLength ++ ] = light;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.shadows.length = lightShadowsLength;\n\n\t\t}\n\n\t\tfunction setupLights( lights, camera ) {\n\n\t\t\tvar l, ll, light,\n\t\t\tr = 0, g = 0, b = 0,\n\t\t\tcolor,\n\t\t\tintensity,\n\t\t\tdistance,\n\t\t\tshadowMap,\n\n\t\t\tviewMatrix = camera.matrixWorldInverse,\n\n\t\t\tdirectionalLength = 0,\n\t\t\tpointLength = 0,\n\t\t\tspotLength = 0,\n\t\t\themiLength = 0;\n\n\t\t\tfor ( l = 0, ll = lights.length; l < ll; l ++ ) {\n\n\t\t\t\tlight = lights[ l ];\n\n\t\t\t\tcolor = light.color;\n\t\t\t\tintensity = light.intensity;\n\t\t\t\tdistance = light.distance;\n\n\t\t\t\tshadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\t\tr += color.r * intensity;\n\t\t\t\t\tg += color.g * intensity;\n\t\t\t\t\tb += color.b * intensity;\n\n\t\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\t_lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.directional[ directionalLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\t_lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.spot[ spotLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.pointShadowMap[ pointLength ] = shadowMap;\n\n\t\t\t\t\tif ( _lights.pointShadowMatrix[ pointLength ] === undefined ) {\n\n\t\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ] = new Matrix4();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// for point lights we set the shadow matrix to be a translation-only matrix\n\t\t\t\t\t// equal to inverse of the light's position\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.matrixWorld ).negate();\n\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ].identity().setPosition( _vector3 );\n\n\t\t\t\t\t_lights.point[ pointLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\t\t_lights.hemi[ hemiLength ++ ] = uniforms;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.ambient[ 0 ] = r;\n\t\t\t_lights.ambient[ 1 ] = g;\n\t\t\t_lights.ambient[ 2 ] = b;\n\n\t\t\t_lights.directional.length = directionalLength;\n\t\t\t_lights.spot.length = spotLength;\n\t\t\t_lights.point.length = pointLength;\n\t\t\t_lights.hemi.length = hemiLength;\n\n\t\t\t_lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + hemiLength + ',' + _lights.shadows.length;\n\n\t\t}\n\n\t\t// GL state setting\n\n\t\tthis.setFaceCulling = function ( cullFace, frontFaceDirection ) {\n\n\t\t\tstate.setCullFace( cullFace );\n\t\t\tstate.setFlipSided( frontFaceDirection === FrontFaceDirectionCW );\n\n\t\t};\n\n\t\t// Textures\n\n\t\tfunction allocTextureUnit() {\n\n\t\t\tvar textureUnit = _usedTextureUnits;\n\n\t\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\t\tconsole.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t\t}\n\n\t\t\t_usedTextureUnits += 1;\n\n\t\t\treturn textureUnit;\n\n\t\t}\n\n\t\tthis.allocTextureUnit = allocTextureUnit;\n\n\t\t// this.setTexture2D = setTexture2D;\n\t\tthis.setTexture2D = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\t// backwards compatibility: peel texture.texture\n\t\t\treturn function setTexture2D( texture, slot ) {\n\n\t\t\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTexture = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTexture( texture, slot ) {\n\n\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.\" );\n\t\t\t\t\twarned = true;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTextureCube = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTextureCube( texture, slot ) {\n\n\t\t\t\t// backwards compatibility: peel texture.texture\n\t\t\t\tif ( texture && texture.isWebGLRenderTargetCube ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\t// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture\n\t\t\t\t// TODO: unify these code paths\n\t\t\t\tif ( ( texture && texture.isCubeTexture ) ||\n\t\t\t\t\t ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {\n\n\t\t\t\t\t// CompressedTexture can have Array in image :/\n\n\t\t\t\t\t// this function alone should take care of cube textures\n\t\t\t\t\ttextures.setTextureCube( texture, slot );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assumed: texture property of THREE.WebGLRenderTargetCube\n\n\t\t\t\t\ttextures.setTextureCubeDynamic( texture, slot );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.getCurrentRenderTarget = function() {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTarget = function ( renderTarget ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\n\t\t\tif ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t}\n\n\t\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\t\tvar framebuffer;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer;\n\n\t\t\t\t}\n\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = null;\n\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );\n\n\t\t\t}\n\n\t\t\tif ( _currentFramebuffer !== framebuffer ) {\n\n\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t\t_currentFramebuffer = framebuffer;\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tstate.viewport( _currentViewport );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) {\n\n\t\t\tif ( ( renderTarget && renderTarget.isWebGLRenderTarget ) === false ) {\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\tvar framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tvar restore = false;\n\n\t\t\t\tif ( framebuffer !== _currentFramebuffer ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\trestore = true;\n\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar texture = renderTarget.texture;\n\t\t\t\t\tvar textureFormat = texture.format;\n\t\t\t\t\tvar textureType = texture.type;\n\n\t\t\t\t\tif ( textureFormat !== RGBAFormat && paramThreeToGL( 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\tif ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t ! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t ! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) {\n\n\t\t\t\t\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\tif ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {\n\n\t\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\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t\t_gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\tif ( restore ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );\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// Map three.js constants to WebGL constants\n\n\t\tfunction paramThreeToGL( p ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( p === RepeatWrapping ) return _gl.REPEAT;\n\t\t\tif ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE;\n\t\t\tif ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT;\n\n\t\t\tif ( p === NearestFilter ) return _gl.NEAREST;\n\t\t\tif ( p === NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST;\n\t\t\tif ( p === NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR;\n\n\t\t\tif ( p === LinearFilter ) return _gl.LINEAR;\n\t\t\tif ( p === LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST;\n\t\t\tif ( p === LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR;\n\n\t\t\tif ( p === UnsignedByteType ) return _gl.UNSIGNED_BYTE;\n\t\t\tif ( p === UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4;\n\t\t\tif ( p === UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1;\n\t\t\tif ( p === UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5;\n\n\t\t\tif ( p === ByteType ) return _gl.BYTE;\n\t\t\tif ( p === ShortType ) return _gl.SHORT;\n\t\t\tif ( p === UnsignedShortType ) return _gl.UNSIGNED_SHORT;\n\t\t\tif ( p === IntType ) return _gl.INT;\n\t\t\tif ( p === UnsignedIntType ) return _gl.UNSIGNED_INT;\n\t\t\tif ( p === FloatType ) return _gl.FLOAT;\n\n\t\t\tif ( p === HalfFloatType ) {\n\n\t\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\t\tif ( extension !== null ) return extension.HALF_FLOAT_OES;\n\n\t\t\t}\n\n\t\t\tif ( p === AlphaFormat ) return _gl.ALPHA;\n\t\t\tif ( p === RGBFormat ) return _gl.RGB;\n\t\t\tif ( p === RGBAFormat ) return _gl.RGBA;\n\t\t\tif ( p === LuminanceFormat ) return _gl.LUMINANCE;\n\t\t\tif ( p === LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA;\n\t\t\tif ( p === DepthFormat ) return _gl.DEPTH_COMPONENT;\n\t\t\tif ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL;\n\n\t\t\tif ( p === AddEquation ) return _gl.FUNC_ADD;\n\t\t\tif ( p === SubtractEquation ) return _gl.FUNC_SUBTRACT;\n\t\t\tif ( p === ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT;\n\n\t\t\tif ( p === ZeroFactor ) return _gl.ZERO;\n\t\t\tif ( p === OneFactor ) return _gl.ONE;\n\t\t\tif ( p === SrcColorFactor ) return _gl.SRC_COLOR;\n\t\t\tif ( p === OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR;\n\t\t\tif ( p === SrcAlphaFactor ) return _gl.SRC_ALPHA;\n\t\t\tif ( p === OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA;\n\t\t\tif ( p === DstAlphaFactor ) return _gl.DST_ALPHA;\n\t\t\tif ( p === OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA;\n\n\t\t\tif ( p === DstColorFactor ) return _gl.DST_COLOR;\n\t\t\tif ( p === OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR;\n\t\t\tif ( p === SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE;\n\n\t\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||\n\t\t\t\tp === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\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}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||\n\t\t\t\t p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\t\tif ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t}\n\n\t\t\tif ( p === MinEquation || p === MaxEquation ) {\n\n\t\t\t\textension = extensions.get( 'EXT_blend_minmax' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === MinEquation ) return extension.MIN_EXT;\n\t\t\t\t\tif ( p === MaxEquation ) return extension.MAX_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\t\tif ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t}\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction FogExp2 ( color, density ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = ( density !== undefined ) ? density : 0.00025;\n\n\t}\n\n\tFogExp2.prototype.isFogExp2 = true;\n\n\tFogExp2.prototype.clone = function () {\n\n\t\treturn new FogExp2( this.color.getHex(), this.density );\n\n\t};\n\n\tFogExp2.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Fog ( color, near, far ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = ( near !== undefined ) ? near : 1;\n\t\tthis.far = ( far !== undefined ) ? far : 1000;\n\n\t}\n\n\tFog.prototype.isFog = true;\n\n\tFog.prototype.clone = function () {\n\n\t\treturn new Fog( this.color.getHex(), this.near, this.far );\n\n\t};\n\n\tFog.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\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\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Scene () {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.fog = null;\n\t\tthis.overrideMaterial = null;\n\n\t\tthis.autoUpdate = true; // checked by the renderer\n\n\t}\n\n\tScene.prototype = Object.create( Object3D.prototype );\n\n\tScene.prototype.constructor = Scene;\n\n\tScene.prototype.copy = function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t};\n\n\tScene.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tif ( this.background !== null ) data.object.background = this.background.toJSON( meta );\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlare( texture, size, distance, blending, color ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.lensFlares = [];\n\n\t\tthis.positionScreen = new Vector3();\n\t\tthis.customUpdateCallback = undefined;\n\n\t\tif ( texture !== undefined ) {\n\n\t\t\tthis.add( texture, size, distance, blending, color );\n\n\t\t}\n\n\t}\n\n\tLensFlare.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LensFlare,\n\n\t\tisLensFlare: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.positionScreen.copy( source.positionScreen );\n\t\t\tthis.customUpdateCallback = source.customUpdateCallback;\n\n\t\t\tfor ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lensFlares.push( source.lensFlares[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( texture, size, distance, blending, color, opacity ) {\n\n\t\t\tif ( size === undefined ) size = - 1;\n\t\t\tif ( distance === undefined ) distance = 0;\n\t\t\tif ( opacity === undefined ) opacity = 1;\n\t\t\tif ( color === undefined ) color = new Color( 0xffffff );\n\t\t\tif ( blending === undefined ) blending = NormalBlending;\n\n\t\t\tdistance = Math.min( distance, Math.max( 0, distance ) );\n\n\t\t\tthis.lensFlares.push( {\n\t\t\t\ttexture: texture,\t// THREE.Texture\n\t\t\t\tsize: size, \t\t// size in pixels (-1 = use texture.width)\n\t\t\t\tdistance: distance, \t// distance (0-1) from light source (0=at light source)\n\t\t\t\tx: 0, y: 0, z: 0,\t// screen position (-1 => 1) z = 0 is in front z = 1 is back\n\t\t\t\tscale: 1, \t\t// scale\n\t\t\t\trotation: 0, \t\t// rotation\n\t\t\t\topacity: opacity,\t// opacity\n\t\t\t\tcolor: color,\t\t// color\n\t\t\t\tblending: blending\t// blending\n\t\t\t} );\n\n\t\t},\n\n\t\t/*\n\t\t * Update lens flares update positions on all flares based on the screen position\n\t\t * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way.\n\t\t */\n\n\t\tupdateLensFlares: function () {\n\n\t\t\tvar f, fl = this.lensFlares.length;\n\t\t\tvar flare;\n\t\t\tvar vecX = - this.positionScreen.x * 2;\n\t\t\tvar vecY = - this.positionScreen.y * 2;\n\n\t\t\tfor ( f = 0; f < fl; f ++ ) {\n\n\t\t\t\tflare = this.lensFlares[ f ];\n\n\t\t\t\tflare.x = this.positionScreen.x + vecX * flare.distance;\n\t\t\t\tflare.y = this.positionScreen.y + vecY * flare.distance;\n\n\t\t\t\tflare.wantedRotation = flare.x * Math.PI * 0.25;\n\t\t\t\tflare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t *\tuvOffset: new THREE.Vector2(),\n\t *\tuvScale: new THREE.Vector2()\n\t * }\n\t */\n\n\tfunction SpriteMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\t\tthis.map = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tSpriteMaterial.prototype = Object.create( Material.prototype );\n\tSpriteMaterial.prototype.constructor = SpriteMaterial;\n\n\tSpriteMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.map = source.map;\n\n\t\tthis.rotation = source.rotation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Sprite( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Sprite';\n\n\t\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\t}\n\n\tSprite.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Sprite,\n\n\t\tisSprite: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distanceSq = raycaster.ray.distanceSqToPoint( matrixPosition );\n\t\t\t\tvar guessSizeSq = this.scale.x * this.scale.y / 4;\n\n\t\t\t\tif ( distanceSq > guessSizeSq ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: Math.sqrt( distanceSq ),\n\t\t\t\t\tpoint: this.position,\n\t\t\t\t\tface: 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\tclone: function () {\n\n\t\t\treturn new this.constructor( this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LOD() {\n\n\t\tObject3D.call( this );\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} );\n\n\t}\n\n\n\tLOD.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LOD,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source, false );\n\n\t\t\tvar levels = source.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddLevel: function ( object, distance ) {\n\n\t\t\tif ( distance === undefined ) distance = 0;\n\n\t\t\tdistance = Math.abs( distance );\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\t\tthis.add( object );\n\n\t\t},\n\n\t\tgetObjectForDistance: function ( distance ) {\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance < levels[ i ].distance ) {\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\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( matrixPosition );\n\n\t\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tupdate: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar levels = this.levels;\n\n\t\t\t\tif ( levels.length > 1 ) {\n\n\t\t\t\t\tv1.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\t\tv2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\t\tvar distance = v1.distanceTo( v2 );\n\n\t\t\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t\t\t} else {\n\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\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\t\t\tlevels[ i ].object.visible = 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\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.levels = [];\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tdata.object.levels.push( {\n\t\t\t\t\tobject: level.object.uuid,\n\t\t\t\t\tdistance: level.distance\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { data: data, 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.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n\tDataTexture.prototype = Object.create( Texture.prototype );\n\tDataTexture.prototype.constructor = DataTexture;\n\n\tDataTexture.prototype.isDataTexture = true;\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author michael guerrero / http://realitymeltdown.com\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Skeleton( bones, boneInverses, useVertexTexture ) {\n\n\t\tthis.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true;\n\n\t\tthis.identityMatrix = new Matrix4();\n\n\t\t// copy the bone array\n\n\t\tbones = bones || [];\n\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t// create a bone texture or an array of floats\n\n\t\tif ( this.useVertexTexture ) {\n\n\t\t\t// layout (1 matrix = 4 pixels)\n\t\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\n\t\t\tvar size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\t\tsize = _Math.nextPowerOfTwo( Math.ceil( size ) );\n\t\t\tsize = Math.max( size, 4 );\n\n\t\t\tthis.boneTextureWidth = size;\n\t\t\tthis.boneTextureHeight = size;\n\n\t\t\tthis.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel\n\t\t\tthis.boneTexture = new DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, RGBAFormat, FloatType );\n\n\t\t} else {\n\n\t\t\tthis.boneMatrices = new Float32Array( 16 * this.bones.length );\n\n\t\t}\n\n\t\t// use the supplied bone inverses or calculate the inverses\n\n\t\tif ( boneInverses === undefined ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\tif ( this.bones.length === boneInverses.length ) {\n\n\t\t\t\tthis.boneInverses = boneInverses.slice( 0 );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton bonInverses is the wrong length.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\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\tObject.assign( Skeleton.prototype, {\n\n\t\tcalculateInverses: function () {\n\n\t\t\tthis.boneInverses = [];\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tvar inverse = new Matrix4();\n\n\t\t\t\tif ( this.bones[ b ] ) {\n\n\t\t\t\t\tinverse.getInverse( this.bones[ b ].matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tthis.boneInverses.push( inverse );\n\n\t\t\t}\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tvar bone;\n\n\t\t\t// recover the bind-time world matrices\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tbone.matrixWorld.getInverse( this.boneInverses[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// compute the local matrices, positions, rotations and scales\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tif ( (bone.parent && bone.parent.isBone) ) {\n\n\t\t\t\t\t\tbone.matrix.getInverse( bone.parent.matrixWorld );\n\t\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdate: ( function () {\n\n\t\t\tvar offsetMatrix = new Matrix4();\n\n\t\t\treturn function update() {\n\n\t\t\t\t// flatten bone matrices to array\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\t\t// compute the offset between the current and the original transform\n\n\t\t\t\t\tvar matrix = this.bones[ b ] ? this.bones[ b ].matrixWorld : this.identityMatrix;\n\n\t\t\t\t\toffsetMatrix.multiplyMatrices( matrix, this.boneInverses[ b ] );\n\t\t\t\t\toffsetMatrix.toArray( this.boneMatrices, b * 16 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.useVertexTexture ) {\n\n\t\t\t\t\tthis.boneTexture.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tclone: function () {\n\n\t\t\treturn new Skeleton( this.bones, this.boneInverses, this.useVertexTexture );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Bone( skin ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Bone';\n\n\t\tthis.skin = skin;\n\n\t}\n\n\tBone.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Bone,\n\n\t\tisBone: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.skin = source.skin;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction SkinnedMesh( geometry, material, useVertexTexture ) {\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\tthis.bindMode = \"attached\";\n\t\tthis.bindMatrix = new Matrix4();\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t// init bones\n\n\t\t// TODO: remove bone creation as there is no reason (other than\n\t\t// convenience) for THREE.SkinnedMesh to do this.\n\n\t\tvar bones = [];\n\n\t\tif ( this.geometry && this.geometry.bones !== undefined ) {\n\n\t\t\tvar bone, gbone;\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tbone = new Bone( this );\n\t\t\t\tbones.push( bone );\n\n\t\t\t\tbone.name = gbone.name;\n\t\t\t\tbone.position.fromArray( gbone.pos );\n\t\t\t\tbone.quaternion.fromArray( gbone.rotq );\n\t\t\t\tif ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );\n\n\t\t\t}\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tif ( gbone.parent !== - 1 && gbone.parent !== null &&\n\t\t\t\t\t\tbones[ gbone.parent ] !== undefined ) {\n\n\t\t\t\t\tbones[ gbone.parent ].add( bones[ b ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.add( bones[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.normalizeSkinWeights();\n\n\t\tthis.updateMatrixWorld( true );\n\t\tthis.bind( new Skeleton( bones, undefined, useVertexTexture ), this.matrixWorld );\n\n\t}\n\n\n\tSkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\t\tconstructor: SkinnedMesh,\n\n\t\tisSkinnedMesh: true,\n\n\t\tbind: function( skeleton, bindMatrix ) {\n\n\t\t\tthis.skeleton = skeleton;\n\n\t\t\tif ( bindMatrix === undefined ) {\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t\t}\n\n\t\t\tthis.bindMatrix.copy( bindMatrix );\n\t\t\tthis.bindMatrixInverse.getInverse( bindMatrix );\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tthis.skeleton.pose();\n\n\t\t},\n\n\t\tnormalizeSkinWeights: function () {\n\n\t\t\tif ( (this.geometry && this.geometry.isGeometry) ) {\n\n\t\t\t\tfor ( var i = 0; i < this.geometry.skinWeights.length; i ++ ) {\n\n\t\t\t\t\tvar sw = this.geometry.skinWeights[ i ];\n\n\t\t\t\t\tvar scale = 1.0 / sw.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tsw.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tsw.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( (this.geometry && this.geometry.isBufferGeometry) ) {\n\n\t\t\t\tvar vec = new Vector4();\n\n\t\t\t\tvar skinWeight = this.geometry.attributes.skinWeight;\n\n\t\t\t\tfor ( var i = 0; i < skinWeight.count; i ++ ) {\n\n\t\t\t\t\tvec.x = skinWeight.getX( i );\n\t\t\t\t\tvec.y = skinWeight.getY( i );\n\t\t\t\t\tvec.z = skinWeight.getZ( i );\n\t\t\t\t\tvec.w = skinWeight.getW( i );\n\n\t\t\t\t\tvar scale = 1.0 / vec.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tvec.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvec.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t\tskinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrixWorld: function( force ) {\n\n\t\t\tMesh.prototype.updateMatrixWorld.call( this, true );\n\n\t\t\tif ( this.bindMode === \"attached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.matrixWorld );\n\n\t\t\t} else if ( this.bindMode === \"detached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.bindMatrix );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.SkinnedMesh unrecognized bindMode: ' + this.bindMode );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function() {\n\n\t\t\treturn new this.constructor( this.geometry, this.material, this.skeleton.useVertexTexture ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t * linecap: \"round\",\n\t * linejoin: \"round\"\n\t * }\n\t */\n\n\tfunction LineBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\t\tthis.linecap = 'round';\n\t\tthis.linejoin = 'round';\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineBasicMaterial.prototype = Object.create( Material.prototype );\n\tLineBasicMaterial.prototype.constructor = LineBasicMaterial;\n\n\tLineBasicMaterial.prototype.isLineBasicMaterial = true;\n\n\tLineBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Line( geometry, material, mode ) {\n\n\t\tif ( mode === 1 ) {\n\n\t\t\tconsole.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' );\n\t\t\treturn new LineSegments( geometry, material );\n\n\t\t}\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tLine.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Line,\n\n\t\tisLine: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar precision = raycaster.linePrecision;\n\t\t\t\tvar precisionSq = precision * precision;\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar vStart = new Vector3();\n\t\t\t\tvar vEnd = new Vector3();\n\t\t\t\tvar interSegment = new Vector3();\n\t\t\t\tvar interRay = new Vector3();\n\t\t\t\tvar step = (this && this.isLineSegments) ? 2 : 1;\n\n\t\t\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, l = indices.length - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\t\t\t\t\t\t\tvar b = indices[ i + 1 ];\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, a * 3 );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, b * 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\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\tfor ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, 3 * i );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, 3 * i + 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\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 if ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar nbVertices = vertices.length;\n\n\t\t\t\t\tfor ( var i = 0; i < nbVertices - 1; i += step ) {\n\n\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );\n\n\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LineSegments( geometry, material ) {\n\n\t\tLine.call( this, geometry, material );\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tLineSegments.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\t\tconstructor: LineSegments,\n\n\t\tisLineSegments: true\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * size: ,\n\t * sizeAttenuation: \n\t * }\n\t */\n\n\tfunction PointsMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tPointsMaterial.prototype = Object.create( Material.prototype );\n\tPointsMaterial.prototype.constructor = PointsMaterial;\n\n\tPointsMaterial.prototype.isPointsMaterial = true;\n\n\tPointsMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Points( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tPoints.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Points,\n\n\t\tisPoints: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar object = this;\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\t\t\t\tvar threshold = raycaster.params.Points.threshold;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\t\t\tvar localThresholdSq = localThreshold * localThreshold;\n\t\t\t\tvar position = new Vector3();\n\n\t\t\t\tfunction testPoint( point, index ) {\n\n\t\t\t\t\tvar rayPointDistanceSq = ray.distanceSqToPoint( point );\n\n\t\t\t\t\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\t\t\t\t\tvar intersectPoint = ray.closestPointToPoint( point );\n\t\t\t\t\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\t\t\t\t\tpoint: intersectPoint.clone(),\n\t\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tobject: 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\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, il = indices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\n\t\t\t\t\t\t\tposition.fromArray( positions, a * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, a );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tposition.fromArray( positions, i * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, i );\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\tvar vertices = geometry.vertices;\n\n\t\t\t\t\tfor ( var i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\ttestPoint( vertices[ i ], i );\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\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Group() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Group';\n\n\t}\n\n\tGroup.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Group\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.generateMipmaps = false;\n\n\t\tvar scope = this;\n\n\t\tfunction update() {\n\n\t\t\trequestAnimationFrame( update );\n\n\t\t\tif ( video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\t\tscope.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tupdate();\n\n\t}\n\n\tVideoTexture.prototype = Object.create( Texture.prototype );\n\tVideoTexture.prototype.constructor = VideoTexture;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\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\tCompressedTexture.prototype = Object.create( Texture.prototype );\n\tCompressedTexture.prototype.constructor = CompressedTexture;\n\n\tCompressedTexture.prototype.isCompressedTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tCanvasTexture.prototype = Object.create( Texture.prototype );\n\tCanvasTexture.prototype.constructor = CanvasTexture;\n\n\t/**\n\t * @author Matt DesLauriers / @mattdesl\n\t * @author atix / arthursilber.de\n\t */\n\n\tfunction DepthTexture( 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\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.type = type !== undefined ? type : UnsignedShortType;\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\t= false;\n\n\t}\n\n\tDepthTexture.prototype = Object.create( Texture.prototype );\n\tDepthTexture.prototype.constructor = DepthTexture;\n\tDepthTexture.prototype.isDepthTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WireframeGeometry( geometry ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tvar edge = [ 0, 0 ], hash = {};\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\tif ( (geometry && geometry.isGeometry) ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\t\t\tvar faces = geometry.faces;\n\t\t\tvar numEdges = 0;\n\n\t\t\t// allocate maximal size\n\t\t\tvar edges = new Uint32Array( 6 * faces.length );\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\t\tvar key = edge.toString();\n\n\t\t\t\t\tif ( hash[ key ] === undefined ) {\n\n\t\t\t\t\t\tedges[ 2 * numEdges ] = edge[ 0 ];\n\t\t\t\t\t\tedges[ 2 * numEdges + 1 ] = edge[ 1 ];\n\t\t\t\t\t\thash[ key ] = true;\n\t\t\t\t\t\tnumEdges ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar coords = new Float32Array( numEdges * 2 * 3 );\n\n\t\t\tfor ( var i = 0, l = numEdges; i < l; i ++ ) {\n\n\t\t\t\tfor ( var j = 0; j < 2; j ++ ) {\n\n\t\t\t\t\tvar vertex = vertices[ edges [ 2 * i + j ] ];\n\n\t\t\t\t\tvar index = 6 * i + 3 * j;\n\t\t\t\t\tcoords[ index + 0 ] = vertex.x;\n\t\t\t\t\tcoords[ index + 1 ] = vertex.y;\n\t\t\t\t\tcoords[ index + 2 ] = vertex.z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.addAttribute( 'position', new BufferAttribute( coords, 3 ) );\n\n\t\t} else if ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// Indexed BufferGeometry\n\n\t\t\t\tvar indices = geometry.index.array;\n\t\t\t\tvar vertices = geometry.attributes.position;\n\t\t\t\tvar groups = geometry.groups;\n\t\t\t\tvar numEdges = 0;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgeometry.addGroup( 0, indices.length );\n\n\t\t\t\t}\n\n\t\t\t\t// allocate maximal size\n\t\t\t\tvar edges = new Uint32Array( 2 * indices.length );\n\n\t\t\t\tfor ( var o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tvar group = groups[ o ];\n\n\t\t\t\t\tvar start = group.start;\n\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tedge[ 0 ] = indices[ i + j ];\n\t\t\t\t\t\t\tedge[ 1 ] = indices[ i + ( j + 1 ) % 3 ];\n\t\t\t\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\t\t\t\tvar key = edge.toString();\n\n\t\t\t\t\t\t\tif ( hash[ key ] === undefined ) {\n\n\t\t\t\t\t\t\t\tedges[ 2 * numEdges ] = edge[ 0 ];\n\t\t\t\t\t\t\t\tedges[ 2 * numEdges + 1 ] = edge[ 1 ];\n\t\t\t\t\t\t\t\thash[ key ] = true;\n\t\t\t\t\t\t\t\tnumEdges ++;\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\tvar coords = new Float32Array( numEdges * 2 * 3 );\n\n\t\t\t\tfor ( var i = 0, l = numEdges; i < l; i ++ ) {\n\n\t\t\t\t\tfor ( var j = 0; j < 2; j ++ ) {\n\n\t\t\t\t\t\tvar index = 6 * i + 3 * j;\n\t\t\t\t\t\tvar index2 = edges[ 2 * i + j ];\n\n\t\t\t\t\t\tcoords[ index + 0 ] = vertices.getX( index2 );\n\t\t\t\t\t\tcoords[ index + 1 ] = vertices.getY( index2 );\n\t\t\t\t\t\tcoords[ index + 2 ] = vertices.getZ( index2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.addAttribute( 'position', new BufferAttribute( coords, 3 ) );\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tvar vertices = geometry.attributes.position.array;\n\t\t\t\tvar numEdges = vertices.length / 3;\n\t\t\t\tvar numTris = numEdges / 3;\n\n\t\t\t\tvar coords = new Float32Array( numEdges * 2 * 3 );\n\n\t\t\t\tfor ( var i = 0, l = numTris; i < l; i ++ ) {\n\n\t\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\tvar index = 18 * i + 6 * j;\n\n\t\t\t\t\t\tvar index1 = 9 * i + 3 * j;\n\t\t\t\t\t\tcoords[ index + 0 ] = vertices[ index1 ];\n\t\t\t\t\t\tcoords[ index + 1 ] = vertices[ index1 + 1 ];\n\t\t\t\t\t\tcoords[ index + 2 ] = vertices[ index1 + 2 ];\n\n\t\t\t\t\t\tvar index2 = 9 * i + 3 * ( ( j + 1 ) % 3 );\n\t\t\t\t\t\tcoords[ index + 3 ] = vertices[ index2 ];\n\t\t\t\t\t\tcoords[ index + 4 ] = vertices[ index2 + 1 ];\n\t\t\t\t\t\tcoords[ index + 5 ] = vertices[ index2 + 2 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.addAttribute( 'position', new BufferAttribute( coords, 3 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tWireframeGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tWireframeGeometry.prototype.constructor = WireframeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricBufferGeometry( func, slices, stacks ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ParametricBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\t// generate vertices and uvs\n\n\t\tvar vertices = [];\n\t\tvar uvs = [];\n\n\t\tvar i, j, p;\n\t\tvar u, v;\n\n\t\tvar sliceCount = slices + 1;\n\n\t\tfor ( i = 0; i <= stacks; i ++ ) {\n\n\t\t\tv = i / stacks;\n\n\t\t\tfor ( j = 0; j <= slices; j ++ ) {\n\n\t\t\t\tu = j / slices;\n\n\t\t\t\tp = func( u, v );\n\t\t\t\tvertices.push( p.x, p.y, p.z );\n\n\t\t\t\tuvs.push( u, v );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tvar indices = [];\n\t\tvar a, b, c, d;\n\n\t\tfor ( i = 0; i < stacks; i ++ ) {\n\n\t\t\tfor ( j = 0; j < slices; j ++ ) {\n\n\t\t\t\ta = i * sliceCount + j;\n\t\t\t\tb = i * sliceCount + j + 1;\n\t\t\t\tc = ( i + 1 ) * sliceCount + j + 1;\n\t\t\t\td = ( i + 1 ) * sliceCount + j;\n\n\t\t\t\t// faces one and two\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.length > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) );\n\t\tthis.addAttribute( 'position', Float32Attribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'uv', Float32Attribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t}\n\n\tParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;\n\n\t/**\n\t * @author zz85 / https://github.com/zz85\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricGeometry( func, slices, stacks ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ParametricGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tParametricGeometry.prototype = Object.create( Geometry.prototype );\n\tParametricGeometry.prototype.constructor = ParametricGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction PolyhedronBufferGeometry( vertices, indices, radius, detail ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronBufferGeometry';\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\tradius = radius || 1;\n\t\tdetail = detail || 0;\n\n\t\t// default buffer data\n\n\t\tvar vertexBuffer = [];\n\t\tvar 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\tappplyRadius( 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.addAttribute( 'position', Float32Attribute( vertexBuffer, 3 ) );\n\t\tthis.addAttribute( 'normal', Float32Attribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.addAttribute( 'uv', Float32Attribute( uvBuffer, 2 ) );\n\t\tthis.normalizeNormals();\n\n\t\tthis.boundingSphere = new Sphere( new Vector3(), radius );\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\t\tfor ( var 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\tvar cols = Math.pow( 2, detail );\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tvar v = [];\n\n\t\t\tvar i, j;\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( i = 0 ; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tvar aj = a.clone().lerp( c, i / cols );\n\t\t\t\tvar bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tvar rows = cols - i;\n\n\t\t\t\tfor ( 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 ( i = 0; i < cols ; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tvar 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 appplyRadius( radius ) {\n\n\t\t\tvar 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 ( var 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\tvar vertex = new Vector3();\n\n\t\t\tfor ( var 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\tvar u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tvar 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 ( var i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tvar x0 = uvBuffer[ i + 0 ];\n\t\t\t\tvar x1 = uvBuffer[ i + 2 ];\n\t\t\t\tvar x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tvar max = Math.max( x0, x1, x2 );\n\t\t\t\tvar 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\tvar 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\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\tvar centroid = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tfor ( var 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\tvar 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\tPolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TetrahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tTetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tTetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction TetrahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTetrahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tTetrahedronGeometry.prototype.constructor = TetrahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction OctahedronBufferGeometry( radius,detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tOctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tOctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction OctahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tOctahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tOctahedronGeometry.prototype.constructor = OctahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction IcosahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tvar vertices = [\n\t\t\t- 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0,\n\t\t\t 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t,\n\t\t\t t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11,\n\t\t\t 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8,\n\t\t\t 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9,\n\t\t\t 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tIcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tIcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction IcosahedronGeometry( radius, detail ) {\n\n\t \tGeometry.call( this );\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\tthis.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tIcosahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tIcosahedronGeometry.prototype.constructor = IcosahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction DodecahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tvar r = 1 / t;\n\n\t\tvar vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1, - 1, - 1, 1,\n\t\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t\t 1, - 1, - 1, 1, - 1, 1,\n\t\t\t 1, 1, - 1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t 0, - r, - t, 0, - r, t,\n\t\t\t 0, 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\t r, - 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\tvar indices = [\n\t\t\t 3, 11, 7, 3, 7, 15, 3, 15, 13,\n\t\t\t 7, 19, 17, 7, 17, 6, 7, 6, 15,\n\t\t\t17, 4, 8, 17, 8, 10, 17, 10, 6,\n\t\t\t 8, 0, 16, 8, 16, 2, 8, 2, 10,\n\t\t\t 0, 12, 1, 0, 1, 18, 0, 18, 16,\n\t\t\t 6, 10, 2, 6, 2, 13, 6, 13, 15,\n\t\t\t 2, 16, 18, 2, 18, 3, 2, 3, 13,\n\t\t\t18, 1, 9, 18, 9, 11, 18, 11, 3,\n\t\t\t 4, 14, 12, 4, 12, 0, 4, 0, 8,\n\t\t\t11, 9, 5, 11, 5, 19, 11, 19, 7,\n\t\t\t19, 5, 14, 19, 14, 4, 19, 4, 17,\n\t\t\t 1, 12, 14, 1, 14, 5, 1, 5, 9\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tDodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tDodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;\n\n\t/**\n\t * @author Abe Pazos / https://hamoid.com\n\t */\n\n\tfunction DodecahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tDodecahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tDodecahedronGeometry.prototype.constructor = DodecahedronGeometry;\n\n\t/**\n\t * @author clockworkgeek / https://github.com/clockworkgeek\n\t * @author timothypratley / https://github.com/timothypratley\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction PolyhedronGeometry( vertices, indices, radius, detail ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tPolyhedronGeometry.prototype = Object.create( Geometry.prototype );\n\tPolyhedronGeometry.prototype.constructor = PolyhedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Creates a tube which extrudes along a 3d spline.\n\t *\n\t */\n\n\tfunction TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TubeBufferGeometry';\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\ttubularSegments = tubularSegments || 64;\n\t\tradius = radius || 1;\n\t\tradialSegments = radialSegments || 8;\n\t\tclosed = closed || false;\n\n\t\tvar 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\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar i, j;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\t\tvar indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( ( indices.length > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) );\n\t\tthis.addAttribute( 'position', Float32Attribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', Float32Attribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', Float32Attribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( 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\tvar P = path.getPointAt( i / tubularSegments );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tvar N = frames.normals[ i ];\n\t\t\tvar B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tvar sin = Math.sin( v );\n\t\t\t\tvar 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 ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tvar 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 ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( 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\tTubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTubeBufferGeometry.prototype.constructor = TubeBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode / https://github.com/oosmoxiecode\n\t * @author WestLangley / https://github.com/WestLangley\n\t * @author zz85 / https://github.com/zz85\n\t * @author miningold / https://github.com/miningold\n\t * @author jonobr1 / https://github.com/jonobr1\n\t *\n\t * Creates a tube which extrudes along a 3d spline.\n\t */\n\n\tfunction TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) {\n\n\t\tGeometry.call( this );\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\tif ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );\n\n\t\tvar bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = bufferGeometry.tangents;\n\t\tthis.normals = bufferGeometry.normals;\n\t\tthis.binormals = bufferGeometry.binormals;\n\n\t\t// create geometry\n\n\t\tthis.fromBufferGeometry( bufferGeometry );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTubeGeometry.prototype = Object.create( Geometry.prototype );\n\tTubeGeometry.prototype.constructor = TubeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * see: http://www.blackpawn.com/texts/pqtorus/\n\t */\n\tfunction TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotBufferGeometry';\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\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 64;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\tp = p || 2;\n\t\tq = q || 3;\n\n\t\t// used to calculate buffer length\n\t\tvar vertexCount = ( ( radialSegments + 1 ) * ( tubularSegments + 1 ) );\n\t\tvar indexCount = radialSegments * tubularSegments * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// helper variables\n\t\tvar i, j, index = 0, indexOffset = 0;\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar P1 = new Vector3();\n\t\tvar P2 = new Vector3();\n\n\t\tvar B = new Vector3();\n\t\tvar T = new Vector3();\n\t\tvar N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( 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 segement\n\n\t\t\tvar 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 ( 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\tvar v = j / radialSegments * Math.PI * 2;\n\t\t\t\tvar cx = - tube * Math.cos( v );\n\t\t\t\tvar 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 vectos, 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\t// vertex\n\t\t\t\tvertices.setXYZ( index, 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\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\t\t\t\tnormals.setXYZ( index, normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\tuv.y = j / radialSegments;\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// face one\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t\t// face two\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\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\tvar cu = Math.cos( u );\n\t\t\tvar su = Math.sin( u );\n\t\t\tvar quOverP = q / p * u;\n\t\t\tvar 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\tTorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t */\n\n\tfunction TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {\n\n\t\tGeometry.call( this );\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\tif( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );\n\n\t\tthis.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTorusKnotGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusKnotGeometry.prototype.constructor = TorusKnotGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusBufferGeometry';\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\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 6;\n\t\tarc = arc || Math.PI * 2;\n\n\t\t// used to calculate buffer length\n\t\tvar vertexCount = ( ( radialSegments + 1 ) * ( tubularSegments + 1 ) );\n\t\tvar indexCount = radialSegments * tubularSegments * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount );\n\t\tvar vertices = new Float32Array( vertexCount * 3 );\n\t\tvar normals = new Float32Array( vertexCount * 3 );\n\t\tvar uvs = new Float32Array( vertexCount * 2 );\n\n\t\t// offset variables\n\t\tvar vertexBufferOffset = 0;\n\t\tvar uvBufferOffset = 0;\n\t\tvar indexBufferOffset = 0;\n\n\t\t// helper variables\n\t\tvar center = new Vector3();\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tvar u = i / tubularSegments * arc;\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\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[ vertexBufferOffset ] = vertex.x;\n\t\t\t\tvertices[ vertexBufferOffset + 1 ] = vertex.y;\n\t\t\t\tvertices[ vertexBufferOffset + 2 ] = vertex.z;\n\n\t\t\t\t// this vector is used to calculate the normal\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\n\t\t\t\t// normal\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals[ vertexBufferOffset ] = normal.x;\n\t\t\t\tnormals[ vertexBufferOffset + 1 ] = normal.y;\n\t\t\t\tnormals[ vertexBufferOffset + 2 ] = normal.z;\n\n\t\t\t\t// uv\n\t\t\t\tuvs[ uvBufferOffset ] = i / tubularSegments;\n\t\t\t\tuvs[ uvBufferOffset + 1 ] = j / radialSegments;\n\n\t\t\t\t// update offsets\n\t\t\t\tvertexBufferOffset += 3;\n\t\t\t\tuvBufferOffset += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\t\t\t\tvar a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tvar b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tvar c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tvar d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// face one\n\t\t\t\tindices[ indexBufferOffset ] = a;\n\t\t\t\tindices[ indexBufferOffset + 1 ] = b;\n\t\t\t\tindices[ indexBufferOffset + 2 ] = d;\n\n\t\t\t\t// face two\n\t\t\t\tindices[ indexBufferOffset + 3 ] = b;\n\t\t\t\tindices[ indexBufferOffset + 4 ] = c;\n\t\t\t\tindices[ indexBufferOffset + 5 ] = d;\n\n\t\t\t\t// update offset\n\t\t\t\tindexBufferOffset += 6;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\t\tthis.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tTorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusBufferGeometry.prototype.constructor = TorusBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888\n\t */\n\n\tfunction TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );\n\n\t}\n\n\tTorusGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusGeometry.prototype.constructor = TorusGeometry;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tvar ShapeUtils = {\n\n\t\t// calculate area of the contour polygon\n\n\t\tarea: function ( contour ) {\n\n\t\t\tvar n = contour.length;\n\t\t\tvar a = 0.0;\n\n\t\t\tfor ( var p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t\t}\n\n\t\t\treturn a * 0.5;\n\n\t\t},\n\n\t\ttriangulate: ( function () {\n\n\t\t\t/**\n\t\t\t * This code is a quick port of code written in C++ which was submitted to\n\t\t\t * flipcode.com by John W. Ratcliff // July 22, 2000\n\t\t\t * See original code and more information here:\n\t\t\t * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml\n\t\t\t *\n\t\t\t * ported to actionscript by Zevan Rosser\n\t\t\t * www.actionsnippet.com\n\t\t\t *\n\t\t\t * ported to javascript by Joshua Koo\n\t\t\t * http://www.lab4games.net/zz85/blog\n\t\t\t *\n\t\t\t */\n\n\t\t\tfunction snip( contour, u, v, w, n, verts ) {\n\n\t\t\t\tvar p;\n\t\t\t\tvar ax, ay, bx, by;\n\t\t\t\tvar cx, cy, px, py;\n\n\t\t\t\tax = contour[ verts[ u ] ].x;\n\t\t\t\tay = contour[ verts[ u ] ].y;\n\n\t\t\t\tbx = contour[ verts[ v ] ].x;\n\t\t\t\tby = contour[ verts[ v ] ].y;\n\n\t\t\t\tcx = contour[ verts[ w ] ].x;\n\t\t\t\tcy = contour[ verts[ w ] ].y;\n\n\t\t\t\tif ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false;\n\n\t\t\t\tvar aX, aY, bX, bY, cX, cY;\n\t\t\t\tvar apx, apy, bpx, bpy, cpx, cpy;\n\t\t\t\tvar cCROSSap, bCROSScp, aCROSSbp;\n\n\t\t\t\taX = cx - bx; aY = cy - by;\n\t\t\t\tbX = ax - cx; bY = ay - cy;\n\t\t\t\tcX = bx - ax; cY = by - ay;\n\n\t\t\t\tfor ( p = 0; p < n; p ++ ) {\n\n\t\t\t\t\tpx = contour[ verts[ p ] ].x;\n\t\t\t\t\tpy = contour[ verts[ p ] ].y;\n\n\t\t\t\t\tif ( ( ( px === ax ) && ( py === ay ) ) ||\n\t\t\t\t\t\t ( ( px === bx ) && ( py === by ) ) ||\n\t\t\t\t\t\t ( ( px === cx ) && ( py === cy ) ) )\tcontinue;\n\n\t\t\t\t\tapx = px - ax; apy = py - ay;\n\t\t\t\t\tbpx = px - bx; bpy = py - by;\n\t\t\t\t\tcpx = px - cx; cpy = py - cy;\n\n\t\t\t\t\t// see if p is inside triangle abc\n\n\t\t\t\t\taCROSSbp = aX * bpy - aY * bpx;\n\t\t\t\t\tcCROSSap = cX * apy - cY * apx;\n\t\t\t\t\tbCROSScp = bX * cpy - bY * cpx;\n\n\t\t\t\t\tif ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false;\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// takes in an contour array and returns\n\n\t\t\treturn function triangulate( contour, indices ) {\n\n\t\t\t\tvar n = contour.length;\n\n\t\t\t\tif ( n < 3 ) return null;\n\n\t\t\t\tvar result = [],\n\t\t\t\t\tverts = [],\n\t\t\t\t\tvertIndices = [];\n\n\t\t\t\t/* we want a counter-clockwise polygon in verts */\n\n\t\t\t\tvar u, v, w;\n\n\t\t\t\tif ( ShapeUtils.area( contour ) > 0.0 ) {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = v;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v;\n\n\t\t\t\t}\n\n\t\t\t\tvar nv = n;\n\n\t\t\t\t/* remove nv - 2 vertices, creating 1 triangle every time */\n\n\t\t\t\tvar count = 2 * nv; /* error detection */\n\n\t\t\t\tfor ( v = nv - 1; nv > 2; ) {\n\n\t\t\t\t\t/* if we loop, it is probably a non-simple polygon */\n\n\t\t\t\t\tif ( ( count -- ) <= 0 ) {\n\n\t\t\t\t\t\t//** Triangulate: ERROR - probable bad polygon!\n\n\t\t\t\t\t\t//throw ( \"Warning, unable to triangulate polygon!\" );\n\t\t\t\t\t\t//return null;\n\t\t\t\t\t\t// Sometimes warning is fine, especially polygons are triangulated in reverse.\n\t\t\t\t\t\tconsole.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' );\n\n\t\t\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t/* three consecutive vertices in current polygon, */\n\n\t\t\t\t\tu = v; \t \tif ( nv <= u ) u = 0; /* previous */\n\t\t\t\t\tv = u + 1; if ( nv <= v ) v = 0; /* new v */\n\t\t\t\t\tw = v + 1; if ( nv <= w ) w = 0; /* next */\n\n\t\t\t\t\tif ( snip( contour, u, v, w, nv, verts ) ) {\n\n\t\t\t\t\t\tvar a, b, c, s, t;\n\n\t\t\t\t\t\t/* true names of the vertices */\n\n\t\t\t\t\t\ta = verts[ u ];\n\t\t\t\t\t\tb = verts[ v ];\n\t\t\t\t\t\tc = verts[ w ];\n\n\t\t\t\t\t\t/* output Triangle */\n\n\t\t\t\t\t\tresult.push( [ contour[ a ],\n\t\t\t\t\t\t\tcontour[ b ],\n\t\t\t\t\t\t\tcontour[ c ] ] );\n\n\n\t\t\t\t\t\tvertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] );\n\n\t\t\t\t\t\t/* remove v from the remaining polygon */\n\n\t\t\t\t\t\tfor ( s = v, t = v + 1; t < nv; s ++, t ++ ) {\n\n\t\t\t\t\t\t\tverts[ s ] = verts[ t ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnv --;\n\n\t\t\t\t\t\t/* reset error detection counter */\n\n\t\t\t\t\t\tcount = 2 * nv;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\treturn result;\n\n\t\t\t}\n\n\t\t} )(),\n\n\t\ttriangulateShape: function ( contour, holes ) {\n\n\t\t\tfunction removeDupEndPts(points) {\n\n\t\t\t\tvar l = points.length;\n\n\t\t\t\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\t\tpoints.pop();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tremoveDupEndPts( contour );\n\t\t\tholes.forEach( removeDupEndPts );\n\n\t\t\tfunction point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) {\n\n\t\t\t\t// inOtherPt needs to be collinear to the inSegment\n\t\t\t\tif ( inSegPt1.x !== inSegPt2.x ) {\n\n\t\t\t\t\tif ( inSegPt1.x < inSegPt2.x ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( inSegPt1.y < inSegPt2.y ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) {\n\n\t\t\t\tvar seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y;\n\t\t\t\tvar seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y;\n\n\t\t\t\tvar seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x;\n\t\t\t\tvar seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y;\n\n\t\t\t\tvar limit\t\t= seg1dy * seg2dx - seg1dx * seg2dy;\n\t\t\t\tvar perpSeg1\t= seg1dy * seg1seg2dx - seg1dx * seg1seg2dy;\n\n\t\t\t\tif ( Math.abs( limit ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\n\t\t\t\t\tvar perpSeg2;\n\t\t\t\t\tif ( limit > 0 ) {\n\n\t\t\t\t\t\tif ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) \t\treturn [];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) \t\treturn [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// i.e. to reduce rounding errors\n\t\t\t\t\t// intersection at endpoint of segment#1?\n\t\t\t\t\tif ( perpSeg2 === 0 ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( perpSeg2 === limit ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt2 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// intersection at endpoint of segment#2?\n\t\t\t\t\tif ( perpSeg1 === 0 )\t\treturn [ inSeg2Pt1 ];\n\t\t\t\t\tif ( perpSeg1 === limit )\treturn [ inSeg2Pt2 ];\n\n\t\t\t\t\t// return real intersection point\n\t\t\t\t\tvar factorSeg1 = perpSeg2 / limit;\n\t\t\t\t\treturn\t[ { x: inSeg1Pt1.x + factorSeg1 * seg1dx,\n\t\t\t\t\t\t\t\ty: inSeg1Pt1.y + factorSeg1 * seg1dy } ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( ( perpSeg1 !== 0 ) ||\n\t\t\t\t\t\t ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) \t\t\treturn [];\n\n\t\t\t\t\t// they are collinear or degenerate\n\t\t\t\t\tvar seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) );\t// segment1 is just a point?\n\t\t\t\t\tvar seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) );\t// segment2 is just a point?\n\t\t\t\t\t// both segments are points\n\t\t\t\t\tif ( seg1Pt && seg2Pt ) {\n\n\t\t\t\t\t\tif ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) ||\n\t\t\t\t\t\t\t ( inSeg1Pt1.y !== inSeg2Pt1.y ) )\t\treturn [];\t// they are distinct points\n\t\t\t\t\t\treturn [ inSeg1Pt1 ]; \t\t\t\t\t\t// they are the same point\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#1 is a single point\n\t\t\t\t\tif ( seg1Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) )\t\treturn [];\t\t// but not in segment#2\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#2 is a single point\n\t\t\t\t\tif ( seg2Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) )\t\treturn [];\t\t// but not in segment#1\n\t\t\t\t\t\treturn [ inSeg2Pt1 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// they are collinear segments, which might overlap\n\t\t\t\t\tvar seg1min, seg1max, seg1minVal, seg1maxVal;\n\t\t\t\t\tvar seg2min, seg2max, seg2minVal, seg2maxVal;\n\t\t\t\t\tif ( seg1dx !== 0 ) {\n\n\t\t\t\t\t\t// the segments are NOT on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.x < inSeg1Pt2.x ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.x < inSeg2Pt2.x ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// the segments are on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.y < inSeg1Pt2.y ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.y < inSeg2Pt2.y ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( seg1minVal <= seg2minVal ) {\n\n\t\t\t\t\t\tif ( seg1maxVal < seg2minVal )\treturn [];\n\t\t\t\t\t\tif ( seg1maxVal === seg2minVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg2min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg2min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg2min, seg2max ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( seg1minVal > seg2maxVal )\treturn [];\n\t\t\t\t\t\tif ( seg1minVal === seg2maxVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg1min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg1min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg1min, seg2max ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) {\n\n\t\t\t\t// The order of legs is important\n\n\t\t\t\t// translation of all points, so that Vertex is at (0,0)\n\t\t\t\tvar legFromPtX\t= inLegFromPt.x - inVertex.x, legFromPtY\t= inLegFromPt.y - inVertex.y;\n\t\t\t\tvar legToPtX\t= inLegToPt.x\t- inVertex.x, legToPtY\t\t= inLegToPt.y\t- inVertex.y;\n\t\t\t\tvar otherPtX\t= inOtherPt.x\t- inVertex.x, otherPtY\t\t= inOtherPt.y\t- inVertex.y;\n\n\t\t\t\t// main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg.\n\t\t\t\tvar from2toAngle\t= legFromPtX * legToPtY - legFromPtY * legToPtX;\n\t\t\t\tvar from2otherAngle\t= legFromPtX * otherPtY - legFromPtY * otherPtX;\n\n\t\t\t\tif ( Math.abs( from2toAngle ) > Number.EPSILON ) {\n\n\t\t\t\t\t// angle != 180 deg.\n\n\t\t\t\t\tvar other2toAngle\t\t= otherPtX * legToPtY - otherPtY * legToPtX;\n\t\t\t\t\t// console.log( \"from2to: \" + from2toAngle + \", from2other: \" + from2otherAngle + \", other2to: \" + other2toAngle );\n\n\t\t\t\t\tif ( from2toAngle > 0 ) {\n\n\t\t\t\t\t\t// main angle < 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// main angle > 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// angle == 180 deg.\n\t\t\t\t\t// console.log( \"from2to: 180 deg., from2other: \" + from2otherAngle );\n\t\t\t\t\treturn\t( from2otherAngle > 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tfunction removeHoles( contour, holes ) {\n\n\t\t\t\tvar shape = contour.concat(); // work on this shape\n\t\t\t\tvar hole;\n\n\t\t\t\tfunction isCutLineInsideAngles( inShapeIdx, inHoleIdx ) {\n\n\t\t\t\t\t// Check if hole point lies within angle around shape point\n\t\t\t\t\tvar lastShapeIdx = shape.length - 1;\n\n\t\t\t\t\tvar prevShapeIdx = inShapeIdx - 1;\n\t\t\t\t\tif ( prevShapeIdx < 0 )\t\t\tprevShapeIdx = lastShapeIdx;\n\n\t\t\t\t\tvar nextShapeIdx = inShapeIdx + 1;\n\t\t\t\t\tif ( nextShapeIdx > lastShapeIdx )\tnextShapeIdx = 0;\n\n\t\t\t\t\tvar insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Shape): \" + inShapeIdx + \", Point: \" + hole[inHoleIdx].x + \"/\" + hole[inHoleIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check if shape point lies within angle around hole point\n\t\t\t\t\tvar lastHoleIdx = hole.length - 1;\n\n\t\t\t\t\tvar prevHoleIdx = inHoleIdx - 1;\n\t\t\t\t\tif ( prevHoleIdx < 0 )\t\t\tprevHoleIdx = lastHoleIdx;\n\n\t\t\t\t\tvar nextHoleIdx = inHoleIdx + 1;\n\t\t\t\t\tif ( nextHoleIdx > lastHoleIdx )\tnextHoleIdx = 0;\n\n\t\t\t\t\tinsideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Hole): \" + inHoleIdx + \", Point: \" + shape[inShapeIdx].x + \"/\" + shape[inShapeIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\ttrue;\n\n\t\t\t\t}\n\n\t\t\t\tfunction intersectsShapeEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with shape edges\n\t\t\t\t\tvar sIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( sIdx = 0; sIdx < shape.length; sIdx ++ ) {\n\n\t\t\t\t\t\tnextIdx = sIdx + 1; nextIdx %= shape.length;\n\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true );\n\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar indepHoles = [];\n\n\t\t\t\tfunction intersectsHoleEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with hole edges\n\t\t\t\t\tvar ihIdx, chkHole,\n\t\t\t\t\t\thIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) {\n\n\t\t\t\t\t\tchkHole = holes[ indepHoles[ ihIdx ]];\n\t\t\t\t\t\tfor ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) {\n\n\t\t\t\t\t\t\tnextIdx = hIdx + 1; nextIdx %= chkHole.length;\n\t\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true );\n\t\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar holeIndex, shapeIndex,\n\t\t\t\t\tshapePt, holePt,\n\t\t\t\t\tholeIdx, cutKey, failedCuts = [],\n\t\t\t\t\ttmpShape1, tmpShape2,\n\t\t\t\t\ttmpHole1, tmpHole2;\n\n\t\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tindepHoles.push( h );\n\n\t\t\t\t}\n\n\t\t\t\tvar minShapeIndex = 0;\n\t\t\t\tvar counter = indepHoles.length * 2;\n\t\t\t\twhile ( indepHoles.length > 0 ) {\n\n\t\t\t\t\tcounter --;\n\t\t\t\t\tif ( counter < 0 ) {\n\n\t\t\t\t\t\tconsole.log( \"Infinite Loop! Holes left:\" + indepHoles.length + \", Probably Hole outside Shape!\" );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// search for shape-vertex and hole-vertex,\n\t\t\t\t\t// which can be connected without intersections\n\t\t\t\t\tfor ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) {\n\n\t\t\t\t\t\tshapePt = shape[ shapeIndex ];\n\t\t\t\t\t\tholeIndex\t= - 1;\n\n\t\t\t\t\t\t// search for hole which can be reached without intersections\n\t\t\t\t\t\tfor ( var h = 0; h < indepHoles.length; h ++ ) {\n\n\t\t\t\t\t\t\tholeIdx = indepHoles[ h ];\n\n\t\t\t\t\t\t\t// prevent multiple checks\n\t\t\t\t\t\t\tcutKey = shapePt.x + \":\" + shapePt.y + \":\" + holeIdx;\n\t\t\t\t\t\t\tif ( failedCuts[ cutKey ] !== undefined )\t\t\tcontinue;\n\n\t\t\t\t\t\t\thole = holes[ holeIdx ];\n\t\t\t\t\t\t\tfor ( var h2 = 0; h2 < hole.length; h2 ++ ) {\n\n\t\t\t\t\t\t\t\tholePt = hole[ h2 ];\n\t\t\t\t\t\t\t\tif ( ! isCutLineInsideAngles( shapeIndex, h2 ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsShapeEdge( shapePt, holePt ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsHoleEdge( shapePt, holePt ) )\t\tcontinue;\n\n\t\t\t\t\t\t\t\tholeIndex = h2;\n\t\t\t\t\t\t\t\tindepHoles.splice( h, 1 );\n\n\t\t\t\t\t\t\t\ttmpShape1 = shape.slice( 0, shapeIndex + 1 );\n\t\t\t\t\t\t\t\ttmpShape2 = shape.slice( shapeIndex );\n\t\t\t\t\t\t\t\ttmpHole1 = hole.slice( holeIndex );\n\t\t\t\t\t\t\t\ttmpHole2 = hole.slice( 0, holeIndex + 1 );\n\n\t\t\t\t\t\t\t\tshape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 );\n\n\t\t\t\t\t\t\t\tminShapeIndex = shapeIndex;\n\n\t\t\t\t\t\t\t\t// Debug only, to show the selected cuts\n\t\t\t\t\t\t\t\t// glob_CutLines.push( [ shapePt, holePt ] );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t\t\tfailedCuts[ cutKey ] = true;\t\t\t// remember failure\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn shape; \t\t\t/* shape with no holes */\n\n\t\t\t}\n\n\n\t\t\tvar i, il, f, face,\n\t\t\t\tkey, index,\n\t\t\t\tallPointsMap = {};\n\n\t\t\t// To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first.\n\n\t\t\tvar allpoints = contour.concat();\n\n\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( allpoints, holes[ h ] );\n\n\t\t\t}\n\n\t\t\t//console.log( \"allpoints\",allpoints, allpoints.length );\n\n\t\t\t// prepare all points map\n\n\t\t\tfor ( i = 0, il = allpoints.length; i < il; i ++ ) {\n\n\t\t\t\tkey = allpoints[ i ].x + \":\" + allpoints[ i ].y;\n\n\t\t\t\tif ( allPointsMap[ key ] !== undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.ShapeUtils: Duplicate point\", key, i );\n\n\t\t\t\t}\n\n\t\t\t\tallPointsMap[ key ] = i;\n\n\t\t\t}\n\n\t\t\t// remove holes by cutting paths to holes and adding them to the shape\n\t\t\tvar shapeWithoutHoles = removeHoles( contour, holes );\n\n\t\t\tvar triangles = ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape\n\t\t\t//console.log( \"triangles\",triangles, triangles.length );\n\n\t\t\t// check all face vertices against all points map\n\n\t\t\tfor ( i = 0, il = triangles.length; i < il; i ++ ) {\n\n\t\t\t\tface = triangles[ i ];\n\n\t\t\t\tfor ( f = 0; f < 3; f ++ ) {\n\n\t\t\t\t\tkey = face[ f ].x + \":\" + face[ f ].y;\n\n\t\t\t\t\tindex = allPointsMap[ key ];\n\n\t\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\t\tface[ f ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn triangles.concat();\n\n\t\t},\n\n\t\tisClockWise: function ( pts ) {\n\n\t\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t\t},\n\n\t\t// Bezier Curves formulas obtained from\n\t\t// http://en.wikipedia.org/wiki/B%C3%A9zier_curve\n\n\t\t// Quad Bezier Functions\n\n\t\tb2: ( function () {\n\n\t\t\tfunction b2p0( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn k * k * p;\n\n\t\t\t}\n\n\t\t\tfunction b2p1( t, p ) {\n\n\t\t\t\treturn 2 * ( 1 - t ) * t * p;\n\n\t\t\t}\n\n\t\t\tfunction b2p2( t, p ) {\n\n\t\t\t\treturn t * t * p;\n\n\t\t\t}\n\n\t\t\treturn function b2( t, p0, p1, p2 ) {\n\n\t\t\t\treturn b2p0( t, p0 ) + b2p1( t, p1 ) + b2p2( t, p2 );\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\t// Cubic Bezier Functions\n\n\t\tb3: ( function () {\n\n\t\t\tfunction b3p0( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn k * k * k * p;\n\n\t\t\t}\n\n\t\t\tfunction b3p1( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn 3 * k * k * t * p;\n\n\t\t\t}\n\n\t\t\tfunction b3p2( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn 3 * k * t * t * p;\n\n\t\t\t}\n\n\t\t\tfunction b3p3( t, p ) {\n\n\t\t\t\treturn t * t * t * p;\n\n\t\t\t}\n\n\t\t\treturn function b3( t, p0, p1, p2, p3 ) {\n\n\t\t\t\treturn b3p0( t, p0 ) + b3p1( t, p1 ) + b3p2( t, p2 ) + b3p3( t, p3 );\n\n\t\t\t};\n\n\t\t} )()\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Creates extruded geometry from a path shape.\n\t *\n\t * parameters = {\n\t *\n\t * curveSegments: , // number of points on the curves\n\t * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n\t * amount: , // Depth to extrude the shape\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into the original shape bevel goes\n\t * bevelSize: , // how far from shape outline is bevel\n\t * bevelSegments: , // number of bevel layers\n\t *\n\t * extrudePath: // 3d spline path to extrude shape along. (creates Frames if .frames aren't defined)\n\t * frames: // containing arrays of tangents, normals, binormals\n\t *\n\t * uvGenerator: // object that provides UV generator functions\n\t *\n\t * }\n\t **/\n\n\tfunction ExtrudeGeometry( shapes, options ) {\n\n\t\tif ( typeof( shapes ) === \"undefined\" ) {\n\n\t\t\tshapes = [];\n\t\t\treturn;\n\n\t\t}\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tthis.addShapeList( shapes, options );\n\n\t\tthis.computeFaceNormals();\n\n\t\t// can't really use automatic vertex normals\n\t\t// as then front and back sides get smoothed too\n\t\t// should do separate smoothing just for sides\n\n\t\t//this.computeVertexNormals();\n\n\t\t//console.log( \"took\", ( Date.now() - startTime ) );\n\n\t}\n\n\tExtrudeGeometry.prototype = Object.create( Geometry.prototype );\n\tExtrudeGeometry.prototype.constructor = ExtrudeGeometry;\n\n\tExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) {\n\n\t\tvar sl = shapes.length;\n\n\t\tfor ( var s = 0; s < sl; s ++ ) {\n\n\t\t\tvar shape = shapes[ s ];\n\t\t\tthis.addShape( shape, options );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.prototype.addShape = function ( shape, options ) {\n\n\t\tvar amount = options.amount !== undefined ? options.amount : 100;\n\n\t\tvar bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10\n\t\tvar bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8\n\t\tvar bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\tvar bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false\n\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\n\t\tvar steps = options.steps !== undefined ? options.steps : 1;\n\n\t\tvar extrudePath = options.extrudePath;\n\t\tvar extrudePts, extrudeByPath = false;\n\n\t\t// Use default WorldUVGenerator if no UV generators are specified.\n\t\tvar uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator;\n\n\t\tvar splineTube, binormal, normal, position2;\n\t\tif ( extrudePath ) {\n\n\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\textrudeByPath = true;\n\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t// SETUP TNB variables\n\n\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\tsplineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\tbinormal = new Vector3();\n\t\t\tnormal = new Vector3();\n\t\t\tposition2 = new Vector3();\n\n\t\t}\n\n\t\t// Safeguards if bevels are not enabled\n\n\t\tif ( ! bevelEnabled ) {\n\n\t\t\tbevelSegments = 0;\n\t\t\tbevelThickness = 0;\n\t\t\tbevelSize = 0;\n\n\t\t}\n\n\t\t// Variables initialization\n\n\t\tvar ahole, h, hl; // looping of holes\n\t\tvar scope = this;\n\n\t\tvar shapesOffset = this.vertices.length;\n\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)!\n\n\t\t}\n\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t/* Vertices */\n\n\t\tvar contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\tvertices = vertices.concat( ahole );\n\n\t\t}\n\n\n\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\tif ( ! vec ) console.error( \"THREE.ExtrudeGeometry: vec does not exist\" );\n\n\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t}\n\n\t\tvar b, bs, t, z,\n\t\t\tvert, vlen = vertices.length,\n\t\t\tface, flen = faces.length;\n\n\n\t\t// Find directions for point movement\n\n\n\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t//\n\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\tvar v_trans_x, v_trans_y, shrink_by = 1;\t\t// resulting translation vector for inPt\n\n\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\tvar v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y;\n\t\t\tvar v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y;\n\n\t\t\tvar v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t// check for collinear edges\n\t\t\tvar collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t// not collinear\n\n\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\tvar v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\tvar v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\tvar ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\tvar ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\tvar ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\tvar ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\tvar sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\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// vector from inPt to intersection point\n\n\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t// but prevent crazy spikes\n\t\t\t\tvar v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\treturn\tnew Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\tvar direction_eq = false;\t\t// assumes: opposite\n\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tnew Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t}\n\n\n\t\tvar contourMovements = [];\n\n\t\tfor ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\tif ( j === il ) j = 0;\n\t\t\tif ( k === il ) k = 0;\n\n\t\t\t// (j)---(i)---(k)\n\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t}\n\n\t\tvar holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\toneHoleMovements = [];\n\n\t\t\tfor ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t}\n\n\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t}\n\n\n\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\tfor ( b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tbs = bevelSize;\n\n\t\t// Back facing vertices\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t} else {\n\n\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add stepped vertices...\n\t\t// Including front facing vertices\n\n\t\tvar s;\n\n\t\tfor ( s = 1; s <= steps; s ++ ) {\n\n\t\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, amount / steps * s );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// Add bevel segments planes\n\n\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\tfor ( b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos ( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/* Faces */\n\n\t\t// Top and bottom faces\n\n\t\tbuildLidFaces();\n\n\t\t// Sides faces\n\n\t\tbuildSideFaces();\n\n\n\t\t///// Internal functions\n\n\t\tfunction buildLidFaces() {\n\n\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\tvar layer = 0; // steps + 1\n\t\t\t\tvar offset = vlen * layer;\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Create faces for the z-sides of the shape\n\n\t\tfunction buildSideFaces() {\n\n\t\t\tvar layeroffset = 0;\n\t\t\tsidewalls( contour, layeroffset );\n\t\t\tlayeroffset += contour.length;\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t//, true\n\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\tvar j, k;\n\t\t\ti = contour.length;\n\n\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\tj = i;\n\t\t\t\tk = i - 1;\n\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\tvar s = 0, sl = steps + bevelSegments * 2;\n\n\t\t\t\tfor ( s = 0; s < sl; s ++ ) {\n\n\t\t\t\t\tvar slen1 = vlen * s;\n\t\t\t\t\tvar slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\tvar a = layeroffset + j + slen1,\n\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\tf4( a, b, c, d, contour, s, sl, j, k );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tfunction v( x, y, z ) {\n\n\t\t\tscope.vertices.push( new Vector3( x, y, z ) );\n\n\t\t}\n\n\t\tfunction f3( a, b, c ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, c, null, null, 0 ) );\n\n\t\t\tvar uvs = uvgen.generateTopUV( scope, a, b, c );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( uvs );\n\n\t\t}\n\n\t\tfunction f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\t\t\td += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, d, null, null, 1 ) );\n\t\t\tscope.faces.push( new Face3( b, c, d, null, null, 1 ) );\n\n\t\t\tvar uvs = uvgen.generateSideWallUV( scope, a, b, c, d );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ] );\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ] );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.WorldUVGenerator = {\n\n\t\tgenerateTopUV: function ( geometry, indexA, indexB, indexC ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a.x, a.y ),\n\t\t\t\tnew Vector2( b.x, b.y ),\n\t\t\t\tnew Vector2( c.x, c.y )\n\t\t\t];\n\n\t\t},\n\n\t\tgenerateSideWallUV: function ( geometry, indexA, indexB, indexC, indexD ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\t\t\tvar d = vertices[ indexD ];\n\n\t\t\tif ( Math.abs( a.y - b.y ) < 0.01 ) {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.x, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.x, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.x, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.x, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t} else {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.y, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.y, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.y, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.y, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t}\n\n\t\t}\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * Text = 3D Text\n\t *\n\t * parameters = {\n\t * font: , // font\n\t *\n\t * size: , // size of the text\n\t * height: , // thickness to extrude text\n\t * curveSegments: , // number of points on the curves\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into text bevel goes\n\t * bevelSize: // how far from text outline is bevel\n\t * }\n\t */\n\n\tfunction TextGeometry( text, parameters ) {\n\n\t\tparameters = parameters || {};\n\n\t\tvar font = parameters.font;\n\n\t\tif ( (font && font.isFont) === false ) {\n\n\t\t\tconsole.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );\n\t\t\treturn new Geometry();\n\n\t\t}\n\n\t\tvar shapes = font.generateShapes( text, parameters.size, parameters.curveSegments );\n\n\t\t// translate parameters to ExtrudeGeometry API\n\n\t\tparameters.amount = parameters.height !== undefined ? parameters.height : 50;\n\n\t\t// defaults\n\n\t\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\n\t\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\n\t\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\n\n\t\tExtrudeGeometry.call( this, shapes, parameters );\n\n\t\tthis.type = 'TextGeometry';\n\n\t}\n\n\tTextGeometry.prototype = Object.create( ExtrudeGeometry.prototype );\n\tTextGeometry.prototype.constructor = TextGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * based on THREE.SphereGeometry\n\t */\n\n\tfunction SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'SphereBufferGeometry';\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\tradius = radius || 50;\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );\n\n\t\tphiStart = phiStart !== undefined ? phiStart : 0;\n\t\tphiLength = phiLength !== undefined ? phiLength : Math.PI * 2;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI;\n\n\t\tvar thetaEnd = thetaStart + thetaLength;\n\n\t\tvar vertexCount = ( ( widthSegments + 1 ) * ( heightSegments + 1 ) );\n\n\t\tvar positions = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\tvar index = 0, vertices = [], normal = new Vector3();\n\n\t\tfor ( var y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\tvar verticesRow = [];\n\n\t\t\tvar v = y / heightSegments;\n\n\t\t\tfor ( var x = 0; x <= widthSegments; x ++ ) {\n\n\t\t\t\tvar u = x / widthSegments;\n\n\t\t\t\tvar px = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvar py = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvar pz = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tnormal.set( px, py, pz ).normalize();\n\n\t\t\t\tpositions.setXYZ( index, px, py, pz );\n\t\t\t\tnormals.setXYZ( index, normal.x, normal.y, normal.z );\n\t\t\t\tuvs.setXY( index, u, 1 - v );\n\n\t\t\t\tverticesRow.push( index );\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\tvertices.push( verticesRow );\n\n\t\t}\n\n\t\tvar indices = [];\n\n\t\tfor ( var y = 0; y < heightSegments; y ++ ) {\n\n\t\t\tfor ( var x = 0; x < widthSegments; x ++ ) {\n\n\t\t\t\tvar v1 = vertices[ y ][ x + 1 ];\n\t\t\t\tvar v2 = vertices[ y ][ x ];\n\t\t\t\tvar v3 = vertices[ y + 1 ][ x ];\n\t\t\t\tvar v4 = vertices[ y + 1 ][ x + 1 ];\n\n\t\t\t\tif ( y !== 0 || thetaStart > 0 ) indices.push( v1, v2, v4 );\n\t\t\t\tif ( y !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( v2, v3, v4 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( new ( positions.count > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) );\n\t\tthis.addAttribute( 'position', positions );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t\tthis.boundingSphere = new Sphere( new Vector3(), radius );\n\n\t}\n\n\tSphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tSphereBufferGeometry.prototype.constructor = SphereBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );\n\n\t}\n\n\tSphereGeometry.prototype = Object.create( Geometry.prototype );\n\tSphereGeometry.prototype.constructor = SphereGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'RingBufferGeometry';\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\tinnerRadius = innerRadius || 20;\n\t\touterRadius = outerRadius || 50;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\tthetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;\n\t\tphiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;\n\n\t\t// these are used to calculate buffer length\n\t\tvar vertexCount = ( thetaSegments + 1 ) * ( phiSegments + 1 );\n\t\tvar indexCount = thetaSegments * phiSegments * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// some helper variables\n\t\tvar index = 0, indexOffset = 0, segment;\n\t\tvar radius = innerRadius;\n\t\tvar radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\t// values are generate from the inside of the ring to the outside\n\n\t\tfor ( j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\tsegment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\t\t\t\tvertices.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\t\t\t\tnormals.setXYZ( index, 0, 0, 1 );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex++;\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tvar thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tsegment = i + thetaSegmentLevel;\n\n\t\t\t\t// indices\n\t\t\t\tvar a = segment;\n\t\t\t\tvar b = segment + thetaSegments + 1;\n\t\t\t\tvar c = segment + thetaSegments + 2;\n\t\t\t\tvar d = segment + 1;\n\n\t\t\t\t// face one\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\n\t\t\t\t// face two\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t}\n\n\tRingBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tRingBufferGeometry.prototype.constructor = RingBufferGeometry;\n\n\t/**\n\t * @author Kaleb Murphy\n\t */\n\n\tfunction RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );\n\n\t}\n\n\tRingGeometry.prototype = Object.create( Geometry.prototype );\n\tRingGeometry.prototype.constructor = RingGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );\n\n\t}\n\n\tPlaneGeometry.prototype = Object.create( Geometry.prototype );\n\tPlaneGeometry.prototype.constructor = PlaneGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\t // points - to create a closed torus, one must use a set of points\n\t // like so: [ a, b, c, d, a ], see first is the same as last.\n\t // segments - the number of circumference segments to create\n\t // phiStart - the starting radian\n\t // phiLength - the radian (0 to 2PI) range of the lathed section\n\t // 2PI is a closed lathe, less than 2PI is a portion.\n\n\tfunction LatheBufferGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'LatheBufferGeometry';\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 ) || 12;\n\t\tphiStart = phiStart || 0;\n\t\tphiLength = phiLength || Math.PI * 2;\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\t\tphiLength = _Math.clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// these are used to calculate buffer length\n\t\tvar vertexCount = ( segments + 1 ) * points.length;\n\t\tvar indexCount = segments * points.length * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// helper variables\n\t\tvar index = 0, indexOffset = 0, base;\n\t\tvar inverseSegments = 1.0 / segments;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar i, j;\n\n\t\t// generate vertices and uvs\n\n\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\tvar phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tvar sin = Math.sin( phi );\n\t\t\tvar cos = Math.cos( phi );\n\n\t\t\tfor ( j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\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\t\t\t\tvertices.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tbase = j + i * points.length;\n\n\t\t\t\t// indices\n\t\t\t\tvar a = base;\n\t\t\t\tvar b = base + points.length;\n\t\t\t\tvar c = base + points.length + 1;\n\t\t\t\tvar d = base + 1;\n\n\t\t\t\t// face one\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t\t// face two\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t\t// if the geometry is closed, we need to average the normals along the seam.\n\t\t// because the corresponding vertices are identical (but still have different UVs).\n\n\t\tif( phiLength === Math.PI * 2 ) {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\t\t\tvar n1 = new Vector3();\n\t\t\tvar n2 = new Vector3();\n\t\t\tvar n = new Vector3();\n\n\t\t\t// this is the buffer offset for the last line of vertices\n\t\t\tbase = segments * points.length * 3;\n\n\t\t\tfor( i = 0, j = 0; i < points.length; i ++, j += 3 ) {\n\n\t\t\t\t// select the normal of the vertex in the first line\n\t\t\t\tn1.x = normals[ j + 0 ];\n\t\t\t\tn1.y = normals[ j + 1 ];\n\t\t\t\tn1.z = normals[ j + 2 ];\n\n\t\t\t\t// select the normal of the vertex in the last line\n\t\t\t\tn2.x = normals[ base + j + 0 ];\n\t\t\t\tn2.y = normals[ base + j + 1 ];\n\t\t\t\tn2.z = normals[ base + j + 2 ];\n\n\t\t\t\t// average normals\n\t\t\t\tn.addVectors( n1, n2 ).normalize();\n\n\t\t\t\t// assign the new values to both normals\n\t\t\t\tnormals[ j + 0 ] = normals[ base + j + 0 ] = n.x;\n\t\t\t\tnormals[ j + 1 ] = normals[ base + j + 1 ] = n.y;\n\t\t\t\tnormals[ j + 2 ] = normals[ base + j + 2 ] = n.z;\n\n\t\t\t} // next row\n\n\t\t}\n\n\t}\n\n\tLatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tLatheBufferGeometry.prototype.constructor = LatheBufferGeometry;\n\n\t/**\n\t * @author astrodud / http://astrodud.isgreat.org/\n\t * @author zz85 / https://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t */\n\n\t// points - to create a closed torus, one must use a set of points\n\t// like so: [ a, b, c, d, a ], see first is the same as last.\n\t// segments - the number of circumference segments to create\n\t// phiStart - the starting radian\n\t// phiLength - the radian (0 to 2PI) range of the lathed section\n\t// 2PI is a closed lathe, less than 2PI is a portion.\n\n\tfunction LatheGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tLatheGeometry.prototype = Object.create( Geometry.prototype );\n\tLatheGeometry.prototype.constructor = LatheGeometry;\n\n\t/**\n\t * @author jonobr1 / http://jonobr1.com\n\t *\n\t * Creates a one-sided polygonal geometry from a path shape. Similar to\n\t * ExtrudeGeometry.\n\t *\n\t * parameters = {\n\t *\n\t *\tcurveSegments: , // number of points on the curves. NOT USED AT THE MOMENT.\n\t *\n\t *\tmaterial: // material index for front and back faces\n\t *\tuvGenerator: // object that provides UV generator functions\n\t *\n\t * }\n\t **/\n\n\tfunction ShapeGeometry( shapes, options ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tif ( Array.isArray( shapes ) === false ) shapes = [ shapes ];\n\n\t\tthis.addShapeList( shapes, options );\n\n\t\tthis.computeFaceNormals();\n\n\t}\n\n\tShapeGeometry.prototype = Object.create( Geometry.prototype );\n\tShapeGeometry.prototype.constructor = ShapeGeometry;\n\n\t/**\n\t * Add an array of shapes to THREE.ShapeGeometry.\n\t */\n\tShapeGeometry.prototype.addShapeList = function ( shapes, options ) {\n\n\t\tfor ( var i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tthis.addShape( shapes[ i ], options );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * Adds a shape to THREE.ShapeGeometry, based on THREE.ExtrudeGeometry.\n\t */\n\tShapeGeometry.prototype.addShape = function ( shape, options ) {\n\n\t\tif ( options === undefined ) options = {};\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\n\t\tvar material = options.material;\n\t\tvar uvgen = options.UVGenerator === undefined ? ExtrudeGeometry.WorldUVGenerator : options.UVGenerator;\n\n\t\t//\n\n\t\tvar i, l, hole;\n\n\t\tvar shapesOffset = this.vertices.length;\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe...\n\n\t\t\tfor ( i = 0, l = holes.length; i < l; i ++ ) {\n\n\t\t\t\thole = holes[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( hole ) ) {\n\n\t\t\t\t\tholes[ i ] = hole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treverse = false;\n\n\t\t}\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t// Vertices\n\n\t\tfor ( i = 0, l = holes.length; i < l; i ++ ) {\n\n\t\t\thole = holes[ i ];\n\t\t\tvertices = vertices.concat( hole );\n\n\t\t}\n\n\t\t//\n\n\t\tvar vert, vlen = vertices.length;\n\t\tvar face, flen = faces.length;\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = vertices[ i ];\n\n\t\t\tthis.vertices.push( new Vector3( vert.x, vert.y, 0 ) );\n\n\t\t}\n\n\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\tface = faces[ i ];\n\n\t\t\tvar a = face[ 0 ] + shapesOffset;\n\t\t\tvar b = face[ 1 ] + shapesOffset;\n\t\t\tvar c = face[ 2 ] + shapesOffset;\n\n\t\t\tthis.faces.push( new Face3( a, b, c, null, null, material ) );\n\t\t\tthis.faceVertexUvs[ 0 ].push( uvgen.generateTopUV( this, a, b, c ) );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction EdgesGeometry( geometry, thresholdAngle ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;\n\n\t\tvar thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle );\n\n\t\tvar edge = [ 0, 0 ], hash = {};\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\tvar geometry2;\n\n\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\tgeometry2 = new Geometry();\n\t\t\tgeometry2.fromBufferGeometry( geometry );\n\n\t\t} else {\n\n\t\t\tgeometry2 = geometry.clone();\n\n\t\t}\n\n\t\tgeometry2.mergeVertices();\n\t\tgeometry2.computeFaceNormals();\n\n\t\tvar vertices = geometry2.vertices;\n\t\tvar faces = geometry2.faces;\n\n\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\tvar key = edge.toString();\n\n\t\t\t\tif ( hash[ key ] === undefined ) {\n\n\t\t\t\t\thash[ key ] = { vert1: edge[ 0 ], vert2: edge[ 1 ], face1: i, face2: undefined };\n\n\t\t\t\t} else {\n\n\t\t\t\t\thash[ key ].face2 = i;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar coords = [];\n\n\t\tfor ( var key in hash ) {\n\n\t\t\tvar h = hash[ key ];\n\n\t\t\tif ( h.face2 === undefined || faces[ h.face1 ].normal.dot( faces[ h.face2 ].normal ) <= thresholdDot ) {\n\n\t\t\t\tvar vertex = vertices[ h.vert1 ];\n\t\t\t\tcoords.push( vertex.x );\n\t\t\t\tcoords.push( vertex.y );\n\t\t\t\tcoords.push( vertex.z );\n\n\t\t\t\tvertex = vertices[ h.vert2 ];\n\t\t\t\tcoords.push( vertex.x );\n\t\t\t\tcoords.push( vertex.y );\n\t\t\t\tcoords.push( vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.addAttribute( 'position', new BufferAttribute( new Float32Array( coords ), 3 ) );\n\n\t}\n\n\tEdgesGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tEdgesGeometry.prototype.constructor = EdgesGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CylinderBufferGeometry';\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\tvar scope = this;\n\n\t\tradiusTop = radiusTop !== undefined ? radiusTop : 20;\n\t\tradiusBottom = radiusBottom !== undefined ? radiusBottom : 20;\n\t\theight = height !== undefined ? height : 100;\n\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\n\t\topenEnded = openEnded !== undefined ? openEnded : false;\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0.0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI;\n\n\t\t// used to calculate buffer length\n\n\t\tvar nbCap = 0;\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) nbCap ++;\n\t\t\tif ( radiusBottom > 0 ) nbCap ++;\n\n\t\t}\n\n\t\tvar vertexCount = calculateVertexCount();\n\t\tvar indexCount = calculateIndexCount();\n\n\t\t// buffers\n\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ), 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// helper variables\n\n\t\tvar index = 0,\n\t\t indexOffset = 0,\n\t\t indexArray = [],\n\t\t halfHeight = height / 2;\n\n\t\t// group variables\n\t\tvar 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.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t\t// helper functions\n\n\t\tfunction calculateVertexCount() {\n\n\t\t\tvar count = ( radialSegments + 1 ) * ( heightSegments + 1 );\n\n\t\t\tif ( openEnded === false ) {\n\n\t\t\t\tcount += ( ( radialSegments + 1 ) * nbCap ) + ( radialSegments * nbCap );\n\n\t\t\t}\n\n\t\t\treturn count;\n\n\t\t}\n\n\t\tfunction calculateIndexCount() {\n\n\t\t\tvar count = radialSegments * heightSegments * 2 * 3;\n\n\t\t\tif ( openEnded === false ) {\n\n\t\t\t\tcount += radialSegments * nbCap * 3;\n\n\t\t\t}\n\n\t\t\treturn count;\n\n\t\t}\n\n\t\tfunction generateTorso() {\n\n\t\t\tvar x, y;\n\t\t\tvar normal = new Vector3();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tvar slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tvar indexRow = [];\n\n\t\t\t\tvar v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\t\t\t\tvar radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tvar u = x / radialSegments;\n\n\t\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tvar sinTheta = Math.sin( theta );\n\t\t\t\t\tvar cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\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.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.setXYZ( index, normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\t\t\t\t\tuvs.setXY( index, u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\t\t\t\t\tindexRow.push( index );\n\n\t\t\t\t\t// increase index\n\t\t\t\t\tindex ++;\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\t\t\t\t\tvar i1 = indexArray[ y ][ x ];\n\t\t\t\t\tvar i2 = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tvar i3 = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tvar i4 = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// face one\n\t\t\t\t\tindices.setX( indexOffset, i1 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i2 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i4 ); indexOffset ++;\n\n\t\t\t\t\t// face two\n\t\t\t\t\tindices.setX( indexOffset, i2 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i3 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i4 ); indexOffset ++;\n\n\t\t\t\t\t// update counters\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\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\tvar x, centerIndexStart, centerIndexEnd;\n\n\t\t\tvar uv = new Vector2();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tvar sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// save the index of the first center vertex\n\t\t\tcenterIndexStart = index;\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 ( x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\t\t\t\tvertices.setXYZ( index, 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\t\t\t\tnormals.setXYZ( index, 0, sign, 0 );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = 0.5;\n\t\t\t\tuv.y = 0.5;\n\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\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\tcenterIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tvar u = x / radialSegments;\n\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\tvar cosTheta = Math.cos( theta );\n\t\t\t\tvar sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\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.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\t\t\t\tnormals.setXYZ( index, 0, sign, 0 );\n\n\t\t\t\t// uv\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.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tvar c = centerIndexStart + x;\n\t\t\t\tvar i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\t\t\t\t\tindices.setX( indexOffset, i ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i + 1 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, c ); indexOffset ++;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\t\t\t\t\tindices.setX( indexOffset, i + 1 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, c ); indexOffset ++;\n\n\t\t\t\t}\n\n\t\t\t\t// update counters\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\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tCylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tCylinderGeometry.prototype = Object.create( Geometry.prototype );\n\tCylinderGeometry.prototype.constructor = CylinderGeometry;\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderGeometry.call( this, 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\tConeGeometry.prototype = Object.create( CylinderGeometry.prototype );\n\tConeGeometry.prototype.constructor = ConeGeometry;\n\n\t/**\n\t * @author: abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeBufferGeometry';\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\tConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype );\n\tConeBufferGeometry.prototype.constructor = ConeBufferGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CircleBufferGeometry';\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\tradius = radius || 50;\n\t\tsegments = segments !== undefined ? Math.max( 3, segments ) : 8;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\tvar vertices = segments + 2;\n\n\t\tvar positions = new Float32Array( vertices * 3 );\n\t\tvar normals = new Float32Array( vertices * 3 );\n\t\tvar uvs = new Float32Array( vertices * 2 );\n\n\t\t// center data is already zero, but need to set a few extras\n\t\tnormals[ 2 ] = 1.0;\n\t\tuvs[ 0 ] = 0.5;\n\t\tuvs[ 1 ] = 0.5;\n\n\t\tfor ( var s = 0, i = 3, ii = 2 ; s <= segments; s ++, i += 3, ii += 2 ) {\n\n\t\t\tvar segment = thetaStart + s / segments * thetaLength;\n\n\t\t\tpositions[ i ] = radius * Math.cos( segment );\n\t\t\tpositions[ i + 1 ] = radius * Math.sin( segment );\n\n\t\t\tnormals[ i + 2 ] = 1; // normal z\n\n\t\t\tuvs[ ii ] = ( positions[ i ] / radius + 1 ) / 2;\n\t\t\tuvs[ ii + 1 ] = ( positions[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t}\n\n\t\tvar indices = [];\n\n\t\tfor ( var i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\tthis.setIndex( new BufferAttribute( new Uint16Array( indices ), 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t\tthis.boundingSphere = new Sphere( new Vector3(), radius );\n\n\t}\n\n\tCircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCircleBufferGeometry.prototype.constructor = CircleBufferGeometry;\n\n\t/**\n\t * @author hughes\n\t */\n\n\tfunction CircleGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );\n\n\t}\n\n\tCircleGeometry.prototype = Object.create( Geometry.prototype );\n\tCircleGeometry.prototype.constructor = CircleGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as\n\t */\n\n\tfunction BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tBoxGeometry.prototype = Object.create( Geometry.prototype );\n\tBoxGeometry.prototype.constructor = BoxGeometry;\n\n\n\n\tvar Geometries = Object.freeze({\n\t\tWireframeGeometry: WireframeGeometry,\n\t\tParametricGeometry: ParametricGeometry,\n\t\tParametricBufferGeometry: ParametricBufferGeometry,\n\t\tTetrahedronGeometry: TetrahedronGeometry,\n\t\tTetrahedronBufferGeometry: TetrahedronBufferGeometry,\n\t\tOctahedronGeometry: OctahedronGeometry,\n\t\tOctahedronBufferGeometry: OctahedronBufferGeometry,\n\t\tIcosahedronGeometry: IcosahedronGeometry,\n\t\tIcosahedronBufferGeometry: IcosahedronBufferGeometry,\n\t\tDodecahedronGeometry: DodecahedronGeometry,\n\t\tDodecahedronBufferGeometry: DodecahedronBufferGeometry,\n\t\tPolyhedronGeometry: PolyhedronGeometry,\n\t\tPolyhedronBufferGeometry: PolyhedronBufferGeometry,\n\t\tTubeGeometry: TubeGeometry,\n\t\tTubeBufferGeometry: TubeBufferGeometry,\n\t\tTorusKnotGeometry: TorusKnotGeometry,\n\t\tTorusKnotBufferGeometry: TorusKnotBufferGeometry,\n\t\tTorusGeometry: TorusGeometry,\n\t\tTorusBufferGeometry: TorusBufferGeometry,\n\t\tTextGeometry: TextGeometry,\n\t\tSphereBufferGeometry: SphereBufferGeometry,\n\t\tSphereGeometry: SphereGeometry,\n\t\tRingGeometry: RingGeometry,\n\t\tRingBufferGeometry: RingBufferGeometry,\n\t\tPlaneBufferGeometry: PlaneBufferGeometry,\n\t\tPlaneGeometry: PlaneGeometry,\n\t\tLatheGeometry: LatheGeometry,\n\t\tLatheBufferGeometry: LatheBufferGeometry,\n\t\tShapeGeometry: ShapeGeometry,\n\t\tExtrudeGeometry: ExtrudeGeometry,\n\t\tEdgesGeometry: EdgesGeometry,\n\t\tConeGeometry: ConeGeometry,\n\t\tConeBufferGeometry: ConeBufferGeometry,\n\t\tCylinderGeometry: CylinderGeometry,\n\t\tCylinderBufferGeometry: CylinderBufferGeometry,\n\t\tCircleBufferGeometry: CircleBufferGeometry,\n\t\tCircleGeometry: CircleGeometry,\n\t\tBoxBufferGeometry: BoxBufferGeometry,\n\t\tBoxGeometry: BoxGeometry\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ShadowMaterial() {\n\n\t\tShaderMaterial.call( this, {\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib[ \"lights\" ],\n\t\t\t\t{\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t}\n\t\t\t] ),\n\t\t\tvertexShader: ShaderChunk[ 'shadow_vert' ],\n\t\t\tfragmentShader: ShaderChunk[ 'shadow_frag' ]\n\t\t} );\n\n\t\tthis.lights = true;\n\t\tthis.transparent = true;\n\n\t\tObject.defineProperties( this, {\n\t\t\topacity: {\n\t\t\t\tenumerable: true,\n\t\t\t\tget: function () {\n\t\t\t\t\treturn this.uniforms.opacity.value;\n\t\t\t\t},\n\t\t\t\tset: function ( value ) {\n\t\t\t\t\tthis.uniforms.opacity.value = value;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tShadowMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tShadowMaterial.prototype.constructor = ShadowMaterial;\n\n\tShadowMaterial.prototype.isShadowMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction RawShaderMaterial( parameters ) {\n\n\t\tShaderMaterial.call( this, parameters );\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n\tRawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tRawShaderMaterial.prototype.constructor = RawShaderMaterial;\n\n\tRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MultiMaterial( materials ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.type = 'MultiMaterial';\n\n\t\tthis.materials = materials instanceof Array ? materials : [];\n\n\t\tthis.visible = true;\n\n\t}\n\n\tMultiMaterial.prototype = {\n\n\t\tconstructor: MultiMaterial,\n\n\t\tisMultiMaterial: true,\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.2,\n\t\t\t\t\ttype: 'material',\n\t\t\t\t\tgenerator: 'MaterialExporter'\n\t\t\t\t},\n\t\t\t\tuuid: this.uuid,\n\t\t\t\ttype: this.type,\n\t\t\t\tmaterials: []\n\t\t\t};\n\n\t\t\tvar materials = this.materials;\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tvar material = materials[ i ].toJSON( meta );\n\t\t\t\tdelete material.metadata;\n\n\t\t\t\toutput.materials.push( material );\n\n\t\t\t}\n\n\t\t\toutput.visible = this.visible;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\tvar material = new this.constructor();\n\n\t\t\tfor ( var i = 0; i < this.materials.length; i ++ ) {\n\n\t\t\t\tmaterial.materials.push( this.materials[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tmaterial.visible = this.visible;\n\n\t\t\treturn material;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * color: ,\n\t * roughness: ,\n\t * metalness: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * roughnessMap: new THREE.Texture( ),\n\t *\n\t * metalnessMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n\t * envMapIntensity: \n\t *\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshStandardMaterial( parameters ) {\n\n\t\tMaterial.call( this );\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 = 0.5;\n\t\tthis.metalness = 0.5;\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.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.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.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshStandardMaterial.prototype = Object.create( Material.prototype );\n\tMeshStandardMaterial.prototype.constructor = MeshStandardMaterial;\n\n\tMeshStandardMaterial.prototype.isMeshStandardMaterial = true;\n\n\tMeshStandardMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, 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.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.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.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * reflectivity: \n\t * }\n\t */\n\n\tfunction MeshPhysicalMaterial( parameters ) {\n\n\t\tMeshStandardMaterial.call( this );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.reflectivity = 0.5; // maps to F0 = 0.04\n\n\t\tthis.clearCoat = 0.0;\n\t\tthis.clearCoatRoughness = 0.0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );\n\tMeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;\n\n\tMeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;\n\n\tMeshPhysicalMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshStandardMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.reflectivity = source.reflectivity;\n\n\t\tthis.clearCoat = source.clearCoat;\n\t\tthis.clearCoatRoughness = source.clearCoatRoughness;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * specular: ,\n\t * shininess: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshPhongMaterial( parameters ) {\n\n\t\tMaterial.call( this );\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.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.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhongMaterial.prototype = Object.create( Material.prototype );\n\tMeshPhongMaterial.prototype.constructor = MeshPhongMaterial;\n\n\tMeshPhongMaterial.prototype.isMeshPhongMaterial = true;\n\n\tMeshPhongMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, 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.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.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t *\n\t * parameters = {\n\t * opacity: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t * }\n\t */\n\n\tfunction MeshNormalMaterial( parameters ) {\n\n\t\tMaterial.call( this, parameters );\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshNormalMaterial.prototype = Object.create( Material.prototype );\n\tMeshNormalMaterial.prototype.constructor = MeshNormalMaterial;\n\n\tMeshNormalMaterial.prototype.isMeshNormalMaterial = true;\n\n\tMeshNormalMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshLambertMaterial( parameters ) {\n\n\t\tMaterial.call( this );\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.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.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshLambertMaterial.prototype = Object.create( Material.prototype );\n\tMeshLambertMaterial.prototype.constructor = MeshLambertMaterial;\n\n\tMeshLambertMaterial.prototype.isMeshLambertMaterial = true;\n\n\tMeshLambertMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, 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.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.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t *\n\t * scale: ,\n\t * dashSize: ,\n\t * gapSize: \n\t * }\n\t */\n\n\tfunction LineDashedMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineDashedMaterial.prototype = Object.create( Material.prototype );\n\tLineDashedMaterial.prototype.constructor = LineDashedMaterial;\n\n\tLineDashedMaterial.prototype.isLineDashedMaterial = true;\n\n\tLineDashedMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\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\tvar Materials = Object.freeze({\n\t\tShadowMaterial: ShadowMaterial,\n\t\tSpriteMaterial: SpriteMaterial,\n\t\tRawShaderMaterial: RawShaderMaterial,\n\t\tShaderMaterial: ShaderMaterial,\n\t\tPointsMaterial: PointsMaterial,\n\t\tMultiMaterial: MultiMaterial,\n\t\tMeshPhysicalMaterial: MeshPhysicalMaterial,\n\t\tMeshStandardMaterial: MeshStandardMaterial,\n\t\tMeshPhongMaterial: MeshPhongMaterial,\n\t\tMeshNormalMaterial: MeshNormalMaterial,\n\t\tMeshLambertMaterial: MeshLambertMaterial,\n\t\tMeshDepthMaterial: MeshDepthMaterial,\n\t\tMeshBasicMaterial: MeshBasicMaterial,\n\t\tLineDashedMaterial: LineDashedMaterial,\n\t\tLineBasicMaterial: LineBasicMaterial,\n\t\tMaterial: Material\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar Cache = {\n\n\t\tenabled: false,\n\n\t\tfiles: {},\n\n\t\tadd: function ( key, file ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\t\tthis.files[ key ] = file;\n\n\t\t},\n\n\t\tget: function ( key ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\t\treturn this.files[ key ];\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete this.files[ key ];\n\n\t\t},\n\n\t\tclear: function () {\n\n\t\t\tthis.files = {};\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LoadingManager( onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar isLoading = false, itemsLoaded = 0, itemsTotal = 0;\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}\n\n\tvar DefaultLoadingManager = new LoadingManager();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction XHRLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( XHRLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\t// Check for data: URI\n\t\t\tvar dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\t\t\tvar dataUriRegexResult = url.match( dataUriRegex );\n\n\t\t\t// Safari can not handle Data URIs through XMLHttpRequest so process manually\n\t\t\tif ( dataUriRegexResult ) {\n\n\t\t\t\tvar mimeType = dataUriRegexResult[1];\n\t\t\t\tvar isBase64 = !!dataUriRegexResult[2];\n\t\t\t\tvar data = dataUriRegexResult[3];\n\n\t\t\t\tdata = window.decodeURIComponent(data);\n\n\t\t\t\tif( isBase64 ) {\n\t\t\t\t\tdata = window.atob(data);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar response;\n\t\t\t\t\tvar responseType = ( this.responseType || '' ).toLowerCase();\n\n\t\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\t \tresponse = new ArrayBuffer( data.length );\n\t\t\t\t\t\t\tvar view = new Uint8Array( response );\n\t\t\t\t\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tview[ i ] = data.charCodeAt( i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( responseType === 'blob' ) {\n\n\t\t\t\t\t\t\t\tresponse = new Blob( [ response ], { \"type\" : mimeType } );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\t\tvar parser = new DOMParser();\n\t\t\t\t\t\t\tresponse = parser.parseFromString( data, mimeType );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\t\tresponse = JSON.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault: // 'text' or other\n\n\t\t\t\t\t\t\tresponse = data;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function() {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t}, 0);\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function() {\n\n\t\t\t\t\t\tif ( onError ) onError( error );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}, 0);\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar request = new XMLHttpRequest();\n\t\t\t\trequest.open( 'GET', url, true );\n\n\t\t\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\t\t\tvar response = event.target.response;\n\n\t\t\t\t\tCache.add( url, response );\n\n\t\t\t\t\tif ( this.status === 200 ) {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else if ( this.status === 0 ) {\n\n\t\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\t\tconsole.warn( 'THREE.XHRLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( onProgress !== undefined ) {\n\n\t\t\t\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\t\t\tonProgress( event );\n\n\t\t\t\t\t}, false );\n\n\t\t\t\t}\n\n\t\t\t\trequest.addEventListener( 'error', function ( event ) {\n\n\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( this.responseType !== undefined ) request.responseType = this.responseType;\n\t\t\t\tif ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;\n\n\t\t\t\tif ( request.overrideMimeType ) request.overrideMimeType( 'text/plain' );\n\n\t\t\t\trequest.send( null );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn request;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetResponseType: function ( value ) {\n\n\t\t\tthis.responseType = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t *\n\t * Abstract Base class to block based textures loader (dds, pvr, ...)\n\t */\n\n\tfunction CompressedTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( CompressedTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar images = [];\n\n\t\t\tvar texture = new CompressedTexture();\n\t\t\ttexture.image = images;\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\timages[ i ] = {\n\t\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t\t};\n\n\t\t\t\t\tloaded += 1;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\tif ( texDatas.mipmapCount === 1 )\n\t\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\tvar loaded = 0;\n\n\t\t\t\tfor ( var i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\t\tloadTexture( i );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\t\tvar faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\t\tfor ( var f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\t\timages[ f ] = { mipmaps : [] };\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\t\timages[ f ].height = texDatas.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} else {\n\n\t\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author Nikos M. / https://github.com/foo123/\n\t *\n\t * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n\t */\n\n\tvar DataTextureLoader = BinaryTextureLoader;\n\tfunction BinaryTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( BinaryTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texture = new DataTexture();\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar texData = scope._parser( buffer );\n\n\t\t\t\tif ( ! texData ) return;\n\n\t\t\t\tif ( undefined !== texData.image ) {\n\n\t\t\t\t\ttexture.image = texData.image;\n\n\t\t\t\t} else if ( undefined !== texData.data ) {\n\n\t\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\t\ttexture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\t\ttexture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter;\n\t\t\t\ttexture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter;\n\n\t\t\t\ttexture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;\n\n\t\t\t\tif ( undefined !== texData.format ) {\n\n\t\t\t\t\ttexture.format = texData.format;\n\n\t\t\t\t}\n\t\t\t\tif ( undefined !== texData.type ) {\n\n\t\t\t\t\ttexture.type = texData.type;\n\n\t\t\t\t}\n\n\t\t\t\tif ( undefined !== texData.mipmaps ) {\n\n\t\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( 1 === texData.mipmapCount ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t\t}, onProgress, onError );\n\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ImageLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( ImageLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );\n\t\t\timage.onload = function () {\n\n\t\t\t\timage.onload = null;\n\n\t\t\t\tURL.revokeObjectURL( image.src );\n\n\t\t\t\tif ( onLoad ) onLoad( image );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t};\n\t\t\timage.onerror = onError;\n\n\t\t\tif ( url.indexOf( 'data:' ) === 0 ) {\n\n\t\t\t\timage.src = url;\n\n\t\t\t} else {\n\n\t\t\t\tvar loader = new XHRLoader();\n\t\t\t\tloader.setPath( this.path );\n\t\t\t\tloader.setResponseType( 'blob' );\n\t\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\t\tloader.load( url, function ( blob ) {\n\n\t\t\t\t\timage.src = URL.createObjectURL( blob );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn image;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( CubeTextureLoader.prototype, {\n\n\t\tload: function ( urls, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new CubeTexture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\n\t\t\tvar loaded = 0;\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\t\tloaded ++;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, undefined, onError );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < urls.length; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction TextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( TextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new Texture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.load( url, function ( image ) {\n\n\t\t\t\t// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.\n\t\t\t\tvar isJPEG = url.search( /\\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\\:image\\/jpeg/ ) === 0;\n\n\t\t\t\ttexture.format = isJPEG ? RGBFormat : RGBAFormat;\n\t\t\t\ttexture.image = image;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\t\tonLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Light( color, intensity ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Light';\n\n\t\tthis.color = new Color( color );\n\t\tthis.intensity = intensity !== undefined ? intensity : 1;\n\n\t\tthis.receiveShadow = undefined;\n\n\t}\n\n\tLight.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Light,\n\n\t\tisLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.color.copy( source.color );\n\t\t\tthis.intensity = source.intensity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.color = this.color.getHex();\n\t\t\tdata.object.intensity = this.intensity;\n\n\t\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction HemisphereLight( skyColor, groundColor, intensity ) {\n\n\t\tLight.call( this, skyColor, intensity );\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.castShadow = undefined;\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tHemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: HemisphereLight,\n\n\t\tisHemisphereLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.groundColor.copy( source.groundColor );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LightShadow( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.bias = 0;\n\t\tthis.radius = 1;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.matrix = new Matrix4();\n\n\t}\n\n\tObject.assign( LightShadow.prototype, {\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.camera = source.camera.clone();\n\n\t\t\tthis.bias = source.bias;\n\t\t\tthis.radius = source.radius;\n\n\t\t\tthis.mapSize.copy( source.mapSize );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar object = {};\n\n\t\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\t\tdelete object.camera.matrix;\n\n\t\t\treturn object;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SpotLightShadow() {\n\n\t\tLightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t}\n\n\tSpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: SpotLightShadow,\n\n\t\tisSpotLightShadow: true,\n\n\t\tupdate: function ( light ) {\n\n\t\t\tvar fov = _Math.RAD2DEG * 2 * light.angle;\n\t\t\tvar aspect = this.mapSize.width / this.mapSize.height;\n\t\t\tvar far = light.distance || 500;\n\n\t\t\tvar camera = this.camera;\n\n\t\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\t\tcamera.fov = fov;\n\t\t\t\tcamera.aspect = aspect;\n\t\t\t\tcamera.far = far;\n\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpotLight( color, intensity, distance, angle, penumbra, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * Math.PI;\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / Math.PI;\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.angle = ( angle !== undefined ) ? angle : Math.PI / 3;\n\t\tthis.penumbra = ( penumbra !== undefined ) ? penumbra : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\tSpotLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: SpotLight,\n\n\t\tisSpotLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.angle = source.angle;\n\t\t\tthis.penumbra = source.penumbra;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\n\tfunction PointLight( color, intensity, distance, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'PointLight';\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * 4 * Math.PI;\n\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / ( 4 * Math.PI );\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t}\n\n\tPointLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: PointLight,\n\n\t\tisPointLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectionalLightShadow( light ) {\n\n\t\tLightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n\t}\n\n\tDirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: DirectionalLightShadow\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DirectionalLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tDirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: DirectionalLight,\n\n\t\tisDirectionalLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AmbientLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'AmbientLight';\n\n\t\tthis.castShadow = undefined;\n\n\t}\n\n\tAmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: AmbientLight,\n\n\t\tisAmbientLight: true,\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tvar AnimationUtils = {\n\n\t\t// same as Array.prototype.slice, but also works on typed arrays\n\t\tarraySlice: function( array, from, to ) {\n\n\t\t\tif ( AnimationUtils.isTypedArray( array ) ) {\n\n\t\t\t\treturn new array.constructor( array.subarray( from, to ) );\n\n\t\t\t}\n\n\t\t\treturn array.slice( from, to );\n\n\t\t},\n\n\t\t// converts an array to a specific type\n\t\tconvertArray: function( array, type, forceClone ) {\n\n\t\t\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t\t\t\t! forceClone && array.constructor === type ) return array;\n\n\t\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\t\t\treturn new type( array ); // create typed array\n\n\t\t\t}\n\n\t\t\treturn Array.prototype.slice.call( array ); // create Array\n\n\t\t},\n\n\t\tisTypedArray: function( object ) {\n\n\t\t\treturn ArrayBuffer.isView( object ) &&\n\t\t\t\t\t! ( object instanceof DataView );\n\n\t\t},\n\n\t\t// returns an array by which times and values can be sorted\n\t\tgetKeyframeOrder: function( times ) {\n\n\t\t\tfunction compareTime( i, j ) {\n\n\t\t\t\treturn times[ i ] - times[ j ];\n\n\t\t\t}\n\n\t\t\tvar n = times.length;\n\t\t\tvar result = new Array( n );\n\t\t\tfor ( var i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\t\t\tresult.sort( compareTime );\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// uses the array previously returned by 'getKeyframeOrder' to sort data\n\t\tsortedArray: function( values, stride, order ) {\n\n\t\t\tvar nValues = values.length;\n\t\t\tvar result = new values.constructor( nValues );\n\n\t\t\tfor ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\t\t\tvar srcOffset = order[ i ] * stride;\n\n\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// function for parsing AOS keyframe formats\n\t\tflattenJSON: function( jsonKeys, times, values, valuePropertyName ) {\n\n\t\t\tvar i = 1, key = jsonKeys[ 0 ];\n\n\t\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t}\n\n\t\t\tif ( key === undefined ) return; // no data\n\n\t\t\tvar value = key[ valuePropertyName ];\n\t\t\tif ( value === undefined ) return; // no data\n\n\t\t\tif ( Array.isArray( value ) ) {\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else if ( value.toArray !== undefined ) {\n\t\t\t\t// ...assume THREE.Math-ish\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else {\n\t\t\t\t// otherwise push as-is\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push( value );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Abstract base class of interpolants over parametric samples.\n\t *\n\t * The parameter domain is one dimensional, typically the time or a path\n\t * along a curve defined by the data.\n\t *\n\t * The sample values can have any dimensionality and derived classes may\n\t * apply special interpretations to the data.\n\t *\n\t * This class provides the interval seek in a Template Method, deferring\n\t * the actual interpolation to derived classes.\n\t *\n\t * Time complexity is O(1) for linear access crossing at most two points\n\t * and O(log N) for random access, where N is the number of positions.\n\t *\n\t * References:\n\t *\n\t * \t\thttp://www.oodesign.com/template-method-pattern.html\n\t *\n\t * @author tschw\n\t */\n\n\tfunction Interpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tthis.parameterPositions = parameterPositions;\n\t\tthis._cachedIndex = 0;\n\n\t\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\t\tthis.sampleValues = sampleValues;\n\t\tthis.valueSize = sampleSize;\n\n\t}\n\n\tInterpolant.prototype = {\n\n\t\tconstructor: Interpolant,\n\n\t\tevaluate: function( t ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\ti1 = this._cachedIndex,\n\n\t\t\t\tt1 = pp[ i1 ],\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\tvalidate_interval: {\n\n\t\t\t\tseek: {\n\n\t\t\t\t\tvar right;\n\n\t\t\t\t\tlinear_scan: {\n\t//- See http://jsperf.com/comparison-to-undefined/3\n\t//- slower code:\n\t//-\n\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 + 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\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\t// prepare binary search on the right side of the index\n\t\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t//- slower code:\n\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\t\tvar t1global = pp[ 1 ];\n\n\t\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 - 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\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\t// prepare binary search on the left side of the index\n\t\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t\t} // linear scan\n\n\t\t\t\t\t// binary search\n\n\t\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\t\tvar mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t\t// check boundary cases, again\n\n\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\n\n\t\t\t\t\t}\n\n\t\t\t\t} // seek\n\n\t\t\t\tthis._cachedIndex = i1;\n\n\t\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t\t} // validate_interval\n\n\t\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t\t},\n\n\t\tsettings: null, // optional, subclass-specific settings structure\n\t\t// Note: The indirection allows central control of many interpolants.\n\n\t\t// --- Protected interface\n\n\t\tDefaultSettings_: {},\n\n\t\tgetSettings_: function() {\n\n\t\t\treturn this.settings || this.DefaultSettings_;\n\n\t\t},\n\n\t\tcopySampleValue_: function( index ) {\n\n\t\t\t// copies a sample value to the result buffer\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = index * stride;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// Template methods for derived classes:\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tthrow new Error( \"call to abstract method\" );\n\t\t\t// implementations shall return this.resultBuffer\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\t// empty\n\n\t\t}\n\n\t};\n\n\tObject.assign( Interpolant.prototype, {\n\n\t\tbeforeStart_: //( 0, t, t0 ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_,\n\n\t\tafterEnd_: //( N-1, tN-1, t ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_\n\n\t} );\n\n\t/**\n\t * Fast and simple cubic spline interpolant.\n\t *\n\t * It was derived from a Hermitian construction setting the first derivative\n\t * at each sample position to the linear slope between neighboring positions\n\t * over their parameter interval.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction CubicInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, 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}\n\n\tCubicInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: CubicInterpolant,\n\n\t\tDefaultSettings_: {\n\n\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\tiPrev = i1 - 2,\n\t\t\t\tiNext = i1 + 1,\n\n\t\t\t\ttPrev = pp[ iPrev ],\n\t\t\t\ttNext = pp[ iNext ];\n\n\t\t\tif ( tPrev === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = t1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tNext === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\t\tiNext = i1;\n\t\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiNext = 1;\n\t\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\t\ttNext = t0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar halfDt = ( t1 - t0 ) * 0.5,\n\t\t\t\tstride = this.valueSize;\n\n\t\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\t\tthis._offsetPrev = iPrev * stride;\n\t\t\tthis._offsetNext = iNext * stride;\n\n\t\t},\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tpp = p * p,\n\t\t\t\tppp = pp * p;\n\n\t\t\t// evaluate polynomials\n\n\t\t\tvar sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\t\tvar s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\t\tvar s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\t\tvar sN = wN * ppp - wN * pp;\n\n\t\t\t// combine data linearly\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction LinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: LinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset1 = i1 * stride,\n\t\t\t\toffset0 = offset1 - stride,\n\n\t\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tweight0 = 1 - weight1;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Interpolant that evaluates to the sample value at the position preceeding\n\t * the parameter.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction DiscreteInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tDiscreteInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: DiscreteInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t}\n\n\t} );\n\n\tvar KeyframeTrackPrototype;\n\n\tKeyframeTrackPrototype = {\n\n\t\tTimeBufferType: Float32Array,\n\t\tValueBufferType: Float32Array,\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodDiscrete: function( result ) {\n\n\t\t\treturn new DiscreteInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodLinear: function( result ) {\n\n\t\t\treturn new LinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: function( result ) {\n\n\t\t\treturn new CubicInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tsetInterpolation: function( interpolation ) {\n\n\t\t\tvar factoryMethod;\n\n\t\t\tswitch ( interpolation ) {\n\n\t\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateLinear:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateSmooth:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( factoryMethod === undefined ) {\n\n\t\t\t\tvar message = \"unsupported interpolation for \" +\n\t\t\t\t\t\tthis.ValueTypeName + \" keyframe track named \" + this.name;\n\n\t\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( message );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.createInterpolant = factoryMethod;\n\n\t\t},\n\n\t\tgetInterpolation: function() {\n\n\t\t\tswitch ( this.createInterpolant ) {\n\n\t\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\t\treturn InterpolateLinear;\n\n\t\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\t\treturn InterpolateSmooth;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetValueSize: function() {\n\n\t\t\treturn this.values.length / this.times.length;\n\n\t\t},\n\n\t\t// move all keyframes either forwards or backwards in time\n\t\tshift: function( timeOffset ) {\n\n\t\t\tif( timeOffset !== 0.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\t\tscale: function( timeScale ) {\n\n\t\t\tif( timeScale !== 1.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t\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\t\ttrim: function( startTime, endTime ) {\n\n\t\t\tvar times = this.times,\n\t\t\t\tnKeys = times.length,\n\t\t\t\tfrom = 0,\n\t\t\t\tto = nKeys - 1;\n\n\t\t\twhile ( from !== nKeys && times[ from ] < startTime ) ++ from;\n\t\t\twhile ( to !== -1 && times[ to ] > endTime ) -- to;\n\n\t\t\t++ to; // inclusive -> exclusive bound\n\n\t\t\tif( from !== 0 || to !== nKeys ) {\n\n\t\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\t\tif ( from >= to ) to = Math.max( to , 1 ), from = to - 1;\n\n\t\t\t\tvar stride = this.getValueSize();\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, from, to );\n\t\t\t\tthis.values = AnimationUtils.\n\t\t\t\t\t\tarraySlice( this.values, from * stride, to * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\t\tvalidate: function() {\n\n\t\t\tvar valid = true;\n\n\t\t\tvar valueSize = this.getValueSize();\n\t\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\t\tconsole.error( \"invalid value size in track\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\n\t\t\t\tnKeys = times.length;\n\n\t\t\tif( nKeys === 0 ) {\n\n\t\t\t\tconsole.error( \"track is empty\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar prevTime = null;\n\n\t\t\tfor( var i = 0; i !== nKeys; i ++ ) {\n\n\t\t\t\tvar currTime = times[ i ];\n\n\t\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\t\tconsole.error( \"time is not a valid number\", this, i, currTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\t\tconsole.error( \"out of order keys\", this, i, currTime, prevTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tprevTime = currTime;\n\n\t\t\t}\n\n\t\t\tif ( values !== undefined ) {\n\n\t\t\t\tif ( AnimationUtils.isTypedArray( values ) ) {\n\n\t\t\t\t\tfor ( var i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tvar value = values[ i ];\n\n\t\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\t\tconsole.error( \"value is not a valid number\", this, i, value );\n\t\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn valid;\n\n\t\t},\n\n\t\t// removes equivalent sequential keys as common in morph target sequences\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\t\toptimize: function() {\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\t\t\t\tstride = this.getValueSize(),\n\n\t\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\t\twriteIndex = 1,\n\t\t\t\tlastIndex = times.length - 1;\n\n\t\t\tfor( var i = 1; i < lastIndex; ++ i ) {\n\n\t\t\t\tvar keep = false;\n\n\t\t\t\tvar time = times[ i ];\n\t\t\t\tvar timeNext = times[ i + 1 ];\n\n\t\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\t\tif ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {\n\n\t\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\t\tvar offset = i * stride,\n\t\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\t\tvar value = values[ offset + j ];\n\n\t\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\t\tbreak;\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 keep = true;\n\n\t\t\t\t}\n\n\t\t\t\t// in-place compaction\n\n\t\t\t\tif ( keep ) {\n\n\t\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\t\tvar readOffset = i * stride,\n\t\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j )\n\n\t\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t++ writeIndex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// flush last keyframe (compaction looks ahead)\n\n\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\t\tfor ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j )\n\n\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t\tif ( writeIndex !== times.length ) {\n\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, 0, writeIndex );\n\t\t\t\tthis.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\tfunction KeyframeTrackConstructor( name, times, values, interpolation ) {\n\n\t\tif( name === undefined ) throw new Error( \"track name is undefined\" );\n\n\t\tif( times === undefined || times.length === 0 ) {\n\n\t\t\tthrow new Error( \"no keyframes in track named \" + name );\n\n\t\t}\n\n\t\tthis.name = name;\n\n\t\tthis.times = AnimationUtils.convertArray( times, this.TimeBufferType );\n\t\tthis.values = AnimationUtils.convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t\tthis.validate();\n\t\tthis.optimize();\n\n\t}\n\n\t/**\n\t *\n\t * A Track of vectored keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction VectorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tVectorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: VectorKeyframeTrack,\n\n\t\tValueTypeName: 'vector'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t * Spherical linear unit quaternion interpolant.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction QuaternionLinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tQuaternionLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: QuaternionLinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset = i1 * stride,\n\n\t\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\t\tfor ( var end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\t\tQuaternion.slerpFlat( result, 0,\n\t\t\t\t\t\tvalues, offset - stride, values, offset, alpha );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of quaternion keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction QuaternionKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tQuaternionKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: QuaternionKeyframeTrack,\n\n\t\tValueTypeName: 'quaternion',\n\n\t\t// ValueBufferType is inherited\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodLinear: function( result ) {\n\n\t\t\treturn new QuaternionLinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: undefined // not yet implemented\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of numeric keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction NumberKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tNumberKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: NumberKeyframeTrack,\n\n\t\tValueTypeName: 'number',\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t *\n\t * A Track that interpolates Strings\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction StringKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tStringKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: StringKeyframeTrack,\n\n\t\tValueTypeName: 'string',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of Boolean keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction BooleanKeyframeTrack( name, times, values ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values );\n\n\t}\n\n\tBooleanKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: BooleanKeyframeTrack,\n\n\t\tValueTypeName: 'bool',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t\t// Note: Actually this track could have a optimized / compressed\n\t\t// representation of a single value and a custom interpolant that\n\t\t// computes \"firstValue ^ isOdd( index )\".\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of keyframe values that represent color.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction ColorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tColorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: ColorKeyframeTrack,\n\n\t\tValueTypeName: 'color'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\n\t\t// Note: Very basic implementation and nothing special yet.\n\t\t// However, this is the place for color space parameterization.\n\n\t} );\n\n\t/**\n\t *\n\t * A timed sequence of keyframes for a specific property.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction KeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.apply( this, arguments );\n\n\t}\n\n\tKeyframeTrack.prototype = KeyframeTrackPrototype;\n\tKeyframeTrackPrototype.constructor = KeyframeTrack;\n\n\t// Static methods:\n\n\tObject.assign( KeyframeTrack, {\n\n\t\t// Serialization (in static context, because of constructor invocation\n\t\t// and automatic invocation of .toJSON):\n\n\t\tparse: function( json ) {\n\n\t\t\tif( json.type === undefined ) {\n\n\t\t\t\tthrow new Error( \"track type undefined, can not parse\" );\n\n\t\t\t}\n\n\t\t\tvar trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type );\n\n\t\t\tif ( json.times === undefined ) {\n\n\t\t\t\tvar times = [], values = [];\n\n\t\t\t\tAnimationUtils.flattenJSON( json.keys, times, values, 'value' );\n\n\t\t\t\tjson.times = times;\n\t\t\t\tjson.values = values;\n\n\t\t\t}\n\n\t\t\t// derived classes can define a static parse method\n\t\t\tif ( trackType.parse !== undefined ) {\n\n\t\t\t\treturn trackType.parse( json );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we asssume a constructor compatible with the base\n\t\t\t\treturn new trackType(\n\t\t\t\t\t\tjson.name, json.times, json.values, json.interpolation );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function( track ) {\n\n\t\t\tvar trackType = track.constructor;\n\n\t\t\tvar json;\n\n\t\t\t// derived classes can define a static toJSON method\n\t\t\tif ( trackType.toJSON !== undefined ) {\n\n\t\t\t\tjson = trackType.toJSON( track );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\t\tjson = {\n\n\t\t\t\t\t'name': track.name,\n\t\t\t\t\t'times': AnimationUtils.convertArray( track.times, Array ),\n\t\t\t\t\t'values': AnimationUtils.convertArray( track.values, Array )\n\n\t\t\t\t};\n\n\t\t\t\tvar interpolation = track.getInterpolation();\n\n\t\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\t\treturn json;\n\n\t\t},\n\n\t\t_getTrackTypeForValueTypeName: function( typeName ) {\n\n\t\t\tswitch( typeName.toLowerCase() ) {\n\n\t\t\t\tcase \"scalar\":\n\t\t\t\tcase \"double\":\n\t\t\t\tcase \"float\":\n\t\t\t\tcase \"number\":\n\t\t\t\tcase \"integer\":\n\n\t\t\t\t\treturn NumberKeyframeTrack;\n\n\t\t\t\tcase \"vector\":\n\t\t\t\tcase \"vector2\":\n\t\t\t\tcase \"vector3\":\n\t\t\t\tcase \"vector4\":\n\n\t\t\t\t\treturn VectorKeyframeTrack;\n\n\t\t\t\tcase \"color\":\n\n\t\t\t\t\treturn ColorKeyframeTrack;\n\n\t\t\t\tcase \"quaternion\":\n\n\t\t\t\t\treturn QuaternionKeyframeTrack;\n\n\t\t\t\tcase \"bool\":\n\t\t\t\tcase \"boolean\":\n\n\t\t\t\t\treturn BooleanKeyframeTrack;\n\n\t\t\t\tcase \"string\":\n\n\t\t\t\t\treturn StringKeyframeTrack;\n\n\t\t\t}\n\n\t\t\tthrow new Error( \"Unsupported typeName: \" + typeName );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Reusable set of Tracks that represent an animation.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tfunction AnimationClip( name, duration, tracks ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = ( duration !== undefined ) ? duration : -1;\n\n\t\tthis.uuid = _Math.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\tthis.optimize();\n\n\t}\n\n\tAnimationClip.prototype = {\n\n\t\tconstructor: AnimationClip,\n\n\t\tresetDuration: function() {\n\n\t\t\tvar tracks = this.tracks,\n\t\t\t\tduration = 0;\n\n\t\t\tfor ( var i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\t\tvar track = this.tracks[ i ];\n\n\t\t\t\tduration = Math.max(\n\t\t\t\t\t\tduration, track.times[ track.times.length - 1 ] );\n\n\t\t\t}\n\n\t\t\tthis.duration = duration;\n\n\t\t},\n\n\t\ttrim: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\toptimize: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].optimize();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t// Static methods:\n\n\tObject.assign( AnimationClip, {\n\n\t\tparse: function( json ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tjsonTracks = json.tracks,\n\t\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\t\tfor ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( json.name, json.duration, tracks );\n\n\t\t},\n\n\n\t\ttoJSON: function( clip ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tclipTracks = clip.tracks;\n\n\t\t\tvar json = {\n\n\t\t\t\t'name': clip.name,\n\t\t\t\t'duration': clip.duration,\n\t\t\t\t'tracks': tracks\n\n\t\t\t};\n\n\t\t\tfor ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn json;\n\n\t\t},\n\n\n\t\tCreateFromMorphTargetSequence: function( name, morphTargetSequence, fps, noLoop ) {\n\n\t\t\tvar numMorphTargets = morphTargetSequence.length;\n\t\t\tvar tracks = [];\n\n\t\t\tfor ( var i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\t\tvar times = [];\n\t\t\t\tvar values = [];\n\n\t\t\t\ttimes.push(\n\t\t\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\t\t\ti,\n\t\t\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\t\tvar order = AnimationUtils.getKeyframeOrder( times );\n\t\t\t\ttimes = AnimationUtils.sortedArray( times, 1, order );\n\t\t\t\tvalues = AnimationUtils.sortedArray( values, 1, order );\n\n\t\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t\t// last frame as well for perfect loop.\n\t\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\ttracks.push(\n\t\t\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\t\t\ttimes, values\n\t\t\t\t\t\t).scale( 1.0 / fps ) );\n\t\t\t}\n\n\t\t\treturn new AnimationClip( name, -1, tracks );\n\n\t\t},\n\n\t\tfindByName: function( objectOrClipArray, name ) {\n\n\t\t\tvar clipArray = objectOrClipArray;\n\n\t\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\t\tvar o = objectOrClipArray;\n\t\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\t\treturn clipArray[ i ];\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\tCreateClipsFromMorphTargetSequences: function( morphTargets, fps, noLoop ) {\n\n\t\t\tvar animationToMorphTargets = {};\n\n\t\t\t// tested with https://regex101.com/ on trick sequences\n\t\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\t\tvar pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t\t// sort morph target names into animation groups based\n\t\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\t\tfor ( var i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = morphTargets[ i ];\n\t\t\t\tvar parts = morphTarget.name.match( pattern );\n\n\t\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\t\tvar name = parts[ 1 ];\n\n\t\t\t\t\tvar animationMorphTargets = animationToMorphTargets[ name ];\n\t\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar clips = [];\n\n\t\t\tfor ( var name in animationToMorphTargets ) {\n\n\t\t\t\tclips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t\t}\n\n\t\t\treturn clips;\n\n\t\t},\n\n\t\t// parse the animation.hierarchy format\n\t\tparseAnimation: function( animation, bones ) {\n\n\t\t\tif ( ! animation ) {\n\n\t\t\t\tconsole.error( \" no animation in JSONLoader data\" );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar addNonemptyTrack = function(\n\t\t\t\t\ttrackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t\t// only return track if there are actually keys.\n\t\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\t\tvar times = [];\n\t\t\t\t\tvar values = [];\n\n\t\t\t\t\tAnimationUtils.flattenJSON(\n\t\t\t\t\t\t\tanimationKeys, times, values, propertyName );\n\n\t\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tvar tracks = [];\n\n\t\t\tvar clipName = animation.name || 'default';\n\t\t\t// automatic length determination in AnimationClip.\n\t\t\tvar duration = animation.length || -1;\n\t\t\tvar fps = animation.fps || 30;\n\n\t\t\tvar hierarchyTracks = animation.hierarchy || [];\n\n\t\t\tfor ( var h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\t\tvar animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t\t// skip empty tracks\n\t\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t\t// process morph targets in a way exactly compatible\n\t\t\t\t// with AnimationHandler.init( animation )\n\t\t\t\tif ( animationKeys[0].morphTargets ) {\n\n\t\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\t\tvar morphTargetNames = {};\n\t\t\t\t\tfor ( var k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\t\tif ( animationKeys[k].morphTargets ) {\n\n\t\t\t\t\t\t\tfor ( var m = 0; m < animationKeys[k].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[k].morphTargets[m] ] = -1;\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\t// create a track for each morph target with all zero\n\t\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t\t// the morphTarget is named.\n\t\t\t\t\tfor ( var morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\t\tvar times = [];\n\t\t\t\t\t\tvar values = [];\n\n\t\t\t\t\t\tfor ( var m = 0;\n\t\t\t\t\t\t\t\tm !== animationKeys[k].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\t\tvar animationKey = animationKeys[k];\n\n\t\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttracks.push( new NumberKeyframeTrack(\n\t\t\t\t\t\t\t\t'.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tduration = morphTargetNames.length * ( fps || 1.0 );\n\n\t\t\t\t} else {\n\t\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\t\tvar boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tracks.length === 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar clip = new AnimationClip( clipName, duration, tracks );\n\n\t\t\treturn clip;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MaterialLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.textures = {};\n\n\t}\n\n\tObject.assign( MaterialLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTextures: function ( value ) {\n\n\t\t\tthis.textures = value;\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar textures = this.textures;\n\n\t\t\tfunction getTexture( name ) {\n\n\t\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t\t}\n\n\t\t\t\treturn textures[ name ];\n\n\t\t\t}\n\n\t\t\tvar material = new Materials[ json.type ]();\n\n\t\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\t\tif ( json.color !== undefined ) material.color.setHex( json.color );\n\t\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\t\tif ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\t\tif ( json.specular !== undefined ) material.specular.setHex( json.specular );\n\t\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\t\tif ( json.uniforms !== undefined ) material.uniforms = json.uniforms;\n\t\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\t\tif ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;\n\t\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\t\tif ( json.shading !== undefined ) material.shading = json.shading;\n\t\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\t\t\tif ( json.skinning !== undefined ) material.skinning = json.skinning;\n\t\t\tif ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;\n\n\t\t\t// for PointsMaterial\n\n\t\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t\t// maps\n\n\t\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\n\t\t\tif ( json.alphaMap !== undefined ) {\n\n\t\t\t\tmaterial.alphaMap = getTexture( json.alphaMap );\n\t\t\t\tmaterial.transparent = true;\n\n\t\t\t}\n\n\t\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\t\tvar normalScale = json.normalScale;\n\n\t\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t\t}\n\n\t\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\n\t\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\n\t\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\n\t\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\t\t// MultiMaterial\n\n\t\t\tif ( json.materials !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.materials.length; i < l; i ++ ) {\n\n\t\t\t\t\tmaterial.materials.push( this.parse( json.materials[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn material;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometryLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( BufferGeometryLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar geometry = new BufferGeometry();\n\n\t\t\tvar index = json.data.index;\n\n\t\t\tvar TYPED_ARRAYS = {\n\t\t\t\t'Int8Array': Int8Array,\n\t\t\t\t'Uint8Array': Uint8Array,\n\t\t\t\t'Uint8ClampedArray': Uint8ClampedArray,\n\t\t\t\t'Int16Array': Int16Array,\n\t\t\t\t'Uint16Array': Uint16Array,\n\t\t\t\t'Int32Array': Int32Array,\n\t\t\t\t'Uint32Array': Uint32Array,\n\t\t\t\t'Float32Array': Float32Array,\n\t\t\t\t'Float64Array': Float64Array\n\t\t\t};\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ index.type ]( index.array );\n\t\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tvar attributes = json.data.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );\n\n\t\t\t\tgeometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) );\n\n\t\t\t}\n\n\t\t\tvar groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\t\tif ( groups !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = json.data.boundingSphere;\n\n\t\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\t\tvar center = new Vector3();\n\n\t\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Loader() {\n\n\t\tthis.onLoadStart = function () {};\n\t\tthis.onLoadProgress = function () {};\n\t\tthis.onLoadComplete = function () {};\n\n\t}\n\n\tLoader.prototype = {\n\n\t\tconstructor: Loader,\n\n\t\tcrossOrigin: undefined,\n\n\t\textractUrlBase: function ( url ) {\n\n\t\t\tvar parts = url.split( '/' );\n\n\t\t\tif ( parts.length === 1 ) return './';\n\n\t\t\tparts.pop();\n\n\t\t\treturn parts.join( '/' ) + '/';\n\n\t\t},\n\n\t\tinitMaterials: function ( materials, texturePath, crossOrigin ) {\n\n\t\t\tvar array = [];\n\n\t\t\tfor ( var i = 0; i < materials.length; ++ i ) {\n\n\t\t\t\tarray[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tcreateMaterial: ( function () {\n\n\t\t\tvar color, textureLoader, materialLoader;\n\n\t\t\treturn function createMaterial( m, texturePath, crossOrigin ) {\n\n\t\t\t\tif ( color === undefined ) color = new Color();\n\t\t\t\tif ( textureLoader === undefined ) textureLoader = new TextureLoader();\n\t\t\t\tif ( materialLoader === undefined ) materialLoader = new MaterialLoader();\n\n\t\t\t\t// convert from old material format\n\n\t\t\t\tvar textures = {};\n\n\t\t\t\tfunction loadTexture( path, repeat, offset, wrap, anisotropy ) {\n\n\t\t\t\t\tvar fullPath = texturePath + path;\n\t\t\t\t\tvar loader = Loader.Handlers.get( fullPath );\n\n\t\t\t\t\tvar texture;\n\n\t\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\t\ttexture = loader.load( fullPath );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttextureLoader.setCrossOrigin( crossOrigin );\n\t\t\t\t\t\ttexture = textureLoader.load( fullPath );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( repeat !== undefined ) {\n\n\t\t\t\t\t\ttexture.repeat.fromArray( repeat );\n\n\t\t\t\t\t\tif ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\t\t\ttexture.offset.fromArray( offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( wrap !== undefined ) {\n\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;\n\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( anisotropy !== undefined ) {\n\n\t\t\t\t\t\ttexture.anisotropy = anisotropy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar uuid = _Math.generateUUID();\n\n\t\t\t\t\ttextures[ uuid ] = texture;\n\n\t\t\t\t\treturn uuid;\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tvar json = {\n\t\t\t\t\tuuid: _Math.generateUUID(),\n\t\t\t\t\ttype: 'MeshLambertMaterial'\n\t\t\t\t};\n\n\t\t\t\tfor ( var name in m ) {\n\n\t\t\t\t\tvar value = m[ name ];\n\n\t\t\t\t\tswitch ( name ) {\n\t\t\t\t\t\tcase 'DbgColor':\n\t\t\t\t\t\tcase 'DbgIndex':\n\t\t\t\t\t\tcase 'opticalDensity':\n\t\t\t\t\t\tcase 'illumination':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'DbgName':\n\t\t\t\t\t\t\tjson.name = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'blending':\n\t\t\t\t\t\t\tjson.blending = BlendingMode[ value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorAmbient':\n\t\t\t\t\t\tcase 'mapAmbient':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorDiffuse':\n\t\t\t\t\t\t\tjson.color = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorSpecular':\n\t\t\t\t\t\t\tjson.specular = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorEmissive':\n\t\t\t\t\t\t\tjson.emissive = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'specularCoef':\n\t\t\t\t\t\t\tjson.shininess = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'shading':\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuse':\n\t\t\t\t\t\t\tjson.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuseRepeat':\n\t\t\t\t\t\tcase 'mapDiffuseOffset':\n\t\t\t\t\t\tcase 'mapDiffuseWrap':\n\t\t\t\t\t\tcase 'mapDiffuseAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissive':\n\t\t\t\t\t\t\tjson.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissiveRepeat':\n\t\t\t\t\t\tcase 'mapEmissiveOffset':\n\t\t\t\t\t\tcase 'mapEmissiveWrap':\n\t\t\t\t\t\tcase 'mapEmissiveAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLight':\n\t\t\t\t\t\t\tjson.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLightRepeat':\n\t\t\t\t\t\tcase 'mapLightOffset':\n\t\t\t\t\t\tcase 'mapLightWrap':\n\t\t\t\t\t\tcase 'mapLightAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAO':\n\t\t\t\t\t\t\tjson.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAORepeat':\n\t\t\t\t\t\tcase 'mapAOOffset':\n\t\t\t\t\t\tcase 'mapAOWrap':\n\t\t\t\t\t\tcase 'mapAOAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBump':\n\t\t\t\t\t\t\tjson.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpScale':\n\t\t\t\t\t\t\tjson.bumpScale = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpRepeat':\n\t\t\t\t\t\tcase 'mapBumpOffset':\n\t\t\t\t\t\tcase 'mapBumpWrap':\n\t\t\t\t\t\tcase 'mapBumpAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormal':\n\t\t\t\t\t\t\tjson.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalFactor':\n\t\t\t\t\t\t\tjson.normalScale = [ value, value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalRepeat':\n\t\t\t\t\t\tcase 'mapNormalOffset':\n\t\t\t\t\t\tcase 'mapNormalWrap':\n\t\t\t\t\t\tcase 'mapNormalAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecular':\n\t\t\t\t\t\t\tjson.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecularRepeat':\n\t\t\t\t\t\tcase 'mapSpecularOffset':\n\t\t\t\t\t\tcase 'mapSpecularWrap':\n\t\t\t\t\t\tcase 'mapSpecularAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalness':\n\t\t\t\t\t\t\tjson.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalnessRepeat':\n\t\t\t\t\t\tcase 'mapMetalnessOffset':\n\t\t\t\t\t\tcase 'mapMetalnessWrap':\n\t\t\t\t\t\tcase 'mapMetalnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughness':\n\t\t\t\t\t\t\tjson.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughnessRepeat':\n\t\t\t\t\t\tcase 'mapRoughnessOffset':\n\t\t\t\t\t\tcase 'mapRoughnessWrap':\n\t\t\t\t\t\tcase 'mapRoughnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlpha':\n\t\t\t\t\t\t\tjson.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlphaRepeat':\n\t\t\t\t\t\tcase 'mapAlphaOffset':\n\t\t\t\t\t\tcase 'mapAlphaWrap':\n\t\t\t\t\t\tcase 'mapAlphaAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'flipSided':\n\t\t\t\t\t\t\tjson.side = BackSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'doubleSided':\n\t\t\t\t\t\t\tjson.side = DoubleSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );\n\t\t\t\t\t\t\tjson.opacity = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'depthTest':\n\t\t\t\t\t\tcase 'depthWrite':\n\t\t\t\t\t\tcase 'colorWrite':\n\t\t\t\t\t\tcase 'opacity':\n\t\t\t\t\t\tcase 'reflectivity':\n\t\t\t\t\t\tcase 'transparent':\n\t\t\t\t\t\tcase 'visible':\n\t\t\t\t\t\tcase 'wireframe':\n\t\t\t\t\t\t\tjson[ name ] = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'vertexColors':\n\t\t\t\t\t\t\tif ( value === true ) json.vertexColors = VertexColors;\n\t\t\t\t\t\t\tif ( value === 'face' ) json.vertexColors = FaceColors;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.Loader.createMaterial: Unsupported', name, value );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.type === 'MeshBasicMaterial' ) delete json.emissive;\n\t\t\t\tif ( json.type !== 'MeshPhongMaterial' ) delete json.specular;\n\n\t\t\t\tif ( json.opacity < 1 ) json.transparent = true;\n\n\t\t\t\tmaterialLoader.setTextures( textures );\n\n\t\t\t\treturn materialLoader.parse( json );\n\n\t\t\t};\n\n\t\t} )()\n\n\t};\n\n\tLoader.Handlers = {\n\n\t\thandlers: [],\n\n\t\tadd: function ( regex, loader ) {\n\n\t\t\tthis.handlers.push( regex, loader );\n\n\t\t},\n\n\t\tget: function ( file ) {\n\n\t\t\tvar handlers = this.handlers;\n\n\t\t\tfor ( var i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tvar regex = handlers[ i ];\n\t\t\t\tvar loader = handlers[ i + 1 ];\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\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction JSONLoader( manager ) {\n\n\t\tif ( typeof manager === 'boolean' ) {\n\n\t\t\tconsole.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );\n\t\t\tmanager = undefined;\n\n\t\t}\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\tthis.withCredentials = false;\n\n\t}\n\n\tObject.assign( JSONLoader.prototype, {\n\n\t\tload: function( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texturePath = this.texturePath && ( typeof this.texturePath === \"string\" ) ? this.texturePath : Loader.prototype.extractUrlBase( url );\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = JSON.parse( text );\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata !== undefined ) {\n\n\t\t\t\t\tvar type = metadata.type;\n\n\t\t\t\t\tif ( type !== undefined ) {\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'object' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'scene' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' );\n\t\t\t\t\t\t\treturn;\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\tvar object = scope.parse( json, texturePath );\n\t\t\t\tonLoad( object.geometry, object.materials );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tparse: function ( json, texturePath ) {\n\n\t\t\tvar geometry = new Geometry(),\n\t\t\tscale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0;\n\n\t\t\tparseModel( scale );\n\n\t\t\tparseSkin();\n\t\t\tparseMorphing( scale );\n\t\t\tparseAnimations();\n\n\t\t\tgeometry.computeFaceNormals();\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\tfunction parseModel( scale ) {\n\n\t\t\t\tfunction isBitSet( value, position ) {\n\n\t\t\t\t\treturn value & ( 1 << position );\n\n\t\t\t\t}\n\n\t\t\t\tvar i, j, fi,\n\n\t\t\t\toffset, zLength,\n\n\t\t\tcolorIndex, normalIndex, uvIndex, materialIndex,\n\n\t\t\t\ttype,\n\t\t\t\tisQuad,\n\t\t\t\thasMaterial,\n\t\t\t\thasFaceVertexUv,\n\t\t\t\thasFaceNormal, hasFaceVertexNormal,\n\t\t\t\thasFaceColor, hasFaceVertexColor,\n\n\t\t\tvertex, face, faceA, faceB, hex, normal,\n\n\t\t\t\tuvLayer, uv, u, v,\n\n\t\t\t\tfaces = json.faces,\n\t\t\t\tvertices = json.vertices,\n\t\t\t\tnormals = json.normals,\n\t\t\t\tcolors = json.colors,\n\n\t\t\t\tnUvLayers = 0;\n\n\t\t\t\tif ( json.uvs !== undefined ) {\n\n\t\t\t\t\t// disregard empty arrays\n\n\t\t\t\t\tfor ( i = 0; i < json.uvs.length; i ++ ) {\n\n\t\t\t\t\t\tif ( json.uvs[ i ].length ) nUvLayers ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\tgeometry.faceVertexUvs[ i ] = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = vertices.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\tvertex = new Vector3();\n\n\t\t\t\t\tvertex.x = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.y = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.z = vertices[ offset ++ ] * scale;\n\n\t\t\t\t\tgeometry.vertices.push( vertex );\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = faces.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\ttype = faces[ offset ++ ];\n\n\n\t\t\t\t\tisQuad = isBitSet( type, 0 );\n\t\t\t\t\thasMaterial = isBitSet( type, 1 );\n\t\t\t\t\thasFaceVertexUv = isBitSet( type, 3 );\n\t\t\t\t\thasFaceNormal = isBitSet( type, 4 );\n\t\t\t\t\thasFaceVertexNormal = isBitSet( type, 5 );\n\t\t\t\t\thasFaceColor\t = isBitSet( type, 6 );\n\t\t\t\t\thasFaceVertexColor = isBitSet( type, 7 );\n\n\t\t\t\t\t// console.log(\"type\", type, \"bits\", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);\n\n\t\t\t\t\tif ( isQuad ) {\n\n\t\t\t\t\t\tfaceA = new Face3();\n\t\t\t\t\t\tfaceA.a = faces[ offset ];\n\t\t\t\t\t\tfaceA.b = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceA.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\tfaceB = new Face3();\n\t\t\t\t\t\tfaceB.a = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceB.b = faces[ offset + 2 ];\n\t\t\t\t\t\tfaceB.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tfaceA.materialIndex = materialIndex;\n\t\t\t\t\t\t\tfaceB.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi + 1 ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tif ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );\n\t\t\t\t\t\t\t\t\tif ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );\n\n\t\t\t\t\t\t\t\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\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tfaceA.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tfaceB.normal.copy( faceA.normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexNormals.push( normal );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\tfaceA.color.setHex( hex );\n\t\t\t\t\t\t\tfaceB.color.setHex( hex );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( faceA );\n\t\t\t\t\t\tgeometry.faces.push( faceB );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface = new Face3();\n\t\t\t\t\t\tface.a = faces[ offset ++ ];\n\t\t\t\t\t\tface.b = faces[ offset ++ ];\n\t\t\t\t\t\tface.c = faces[ offset ++ ];\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ].push( uv );\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\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tface.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tface.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.color.setHex( colors[ colorIndex ] );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\tface.vertexColors.push( new Color( colors[ colorIndex ] ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( face );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseSkin() {\n\n\t\t\t\tvar influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;\n\n\t\t\t\tif ( json.skinWeights ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar x = json.skinWeights[ i ];\n\t\t\t\t\t\tvar y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;\n\t\t\t\t\t\tvar z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;\n\t\t\t\t\t\tvar w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinWeights.push( new Vector4( x, y, z, w ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.skinIndices ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar a = json.skinIndices[ i ];\n\t\t\t\t\t\tvar b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;\n\t\t\t\t\t\tvar c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;\n\t\t\t\t\t\tvar d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinIndices.push( new Vector4( a, b, c, d ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.bones = json.bones;\n\n\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {\n\n\t\t\t\t\tconsole.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +\n\t\t\t\t\t\tgeometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseMorphing( scale ) {\n\n\t\t\t\tif ( json.morphTargets !== undefined ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tgeometry.morphTargets[ i ] = {};\n\t\t\t\t\t\tgeometry.morphTargets[ i ].name = json.morphTargets[ i ].name;\n\t\t\t\t\t\tgeometry.morphTargets[ i ].vertices = [];\n\n\t\t\t\t\t\tvar dstVertices = geometry.morphTargets[ i ].vertices;\n\t\t\t\t\t\tvar srcVertices = json.morphTargets[ i ].vertices;\n\n\t\t\t\t\t\tfor ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {\n\n\t\t\t\t\t\t\tvar vertex = new Vector3();\n\t\t\t\t\t\t\tvertex.x = srcVertices[ v ] * scale;\n\t\t\t\t\t\t\tvertex.y = srcVertices[ v + 1 ] * scale;\n\t\t\t\t\t\t\tvertex.z = srcVertices[ v + 2 ] * scale;\n\n\t\t\t\t\t\t\tdstVertices.push( vertex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.morphColors !== undefined && json.morphColors.length > 0 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.JSONLoader: \"morphColors\" no longer supported. Using them as face colors.' );\n\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar morphColors = json.morphColors[ 0 ].colors;\n\n\t\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tfaces[ i ].color.fromArray( morphColors, i * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseAnimations() {\n\n\t\t\t\tvar outputAnimations = [];\n\n\t\t\t\t// parse old style Bone/Hierarchy animations\n\t\t\t\tvar animations = [];\n\n\t\t\t\tif ( json.animation !== undefined ) {\n\n\t\t\t\t\tanimations.push( json.animation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.animations !== undefined ) {\n\n\t\t\t\t\tif ( json.animations.length ) {\n\n\t\t\t\t\t\tanimations = animations.concat( json.animations );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tanimations.push( json.animations );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0; i < animations.length; i ++ ) {\n\n\t\t\t\t\tvar clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones );\n\t\t\t\t\tif ( clip ) outputAnimations.push( clip );\n\n\t\t\t\t}\n\n\t\t\t\t// parse implicit morph animations\n\t\t\t\tif ( geometry.morphTargets ) {\n\n\t\t\t\t\t// TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary.\n\t\t\t\t\tvar morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );\n\t\t\t\t\toutputAnimations = outputAnimations.concat( morphAnimationClips );\n\n\t\t\t\t}\n\n\t\t\t\tif ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;\n\n\t\t\t}\n\n\t\t\tif ( json.materials === undefined || json.materials.length === 0 ) {\n\n\t\t\t\treturn { geometry: geometry };\n\n\t\t\t} else {\n\n\t\t\t\tvar materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin );\n\n\t\t\t\treturn { geometry: geometry, materials: materials };\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ObjectLoader ( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.texturePath = '';\n\n\t}\n\n\tObject.assign( ObjectLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( this.texturePath === '' ) {\n\n\t\t\t\tthis.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );\n\n\t\t\t}\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tscope.parse( JSON.parse( text ), onLoad );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\n\t\t},\n\n\t\tparse: function ( json, onLoad ) {\n\n\t\t\tvar geometries = this.parseGeometries( json.geometries );\n\n\t\t\tvar images = this.parseImages( json.images, function () {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t} );\n\n\t\t\tvar textures = this.parseTextures( json.textures, images );\n\t\t\tvar materials = this.parseMaterials( json.materials, textures );\n\n\t\t\tvar object = this.parseObject( json.object, geometries, materials );\n\n\t\t\tif ( json.animations ) {\n\n\t\t\t\tobject.animations = this.parseAnimations( json.animations );\n\n\t\t\t}\n\n\t\t\tif ( json.images === undefined || json.images.length === 0 ) {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t}\n\n\t\t\treturn object;\n\n\t\t},\n\n\t\tparseGeometries: function ( json ) {\n\n\t\t\tvar geometries = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar geometryLoader = new JSONLoader();\n\t\t\t\tvar bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar geometry;\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\t\tcase 'PlaneGeometry':\n\t\t\t\t\t\tcase 'PlaneBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BoxGeometry':\n\t\t\t\t\t\tcase 'BoxBufferGeometry':\n\t\t\t\t\t\tcase 'CubeGeometry': // backwards compatible\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.depth,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.depthSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CircleGeometry':\n\t\t\t\t\t\tcase 'CircleBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CylinderGeometry':\n\t\t\t\t\t\tcase 'CylinderBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radiusTop,\n\t\t\t\t\t\t\t\tdata.radiusBottom,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'ConeGeometry':\n\t\t\t\t\t\tcase 'ConeBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'SphereGeometry':\n\t\t\t\t\t\tcase 'SphereBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'DodecahedronGeometry':\n\t\t\t\t\t\tcase 'IcosahedronGeometry':\n\t\t\t\t\t\tcase 'OctahedronGeometry':\n\t\t\t\t\t\tcase 'TetrahedronGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.detail\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'RingGeometry':\n\t\t\t\t\t\tcase 'RingBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.innerRadius,\n\t\t\t\t\t\t\t\tdata.outerRadius,\n\t\t\t\t\t\t\t\tdata.thetaSegments,\n\t\t\t\t\t\t\t\tdata.phiSegments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusGeometry':\n\t\t\t\t\t\tcase 'TorusBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.arc\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusKnotGeometry':\n\t\t\t\t\t\tcase 'TorusKnotBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.p,\n\t\t\t\t\t\t\t\tdata.q\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'LatheGeometry':\n\t\t\t\t\t\tcase 'LatheBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.points,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\t\tgeometry = geometryLoader.parse( data.data, this.texturePath ).geometry;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\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\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\n\t\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometries;\n\n\t\t},\n\n\t\tparseMaterials: function ( json, textures ) {\n\n\t\t\tvar materials = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar loader = new MaterialLoader();\n\t\t\t\tloader.setTextures( textures );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar material = loader.parse( json[ i ] );\n\t\t\t\t\tmaterials[ material.uuid ] = material;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn materials;\n\n\t\t},\n\n\t\tparseAnimations: function ( json ) {\n\n\t\t\tvar animations = [];\n\n\t\t\tfor ( var i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tvar clip = AnimationClip.parse( json[ i ] );\n\n\t\t\t\tanimations.push( clip );\n\n\t\t\t}\n\n\t\t\treturn animations;\n\n\t\t},\n\n\t\tparseImages: function ( json, onLoad ) {\n\n\t\t\tvar scope = this;\n\t\t\tvar images = {};\n\n\t\t\tfunction loadImage( url ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\treturn loader.load( url, function () {\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, undefined, function () {\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\t\tvar manager = new LoadingManager( onLoad );\n\n\t\t\t\tvar loader = new ImageLoader( manager );\n\t\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar image = json[ i ];\n\t\t\t\t\tvar path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url;\n\n\t\t\t\t\timages[ image.uuid ] = loadImage( path );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn images;\n\n\t\t},\n\n\t\tparseTextures: function ( json, images ) {\n\n\t\t\tfunction parseConstant( value, type ) {\n\n\t\t\t\tif ( typeof( value ) === 'number' ) return value;\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\t\treturn type[ value ];\n\n\t\t\t}\n\n\t\t\tvar textures = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar texture = new Texture( images[ data.image ] );\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TextureMapping );\n\n\t\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TextureWrapping );\n\t\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TextureWrapping );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TextureFilter );\n\t\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TextureFilter );\n\t\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn textures;\n\n\t\t},\n\n\t\tparseObject: function () {\n\n\t\t\tvar matrix = new Matrix4();\n\n\t\t\treturn function parseObject( data, geometries, materials ) {\n\n\t\t\t\tvar object;\n\n\t\t\t\tfunction getGeometry( name ) {\n\n\t\t\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn geometries[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tfunction getMaterial( name ) {\n\n\t\t\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn materials[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'Scene':\n\n\t\t\t\t\t\tobject = new Scene();\n\n\t\t\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\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\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'AmbientLight':\n\n\t\t\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'DirectionalLight':\n\n\t\t\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\n\t\t\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\n\t\t\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\n\t\t\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Mesh':\n\n\t\t\t\t\t\tvar geometry = getGeometry( data.geometry );\n\t\t\t\t\t\tvar material = getMaterial( data.material );\n\n\t\t\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 ) {\n\n\t\t\t\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LOD':\n\n\t\t\t\t\t\tobject = new LOD();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Line':\n\n\t\t\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LineSegments':\n\n\t\t\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointCloud':\n\t\t\t\t\tcase 'Points':\n\n\t\t\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Sprite':\n\n\t\t\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Group':\n\n\t\t\t\t\t\tobject = new Group();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tobject = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t\tobject.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) object.name = data.name;\n\t\t\t\tif ( data.matrix !== undefined ) {\n\n\t\t\t\t\tmatrix.fromArray( data.matrix );\n\t\t\t\t\tmatrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\t\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\t\t\tif ( data.shadow ) {\n\n\t\t\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\t\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\n\t\t\t\tif ( data.children !== undefined ) {\n\n\t\t\t\t\tfor ( var child in data.children ) {\n\n\t\t\t\t\t\tobject.add( this.parseObject( data.children[ child ], geometries, materials ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.type === 'LOD' ) {\n\n\t\t\t\t\tvar levels = data.levels;\n\n\t\t\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\t\t\tvar level = levels[ l ];\n\t\t\t\t\t\tvar child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn object;\n\n\t\t\t};\n\n\t\t}()\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Extensible curve object\n\t *\n\t * Some common of Curve methods\n\t * .getPoint(t), getTangent(t)\n\t * .getPointAt(u), getTangentAt(u)\n\t * .getPoints(), .getSpacedPoints()\n\t * .getLength()\n\t * .updateArcLengths()\n\t *\n\t * This following classes subclasses THREE.Curve:\n\t *\n\t * -- 2d classes --\n\t * THREE.LineCurve\n\t * THREE.QuadraticBezierCurve\n\t * THREE.CubicBezierCurve\n\t * THREE.SplineCurve\n\t * THREE.ArcCurve\n\t * THREE.EllipseCurve\n\t *\n\t * -- 3d classes --\n\t * THREE.LineCurve3\n\t * THREE.QuadraticBezierCurve3\n\t * THREE.CubicBezierCurve3\n\t * THREE.SplineCurve3\n\t *\n\t * A series of curves can be represented as a THREE.CurvePath\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tAbstract Curve base class\n\t **************************************************************/\n\n\tfunction Curve() {}\n\n\tCurve.prototype = {\n\n\t\tconstructor: Curve,\n\n\t\t// Virtual base class method to overwrite and implement in subclasses\n\t\t//\t- t [0 .. 1]\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tconsole.warn( \"THREE.Curve: Warning, getPoint() not implemented!\" );\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// Get point at relative position in curve according to arc length\n\t\t// - u [0 .. 1]\n\n\t\tgetPointAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getPoint( t );\n\n\t\t},\n\n\t\t// Get sequence of points using getPoint( t )\n\n\t\tgetPoints: function ( divisions ) {\n\n\t\t\tif ( ! divisions ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get sequence of points using getPointAt( u )\n\n\t\tgetSpacedPoints: function ( divisions ) {\n\n\t\t\tif ( ! divisions ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get total curve arc length\n\n\t\tgetLength: function () {\n\n\t\t\tvar lengths = this.getLengths();\n\t\t\treturn lengths[ lengths.length - 1 ];\n\n\t\t},\n\n\t\t// Get list of cumulative segment lengths\n\n\t\tgetLengths: function ( divisions ) {\n\n\t\t\tif ( ! divisions ) divisions = ( this.__arcLengthDivisions ) ? ( this.__arcLengthDivisions ) : 200;\n\n\t\t\tif ( this.cacheArcLengths\n\t\t\t\t&& ( this.cacheArcLengths.length === divisions + 1 )\n\t\t\t\t&& ! this.needsUpdate ) {\n\n\t\t\t\t//console.log( \"cached\", this.cacheArcLengths );\n\t\t\t\treturn this.cacheArcLengths;\n\n\t\t\t}\n\n\t\t\tthis.needsUpdate = false;\n\n\t\t\tvar cache = [];\n\t\t\tvar current, last = this.getPoint( 0 );\n\t\t\tvar p, sum = 0;\n\n\t\t\tcache.push( 0 );\n\n\t\t\tfor ( p = 1; p <= divisions; p ++ ) {\n\n\t\t\t\tcurrent = this.getPoint ( p / divisions );\n\t\t\t\tsum += current.distanceTo( last );\n\t\t\t\tcache.push( sum );\n\t\t\t\tlast = current;\n\n\t\t\t}\n\n\t\t\tthis.cacheArcLengths = cache;\n\n\t\t\treturn cache; // { sums: cache, sum:sum }; Sum is in the last element.\n\n\t\t},\n\n\t\tupdateArcLengths: function() {\n\n\t\t\tthis.needsUpdate = true;\n\t\t\tthis.getLengths();\n\n\t\t},\n\n\t\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\t\tgetUtoTmapping: function ( u, distance ) {\n\n\t\t\tvar arcLengths = this.getLengths();\n\n\t\t\tvar i = 0, il = arcLengths.length;\n\n\t\t\tvar targetArcLength; // The targeted u distance value to get\n\n\t\t\tif ( distance ) {\n\n\t\t\t\ttargetArcLength = distance;\n\n\t\t\t} else {\n\n\t\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t\t}\n\n\t\t\t//var time = Date.now();\n\n\t\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\t\tvar low = 0, high = il - 1, comparison;\n\n\t\t\twhile ( low <= high ) {\n\n\t\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\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\t\tlow = i + 1;\n\n\t\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\t\thigh = i - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thigh = i;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// DONE\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ti = high;\n\n\t\t\t//console.log('b' , i, low, high, Date.now()- time);\n\n\t\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\t\tvar t = i / ( il - 1 );\n\t\t\t\treturn t;\n\n\t\t\t}\n\n\t\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\t\tvar lengthBefore = arcLengths[ i ];\n\t\t\tvar lengthAfter = arcLengths[ i + 1 ];\n\n\t\t\tvar segmentLength = lengthAfter - lengthBefore;\n\n\t\t\t// determine where we are between the 'before' and 'after' points\n\n\t\t\tvar segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t\t// add that fractional amount to t\n\n\t\t\tvar t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\t\treturn t;\n\n\t\t},\n\n\t\t// Returns a unit vector tangent at t\n\t\t// In case any sub curve does not implement its tangent derivation,\n\t\t// 2 points a small delta apart will be used to find its gradient\n\t\t// which seems to give a reasonable approximation\n\n\t\tgetTangent: function( t ) {\n\n\t\t\tvar delta = 0.0001;\n\t\t\tvar t1 = t - delta;\n\t\t\tvar t2 = t + delta;\n\n\t\t\t// Capping in case of danger\n\n\t\t\tif ( t1 < 0 ) t1 = 0;\n\t\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\t\tvar pt1 = this.getPoint( t1 );\n\t\t\tvar pt2 = this.getPoint( t2 );\n\n\t\t\tvar vec = pt2.clone().sub( pt1 );\n\t\t\treturn vec.normalize();\n\n\t\t},\n\n\t\tgetTangentAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getTangent( t );\n\n\t\t},\n\n\t\tcomputeFrenetFrames: function ( segments, closed ) {\n\n\t\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\t\tvar normal = new Vector3();\n\n\t\t\tvar tangents = [];\n\t\t\tvar normals = [];\n\t\t\tvar binormals = [];\n\n\t\t\tvar vec = new Vector3();\n\t\t\tvar mat = new Matrix4();\n\n\t\t\tvar i, u, theta;\n\n\t\t\t// compute the tangent vectors for each segment on the curve\n\n\t\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\t\tu = i / segments;\n\n\t\t\t\ttangents[ i ] = this.getTangentAt( u );\n\t\t\t\ttangents[ i ].normalize();\n\n\t\t\t}\n\n\t\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t\t// and in the direction of the minimum tangent xyz component\n\n\t\t\tnormals[ 0 ] = new Vector3();\n\t\t\tbinormals[ 0 ] = new Vector3();\n\t\t\tvar min = Number.MAX_VALUE;\n\t\t\tvar tx = Math.abs( tangents[ 0 ].x );\n\t\t\tvar ty = Math.abs( tangents[ 0 ].y );\n\t\t\tvar tz = Math.abs( tangents[ 0 ].z );\n\n\t\t\tif ( tx <= min ) {\n\n\t\t\t\tmin = tx;\n\t\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( ty <= min ) {\n\n\t\t\t\tmin = ty;\n\t\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t\t}\n\n\t\t\tif ( tz <= min ) {\n\n\t\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t\t}\n\n\t\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\t\tvec.normalize();\n\n\t\t\t\t\ttheta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t\t}\n\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\t\tif ( closed === true ) {\n\n\t\t\t\ttheta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\t\ttheta /= segments;\n\n\t\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\t\ttheta = - theta;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t\t// twist a little...\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttangents: tangents,\n\t\t\t\tnormals: normals,\n\t\t\t\tbinormals: binormals\n\t\t\t};\n\n\t\t}\n\n\t};\n\n\t// TODO: Transformation for Curves?\n\n\t/**************************************************************\n\t *\t3D Curves\n\t **************************************************************/\n\n\t// A Factory method for creating new curve subclasses\n\n\tCurve.create = function ( constructor, getPointFunc ) {\n\n\t\tconstructor.prototype = Object.create( Curve.prototype );\n\t\tconstructor.prototype.constructor = constructor;\n\t\tconstructor.prototype.getPoint = getPointFunc;\n\n\t\treturn constructor;\n\n\t};\n\n\t/**************************************************************\n\t *\tLine\n\t **************************************************************/\n\n\tfunction LineCurve( v1, v2 ) {\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve.prototype = Object.create( Curve.prototype );\n\tLineCurve.prototype.constructor = LineCurve;\n\n\tLineCurve.prototype.isLineCurve = true;\n\n\tLineCurve.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar point = this.v2.clone().sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\treturn point;\n\n\t};\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\n\tLineCurve.prototype.getPointAt = function ( u ) {\n\n\t\treturn this.getPoint( u );\n\n\t};\n\n\tLineCurve.prototype.getTangent = function( t ) {\n\n\t\tvar tangent = this.v2.clone().sub( this.v1 );\n\n\t\treturn tangent.normalize();\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tCurved Path - a curve path is simply a array of connected\n\t * curves, but retains the api of a curve\n\t **************************************************************/\n\n\tfunction CurvePath() {\n\n\t\tthis.curves = [];\n\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tCurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {\n\n\t\tconstructor: CurvePath,\n\n\t\tadd: function ( curve ) {\n\n\t\t\tthis.curves.push( curve );\n\n\t\t},\n\n\t\tclosePath: function () {\n\n\t\t\t// Add a line curve if start and end of lines are not connected\n\t\t\tvar startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\t\tvar endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tvar d = t * this.getLength();\n\t\t\tvar curveLengths = this.getCurveLengths();\n\t\t\tvar i = 0;\n\n\t\t\t// To think about boundaries points.\n\n\t\t\twhile ( i < curveLengths.length ) {\n\n\t\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\t\tvar diff = curveLengths[ i ] - d;\n\t\t\t\t\tvar curve = this.curves[ i ];\n\n\t\t\t\t\tvar segmentLength = curve.getLength();\n\t\t\t\t\tvar u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\t\treturn curve.getPointAt( u );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t\t// loop where sum != 0, sum > d , sum+1 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\tpoints.push( points[ 0 ] );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t/**************************************************************\n\t\t *\tCreate Geometries Helpers\n\t\t **************************************************************/\n\n\t\t/// Generate geometry from path points (for Line or Points objects)\n\n\t\tcreatePointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\t// Generate geometry from equidistant sampling along the path\n\n\t\tcreateSpacedPointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getSpacedPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\tcreateGeometry: function ( points ) {\n\n\t\t\tvar geometry = new Geometry();\n\n\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tvar point = points[ i ];\n\t\t\t\tgeometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\t/**************************************************************\n\t *\tEllipse curve\n\t **************************************************************/\n\n\tfunction EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\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 || 0;\n\n\t}\n\n\tEllipseCurve.prototype = Object.create( Curve.prototype );\n\tEllipseCurve.prototype.constructor = EllipseCurve;\n\n\tEllipseCurve.prototype.isEllipseCurve = true;\n\n\tEllipseCurve.prototype.getPoint = function( t ) {\n\n\t\tvar twoPi = Math.PI * 2;\n\t\tvar deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tvar 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\tvar angle = this.aStartAngle + t * deltaAngle;\n\t\tvar x = this.aX + this.xRadius * Math.cos( angle );\n\t\tvar y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tvar cos = Math.cos( this.aRotation );\n\t\t\tvar sin = Math.sin( this.aRotation );\n\n\t\t\tvar tx = x - this.aX;\n\t\t\tvar 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 new Vector2( x, y );\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tvar CurveUtils = {\n\n\t\ttangentQuadraticBezier: function ( t, p0, p1, p2 ) {\n\n\t\t\treturn 2 * ( 1 - t ) * ( p1 - p0 ) + 2 * t * ( p2 - p1 );\n\n\t\t},\n\n\t\t// Puay Bing, thanks for helping with this derivative!\n\n\t\ttangentCubicBezier: function ( t, p0, p1, p2, p3 ) {\n\n\t\t\treturn - 3 * p0 * ( 1 - t ) * ( 1 - t ) +\n\t\t\t\t3 * p1 * ( 1 - t ) * ( 1 - t ) - 6 * t * p1 * ( 1 - t ) +\n\t\t\t\t6 * t * p2 * ( 1 - t ) - 3 * t * t * p2 +\n\t\t\t\t3 * t * t * p3;\n\n\t\t},\n\n\t\ttangentSpline: function ( t, p0, p1, p2, p3 ) {\n\n\t\t\t// To check if my formulas are correct\n\n\t\t\tvar h00 = 6 * t * t - 6 * t; \t// derived from 2t^3 − 3t^2 + 1\n\t\t\tvar h10 = 3 * t * t - 4 * t + 1; // t^3 − 2t^2 + t\n\t\t\tvar h01 = - 6 * t * t + 6 * t; \t// − 2t3 + 3t2\n\t\t\tvar h11 = 3 * t * t - 2 * t;\t// t3 − t2\n\n\t\t\treturn h00 + h10 + h01 + h11;\n\n\t\t},\n\n\t\t// Catmull-Rom\n\n\t\tinterpolate: function( p0, p1, p2, p3, t ) {\n\n\t\t\tvar v0 = ( p2 - p0 ) * 0.5;\n\t\t\tvar v1 = ( p3 - p1 ) * 0.5;\n\t\t\tvar t2 = t * t;\n\t\t\tvar t3 = t * t2;\n\t\t\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t\t}\n\n\t};\n\n\t/**************************************************************\n\t *\tSpline curve\n\t **************************************************************/\n\n\tfunction SplineCurve( points /* array of Vector2 */ ) {\n\n\t\tthis.points = ( points === undefined ) ? [] : points;\n\n\t}\n\n\tSplineCurve.prototype = Object.create( Curve.prototype );\n\tSplineCurve.prototype.constructor = SplineCurve;\n\n\tSplineCurve.prototype.isSplineCurve = true;\n\n\tSplineCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar point = ( points.length - 1 ) * t;\n\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tvar point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tvar point1 = points[ intPoint ];\n\t\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tvar interpolate = CurveUtils.interpolate;\n\n\t\treturn new Vector2(\n\t\t\tinterpolate( point0.x, point1.x, point2.x, point3.x, weight ),\n\t\t\tinterpolate( point0.y, point1.y, point2.y, point3.y, weight )\n\t\t);\n\n\t};\n\n\t/**************************************************************\n\t *\tCubic Bezier curve\n\t **************************************************************/\n\n\tfunction CubicBezierCurve( v0, v1, v2, v3 ) {\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\tCubicBezierCurve.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve.prototype.constructor = CubicBezierCurve;\n\n\tCubicBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar b3 = ShapeUtils.b3;\n\n\t\treturn new Vector2(\n\t\t\tb3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ),\n\t\t\tb3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y )\n\t\t);\n\n\t};\n\n\tCubicBezierCurve.prototype.getTangent = function( t ) {\n\n\t\tvar tangentCubicBezier = CurveUtils.tangentCubicBezier;\n\n\t\treturn new Vector2(\n\t\t\ttangentCubicBezier( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ),\n\t\t\ttangentCubicBezier( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y )\n\t\t).normalize();\n\n\t};\n\n\t/**************************************************************\n\t *\tQuadratic Bezier curve\n\t **************************************************************/\n\n\n\tfunction QuadraticBezierCurve( v0, v1, v2 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;\n\n\n\tQuadraticBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar b2 = ShapeUtils.b2;\n\n\t\treturn new Vector2(\n\t\t\tb2( t, this.v0.x, this.v1.x, this.v2.x ),\n\t\t\tb2( t, this.v0.y, this.v1.y, this.v2.y )\n\t\t);\n\n\t};\n\n\n\tQuadraticBezierCurve.prototype.getTangent = function( t ) {\n\n\t\tvar tangentQuadraticBezier = CurveUtils.tangentQuadraticBezier;\n\n\t\treturn new Vector2(\n\t\t\ttangentQuadraticBezier( t, this.v0.x, this.v1.x, this.v2.x ),\n\t\t\ttangentQuadraticBezier( t, this.v0.y, this.v1.y, this.v2.y )\n\t\t).normalize();\n\n\t};\n\n\tvar PathPrototype = Object.assign( Object.create( CurvePath.prototype ), {\n\n\t\tfromPoints: function ( vectors ) {\n\n\t\t\tthis.moveTo( vectors[ 0 ].x, vectors[ 0 ].y );\n\n\t\t\tfor ( var i = 1, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lineTo( vectors[ i ].x, vectors[ i ].y );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tvar curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tvar curve = new QuadraticBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tvar curve = new CubicBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts /*Array of Vector*/ ) {\n\n\t\t\tvar npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\t\tvar curve = new SplineCurve( npts );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\t},\n\n\t\tarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tabsarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t},\n\n\t\tabsellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t\t// if a previous curve is present, attempt to join\n\t\t\t\tvar firstPoint = curve.getPoint( 0 );\n\n\t\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tvar lastPoint = curve.getPoint( 1 );\n\t\t\tthis.currentPoint.copy( lastPoint );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Defines a 2d shape plane using paths.\n\t **/\n\n\t// STEP 1 Create a path.\n\t// STEP 2 Turn path into shape.\n\t// STEP 3 ExtrudeGeometry takes in Shape/Shapes\n\t// STEP 3a - Extract points from each shape, turn to vertices\n\t// STEP 3b - Triangulate each shape, add faces.\n\n\tfunction Shape() {\n\n\t\tPath.apply( this, arguments );\n\n\t\tthis.holes = [];\n\n\t}\n\n\tShape.prototype = Object.assign( Object.create( PathPrototype ), {\n\n\t\tconstructor: Shape,\n\n\t\tgetPointsHoles: function ( divisions ) {\n\n\t\t\tvar holesPts = [];\n\n\t\t\tfor ( var i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t\t}\n\n\t\t\treturn holesPts;\n\n\t\t},\n\n\t\t// Get points of shape and holes (keypoints based on segments parameter)\n\n\t\textractAllPoints: function ( divisions ) {\n\n\t\t\treturn {\n\n\t\t\t\tshape: this.getPoints( divisions ),\n\t\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t\t};\n\n\t\t},\n\n\t\textractPoints: function ( divisions ) {\n\n\t\t\treturn this.extractAllPoints( divisions );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Creates free form 2d path using series of points, lines or curves.\n\t *\n\t **/\n\n\tfunction Path( points ) {\n\n\t\tCurvePath.call( this );\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.fromPoints( points );\n\n\t\t}\n\n\t}\n\n\tPath.prototype = PathPrototype;\n\tPathPrototype.constructor = Path;\n\n\n\t// minimal class for proxing functions to Path. Replaces old \"extractSubpaths()\"\n\tfunction ShapePath() {\n\t\tthis.subPaths = [];\n\t\tthis.currentPath = null;\n\t}\n\n\tShapePath.prototype = {\n\t\tmoveTo: function ( x, y ) {\n\t\t\tthis.currentPath = new Path();\n\t\t\tthis.subPaths.push(this.currentPath);\n\t\t\tthis.currentPath.moveTo( x, y );\n\t\t},\n\t\tlineTo: function ( x, y ) {\n\t\t\tthis.currentPath.lineTo( x, y );\n\t\t},\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\t\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\t\t},\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\t\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\t\t},\n\t\tsplineThru: function ( pts ) {\n\t\t\tthis.currentPath.splineThru( pts );\n\t\t},\n\n\t\ttoShapes: function ( isCCW, noHoles ) {\n\n\t\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\t\tvar shapes = [];\n\n\t\t\t\tfor ( var i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar tmpPath = inSubpaths[ i ];\n\n\t\t\t\t\tvar tmpShape = new Shape();\n\t\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t\t}\n\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\t\tvar polyLen = inPolygon.length;\n\n\t\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\t\tvar inside = false;\n\t\t\t\tfor ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\t\tvar edgeLowPt = inPolygon[ p ];\n\t\t\t\t\tvar edgeHighPt = inPolygon[ q ];\n\n\t\t\t\t\tvar edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\t\tvar edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t\t// not parallel\n\t\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\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\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\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\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// parallel or collinear\n\t\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\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\t// continue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn\tinside;\n\n\t\t\t}\n\n\t\t\tvar isClockWise = ShapeUtils.isClockWise;\n\n\t\t\tvar subPaths = this.subPaths;\n\t\t\tif ( subPaths.length === 0 ) return [];\n\n\t\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tvar solid, tmpPath, tmpShape, shapes = [];\n\n\t\t\tif ( subPaths.length === 1 ) {\n\n\t\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\t\ttmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tvar holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\t\tvar betterShapeHoles = [];\n\t\t\tvar newShapes = [];\n\t\t\tvar newShapeHoles = [];\n\t\t\tvar mainIdx = 0;\n\t\t\tvar tmpPoints;\n\n\t\t\tnewShapes[ mainIdx ] = undefined;\n\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\tfor ( var i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\t\ttmpPath = subPaths[ i ];\n\t\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\t\tif ( solid ) {\n\n\t\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t\t//console.log('cw', i);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t\t//console.log('ccw', i);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tif ( newShapes.length > 1 ) {\n\n\t\t\t\tvar ambiguous = false;\n\t\t\t\tvar toChange = [];\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tvar sho = newShapeHoles[ sIdx ];\n\n\t\t\t\t\tfor ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\t\tvar ho = sho[ hIdx ];\n\t\t\t\t\t\tvar hole_unassigned = true;\n\n\t\t\t\t\t\tfor ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );\n\t\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\t// console.log(\"ambiguous: \", ambiguous);\n\t\t\t\tif ( toChange.length > 0 ) {\n\n\t\t\t\t\t// console.log(\"to change: \", toChange);\n\t\t\t\t\tif ( ! ambiguous )\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar tmpHoles;\n\n\t\t\tfor ( var i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\t\tfor ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//console.log(\"shape\", shapes);\n\n\t\t\treturn shapes;\n\n\t\t}\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Font( data ) {\n\n\t\tthis.data = data;\n\n\t}\n\n\tObject.assign( Font.prototype, {\n\n\t\tisFont: true,\n\n\t\tgenerateShapes: function ( text, size, divisions ) {\n\n\t\t\tfunction createPaths( text ) {\n\n\t\t\t\tvar chars = String( text ).split( '' );\n\t\t\t\tvar scale = size / data.resolution;\n\t\t\t\tvar offset = 0;\n\n\t\t\t\tvar paths = [];\n\n\t\t\t\tfor ( var i = 0; i < chars.length; i ++ ) {\n\n\t\t\t\t\tvar ret = createPath( chars[ i ], scale, offset );\n\t\t\t\t\toffset += ret.offset;\n\n\t\t\t\t\tpaths.push( ret.path );\n\n\t\t\t\t}\n\n\t\t\t\treturn paths;\n\n\t\t\t}\n\n\t\t\tfunction createPath( c, scale, offset ) {\n\n\t\t\t\tvar glyph = data.glyphs[ c ] || data.glyphs[ '?' ];\n\n\t\t\t\tif ( ! glyph ) return;\n\n\t\t\t\tvar path = new ShapePath();\n\n\t\t\t\tvar pts = [], b2 = ShapeUtils.b2, b3 = ShapeUtils.b3;\n\t\t\t\tvar x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste;\n\n\t\t\t\tif ( glyph.o ) {\n\n\t\t\t\t\tvar outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\t\t\t\tfor ( var i = 0, l = outline.length; i < l; ) {\n\n\t\t\t\t\t\tvar action = outline[ i ++ ];\n\n\t\t\t\t\t\tswitch ( action ) {\n\n\t\t\t\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tb2( t, cpx0, cpx1, cpx );\n\t\t\t\t\t\t\t\t\t\tb2( t, cpy0, cpy1, cpy );\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\tbreak;\n\n\t\t\t\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale;\n\t\t\t\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy2 = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tb3( t, cpx0, cpx1, cpx2, cpx );\n\t\t\t\t\t\t\t\t\t\tb3( t, cpy0, cpy1, cpy2, cpy );\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\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn { offset: glyph.ha * scale, path: path };\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( size === undefined ) size = 100;\n\t\t\tif ( divisions === undefined ) divisions = 4;\n\n\t\t\tvar data = this.data;\n\n\t\t\tvar paths = createPaths( text );\n\t\t\tvar shapes = [];\n\n\t\t\tfor ( var p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FontLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FontLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\t\t\t\tjson = JSON.parse( text.substring( 65, text.length - 2 ) );\n\n\t\t\t\t}\n\n\t\t\t\tvar font = scope.parse( json );\n\n\t\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\treturn new Font( json );\n\n\t\t}\n\n\t} );\n\n\tvar context;\n\n\tfunction getAudioContext() {\n\n\t\tif ( context === undefined ) {\n\n\t\t\tcontext = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn context;\n\n\t}\n\n\t/**\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction AudioLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( AudioLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar context = getAudioContext();\n\n\t\t\t\tcontext.decodeAudioData( buffer, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction StereoCamera() {\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}\n\n\tObject.assign( StereoCamera.prototype, {\n\n\t\tupdate: ( function () {\n\n\t\t\tvar instance, focus, fov, aspect, near, far, zoom;\n\n\t\t\tvar eyeRight = new Matrix4();\n\t\t\tvar eyeLeft = new Matrix4();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov ||\n\t\t\t\t\t\t\t\t\t\t\t\t\taspect !== camera.aspect * this.aspect || near !== camera.near ||\n\t\t\t\t\t\t\t\t\t\t\t\t\tfar !== camera.far || zoom !== camera.zoom;\n\n\t\t\t\tif ( needsUpdate ) {\n\n\t\t\t\t\tinstance = this;\n\t\t\t\t\tfocus = camera.focus;\n\t\t\t\t\tfov = camera.fov;\n\t\t\t\t\taspect = camera.aspect * this.aspect;\n\t\t\t\t\tnear = camera.near;\n\t\t\t\t\tfar = camera.far;\n\t\t\t\t\tzoom = camera.zoom;\n\n\t\t\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t\t\tvar projectionMatrix = camera.projectionMatrix.clone();\n\t\t\t\t\tvar eyeSep = this.eyeSep / 2;\n\t\t\t\t\tvar eyeSepOnProjection = eyeSep * near / focus;\n\t\t\t\t\tvar ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom;\n\t\t\t\t\tvar xmin, xmax;\n\n\t\t\t\t\t// translate xOffset\n\n\t\t\t\t\teyeLeft.elements[ 12 ] = - eyeSep;\n\t\t\t\t\teyeRight.elements[ 12 ] = eyeSep;\n\n\t\t\t\t\t// for left eye\n\n\t\t\t\t\txmin = - ymax * aspect + eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect + eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t\t// for right eye\n\n\t\t\t\t\txmin = - ymax * aspect - eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect - eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\n\t\t\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * Camera for rendering cube maps\n\t *\t- renders scene into axis-aligned cube\n\t *\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CubeCamera( near, far, cubeResolution ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tvar fov = 90, aspect = 1;\n\n\t\tvar cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.up.set( 0, - 1, 0 );\n\t\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\t\tthis.add( cameraPX );\n\n\t\tvar cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.up.set( 0, - 1, 0 );\n\t\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\t\tthis.add( cameraNX );\n\n\t\tvar cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.up.set( 0, 0, 1 );\n\t\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\t\tthis.add( cameraPY );\n\n\t\tvar cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.up.set( 0, 0, - 1 );\n\t\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\t\tthis.add( cameraNY );\n\n\t\tvar cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.up.set( 0, - 1, 0 );\n\t\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\t\tthis.add( cameraPZ );\n\n\t\tvar cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.up.set( 0, - 1, 0 );\n\t\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\t\tthis.add( cameraNZ );\n\n\t\tvar options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };\n\n\t\tthis.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );\n\n\t\tthis.updateCubeMap = function ( renderer, scene ) {\n\n\t\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\t\tvar renderTarget = this.renderTarget;\n\t\t\tvar generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\t\trenderTarget.activeCubeFace = 0;\n\t\t\trenderer.render( scene, cameraPX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 1;\n\t\t\trenderer.render( scene, cameraNX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 2;\n\t\t\trenderer.render( scene, cameraPY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 3;\n\t\t\trenderer.render( scene, cameraNY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 4;\n\t\t\trenderer.render( scene, cameraPZ, renderTarget );\n\n\t\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\t\trenderTarget.activeCubeFace = 5;\n\t\t\trenderer.render( scene, cameraNZ, renderTarget );\n\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t};\n\n\t}\n\n\tCubeCamera.prototype = Object.create( Object3D.prototype );\n\tCubeCamera.prototype.constructor = CubeCamera;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioListener() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = getAudioContext();\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}\n\n\tAudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: AudioListener,\n\n\t\tgetInput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tremoveFilter: function ( ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\t\tthis.gain.connect( this.context.destination );\n\t\t\t\tthis.filter = null;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.filter;\n\n\t\t},\n\n\t\tsetFilter: function ( value ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t\t} else {\n\n\t\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t\t}\n\n\t\t\tthis.filter = value;\n\t\t\tthis.gain.connect( this.filter );\n\t\t\tthis.filter.connect( this.context.destination );\n\n\t\t},\n\n\t\tgetMasterVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\t\tsetMasterVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\t\t\tvar scale = new Vector3();\n\n\t\t\tvar orientation = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tvar listener = this.context.listener;\n\t\t\t\tvar up = this.up;\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, scale );\n\n\t\t\t\torientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t\t\tlistener.setPosition( position.x, position.y, position.z );\n\t\t\t\tlistener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z );\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction Audio( listener ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.context = listener.context;\n\t\tthis.source = this.context.createBufferSource();\n\t\tthis.source.onended = this.onEnded.bind( this );\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.startTime = 0;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis.filters = [];\n\n\t}\n\n\tAudio.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Audio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tsetNodeSource: function ( audioNode ) {\n\n\t\t\tthis.hasPlaybackControl = false;\n\t\t\tthis.sourceType = 'audioNode';\n\t\t\tthis.source = audioNode;\n\t\t\tthis.connect();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetBuffer: function ( audioBuffer ) {\n\n\t\t\tthis.source.buffer = audioBuffer;\n\t\t\tthis.sourceType = 'buffer';\n\n\t\t\tif ( this.autoplay ) this.play();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tplay: function () {\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar source = this.context.createBufferSource();\n\n\t\t\tsource.buffer = this.source.buffer;\n\t\t\tsource.loop = this.source.loop;\n\t\t\tsource.onended = this.source.onended;\n\t\t\tsource.start( 0, this.startTime );\n\t\t\tsource.playbackRate.value = this.playbackRate;\n\n\t\t\tthis.isPlaying = true;\n\n\t\t\tthis.source = source;\n\n\t\t\treturn this.connect();\n\n\t\t},\n\n\t\tpause: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = this.context.currentTime;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = 0;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdisconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilters: function () {\n\n\t\t\treturn this.filters;\n\n\t\t},\n\n\t\tsetFilters: function ( value ) {\n\n\t\t\tif ( ! value ) value = [];\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.disconnect();\n\t\t\t\tthis.filters = value;\n\t\t\t\tthis.connect();\n\n\t\t\t} else {\n\n\t\t\t\tthis.filters = value;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.getFilters()[ 0 ];\n\n\t\t},\n\n\t\tsetFilter: function ( filter ) {\n\n\t\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t\t},\n\n\t\tsetPlaybackRate: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.playbackRate = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.playbackRate.value = this.playbackRate;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetPlaybackRate: function () {\n\n\t\t\treturn this.playbackRate;\n\n\t\t},\n\n\t\tonEnded: function () {\n\n\t\t\tthis.isPlaying = false;\n\n\t\t},\n\n\t\tgetLoop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn this.source.loop;\n\n\t\t},\n\n\t\tsetLoop: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.loop = value;\n\n\t\t},\n\n\t\tgetVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\n\t\tsetVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PositionalAudio( listener ) {\n\n\t\tAudio.call( this, listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tPositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {\n\n\t\tconstructor: PositionalAudio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.panner;\n\n\t\t},\n\n\t\tgetRefDistance: function () {\n\n\t\t\treturn this.panner.refDistance;\n\n\t\t},\n\n\t\tsetRefDistance: function ( value ) {\n\n\t\t\tthis.panner.refDistance = value;\n\n\t\t},\n\n\t\tgetRolloffFactor: function () {\n\n\t\t\treturn this.panner.rolloffFactor;\n\n\t\t},\n\n\t\tsetRolloffFactor: function ( value ) {\n\n\t\t\tthis.panner.rolloffFactor = value;\n\n\t\t},\n\n\t\tgetDistanceModel: function () {\n\n\t\t\treturn this.panner.distanceModel;\n\n\t\t},\n\n\t\tsetDistanceModel: function ( value ) {\n\n\t\t\tthis.panner.distanceModel = value;\n\n\t\t},\n\n\t\tgetMaxDistance: function () {\n\n\t\t\treturn this.panner.maxDistance;\n\n\t\t},\n\n\t\tsetMaxDistance: function ( value ) {\n\n\t\t\tthis.panner.maxDistance = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tposition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tthis.panner.setPosition( position.x, position.y, position.z );\n\n\t\t\t};\n\n\t\t} )()\n\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioAnalyser( audio, fftSize ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\tObject.assign( AudioAnalyser.prototype, {\n\n\t\tgetFrequencyData: function () {\n\n\t\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\t\treturn this.data;\n\n\t\t},\n\n\t\tgetAverageFrequency: function () {\n\n\t\t\tvar value = 0, data = this.getFrequencyData();\n\n\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tvalue += data[ i ];\n\n\t\t\t}\n\n\t\t\treturn value / data.length;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Buffered scene graph property that allows weighted accumulation.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyMixer( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tvar bufferType = Float64Array,\n\t\t\tmixFunction;\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\t\t\tmixFunction = this._slerp;\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\n\t\t\t\tbufferType = Array,\t\tmixFunction = this._select;\t\tbreak;\n\n\t\t\tdefault:\t\t\t\t\tmixFunction = this._lerp;\n\n\t\t}\n\n\t\tthis.buffer = new bufferType( valueSize * 4 );\n\t\t// layout: [ incoming | accu0 | accu1 | orig ]\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\n\t\tthis._mixBufferRegion = mixFunction;\n\n\t\tthis.cumulativeWeight = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\tPropertyMixer.prototype = {\n\n\t\tconstructor: PropertyMixer,\n\n\t\t// accumulate data in the 'incoming' region into 'accu'\n\t\taccumulate: function( accuIndex, weight ) {\n\n\t\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t\t// the weight and shouldn't have made the call in the first place\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tcurrentWeight = this.cumulativeWeight;\n\n\t\t\tif ( currentWeight === 0 ) {\n\n\t\t\t\t// accuN := incoming * weight\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcurrentWeight = weight;\n\n\t\t\t} else {\n\n\t\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\t\tcurrentWeight += weight;\n\t\t\t\tvar mix = weight / currentWeight;\n\t\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = currentWeight;\n\n\t\t},\n\n\t\t// apply the state of 'accu' to the binding when accus differ\n\t\tapply: function( accuIndex ) {\n\n\t\t\tvar stride = this.valueSize,\n\t\t\t\tbuffer = this.buffer,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tweight = this.cumulativeWeight,\n\n\t\t\t\tbinding = this.binding;\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t\tif ( weight < 1 ) {\n\n\t\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\t\tvar originalValueOffset = stride * 3;\n\n\t\t\t\tthis._mixBufferRegion(\n\t\t\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t\t}\n\n\t\t\tfor ( var i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remember the state of the bound property and copy it to both accus\n\t\tsaveOriginalState: function() {\n\n\t\t\tvar binding = this.binding;\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toriginalValueOffset = stride * 3;\n\n\t\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\t\tfor ( var i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t},\n\n\t\t// apply the state previously taken via 'saveOriginalState' to the binding\n\t\trestoreOriginalState: function() {\n\n\t\t\tvar originalValueOffset = this.valueSize * 3;\n\t\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t\t},\n\n\n\t\t// mix functions\n\n\t\t_select: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tif ( t >= 0.5 ) {\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_slerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tQuaternion.slerpFlat( buffer, dstOffset,\n\t\t\t\t\tbuffer, dstOffset, buffer, srcOffset, t );\n\n\t\t},\n\n\t\t_lerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tvar s = 1 - t;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tvar j = dstOffset + i;\n\n\t\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * A reference to a real property in the scene graph.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyBinding( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode(\n\t\t\t\trootNode, this.parsedPath.nodeName ) || rootNode;\n\n\t\tthis.rootNode = rootNode;\n\n\t}\n\n\tPropertyBinding.prototype = {\n\n\t\tconstructor: PropertyBinding,\n\n\t\tgetValue: function getValue_unbound( targetArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.getValue( targetArray, offset );\n\n\t\t\t// Note: This class uses a State pattern on a per-method basis:\n\t\t\t// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n\t\t\t// prototype version of these methods with one that represents\n\t\t\t// the bound state. When the property is not found, the methods\n\t\t\t// become no-ops.\n\n\t\t},\n\n\t\tsetValue: function getValue_unbound( sourceArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.setValue( sourceArray, offset );\n\n\t\t},\n\n\t\t// create getter / setter pair for a property in the scene graph\n\t\tbind: function() {\n\n\t\t\tvar targetObject = this.node,\n\t\t\t\tparsedPath = this.parsedPath,\n\n\t\t\t\tobjectName = parsedPath.objectName,\n\t\t\t\tpropertyName = parsedPath.propertyName,\n\t\t\t\tpropertyIndex = parsedPath.propertyIndex;\n\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\ttargetObject = PropertyBinding.findNode(\n\t\t\t\t\t\tthis.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\t\tthis.node = targetObject;\n\n\t\t\t}\n\n\t\t\t// set fail state so we can just 'return' on error\n\t\t\tthis.getValue = this._getValue_unavailable;\n\t\t\tthis.setValue = this._setValue_unavailable;\n\n\t \t\t// ensure there is a value node\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\tconsole.error( \" trying to update node for track: \" + this.path + \" but it wasn't found.\" );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( objectName ) {\n\n\t\t\t\tvar objectIndex = parsedPath.objectIndex;\n\n\t\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\t\tswitch ( objectName ) {\n\n\t\t\t\t\tcase 'materials':\n\n\t\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material as node does not have a material', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material.materials as node.material does not have a materials array', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bones':\n\n\t\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to bones as node does not have a skeleton', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\t\tfor ( var i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to objectName of node, undefined', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( \" trying to bind to objectIndex of objectName, but is undefined:\", this, targetObject );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// resolve property\n\t\t\tvar nodeProperty = targetObject[ propertyName ];\n\n\t\t\tif ( nodeProperty === undefined ) {\n\n\t\t\t\tvar nodeName = parsedPath.nodeName;\n\n\t\t\t\tconsole.error( \" trying to update property for track: \" + nodeName +\n\t\t\t\t\t\t'.' + propertyName + \" but it wasn't found.\", targetObject );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// determine versioning scheme\n\t\t\tvar versioning = this.Versioning.None;\n\n\t\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\t\tversioning = this.Versioning.NeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t}\n\n\t\t\t// determine how the property gets bound\n\t\t\tvar bindingType = this.BindingType.Direct;\n\n\t\t\tif ( propertyIndex !== undefined ) {\n\t\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\t\tif ( propertyName === \"morphTargetInfluences\" ) {\n\t\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\t// support resolving morphTarget names into indices.\n\t\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphTargets ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) {\n\n\t\t\t\t\t\t\tpropertyIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\t\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else if ( nodeProperty.length !== undefined ) {\n\n\t\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else {\n\n\t\t\t\tthis.propertyName = propertyName;\n\n\t\t\t}\n\n\t\t\t// select getter / setter\n\t\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tthis.node = null;\n\n\t\t\t// back to the prototype version of getValue / setValue\n\t\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\t\tthis.getValue = this._getValue_unbound;\n\t\t\tthis.setValue = this._setValue_unbound;\n\n\t\t}\n\n\t};\n\n\tObject.assign( PropertyBinding.prototype, { // prototype, continued\n\n\t\t// these are used to \"bind\" a nonexistent property\n\t\t_getValue_unavailable: function() {},\n\t\t_setValue_unavailable: function() {},\n\n\t\t// initial state of these methods that calls 'bind'\n\t\t_getValue_unbound: PropertyBinding.prototype.getValue,\n\t\t_setValue_unbound: PropertyBinding.prototype.setValue,\n\n\t\tBindingType: {\n\t\t\tDirect: 0,\n\t\t\tEntireArray: 1,\n\t\t\tArrayElement: 2,\n\t\t\tHasFromToArray: 3\n\t\t},\n\n\t\tVersioning: {\n\t\t\tNone: 0,\n\t\t\tNeedsUpdate: 1,\n\t\t\tMatrixWorldNeedsUpdate: 2\n\t\t},\n\n\t\tGetterByBindingType: [\n\n\t\t\tfunction getValue_direct( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.node[ this.propertyName ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_array( buffer, offset ) {\n\n\t\t\t\tvar source = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tfunction getValue_arrayElement( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_toArray( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t\t\t}\n\n\t\t],\n\n\t\tSetterByBindingTypeAndVersioning: [\n\n\t\t\t[\n\t\t\t\t// Direct\n\n\t\t\t\tfunction setValue_direct( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// EntireArray\n\n\t\t\t\tfunction setValue_array( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// ArrayElement\n\n\t\t\t\tfunction setValue_arrayElement( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// HasToFromArray\n\n\t\t\t\tfunction setValue_fromArray( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t]\n\n\t\t]\n\n\t} );\n\n\tPropertyBinding.Composite =\n\t\t\tfunction( targetGroup, path, optionalParsedPath ) {\n\n\t\tvar parsedPath = optionalParsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t};\n\n\tPropertyBinding.Composite.prototype = {\n\n\t\tconstructor: PropertyBinding.Composite,\n\n\t\tgetValue: function( array, offset ) {\n\n\t\t\tthis.bind(); // bind all binding\n\n\t\t\tvar firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t\t// and only call .getValue on the first\n\t\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t\t},\n\n\t\tsetValue: function( array, offset ) {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t\t}\n\n\t\t},\n\n\t\tbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].bind();\n\n\t\t\t}\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].unbind();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.create = function( root, path, parsedPath ) {\n\n\t\tif ( ! ( (root && root.isAnimationObjectGroup) ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.parseTrackName = function( trackName ) {\n\n\t\t// matches strings in the form of:\n\t\t// nodeName.property\n\t\t// nodeName.property[accessor]\n\t\t// nodeName.material.property[accessor]\n\t\t// uuid.property[accessor]\n\t\t// uuid.objectName[objectIndex].propertyName[propertyIndex]\n\t\t// parentName/nodeName.property\n\t\t// parentName/parentName/nodeName.property[index]\n\t\t// .bone[Armature.DEF_cog].position\n\t\t// scene:helium_balloon_model:helium_balloon_model.position\n\t\t// created and tested via https://regex101.com/#javascript\n\n\t\tvar re = /^((?:\\w+[\\/:])*)(\\w+)?(?:\\.(\\w+)(?:\\[(.+)\\])?)?\\.(\\w+)(?:\\[(.+)\\])?$/;\n\t\tvar matches = re.exec( trackName );\n\n\t\tif ( ! matches ) {\n\n\t\t\tthrow new Error( \"cannot parse trackName at all: \" + trackName );\n\n\t\t}\n\n\t\tvar results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ], \t// allowed to be null, specified root node.\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ],\n\t\t\tpropertyIndex: matches[ 6 ]\t// allowed to be null, specifies that the whole property is set.\n\t\t};\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( \"can not parse propertyName from trackName: \" + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t};\n\n\tPropertyBinding.findNode = function( root, nodeName ) {\n\n\t\tif ( ! nodeName || nodeName === \"\" || nodeName === \"root\" || nodeName === \".\" || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tvar searchSkeleton = function( skeleton ) {\n\n\t\t\t\tfor( var i = 0; i < skeleton.bones.length; i ++ ) {\n\n\t\t\t\t\tvar bone = skeleton.bones[ i ];\n\n\t\t\t\t\tif ( bone.name === nodeName ) {\n\n\t\t\t\t\t\treturn bone;\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar bone = searchSkeleton( root.skeleton );\n\n\t\t\tif ( bone ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tvar searchNodeSubtree = function( children ) {\n\n\t\t\t\tfor( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tvar childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\t/**\n\t *\n\t * A group of objects that receives a shared animation state.\n\t *\n\t * Usage:\n\t *\n\t * \t-\tAdd objects you would otherwise pass as 'root' to the\n\t * \t\tconstructor or the .clipAction method of AnimationMixer.\n\t *\n\t * \t-\tInstead pass this object as 'root'.\n\t *\n\t * \t-\tYou can also add and remove objects later when the mixer\n\t * \t\tis running.\n\t *\n\t * Note:\n\t *\n\t * \tObjects of this class appear as one object to the mixer,\n\t * \tso cache control of the individual objects must be done\n\t * \ton the group.\n\t *\n\t * Limitation:\n\t *\n\t * \t- \tThe animated properties must be compatible among the\n\t * \t\tall objects in the group.\n\t *\n\t * -\tA single property can either be controlled through a\n\t * \ttarget group or directly, but not both.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction AnimationObjectGroup( var_args ) {\n\n\t\tthis.uuid = _Math.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;\t\t\t// threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tvar indices = {};\n\t\tthis._indicesByUUID = indices;\t\t// for bookkeeping\n\n\t\tfor ( var 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 = [];\t\t\t\t\t// inside: string\n\t\tthis._parsedPaths = [];\t\t\t\t// inside: { we don't care, here }\n\t\tthis._bindings = []; \t\t\t\t// inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; \t// inside: indices in these arrays\n\n\t\tvar scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() { return scope._objects.length; },\n\t\t\t\tget inUse() { return this.total - scope.nCachedObjects_; }\n\t\t\t},\n\n\t\t\tget bindingsPerObject() { return scope._bindings.length; }\n\n\t\t};\n\n\t}\n\n\tAnimationObjectGroup.prototype = {\n\n\t\tconstructor: AnimationObjectGroup,\n\n\t\tisAnimationObjectGroup: true,\n\n\t\tadd: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tpaths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index === undefined ) {\n\n\t\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\t\tindex = nObjects ++;\n\t\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\t\tobjects.push( object );\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tbindings[ j ].push(\n\t\t\t\t\t\t\t\tnew PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\t\tvar knownObject = objects[ index ];\n\n\t\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\t\tbinding = new PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( objects[ index ] !== knownObject) {\n\n\t\t\t\t\tconsole.error( \"Different objects with the same UUID \" +\n\t\t\t\t\t\t\t\"detected. Clean the caches or recreate your \" +\n\t\t\t\t\t\t\t\"infrastructure when reloading scenes...\" );\n\n\t\t\t\t} // else the object is already where we want it to be\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\tremove: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\t\tvar lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// remove & forget\n\t\tuncache: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\t\tvar lastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} // cached or active\n\n\t\t\t\t} // if object is known\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\t\tsubscribe_: function( path, parsedPath ) {\n\t\t\t// returns an array of bindings for the given path that is changed\n\t\t\t// according to the contained objects in the group\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ],\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\t\tvar paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tobjects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\t\tindex = bindings.length;\n\n\t\t\tindicesByPath[ path ] = index;\n\n\t\t\tpaths.push( path );\n\t\t\tparsedPaths.push( parsedPath );\n\t\t\tbindings.push( bindingsForPath );\n\n\t\t\tfor ( var i = nCachedObjects,\n\t\t\t\t\tn = objects.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = objects[ i ];\n\n\t\t\t\tbindingsForPath[ i ] =\n\t\t\t\t\t\tnew PropertyBinding( object, path, parsedPath );\n\n\t\t\t}\n\n\t\t\treturn bindingsForPath;\n\n\t\t},\n\n\t\tunsubscribe_: function( path ) {\n\t\t\t// tells the group to forget about a property path and no longer\n\t\t\t// update the array previously obtained with 'subscribe_'\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar paths = this._paths,\n\t\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\t\tbindings = this._bindings,\n\t\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\t\tbindings[ index ] = lastBindings;\n\t\t\t\tbindings.pop();\n\n\t\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\t\tparsedPaths.pop();\n\n\t\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\t\tpaths.pop();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Action provided by AnimationMixer for scheduling clip playback on specific\n\t * objects.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t *\n\t */\n\n\tfunction AnimationAction( mixer, clip, localRoot ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot || null;\n\n\t\tvar tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tvar interpolantSettings = {\n\t\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tvar 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;\t// 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;\t\t\t// for the memory manager\n\t\tthis._byClipCacheIndex = null;\t\t// 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; \t\t// no. of repetitions when looping\n\n\t\tthis.paused = false;\t\t\t\t// false -> zero effective time scale\n\t\tthis.enabled = true;\t\t\t\t// true -> zero effective weight\n\n\t\tthis.clampWhenFinished \t= false;\t// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart \t= true;\t\t// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd\t\t= true;\t\t// clips for start, loop and end\n\n\t}\n\n\tAnimationAction.prototype = {\n\n\t\tconstructor: AnimationAction,\n\n\t\t// State & Scheduling\n\n\t\tplay: function() {\n\n\t\t\tthis._mixer._activateAction( this );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function() {\n\n\t\t\tthis._mixer._deactivateAction( this );\n\n\t\t\treturn this.reset();\n\n\t\t},\n\n\t\treset: function() {\n\n\t\t\tthis.paused = false;\n\t\t\tthis.enabled = true;\n\n\t\t\tthis.time = 0;\t\t\t// restart clip\n\t\t\tthis._loopCount = -1;\t// forget previous loops\n\t\t\tthis._startTime = null;\t// forget scheduling\n\n\t\t\treturn this.stopFading().stopWarping();\n\n\t\t},\n\n\t\tisRunning: function() {\n\n\t\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\t// return true when play has been called\n\t\tisScheduled: function() {\n\n\t\t\treturn this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\tstartAt: function( time ) {\n\n\t\t\tthis._startTime = time;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetLoop: function( mode, repetitions ) {\n\n\t\t\tthis.loop = mode;\n\t\t\tthis.repetitions = repetitions;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Weight\n\n\t\t// set the weight stopping any scheduled fading\n\t\t// although .enabled = false yields an effective weight of zero, this\n\t\t// method does *not* change .enabled, because it would be confusing\n\t\tsetEffectiveWeight: function( weight ) {\n\n\t\t\tthis.weight = weight;\n\n\t\t\t// note: same logic as when updated at runtime\n\t\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\t\treturn this.stopFading();\n\n\t\t},\n\n\t\t// return the weight considering fading and .enabled\n\t\tgetEffectiveWeight: function() {\n\n\t\t\treturn this._effectiveWeight;\n\n\t\t},\n\n\t\tfadeIn: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t\t},\n\n\t\tfadeOut: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t\t},\n\n\t\tcrossFadeFrom: function( fadeOutAction, duration, warp ) {\n\n\t\t\tfadeOutAction.fadeOut( duration );\n\t\t\tthis.fadeIn( duration );\n\n\t\t\tif( warp ) {\n\n\t\t\t\tvar fadeInDuration = this._clip.duration,\n\t\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossFadeTo: function( fadeInAction, duration, warp ) {\n\n\t\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t\t},\n\n\t\tstopFading: function() {\n\n\t\t\tvar weightInterpolant = this._weightInterpolant;\n\n\t\t\tif ( weightInterpolant !== null ) {\n\n\t\t\t\tthis._weightInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Time Scale Control\n\n\t\t// set the weight stopping any scheduled warping\n\t\t// although .paused = true yields an effective time scale of zero, this\n\t\t// method does *not* change .paused, because it would be confusing\n\t\tsetEffectiveTimeScale: function( timeScale ) {\n\n\t\t\tthis.timeScale = timeScale;\n\t\t\tthis._effectiveTimeScale = this.paused ? 0 :timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\t// return the time scale considering warping and .paused\n\t\tgetEffectiveTimeScale: function() {\n\n\t\t\treturn this._effectiveTimeScale;\n\n\t\t},\n\n\t\tsetDuration: function( duration ) {\n\n\t\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\tsyncWith: function( action ) {\n\n\t\t\tthis.time = action.time;\n\t\t\tthis.timeScale = action.timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\thalt: function( duration ) {\n\n\t\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t\t},\n\n\t\twarp: function( startTimeScale, endTimeScale, duration ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._timeScaleInterpolant,\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant(),\n\t\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now;\n\t\t\ttimes[ 1 ] = now + duration;\n\n\t\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstopWarping: function() {\n\n\t\t\tvar timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\t\tthis._timeScaleInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Object Accessors\n\n\t\tgetMixer: function() {\n\n\t\t\treturn this._mixer;\n\n\t\t},\n\n\t\tgetClip: function() {\n\n\t\t\treturn this._clip;\n\n\t\t},\n\n\t\tgetRoot: function() {\n\n\t\t\treturn this._localRoot || this._mixer._root;\n\n\t\t},\n\n\t\t// Interna\n\n\t\t_update: function( time, deltaTime, timeDirection, accuIndex ) {\n\t\t\t// called by the mixer\n\n\t\t\tvar startTime = this._startTime;\n\n\t\t\tif ( startTime !== null ) {\n\n\t\t\t\t// check for scheduled start of action\n\n\t\t\t\tvar timeRunning = ( time - startTime ) * timeDirection;\n\t\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t\t}\n\n\t\t\t\t// start\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\t// apply time scale and advance time\n\n\t\t\tdeltaTime *= this._updateTimeScale( time );\n\t\t\tvar clipTime = this._updateTime( deltaTime );\n\n\t\t\t// note: _updateTime may disable the action resulting in\n\t\t\t// an effective weight of 0\n\n\t\t\tvar weight = this._updateWeight( time );\n\n\t\t\tif ( weight > 0 ) {\n\n\t\t\t\tvar interpolants = this._interpolants;\n\t\t\t\tvar propertyMixers = this._propertyBindings;\n\n\t\t\t\tfor ( var j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_updateWeight: function( time ) {\n\n\t\t\tvar weight = 0;\n\n\t\t\tif ( this.enabled ) {\n\n\t\t\t\tweight = this.weight;\n\t\t\t\tvar interpolant = this._weightInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\t\tthis.enabled = 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\tthis._effectiveWeight = weight;\n\t\t\treturn weight;\n\n\t\t},\n\n\t\t_updateTimeScale: function( time ) {\n\n\t\t\tvar timeScale = 0;\n\n\t\t\tif ( ! this.paused ) {\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\t\tvar interpolant = this._timeScaleInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\t\tthis.timeScale = timeScale;\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\tthis._effectiveTimeScale = timeScale;\n\t\t\treturn timeScale;\n\n\t\t},\n\n\t\t_updateTime: function( deltaTime ) {\n\n\t\t\tvar time = this.time + deltaTime;\n\n\t\t\tif ( deltaTime === 0 ) return time;\n\n\t\t\tvar duration = this._clip.duration,\n\n\t\t\t\tloop = this.loop,\n\t\t\t\tloopCount = this._loopCount;\n\n\t\t\tif ( loop === LoopOnce ) {\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tthis.loopCount = 0;\n\t\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t\t}\n\n\t\t\t\thandle_stop: {\n\n\t\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\t\ttime = duration;\n\n\t\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\t\ttime = 0;\n\n\t\t\t\t\t} else break handle_stop;\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\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}\n\n\t\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\t\tvar pingPong = ( loop === LoopPingPong );\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\ttrue, this.repetitions === 0, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\tthis.repetitions === 0, true, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( time >= duration || time < 0 ) {\n\t\t\t\t\t// wrap around\n\n\t\t\t\t\tvar loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\t\tvar pending = this.repetitions - loopCount;\n\n\t\t\t\t\tif ( pending < 0 ) {\n\t\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// keep running\n\n\t\t\t\t\t\tif ( pending === 0 ) {\n\t\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\t\tvar atStart = deltaTime < 0;\n\t\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\t\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\t\tthis.time = time;\n\t\t\t\t\treturn duration - time;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.time = time;\n\t\t\treturn time;\n\n\t\t},\n\n\t\t_setEndings: function( atStart, atEnd, pingPong ) {\n\n\t\t\tvar settings = this._interpolantSettings;\n\n\t\t\tif ( pingPong ) {\n\n\t\t\t\tsettings.endingStart \t= ZeroSlopeEnding;\n\t\t\t\tsettings.endingEnd\t\t= ZeroSlopeEnding;\n\n\t\t\t} else {\n\n\t\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\t\tif ( atStart ) {\n\n\t\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t\tif ( atEnd ) {\n\n\t\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_scheduleFading: function( duration, weightNow, weightThen ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant(),\n\t\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now; \t\t\t\tvalues[ 0 ] = weightNow;\n\t\t\ttimes[ 1 ] = now + duration;\tvalues[ 1 ] = weightThen;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Player for AnimationClips.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction AnimationMixer( root ) {\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\tObject.assign( AnimationMixer.prototype, EventDispatcher.prototype, {\n\n\t\t// return an action for a clip optionally using a custom root target\n\t\t// object (this method allocates a lot of dynamic memory in case a\n\t\t// previously unknown clip/root combination is specified)\n\t\tclipAction: function( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject !== null ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ],\n\t\t\t\tprototypeAction = null;\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\tvar existingAction =\n\t\t\t\t\t\tactionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( existingAction !== undefined ) {\n\n\t\t\t\t\treturn existingAction;\n\n\t\t\t\t}\n\n\t\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t\t// the bindings again but can just copy\n\t\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t\t// also, take the clip from the prototype action\n\t\t\t\tif ( clipObject === null )\n\t\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t\t}\n\n\t\t\t// clip must be known when specified via string\n\t\t\tif ( clipObject === null ) return null;\n\n\t\t\t// allocate all resources required to run it\n\t\t\tvar newAction = new AnimationAction( this, clipObject, optionalRoot );\n\n\t\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t\t// and make the action known to the memory manager\n\t\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\t\treturn newAction;\n\n\t\t},\n\n\t\t// get an existing action\n\t\texistingAction: function( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// deactivates all previously scheduled actions\n\t\tstopAllAction: function() {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tthis._nActiveActions = 0;\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tactions[ i ].reset();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].useCount = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// advance the time and update apply the animation\n\t\tupdate: function( deltaTime ) {\n\n\t\t\tdeltaTime *= this.timeScale;\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\n\t\t\t\ttime = this.time += deltaTime,\n\t\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t\t// run active actions\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tvar action = actions[ i ];\n\n\t\t\t\tif ( action.enabled ) {\n\n\t\t\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// update scene graph\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// return this mixer's root target object\n\t\tgetRoot: function() {\n\n\t\t\treturn this._root;\n\n\t\t},\n\n\t\t// free all resources specific to a particular clip\n\t\tuncacheClip: function( clip ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tclipUuid = clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t\t// iteration state and also require updating the state we can\n\t\t\t\t// just throw away\n\n\t\t\t\tvar actionsToRemove = actionsForClip.knownActions;\n\n\t\t\t\tfor ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar action = actionsToRemove[ i ];\n\n\t\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\t\tvar cacheIndex = action._cacheIndex,\n\t\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\t\taction._cacheIndex = null;\n\t\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\t\tactions.pop();\n\n\t\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t\t}\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t// free all resources specific to a particular root target object\n\t\tuncacheRoot: function( root ) {\n\n\t\t\tvar rootUuid = root.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip;\n\n\t\t\tfor ( var clipUuid in actionsByClip ) {\n\n\t\t\t\tvar actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( action !== undefined ) {\n\n\t\t\t\t\tthis._deactivateAction( action );\n\t\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingByName !== undefined ) {\n\n\t\t\t\tfor ( var trackName in bindingByName ) {\n\n\t\t\t\t\tvar binding = bindingByName[ trackName ];\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remove a targeted clip from the cache\n\t\tuncacheAction: function( clip, optionalRoot ) {\n\n\t\t\tvar action = this.existingAction( clip, optionalRoot );\n\n\t\t\tif ( action !== null ) {\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} );\n\n\t// Implementation details:\n\n\tObject.assign( AnimationMixer.prototype, {\n\n\t\t_bindAction: function( action, prototypeAction ) {\n\n\t\t\tvar root = action._localRoot || this._root,\n\t\t\t\ttracks = action._clip.tracks,\n\t\t\t\tnTracks = tracks.length,\n\t\t\t\tbindings = action._propertyBindings,\n\t\t\t\tinterpolants = action._interpolants,\n\t\t\t\trootUuid = root.uuid,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingsByName === undefined ) {\n\n\t\t\t\tbindingsByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\t\tvar track = tracks[ i ],\n\t\t\t\t\ttrackName = track.name,\n\t\t\t\t\tbinding = bindingsByName[ trackName ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar path = prototypeAction && prototypeAction.\n\t\t\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t}\n\n\t\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t\t}\n\n\t\t},\n\n\t\t_activateAction: function( action ) {\n\n\t\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\t\tvar rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\t\tthis._bindAction( action,\n\t\t\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t\t}\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// increment reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._lendAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t_deactivateAction: function( action ) {\n\n\t\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// decrement reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._takeBackAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// Memory manager\n\n\t\t_initMemoryManager: function() {\n\n\t\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\t\tthis._nActiveActions = 0;\n\n\t\t\tthis._actionsByClip = {};\n\t\t\t// inside:\n\t\t\t// {\n\t\t\t// \t\tknownActions: Array< AnimationAction >\t- used as prototypes\n\t\t\t// \t\tactionByRoot: AnimationAction\t\t\t- lookup\n\t\t\t// }\n\n\n\t\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\t\tthis._controlInterpolants = []; // same game as above\n\t\t\tthis._nActiveControlInterpolants = 0;\n\n\t\t\tvar scope = this;\n\n\t\t\tthis.stats = {\n\n\t\t\t\tactions: {\n\t\t\t\t\tget total() { return scope._actions.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveActions; }\n\t\t\t\t},\n\t\t\t\tbindings: {\n\t\t\t\t\tget total() { return scope._bindings.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveBindings; }\n\t\t\t\t},\n\t\t\t\tcontrolInterpolants: {\n\t\t\t\t\tget total() { return scope._controlInterpolants.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveControlInterpolants; }\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t},\n\n\t\t// Memory management for AnimationAction objects\n\n\t\t_isActiveAction: function( action ) {\n\n\t\t\tvar index = action._cacheIndex;\n\t\t\treturn index !== null && index < this._nActiveActions;\n\n\t\t},\n\n\t\t_addInactiveAction: function( action, clipUuid, rootUuid ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip === undefined ) {\n\n\t\t\t\tactionsForClip = {\n\n\t\t\t\t\tknownActions: [ action ],\n\t\t\t\t\tactionByRoot: {}\n\n\t\t\t\t};\n\n\t\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t\t} else {\n\n\t\t\t\tvar knownActions = actionsForClip.knownActions;\n\n\t\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\t\tknownActions.push( action );\n\n\t\t\t}\n\n\t\t\taction._cacheIndex = actions.length;\n\t\t\tactions.push( action );\n\n\t\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t\t},\n\n\t\t_removeInactiveAction: function( action ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\t\tcacheIndex = action._cacheIndex;\n\n\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\tactions.pop();\n\n\t\t\taction._cacheIndex = null;\n\n\n\t\t\tvar clipUuid = action._clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\t\tlastKnownAction =\n\t\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\t\tknownActionsForClip.pop();\n\n\t\t\taction._byClipCacheIndex = null;\n\n\n\t\t\tvar actionByRoot = actionsForClip.actionByRoot,\n\t\t\t\trootUuid = ( actions._localRoot || this._root ).uuid;\n\n\t\t\tdelete actionByRoot[ rootUuid ];\n\n\t\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t},\n\n\t\t_removeInactiveBindingsForAction: function( action ) {\n\n\t\t\tvar bindings = action._propertyBindings;\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendAction: function( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions >| inactive actions ]\n\t\t\t// s a\n\t\t\t// <-swap->\n\t\t\t// a s\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\t\taction._cacheIndex = lastActiveIndex;\n\t\t\tactions[ lastActiveIndex ] = action;\n\n\t\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t\t},\n\n\t\t_takeBackAction: function( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions |< inactive actions ]\n\t\t\t// a s\n\t\t\t// <-swap->\n\t\t\t// s a\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\t\taction._cacheIndex = firstInactiveIndex;\n\t\t\tactions[ firstInactiveIndex ] = action;\n\n\t\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t\t},\n\n\t\t// Memory management for PropertyMixer objects\n\n\t\t_addInactiveBinding: function( binding, rootUuid, trackName ) {\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( bindingByName === undefined ) {\n\n\t\t\t\tbindingByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t\t}\n\n\t\t\tbindingByName[ trackName ] = binding;\n\n\t\t\tbinding._cacheIndex = bindings.length;\n\t\t\tbindings.push( binding );\n\n\t\t},\n\n\t\t_removeInactiveBinding: function( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tpropBinding = binding.binding,\n\t\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\t\ttrackName = propBinding.path,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\t\tbindings.pop();\n\n\t\t\tdelete bindingByName[ trackName ];\n\n\t\t\tremove_empty_map: {\n\n\t\t\t\tfor ( var _ in bindingByName ) break remove_empty_map;\n\n\t\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendBinding: function( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\t\tbinding._cacheIndex = lastActiveIndex;\n\t\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t\t},\n\n\t\t_takeBackBinding: function( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t\t},\n\n\n\t\t// Memory management of Interpolants for weight and time scale\n\n\t\t_lendControlInterpolant: function() {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++,\n\t\t\t\tinterpolant = interpolants[ lastActiveIndex ];\n\n\t\t\tif ( interpolant === undefined ) {\n\n\t\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t\t\t\t1, this._controlInterpolantsResultBuffer );\n\n\t\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t\t}\n\n\t\t\treturn interpolant;\n\n\t\t},\n\n\t\t_takeBackControlInterpolant: function( interpolant ) {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t\t},\n\n\t\t_controlInterpolantsResultBuffer: new Float32Array( 1 )\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Uniform( value ) {\n\n\t\tif ( typeof value === 'string' ) {\n\n\t\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\n\t\t\tvalue = arguments[ 1 ];\n\n\t\t}\n\n\t\tthis.value = value;\n\n\t}\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferGeometry() {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.maxInstancedCount = undefined;\n\n\t}\n\n\tInstancedBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tInstancedBufferGeometry.prototype.constructor = InstancedBufferGeometry;\n\n\tInstancedBufferGeometry.prototype.isInstancedBufferGeometry = true;\n\n\tInstancedBufferGeometry.prototype.addGroup = function ( start, count, materialIndex ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t};\n\n\tInstancedBufferGeometry.prototype.copy = function ( source ) {\n\n\t\tvar index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\tvar attributes = source.attributes;\n\n\t\tfor ( var name in attributes ) {\n\n\t\t\tvar attribute = attributes[ name ];\n\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t}\n\n\t\tvar groups = source.groups;\n\n\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tvar group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.data = interleavedBuffer;\n\t\tthis.itemSize = itemSize;\n\t\tthis.offset = offset;\n\n\t\tthis.normalized = normalized === true;\n\n\t}\n\n\n\tInterleavedBufferAttribute.prototype = {\n\n\t\tconstructor: InterleavedBufferAttribute,\n\n\t\tisInterleavedBufferAttribute: true,\n\n\t\tget count() {\n\n\t\t\treturn this.data.count;\n\n\t\t},\n\n\t\tget array() {\n\n\t\t\treturn this.data.array;\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\t\t\tthis.data.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBuffer( array, stride ) {\n\n\t\tthis.uuid = _Math.generateUUID();\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.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t}\n\n\tInterleavedBuffer.prototype = {\n\n\t\tconstructor: InterleavedBuffer,\n\n\t\tisInterleavedBuffer: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.stride : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.count = source.count;\n\t\t\tthis.stride = source.stride;\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.stride;\n\t\t\tindex2 *= attribute.stride;\n\n\t\t\tfor ( var i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {\n\n\t\tInterleavedBuffer.call( this, array, stride );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedInterleavedBuffer.prototype = Object.create( InterleavedBuffer.prototype );\n\tInstancedInterleavedBuffer.prototype.constructor = InstancedInterleavedBuffer;\n\n\tInstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true;\n\n\tInstancedInterleavedBuffer.prototype.copy = function ( source ) {\n\n\t\tInterleavedBuffer.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferAttribute( array, itemSize, meshPerAttribute ) {\n\n\t\tBufferAttribute.call( this, array, itemSize );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInstancedBufferAttribute.prototype.constructor = InstancedBufferAttribute;\n\n\tInstancedBufferAttribute.prototype.isInstancedBufferAttribute = true;\n\n\tInstancedBufferAttribute.prototype.copy = function ( source ) {\n\n\t\tBufferAttribute.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author bhouston / http://clara.io/\n\t * @author stephomi / http://stephaneginier.com/\n\t */\n\n\tfunction Raycaster( origin, direction, near, far ) {\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 || 0;\n\t\tthis.far = far || Infinity;\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: {},\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t\tObject.defineProperties( this.params, {\n\t\t\tPointCloud: {\n\t\t\t\tget: function () {\n\t\t\t\t\tconsole.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );\n\t\t\t\t\treturn this.Points;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tfunction ascSort( a, b ) {\n\n\t\treturn a.distance - b.distance;\n\n\t}\n\n\tfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t//\n\n\tRaycaster.prototype = {\n\n\t\tconstructor: Raycaster,\n\n\t\tlinePrecision: 1,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\t\tthis.ray.set( origin, direction );\n\n\t\t},\n\n\t\tsetFromCamera: function ( coords, camera ) {\n\n\t\t\tif ( (camera && camera.isPerspectiveCamera) ) {\n\n\t\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\n\t\t\t} else if ( (camera && camera.isOrthographicCamera) ) {\n\n\t\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\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type.' );\n\n\t\t\t}\n\n\t\t},\n\n\t\tintersectObject: function ( object, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tintersectObject( object, this, intersects, recursive );\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t},\n\n\t\tintersectObjects: function ( objects, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tif ( Array.isArray( objects ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );\n\t\t\t\treturn intersects;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t\t}\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Clock( autoStart ) {\n\n\t\tthis.autoStart = ( autoStart !== undefined ) ? autoStart : true;\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\tClock.prototype = {\n\n\t\tconstructor: Clock,\n\n\t\tstart: function () {\n\n\t\t\tthis.startTime = ( performance || Date ).now();\n\n\t\t\tthis.oldTime = this.startTime;\n\t\t\tthis.elapsedTime = 0;\n\t\t\tthis.running = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tthis.getElapsedTime();\n\t\t\tthis.running = false;\n\n\t\t},\n\n\t\tgetElapsedTime: function () {\n\n\t\t\tthis.getDelta();\n\t\t\treturn this.elapsedTime;\n\n\t\t},\n\n\t\tgetDelta: function () {\n\n\t\t\tvar diff = 0;\n\n\t\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\t\tthis.start();\n\n\t\t\t}\n\n\t\t\tif ( this.running ) {\n\n\t\t\t\tvar newTime = ( performance || Date ).now();\n\n\t\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\t\tthis.oldTime = newTime;\n\n\t\t\t\tthis.elapsedTime += diff;\n\n\t\t\t}\n\n\t\t\treturn diff;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Spline from Tween.js, slightly optimized (and trashed)\n\t * http://sole.github.com/tween.js/examples/05_spline.html\n\t *\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Spline( points ) {\n\n\t\tthis.points = points;\n\n\t\tvar c = [], v3 = { x: 0, y: 0, z: 0 },\n\t\tpoint, intPoint, weight, w2, w3,\n\t\tpa, pb, pc, pd;\n\n\t\tthis.initFromArray = function ( a ) {\n\n\t\t\tthis.points = [];\n\n\t\t\tfor ( var i = 0; i < a.length; i ++ ) {\n\n\t\t\t\tthis.points[ i ] = { x: a[ i ][ 0 ], y: a[ i ][ 1 ], z: a[ i ][ 2 ] };\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getPoint = function ( k ) {\n\n\t\t\tpoint = ( this.points.length - 1 ) * k;\n\t\t\tintPoint = Math.floor( point );\n\t\t\tweight = point - intPoint;\n\n\t\t\tc[ 0 ] = intPoint === 0 ? intPoint : intPoint - 1;\n\t\t\tc[ 1 ] = intPoint;\n\t\t\tc[ 2 ] = intPoint > this.points.length - 2 ? this.points.length - 1 : intPoint + 1;\n\t\t\tc[ 3 ] = intPoint > this.points.length - 3 ? this.points.length - 1 : intPoint + 2;\n\n\t\t\tpa = this.points[ c[ 0 ] ];\n\t\t\tpb = this.points[ c[ 1 ] ];\n\t\t\tpc = this.points[ c[ 2 ] ];\n\t\t\tpd = this.points[ c[ 3 ] ];\n\n\t\t\tw2 = weight * weight;\n\t\t\tw3 = weight * w2;\n\n\t\t\tv3.x = interpolate( pa.x, pb.x, pc.x, pd.x, weight, w2, w3 );\n\t\t\tv3.y = interpolate( pa.y, pb.y, pc.y, pd.y, weight, w2, w3 );\n\t\t\tv3.z = interpolate( pa.z, pb.z, pc.z, pd.z, weight, w2, w3 );\n\n\t\t\treturn v3;\n\n\t\t};\n\n\t\tthis.getControlPointsArray = function () {\n\n\t\t\tvar i, p, l = this.points.length,\n\t\t\t\tcoords = [];\n\n\t\t\tfor ( i = 0; i < l; i ++ ) {\n\n\t\t\t\tp = this.points[ i ];\n\t\t\t\tcoords[ i ] = [ p.x, p.y, p.z ];\n\n\t\t\t}\n\n\t\t\treturn coords;\n\n\t\t};\n\n\t\t// approximate length by summing linear segments\n\n\t\tthis.getLength = function ( nSubDivisions ) {\n\n\t\t\tvar i, index, nSamples, position,\n\t\t\t\tpoint = 0, intPoint = 0, oldIntPoint = 0,\n\t\t\t\toldPosition = new Vector3(),\n\t\t\t\ttmpVec = new Vector3(),\n\t\t\t\tchunkLengths = [],\n\t\t\t\ttotalLength = 0;\n\n\t\t\t// first point has 0 length\n\n\t\t\tchunkLengths[ 0 ] = 0;\n\n\t\t\tif ( ! nSubDivisions ) nSubDivisions = 100;\n\n\t\t\tnSamples = this.points.length * nSubDivisions;\n\n\t\t\toldPosition.copy( this.points[ 0 ] );\n\n\t\t\tfor ( i = 1; i < nSamples; i ++ ) {\n\n\t\t\t\tindex = i / nSamples;\n\n\t\t\t\tposition = this.getPoint( index );\n\t\t\t\ttmpVec.copy( position );\n\n\t\t\t\ttotalLength += tmpVec.distanceTo( oldPosition );\n\n\t\t\t\toldPosition.copy( position );\n\n\t\t\t\tpoint = ( this.points.length - 1 ) * index;\n\t\t\t\tintPoint = Math.floor( point );\n\n\t\t\t\tif ( intPoint !== oldIntPoint ) {\n\n\t\t\t\t\tchunkLengths[ intPoint ] = totalLength;\n\t\t\t\t\toldIntPoint = intPoint;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// last point ends with total length\n\n\t\t\tchunkLengths[ chunkLengths.length ] = totalLength;\n\n\t\t\treturn { chunks: chunkLengths, total: totalLength };\n\n\t\t};\n\n\t\tthis.reparametrizeByArcLength = function ( samplingCoef ) {\n\n\t\t\tvar i, j,\n\t\t\t\tindex, indexCurrent, indexNext,\n\t\t\t\trealDistance,\n\t\t\t\tsampling, position,\n\t\t\t\tnewpoints = [],\n\t\t\t\ttmpVec = new Vector3(),\n\t\t\t\tsl = this.getLength();\n\n\t\t\tnewpoints.push( tmpVec.copy( this.points[ 0 ] ).clone() );\n\n\t\t\tfor ( i = 1; i < this.points.length; i ++ ) {\n\n\t\t\t\t//tmpVec.copy( this.points[ i - 1 ] );\n\t\t\t\t//linearDistance = tmpVec.distanceTo( this.points[ i ] );\n\n\t\t\t\trealDistance = sl.chunks[ i ] - sl.chunks[ i - 1 ];\n\n\t\t\t\tsampling = Math.ceil( samplingCoef * realDistance / sl.total );\n\n\t\t\t\tindexCurrent = ( i - 1 ) / ( this.points.length - 1 );\n\t\t\t\tindexNext = i / ( this.points.length - 1 );\n\n\t\t\t\tfor ( j = 1; j < sampling - 1; j ++ ) {\n\n\t\t\t\t\tindex = indexCurrent + j * ( 1 / sampling ) * ( indexNext - indexCurrent );\n\n\t\t\t\t\tposition = this.getPoint( index );\n\t\t\t\t\tnewpoints.push( tmpVec.copy( position ).clone() );\n\n\t\t\t\t}\n\n\t\t\t\tnewpoints.push( tmpVec.copy( this.points[ i ] ).clone() );\n\n\t\t\t}\n\n\t\t\tthis.points = newpoints;\n\n\t\t};\n\n\t\t// Catmull-Rom\n\n\t\tfunction interpolate( p0, p1, p2, p3, t, t2, t3 ) {\n\n\t\t\tvar v0 = ( p2 - p0 ) * 0.5,\n\t\t\t\tv1 = ( p3 - p1 ) * 0.5;\n\n\t\t\treturn ( 2 * ( p1 - p2 ) + v0 + v1 ) * t3 + ( - 3 * ( p1 - p2 ) - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n\t *\n\t * The poles (phi) are at the positive and negative y axis.\n\t * The equator starts at positive z.\n\t */\n\n\tfunction Spherical( radius, phi, theta ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0;\n\t\tthis.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere\n\n\t\treturn this;\n\n\t}\n\n\tSpherical.prototype = {\n\n\t\tconstructor: Spherical,\n\n\t\tset: function ( radius, phi, theta ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.phi = phi;\n\t\t\tthis.theta = theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.phi = other.phi;\n\t\t\tthis.theta = other.theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\tmakeSafe: function() {\n\n\t\t\tvar EPS = 0.000001;\n\t\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = vec3.length();\n\n\t\t\tif ( this.radius === 0 ) {\n\n\t\t\t\tthis.theta = 0;\n\t\t\t\tthis.phi = 0;\n\n\t\t\t} else {\n\n\t\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis\n\t\t\t\tthis.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t};\n\n\t/**\r\n\t * @author alteredq / http://alteredqualia.com/\r\n\t */\r\n\r\n\tfunction MorphBlendMesh( geometry, material ) {\n\r\n\t\tMesh.call( this, geometry, material );\r\n\r\n\t\tthis.animationsMap = {};\r\n\t\tthis.animationsList = [];\r\n\r\n\t\t// prepare default animation\r\n\t\t// (all frames played together in 1 second)\r\n\r\n\t\tvar numFrames = this.geometry.morphTargets.length;\r\n\r\n\t\tvar name = \"__default\";\r\n\r\n\t\tvar startFrame = 0;\r\n\t\tvar endFrame = numFrames - 1;\r\n\r\n\t\tvar fps = numFrames / 1;\r\n\r\n\t\tthis.createAnimation( name, startFrame, endFrame, fps );\r\n\t\tthis.setAnimationWeight( name, 1 );\r\n\r\n\t}\r\n\r\n\tMorphBlendMesh.prototype = Object.create( Mesh.prototype );\r\n\tMorphBlendMesh.prototype.constructor = MorphBlendMesh;\r\n\r\n\tMorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) {\r\n\r\n\t\tvar animation = {\r\n\r\n\t\t\tstart: start,\r\n\t\t\tend: end,\r\n\r\n\t\t\tlength: end - start + 1,\r\n\r\n\t\t\tfps: fps,\r\n\t\t\tduration: ( end - start ) / fps,\r\n\r\n\t\t\tlastFrame: 0,\r\n\t\t\tcurrentFrame: 0,\r\n\r\n\t\t\tactive: false,\r\n\r\n\t\t\ttime: 0,\r\n\t\t\tdirection: 1,\r\n\t\t\tweight: 1,\r\n\r\n\t\t\tdirectionBackwards: false,\r\n\t\t\tmirroredLoop: false\r\n\r\n\t\t};\r\n\r\n\t\tthis.animationsMap[ name ] = animation;\r\n\t\tthis.animationsList.push( animation );\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) {\r\n\r\n\t\tvar pattern = /([a-z]+)_?(\\d+)/i;\r\n\r\n\t\tvar firstAnimation, frameRanges = {};\r\n\r\n\t\tvar geometry = this.geometry;\r\n\r\n\t\tfor ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar morph = geometry.morphTargets[ i ];\r\n\t\t\tvar chunks = morph.name.match( pattern );\r\n\r\n\t\t\tif ( chunks && chunks.length > 1 ) {\r\n\r\n\t\t\t\tvar name = chunks[ 1 ];\r\n\r\n\t\t\t\tif ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity };\r\n\r\n\t\t\t\tvar range = frameRanges[ name ];\r\n\r\n\t\t\t\tif ( i < range.start ) range.start = i;\r\n\t\t\t\tif ( i > range.end ) range.end = i;\r\n\r\n\t\t\t\tif ( ! firstAnimation ) firstAnimation = name;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var name in frameRanges ) {\r\n\r\n\t\t\tvar range = frameRanges[ name ];\r\n\t\t\tthis.createAnimation( name, range.start, range.end, fps );\r\n\r\n\t\t}\r\n\r\n\t\tthis.firstAnimation = firstAnimation;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = 1;\r\n\t\t\tanimation.directionBackwards = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = - 1;\r\n\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.fps = fps;\r\n\t\t\tanimation.duration = ( animation.end - animation.start ) / animation.fps;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.duration = duration;\r\n\t\t\tanimation.fps = ( animation.end - animation.start ) / animation.duration;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.weight = weight;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationTime = function ( name, time ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = time;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationTime = function ( name ) {\r\n\r\n\t\tvar time = 0;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\ttime = animation.time;\r\n\r\n\t\t}\r\n\r\n\t\treturn time;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationDuration = function ( name ) {\r\n\r\n\t\tvar duration = - 1;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tduration = animation.duration;\r\n\r\n\t\t}\r\n\r\n\t\treturn duration;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.playAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = 0;\r\n\t\t\tanimation.active = true;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconsole.warn( \"THREE.MorphBlendMesh: animation[\" + name + \"] undefined in .playAnimation()\" );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.stopAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.active = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.update = function ( delta ) {\r\n\r\n\t\tfor ( var i = 0, il = this.animationsList.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar animation = this.animationsList[ i ];\r\n\r\n\t\t\tif ( ! animation.active ) continue;\r\n\r\n\t\t\tvar frameTime = animation.duration / animation.length;\r\n\r\n\t\t\tanimation.time += animation.direction * delta;\r\n\r\n\t\t\tif ( animation.mirroredLoop ) {\r\n\r\n\t\t\t\tif ( animation.time > animation.duration || animation.time < 0 ) {\r\n\r\n\t\t\t\t\tanimation.direction *= - 1;\r\n\r\n\t\t\t\t\tif ( animation.time > animation.duration ) {\r\n\r\n\t\t\t\t\t\tanimation.time = animation.duration;\r\n\t\t\t\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( animation.time < 0 ) {\r\n\r\n\t\t\t\t\t\tanimation.time = 0;\r\n\t\t\t\t\t\tanimation.directionBackwards = false;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tanimation.time = animation.time % animation.duration;\r\n\r\n\t\t\t\tif ( animation.time < 0 ) animation.time += animation.duration;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar keyframe = animation.start + _Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 );\r\n\t\t\tvar weight = animation.weight;\r\n\r\n\t\t\tif ( keyframe !== animation.currentFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = 0;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = 1 * weight;\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ keyframe ] = 0;\r\n\r\n\t\t\t\tanimation.lastFrame = animation.currentFrame;\r\n\t\t\t\tanimation.currentFrame = keyframe;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar mix = ( animation.time % frameTime ) / frameTime;\r\n\r\n\t\t\tif ( animation.directionBackwards ) mix = 1 - mix;\r\n\r\n\t\t\tif ( animation.currentFrame !== animation.lastFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = mix * weight;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = weight;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction ImmediateRenderObject( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.material = material;\n\t\tthis.render = function ( renderCallback ) {};\n\n\t}\n\n\tImmediateRenderObject.prototype = Object.create( Object3D.prototype );\n\tImmediateRenderObject.prototype.constructor = ImmediateRenderObject;\n\n\tImmediateRenderObject.prototype.isImmediateRenderObject = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction VertexNormalsHelper( object, size, hex, linewidth ) {\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xff0000;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( (objGeometry && objGeometry.isGeometry) ) {\n\n\t\t\tnNormals = objGeometry.faces.length * 3;\n\n\t\t} else if ( (objGeometry && objGeometry.isBufferGeometry) ) {\n\n\t\t\tnNormals = objGeometry.attributes.normal.count;\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32Attribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tVertexNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tVertexNormalsHelper.prototype.constructor = VertexNormalsHelper;\n\n\tVertexNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tif ( (objGeometry && objGeometry.isGeometry) ) {\n\n\t\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\t\tvar faces = objGeometry.faces;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar vertex = vertices[ face[ keys[ j ] ] ];\n\n\t\t\t\t\t\tvar normal = face.vertexNormals[ j ];\n\n\t\t\t\t\t\tv1.copy( vertex ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( (objGeometry && objGeometry.isBufferGeometry) ) {\n\n\t\t\t\tvar objPos = objGeometry.attributes.position;\n\n\t\t\t\tvar objNorm = objGeometry.attributes.normal;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\t// for simplicity, ignore index and drawcalls, and render every normal\n\n\t\t\t\tfor ( var j = 0, jl = objPos.count; j < jl; j ++ ) {\n\n\t\t\t\t\tv1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\tv2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) );\n\n\t\t\t\t\tv2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction SpotLightHelper( light ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = [\n\t\t\t0, 0, 0, 0, 0, 1,\n\t\t\t0, 0, 0, 1, 0, 1,\n\t\t\t0, 0, 0, - 1, 0, 1,\n\t\t\t0, 0, 0, 0, 1, 1,\n\t\t\t0, 0, 0, 0, - 1, 1\n\t\t];\n\n\t\tfor ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tvar p1 = ( i / l ) * Math.PI * 2;\n\t\t\tvar 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.addAttribute( 'position', new Float32Attribute( positions, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: 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\tSpotLightHelper.prototype = Object.create( Object3D.prototype );\n\tSpotLightHelper.prototype.constructor = SpotLightHelper;\n\n\tSpotLightHelper.prototype.dispose = function () {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t};\n\n\tSpotLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\t\tvar vector2 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tvar coneLength = this.light.distance ? this.light.distance : 1000;\n\t\t\tvar coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t\tvector.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\t\tthis.cone.lookAt( vector2.sub( vector ) );\n\n\t\t\tthis.cone.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author Sean Griffin / http://twitter.com/sgrif\n\t * @author Michael Guerrero / http://realitymeltdown.com\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction SkeletonHelper( object ) {\n\n\t\tthis.bones = this.getBoneList( object );\n\n\t\tvar geometry = new Geometry();\n\n\t\tfor ( var i = 0; i < this.bones.length; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( (bone.parent && bone.parent.isBone) ) {\n\n\t\t\t\tgeometry.vertices.push( new Vector3() );\n\t\t\t\tgeometry.vertices.push( new Vector3() );\n\t\t\t\tgeometry.colors.push( new Color( 0, 0, 1 ) );\n\t\t\t\tgeometry.colors.push( new Color( 0, 1, 0 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.dynamic = true;\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.root = object;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\n\tSkeletonHelper.prototype = Object.create( LineSegments.prototype );\n\tSkeletonHelper.prototype.constructor = SkeletonHelper;\n\n\tSkeletonHelper.prototype.getBoneList = function( object ) {\n\n\t\tvar boneList = [];\n\n\t\tif ( (object && object.isBone) ) {\n\n\t\t\tboneList.push( object );\n\n\t\t}\n\n\t\tfor ( var i = 0; i < object.children.length; i ++ ) {\n\n\t\t\tboneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) );\n\n\t\t}\n\n\t\treturn boneList;\n\n\t};\n\n\tSkeletonHelper.prototype.update = function () {\n\n\t\tvar geometry = this.geometry;\n\n\t\tvar matrixWorldInv = new Matrix4().getInverse( this.root.matrixWorld );\n\n\t\tvar boneMatrix = new Matrix4();\n\n\t\tvar j = 0;\n\n\t\tfor ( var i = 0; i < this.bones.length; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( (bone.parent && bone.parent.isBone) ) {\n\n\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );\n\t\t\t\tgeometry.vertices[ j ].setFromMatrixPosition( boneMatrix );\n\n\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\tgeometry.vertices[ j + 1 ].setFromMatrixPosition( boneMatrix );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.verticesNeedUpdate = true;\n\n\t\tgeometry.computeBoundingSphere();\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PointLightHelper( light, sphereSize ) {\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar geometry = new SphereBufferGeometry( sphereSize, 4, 2 );\n\t\tvar material = new MeshBasicMaterial( { wireframe: true, fog: false } );\n\t\tmaterial.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/*\n\t\tvar distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\t\tvar distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\t\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\t\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\t\tvar d = 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.scale.set( d, d, d );\n\n\t\t}\n\n\t\tthis.add( this.lightDistance );\n\t\t*/\n\n\t}\n\n\tPointLightHelper.prototype = Object.create( Mesh.prototype );\n\tPointLightHelper.prototype.constructor = PointLightHelper;\n\n\tPointLightHelper.prototype.dispose = function () {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t};\n\n\tPointLightHelper.prototype.update = function () {\n\n\t\tthis.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t/*\n\t\tvar 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\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction HemisphereLightHelper( light, sphereSize ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.colors = [ new Color(), new Color() ];\n\n\t\tvar geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tgeometry.rotateX( - Math.PI / 2 );\n\n\t\tfor ( var i = 0, il = 8; i < il; i ++ ) {\n\n\t\t\tgeometry.faces[ i ].color = this.colors[ i < 4 ? 0 : 1 ];\n\n\t\t}\n\n\t\tvar material = new MeshBasicMaterial( { vertexColors: FaceColors, wireframe: true } );\n\n\t\tthis.lightSphere = new Mesh( geometry, material );\n\t\tthis.add( this.lightSphere );\n\n\t\tthis.update();\n\n\t}\n\n\tHemisphereLightHelper.prototype = Object.create( Object3D.prototype );\n\tHemisphereLightHelper.prototype.constructor = HemisphereLightHelper;\n\n\tHemisphereLightHelper.prototype.dispose = function () {\n\n\t\tthis.lightSphere.geometry.dispose();\n\t\tthis.lightSphere.material.dispose();\n\n\t};\n\n\tHemisphereLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tthis.colors[ 0 ].copy( this.light.color ).multiplyScalar( this.light.intensity );\n\t\t\tthis.colors[ 1 ].copy( this.light.groundColor ).multiplyScalar( this.light.intensity );\n\n\t\t\tthis.lightSphere.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\t\t\tthis.lightSphere.geometry.colorsNeedUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction GridHelper( size, divisions, color1, color2 ) {\n\n\t\tdivisions = divisions || 1;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar center = divisions / 2;\n\t\tvar step = ( size * 2 ) / divisions;\n\t\tvar vertices = [], colors = [];\n\n\t\tfor ( var i = 0, j = 0, k = - size; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - size, 0, k, size, 0, k );\n\t\t\tvertices.push( k, 0, - size, k, 0, size );\n\n\t\t\tvar 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\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32Attribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32Attribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tGridHelper.prototype = Object.create( LineSegments.prototype );\n\tGridHelper.prototype.constructor = GridHelper;\n\n\tGridHelper.prototype.setColors = function () {\n\n\t\tconsole.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction FaceNormalsHelper( object, size, hex, linewidth ) {\n\n\t\t// FaceNormalsHelper only supports THREE.Geometry\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( (objGeometry && objGeometry.isGeometry) ) {\n\n\t\t\tnNormals = objGeometry.faces.length;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' );\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32Attribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\t\tthis.update();\n\n\t}\n\n\tFaceNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tFaceNormalsHelper.prototype.constructor = FaceNormalsHelper;\n\n\tFaceNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\tvar faces = objGeometry.faces;\n\n\t\t\tvar idx = 0;\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar normal = face.normal;\n\n\t\t\t\tv1.copy( vertices[ face.a ] )\n\t\t\t\t\t.add( vertices[ face.b ] )\n\t\t\t\t\t.add( vertices[ face.c ] )\n\t\t\t\t\t.divideScalar( 3 )\n\t\t\t\t\t.applyMatrix4( matrixWorld );\n\n\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction DirectionalLightHelper( light, size ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32Attribute( [\n\t\t\t- size, size, 0,\n\t\t\t size, size, 0,\n\t\t\t size, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.add( new Line( geometry, material ) );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32Attribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.add( new Line( geometry, material ));\n\n\t\tthis.update();\n\n\t}\n\n\tDirectionalLightHelper.prototype = Object.create( Object3D.prototype );\n\tDirectionalLightHelper.prototype.constructor = DirectionalLightHelper;\n\n\tDirectionalLightHelper.prototype.dispose = function () {\n\n\t\tvar lightPlane = this.children[ 0 ];\n\t\tvar targetLine = this.children[ 1 ];\n\n\t\tlightPlane.geometry.dispose();\n\t\tlightPlane.material.dispose();\n\t\ttargetLine.geometry.dispose();\n\t\ttargetLine.material.dispose();\n\n\t};\n\n\tDirectionalLightHelper.prototype.update = function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar v3 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tv1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tv2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t\tv3.subVectors( v2, v1 );\n\n\t\t\tvar lightPlane = this.children[ 0 ];\n\t\t\tvar targetLine = this.children[ 1 ];\n\n\t\t\tlightPlane.lookAt( v3 );\n\t\t\tlightPlane.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\ttargetLine.lookAt( v3 );\n\t\t\ttargetLine.scale.z = v3.length();\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t *\t- shows frustum, line of sight and up of the camera\n\t *\t- suitable for fast updates\n\t * \t- based on frustum visualization in lightgl.js shadowmap example\n\t *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\n\t */\n\n\tfunction CameraHelper( camera ) {\n\n\t\tvar geometry = new Geometry();\n\t\tvar material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } );\n\n\t\tvar pointMap = {};\n\n\t\t// colors\n\n\t\tvar hexFrustum = 0xffaa00;\n\t\tvar hexCone = 0xff0000;\n\t\tvar hexUp = 0x00aaff;\n\t\tvar hexTarget = 0xffffff;\n\t\tvar hexCross = 0x333333;\n\n\t\t// near\n\n\t\taddLine( \"n1\", \"n2\", hexFrustum );\n\t\taddLine( \"n2\", \"n4\", hexFrustum );\n\t\taddLine( \"n4\", \"n3\", hexFrustum );\n\t\taddLine( \"n3\", \"n1\", hexFrustum );\n\n\t\t// far\n\n\t\taddLine( \"f1\", \"f2\", hexFrustum );\n\t\taddLine( \"f2\", \"f4\", hexFrustum );\n\t\taddLine( \"f4\", \"f3\", hexFrustum );\n\t\taddLine( \"f3\", \"f1\", hexFrustum );\n\n\t\t// sides\n\n\t\taddLine( \"n1\", \"f1\", hexFrustum );\n\t\taddLine( \"n2\", \"f2\", hexFrustum );\n\t\taddLine( \"n3\", \"f3\", hexFrustum );\n\t\taddLine( \"n4\", \"f4\", hexFrustum );\n\n\t\t// cone\n\n\t\taddLine( \"p\", \"n1\", hexCone );\n\t\taddLine( \"p\", \"n2\", hexCone );\n\t\taddLine( \"p\", \"n3\", hexCone );\n\t\taddLine( \"p\", \"n4\", hexCone );\n\n\t\t// up\n\n\t\taddLine( \"u1\", \"u2\", hexUp );\n\t\taddLine( \"u2\", \"u3\", hexUp );\n\t\taddLine( \"u3\", \"u1\", hexUp );\n\n\t\t// target\n\n\t\taddLine( \"c\", \"t\", hexTarget );\n\t\taddLine( \"p\", \"c\", hexCross );\n\n\t\t// cross\n\n\t\taddLine( \"cn1\", \"cn2\", hexCross );\n\t\taddLine( \"cn3\", \"cn4\", hexCross );\n\n\t\taddLine( \"cf1\", \"cf2\", hexCross );\n\t\taddLine( \"cf3\", \"cf4\", hexCross );\n\n\t\tfunction addLine( a, b, hex ) {\n\n\t\t\taddPoint( a, hex );\n\t\t\taddPoint( b, hex );\n\n\t\t}\n\n\t\tfunction addPoint( id, hex ) {\n\n\t\t\tgeometry.vertices.push( new Vector3() );\n\t\t\tgeometry.colors.push( new Color( hex ) );\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( geometry.vertices.length - 1 );\n\n\t\t}\n\n\t\tLineSegments.call( this, geometry, material );\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}\n\n\tCameraHelper.prototype = Object.create( LineSegments.prototype );\n\tCameraHelper.prototype.constructor = CameraHelper;\n\n\tCameraHelper.prototype.update = function () {\n\n\t\tvar geometry, pointMap;\n\n\t\tvar vector = new Vector3();\n\t\tvar camera = new Camera();\n\n\t\tfunction setPoint( point, x, y, z ) {\n\n\t\t\tvector.set( x, y, z ).unproject( camera );\n\n\t\t\tvar points = pointMap[ point ];\n\n\t\t\tif ( points !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\t\tgeometry.vertices[ points[ i ] ].copy( vector );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn function update() {\n\n\t\t\tgeometry = this.geometry;\n\t\t\tpointMap = this.pointMap;\n\n\t\t\tvar w = 1, h = 1;\n\n\t\t\t// we need just camera projection matrix\n\t\t\t// world matrix must be identity\n\n\t\t\tcamera.projectionMatrix.copy( this.camera.projectionMatrix );\n\n\t\t\t// center / target\n\n\t\t\tsetPoint( \"c\", 0, 0, - 1 );\n\t\t\tsetPoint( \"t\", 0, 0, 1 );\n\n\t\t\t// near\n\n\t\t\tsetPoint( \"n1\", - w, - h, - 1 );\n\t\t\tsetPoint( \"n2\", w, - h, - 1 );\n\t\t\tsetPoint( \"n3\", - w, h, - 1 );\n\t\t\tsetPoint( \"n4\", w, h, - 1 );\n\n\t\t\t// far\n\n\t\t\tsetPoint( \"f1\", - w, - h, 1 );\n\t\t\tsetPoint( \"f2\", w, - h, 1 );\n\t\t\tsetPoint( \"f3\", - w, h, 1 );\n\t\t\tsetPoint( \"f4\", w, h, 1 );\n\n\t\t\t// up\n\n\t\t\tsetPoint( \"u1\", w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u2\", - w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u3\", 0, h * 2, - 1 );\n\n\t\t\t// cross\n\n\t\t\tsetPoint( \"cf1\", - w, 0, 1 );\n\t\t\tsetPoint( \"cf2\", w, 0, 1 );\n\t\t\tsetPoint( \"cf3\", 0, - h, 1 );\n\t\t\tsetPoint( \"cf4\", 0, h, 1 );\n\n\t\t\tsetPoint( \"cn1\", - w, 0, - 1 );\n\t\t\tsetPoint( \"cn2\", w, 0, - 1 );\n\t\t\tsetPoint( \"cn3\", 0, - h, - 1 );\n\t\t\tsetPoint( \"cn4\", 0, h, - 1 );\n\n\t\t\tgeometry.verticesNeedUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\t// a helper to show the world-axis-aligned bounding box for an object\n\n\tfunction BoundingBoxHelper( object, hex ) {\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0x888888;\n\n\t\tthis.object = object;\n\n\t\tthis.box = new Box3();\n\n\t\tMesh.call( this, new BoxGeometry( 1, 1, 1 ), new MeshBasicMaterial( { color: color, wireframe: true } ) );\n\n\t}\n\n\tBoundingBoxHelper.prototype = Object.create( Mesh.prototype );\n\tBoundingBoxHelper.prototype.constructor = BoundingBoxHelper;\n\n\tBoundingBoxHelper.prototype.update = function () {\n\n\t\tthis.box.setFromObject( this.object );\n\n\t\tthis.box.getSize( this.scale );\n\n\t\tthis.box.getCenter( this.position );\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BoxHelper( object, color ) {\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\n\t\tvar indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\t\tvar positions = new Float32Array( 8 * 3 );\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tthis.update( object );\n\n\t\t}\n\n\t}\n\n\tBoxHelper.prototype = Object.create( LineSegments.prototype );\n\tBoxHelper.prototype.constructor = BoxHelper;\n\n\tBoxHelper.prototype.update = ( function () {\n\n\t\tvar box = new Box3();\n\n\t\treturn function update( object ) {\n\n\t\t\tif ( (object && object.isBox3) ) {\n\n\t\t\t\tbox.copy( object );\n\n\t\t\t} else {\n\n\t\t\t\tbox.setFromObject( object );\n\n\t\t\t}\n\n\t\t\tif ( box.isEmpty() ) return;\n\n\t\t\tvar min = box.min;\n\t\t\tvar max = box.max;\n\n\t\t\t/*\n\t\t\t 5____4\n\t\t\t1/___0/|\n\t\t\t| 6__|_7\n\t\t\t2/___3/\n\n\t\t\t0: max.x, max.y, max.z\n\t\t\t1: min.x, max.y, max.z\n\t\t\t2: min.x, min.y, max.z\n\t\t\t3: max.x, min.y, max.z\n\t\t\t4: max.x, max.y, min.z\n\t\t\t5: min.x, max.y, min.z\n\t\t\t6: min.x, min.y, min.z\n\t\t\t7: max.x, min.y, min.z\n\t\t\t*/\n\n\t\t\tvar position = this.geometry.attributes.position;\n\t\t\tvar array = position.array;\n\n\t\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\tthis.geometry.computeBoundingSphere();\n\n\t\t};\n\n\t} )();\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author zz85 / http://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t *\n\t * Creates an arrow for visualizing directions\n\t *\n\t * Parameters:\n\t * dir - Vector3\n\t * origin - Vector3\n\t * length - Number\n\t * color - color in hex value\n\t * headLength - Number\n\t * headWidth - Number\n\t */\n\n\tvar lineGeometry = new BufferGeometry();\n\tlineGeometry.addAttribute( 'position', new Float32Attribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\tvar coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );\n\tconeGeometry.translate( 0, - 0.5, 0 );\n\n\tfunction ArrowHelper( dir, origin, length, color, headLength, headWidth ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tObject3D.call( this );\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\t\tif ( length === undefined ) length = 1;\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) );\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\tArrowHelper.prototype = Object.create( Object3D.prototype );\n\tArrowHelper.prototype.constructor = ArrowHelper;\n\n\tArrowHelper.prototype.setDirection = ( function () {\n\n\t\tvar axis = new Vector3();\n\t\tvar radians;\n\n\t\treturn function setDirection( dir ) {\n\n\t\t\t// dir is assumed to be normalized\n\n\t\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\taxis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\t\tradians = Math.acos( dir.y );\n\n\t\t\t\tthis.quaternion.setFromAxisAngle( axis, radians );\n\n\t\t\t}\n\n\t\t};\n\n\t}() );\n\n\tArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {\n\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tthis.line.scale.set( 1, Math.max( 0, length - headLength ), 1 );\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\tArrowHelper.prototype.setColor = function ( color ) {\n\n\t\tthis.line.material.color.copy( color );\n\t\tthis.cone.material.color.copy( color );\n\n\t};\n\n\t/**\n\t * @author sroucheray / http://sroucheray.org/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AxisHelper( size ) {\n\n\t\tsize = size || 1;\n\n\t\tvar vertices = new Float32Array( [\n\t\t\t0, 0, 0, size, 0, 0,\n\t\t\t0, 0, 0, 0, size, 0,\n\t\t\t0, 0, 0, 0, 0, size\n\t\t] );\n\n\t\tvar colors = new Float32Array( [\n\t\t\t1, 0, 0, 1, 0.6, 0,\n\t\t\t0, 1, 0, 0.6, 1, 0,\n\t\t\t0, 0, 1, 0, 0.6, 1\n\t\t] );\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tAxisHelper.prototype = Object.create( LineSegments.prototype );\n\tAxisHelper.prototype.constructor = AxisHelper;\n\n\t/**\n\t * @author zz85 https://github.com/zz85\n\t *\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t * cusps and self-intersections in non-uniform catmull rom curves.\n\t * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t *\n\t * curve.type accepts centripetal(default), chordal and catmullrom\n\t * curve.tension is used for catmullrom which defaults to 0.5\n\t */\n\n\tvar CatmullRomCurve3 = ( function() {\n\n\t\tvar\n\t\t\ttmp = new Vector3(),\n\t\t\tpx = new CubicPoly(),\n\t\t\tpy = new CubicPoly(),\n\t\t\tpz = new CubicPoly();\n\n\t\t/*\n\t\tBased on an optimized c++ solution in\n\t\t - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t\t - http://ideone.com/NoEbVM\n\n\t\tThis CubicPoly class could be used for reusing some variables and calculations,\n\t\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\t\twhich can be placed in CurveUtils.\n\t\t*/\n\n\t\tfunction CubicPoly() {}\n\n\t\t/*\n\t\t * Compute coefficients for a cubic polynomial\n\t\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t\t * such that\n\t\t * p(0) = x0, p(1) = x1\n\t\t * and\n\t\t * p'(0) = t0, p'(1) = t1.\n\t\t */\n\t\tCubicPoly.prototype.init = function( x0, x1, t0, t1 ) {\n\n\t\t\tthis.c0 = x0;\n\t\t\tthis.c1 = t0;\n\t\t\tthis.c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\t\tthis.c3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t\t};\n\n\t\tCubicPoly.prototype.initNonuniformCatmullRom = function( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tvar t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tvar t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\t// initCubicPoly\n\t\t\tthis.init( x1, x2, t1, t2 );\n\n\t\t};\n\n\t\t// standard Catmull-Rom spline: interpolate between x1 and x2 with previous/following points x1/x4\n\t\tCubicPoly.prototype.initCatmullRom = function( x0, x1, x2, x3, tension ) {\n\n\t\t\tthis.init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t};\n\n\t\tCubicPoly.prototype.calc = function( t ) {\n\n\t\t\tvar t2 = t * t;\n\t\t\tvar t3 = t2 * t;\n\t\t\treturn this.c0 + this.c1 * t + this.c2 * t2 + this.c3 * t3;\n\n\t\t};\n\n\t\t// Subclass Three.js curve\n\t\treturn Curve.create(\n\n\t\t\tfunction ( p /* array of Vector3 */ ) {\n\n\t\t\t\tthis.points = p || [];\n\t\t\t\tthis.closed = false;\n\n\t\t\t},\n\n\t\t\tfunction ( t ) {\n\n\t\t\t\tvar points = this.points,\n\t\t\t\t\tpoint, intPoint, weight, l;\n\n\t\t\t\tl = points.length;\n\n\t\t\t\tif ( l < 2 ) console.log( 'duh, you need at least 2 points' );\n\n\t\t\t\tpoint = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\t\t\tintPoint = Math.floor( point );\n\t\t\t\tweight = point - intPoint;\n\n\t\t\t\tif ( this.closed ) {\n\n\t\t\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length;\n\n\t\t\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\t\t\tintPoint = l - 2;\n\t\t\t\t\tweight = 1;\n\n\t\t\t\t}\n\n\t\t\t\tvar p0, p1, p2, p3; // 4 points\n\n\t\t\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// extrapolate first point\n\t\t\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\t\t\tp0 = tmp;\n\n\t\t\t\t}\n\n\t\t\t\tp1 = points[ intPoint % l ];\n\t\t\t\tp2 = points[ ( intPoint + 1 ) % l ];\n\n\t\t\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// extrapolate last point\n\t\t\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\t\t\tp3 = tmp;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) {\n\n\t\t\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\t\t\tvar pow = this.type === 'chordal' ? 0.5 : 0.25;\n\t\t\t\t\tvar dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\t\t\tvar dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\t\t\tvar dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t\t\t// safety check for repeated points\n\t\t\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t\t\t} else if ( this.type === 'catmullrom' ) {\n\n\t\t\t\t\tvar tension = this.tension !== undefined ? this.tension : 0.5;\n\t\t\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension );\n\t\t\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension );\n\t\t\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension );\n\n\t\t\t\t}\n\n\t\t\t\tvar v = new Vector3(\n\t\t\t\t\tpx.calc( weight ),\n\t\t\t\t\tpy.calc( weight ),\n\t\t\t\t\tpz.calc( weight )\n\t\t\t\t);\n\n\t\t\t\treturn v;\n\n\t\t\t}\n\n\t\t);\n\n\t} )();\n\n\t/**************************************************************\n\t *\tClosed Spline 3D curve\n\t **************************************************************/\n\n\n\tfunction ClosedSplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Please use THREE.CatmullRomCurve3.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\t\tthis.closed = true;\n\n\t}\n\n\tClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t/**************************************************************\n\t *\tSpline 3D curve\n\t **************************************************************/\n\n\n\tvar SplineCurve3 = Curve.create(\n\n\t\tfunction ( points /* array of Vector3 */ ) {\n\n\t\t\tconsole.warn( 'THREE.SplineCurve3 will be deprecated. Please use THREE.CatmullRomCurve3' );\n\t\t\tthis.points = ( points === undefined ) ? [] : points;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tvar points = this.points;\n\t\t\tvar point = ( points.length - 1 ) * t;\n\n\t\t\tvar intPoint = Math.floor( point );\n\t\t\tvar weight = point - intPoint;\n\n\t\t\tvar point0 = points[ intPoint == 0 ? intPoint : intPoint - 1 ];\n\t\t\tvar point1 = points[ intPoint ];\n\t\t\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\t\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\t\tvar interpolate = CurveUtils.interpolate;\n\n\t\t\treturn new Vector3(\n\t\t\t\tinterpolate( point0.x, point1.x, point2.x, point3.x, weight ),\n\t\t\t\tinterpolate( point0.y, point1.y, point2.y, point3.y, weight ),\n\t\t\t\tinterpolate( point0.z, point1.z, point2.z, point3.z, weight )\n\t\t\t);\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tCubic Bezier 3D curve\n\t **************************************************************/\n\n\tvar CubicBezierCurve3 = Curve.create(\n\n\t\tfunction ( v0, v1, v2, v3 ) {\n\n\t\t\tthis.v0 = v0;\n\t\t\tthis.v1 = v1;\n\t\t\tthis.v2 = v2;\n\t\t\tthis.v3 = v3;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tvar b3 = ShapeUtils.b3;\n\n\t\t\treturn new Vector3(\n\t\t\t\tb3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ),\n\t\t\t\tb3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ),\n\t\t\t\tb3( t, this.v0.z, this.v1.z, this.v2.z, this.v3.z )\n\t\t\t);\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tQuadratic Bezier 3D curve\n\t **************************************************************/\n\n\tvar QuadraticBezierCurve3 = Curve.create(\n\n\t\tfunction ( v0, v1, v2 ) {\n\n\t\t\tthis.v0 = v0;\n\t\t\tthis.v1 = v1;\n\t\t\tthis.v2 = v2;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tvar b2 = ShapeUtils.b2;\n\n\t\t\treturn new Vector3(\n\t\t\t\tb2( t, this.v0.x, this.v1.x, this.v2.x ),\n\t\t\t\tb2( t, this.v0.y, this.v1.y, this.v2.y ),\n\t\t\t\tb2( t, this.v0.z, this.v1.z, this.v2.z )\n\t\t\t);\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tLine3D\n\t **************************************************************/\n\n\tvar LineCurve3 = Curve.create(\n\n\t\tfunction ( v1, v2 ) {\n\n\t\t\tthis.v1 = v1;\n\t\t\tthis.v2 = v2;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tif ( t === 1 ) {\n\n\t\t\t\treturn this.v2.clone();\n\n\t\t\t}\n\n\t\t\tvar vector = new Vector3();\n\n\t\t\tvector.subVectors( this.v2, this.v1 ); // diff\n\t\t\tvector.multiplyScalar( t );\n\t\t\tvector.add( this.v1 );\n\n\t\t\treturn vector;\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tArc curve\n\t **************************************************************/\n\n\tfunction ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tEllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t}\n\n\tArcCurve.prototype = Object.create( EllipseCurve.prototype );\n\tArcCurve.prototype.constructor = ArcCurve;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar SceneUtils = {\n\n\t\tcreateMultiMaterialObject: function ( geometry, materials ) {\n\n\t\t\tvar group = new Group();\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tgroup.add( new Mesh( geometry, materials[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t},\n\n\t\tdetach: function ( child, parent, scene ) {\n\n\t\t\tchild.applyMatrix( parent.matrixWorld );\n\t\t\tparent.remove( child );\n\t\t\tscene.add( child );\n\n\t\t},\n\n\t\tattach: function ( child, scene, parent ) {\n\n\t\t\tvar matrixWorldInverse = new Matrix4();\n\t\t\tmatrixWorldInverse.getInverse( parent.matrixWorld );\n\t\t\tchild.applyMatrix( matrixWorldInverse );\n\n\t\t\tscene.remove( child );\n\t\t\tparent.add( child );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Face4 ( a, b, c, d, normal, color, materialIndex ) {\n\t\tconsole.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' );\n\t\treturn new Face3( a, b, c, normal, color, materialIndex );\n\t}\n\n\tvar LineStrip = 0;\n\n\tvar LinePieces = 1;\n\n\tfunction PointCloud ( geometry, material ) {\n\t\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\t}\n\n\tfunction ParticleSystem ( geometry, material ) {\n\t\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\t}\n\n\tfunction PointCloudMaterial ( parameters ) {\n\t\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\t}\n\n\tfunction ParticleBasicMaterial ( parameters ) {\n\t\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\t}\n\n\tfunction ParticleSystemMaterial ( parameters ) {\n\t\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\t}\n\n\tfunction Vertex ( x, y, z ) {\n\t\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\n\t\treturn new Vector3( x, y, z );\n\t}\n\n\t//\n\n\tfunction EdgesHelper( object, hex ) {\n\t\tconsole.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );\n\t\treturn new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\t}\n\n\tfunction WireframeHelper( object, hex ) {\n\t\tconsole.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );\n\t\treturn new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\t}\n\n\t//\n\n\tObject.assign( Box2.prototype, {\n\t\tcenter: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\t\t},\n\t\tempty: function () {\n\t\t\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\t\t\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\t\t}\n\t} );\n\n\tObject.assign( Box3.prototype, {\n\t\tcenter: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\t\t},\n\t\tempty: function () {\n\t\t\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\t\t}\n\t} );\n\n\tObject.assign( Line3.prototype, {\n\t\tcenter: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\t\t}\n\t} );\n\n\tObject.assign( Matrix3.prototype, {\n\t\tmultiplyVector3: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix3( this );\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\t\t}\n\t} );\n\n\tObject.assign( Matrix4.prototype, {\n\t\textractPosition: function ( m ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\n\t\t\treturn this.copyPosition( m );\n\t\t},\n\t\tsetRotationFromQuaternion: function ( q ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\n\t\t\treturn this.makeRotationFromQuaternion( q );\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.' );\n\t\t\treturn vector.applyProjection( this );\n\t\t},\n\t\tmultiplyVector4: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\t\t},\n\t\trotateAxis: function ( v ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\n\t\t\tv.transformDirection( this );\n\t\t},\n\t\tcrossVector: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\t\t},\n\t\ttranslate: function ( v ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\n\t\t},\n\t\trotateX: function ( angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\n\t\t},\n\t\trotateY: function ( angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\n\t\t},\n\t\trotateZ: function ( angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\n\t\t},\n\t\trotateByAxis: function ( axis, angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\n\t\t}\n\t} );\n\n\tObject.assign( Plane.prototype, {\n\t\tisIntersectionLine: function ( line ) {\n\t\t\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\n\t\t\treturn this.intersectsLine( line );\n\t\t}\n\t} );\n\n\tObject.assign( Quaternion.prototype, {\n\t\tmultiplyVector3: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\n\t\t\treturn vector.applyQuaternion( this );\n\t\t}\n\t} );\n\n\tObject.assign( Ray.prototype, {\n\t\tisIntersectionBox: function ( box ) {\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\t\t},\n\t\tisIntersectionPlane: function ( plane ) {\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\n\t\t\treturn this.intersectsPlane( plane );\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\t\t}\n\t} );\n\n\tObject.assign( Shape.prototype, {\n\t\textrude: function ( options ) {\n\t\t\tconsole.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );\n\t\t\treturn new ExtrudeGeometry( this, options );\n\t\t},\n\t\tmakeGeometry: function ( options ) {\n\t\t\tconsole.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );\n\t\t\treturn new ShapeGeometry( this, options );\n\t\t}\n\t} );\n\n\tObject.assign( Vector3.prototype, {\n\t\tsetEulerFromRotationMatrix: function () {\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\n\t\t},\n\t\tsetEulerFromQuaternion: function () {\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\n\t\t},\n\t\tgetPositionFromMatrix: function ( m ) {\n\t\t\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\n\t\t\treturn this.setFromMatrixPosition( m );\n\t\t},\n\t\tgetScaleFromMatrix: function ( m ) {\n\t\t\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\n\t\t\treturn this.setFromMatrixScale( m );\n\t\t},\n\t\tgetColumnFromMatrix: function ( index, matrix ) {\n\t\t\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\n\t\t\treturn this.setFromMatrixColumn( matrix, index );\n\t\t}\n\t} );\n\n\t//\n\n\tObject.assign( Object3D.prototype, {\n\t\tgetChildByName: function ( name ) {\n\t\t\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\n\t\t\treturn this.getObjectByName( name );\n\t\t},\n\t\trenderDepth: function ( value ) {\n\t\t\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\n\t\t},\n\t\ttranslate: function ( distance, axis ) {\n\t\t\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\n\t\t\treturn this.translateOnAxis( axis, distance );\n\t\t}\n\t} );\n\n\tObject.defineProperties( Object3D.prototype, {\n\t\teulerOrder: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\treturn this.rotation.order;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\tthis.rotation.order = value;\n\t\t\t}\n\t\t},\n\t\tuseQuaternion: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( LOD.prototype, {\n\t\tobjects: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.LOD: .objects has been renamed to .levels.' );\n\t\t\t\treturn this.levels;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tPerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {\n\n\t\tconsole.warn( \"THREE.PerspectiveCamera.setLens is deprecated. \" +\n\t\t\t\t\"Use .setFocalLength and .filmGauge for a photographic setup.\" );\n\n\t\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\n\t\tthis.setFocalLength( focalLength );\n\n\t};\n\n\t//\n\n\tObject.defineProperties( Light.prototype, {\n\t\tonlyShadow: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\n\t\t\t}\n\t\t},\n\t\tshadowCameraFov: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\n\t\t\t\tthis.shadow.camera.fov = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraLeft: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\n\t\t\t\tthis.shadow.camera.left = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraRight: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\n\t\t\t\tthis.shadow.camera.right = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraTop: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\n\t\t\t\tthis.shadow.camera.top = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraBottom: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\n\t\t\t\tthis.shadow.camera.bottom = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraNear: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\n\t\t\t\tthis.shadow.camera.near = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraFar: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\n\t\t\t\tthis.shadow.camera.far = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraVisible: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\n\t\t\t}\n\t\t},\n\t\tshadowBias: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\n\t\t\t\tthis.shadow.bias = value;\n\t\t\t}\n\t\t},\n\t\tshadowDarkness: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\n\t\t\t}\n\t\t},\n\t\tshadowMapWidth: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\n\t\t\t\tthis.shadow.mapSize.width = value;\n\t\t\t}\n\t\t},\n\t\tshadowMapHeight: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\n\t\t\t\tthis.shadow.mapSize.height = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( BufferAttribute.prototype, {\n\t\tlength: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Please use .count.' );\n\t\t\t\treturn this.array.length;\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.assign( BufferGeometry.prototype, {\n\t\taddIndex: function ( index ) {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\n\t\t\tthis.setIndex( index );\n\t\t},\n\t\taddDrawCall: function ( start, count, indexOffset ) {\n\t\t\tif ( indexOffset !== undefined ) {\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\n\t\t\t}\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\n\t\t\tthis.addGroup( start, count );\n\t\t},\n\t\tclearDrawCalls: function () {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\n\t\t\tthis.clearGroups();\n\t\t},\n\t\tcomputeTangents: function () {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );\n\t\t},\n\t\tcomputeOffsets: function () {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\n\t\t}\n\t} );\n\n\tObject.defineProperties( BufferGeometry.prototype, {\n\t\tdrawcalls: {\n\t\t\tget: function () {\n\t\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\t\t\t}\n\t\t},\n\t\toffsets: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( Material.prototype, {\n\t\twrapAround: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\t\t\t}\n\t\t},\n\t\twrapRGB: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapRGB has been removed.' );\n\t\t\t\treturn new Color();\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( MeshPhongMaterial.prototype, {\n\t\tmetal: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( ShaderMaterial.prototype, {\n\t\tderivatives: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\treturn this.extensions.derivatives;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\tthis.extensions.derivatives = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tEventDispatcher.prototype = Object.assign( Object.create( {\n\n\t\t// Note: Extra base ensures these properties are not 'assign'ed.\n\n\t\tconstructor: EventDispatcher,\n\n\t\tapply: function ( target ) {\n\n\t\t\tconsole.warn( \"THREE.EventDispatcher: .apply is deprecated, \" +\n\t\t\t\t\t\"just inherit or Object.assign the prototype to mix-in.\" );\n\n\t\t\tObject.assign( target, this );\n\n\t\t}\n\n\t} ), EventDispatcher.prototype );\n\n\t//\n\n\tObject.defineProperties( Uniform.prototype, {\n\t\tdynamic: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );\n\t\t\t}\n\t\t},\n\t\tonUpdate: {\n\t\t\tvalue: function () {\n\t\t\t\tconsole.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.assign( WebGLRenderer.prototype, {\n\t\tsupportsFloatTextures: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_float' );\n\t\t},\n\t\tsupportsHalfFloatTextures: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_half_float' );\n\t\t},\n\t\tsupportsStandardDerivatives: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_standard_derivatives' );\n\t\t},\n\t\tsupportsCompressedTextureS3TC: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\t\t},\n\t\tsupportsCompressedTexturePVRTC: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\t\t},\n\t\tsupportsBlendMinMax: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\n\t\t\treturn this.extensions.get( 'EXT_blend_minmax' );\n\t\t},\n\t\tsupportsVertexTextures: function () {\n\t\t\treturn this.capabilities.vertexTextures;\n\t\t},\n\t\tsupportsInstancedArrays: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\n\t\t\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\n\t\t},\n\t\tenableScissorTest: function ( boolean ) {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\n\t\t\tthis.setScissorTest( boolean );\n\t\t},\n\t\tinitMaterial: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\n\t\t},\n\t\taddPrePlugin: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\n\t\t},\n\t\taddPostPlugin: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\n\t\t},\n\t\tupdateShadowMap: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\n\t\t}\n\t} );\n\n\tObject.defineProperties( WebGLRenderer.prototype, {\n\t\tshadowMapEnabled: {\n\t\t\tget: function () {\n\t\t\t\treturn this.shadowMap.enabled;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\n\t\t\t\tthis.shadowMap.enabled = value;\n\t\t\t}\n\t\t},\n\t\tshadowMapType: {\n\t\t\tget: function () {\n\t\t\t\treturn this.shadowMap.type;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\n\t\t\t\tthis.shadowMap.type = value;\n\t\t\t}\n\t\t},\n\t\tshadowMapCullFace: {\n\t\t\tget: function () {\n\t\t\t\treturn this.shadowMap.cullFace;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' );\n\t\t\t\tthis.shadowMap.cullFace = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( WebGLShadowMap.prototype, {\n\t\tcullFace: {\n\t\t\tget: function () {\n\t\t\t\treturn this.renderReverseSided ? CullFaceFront : CullFaceBack;\n\t\t\t},\n\t\t\tset: function ( cullFace ) {\n\t\t\t\tvar value = ( cullFace !== CullFaceBack );\n\t\t\t\tconsole.warn( \"WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to \" + value + \".\" );\n\t\t\t\tthis.renderReverseSided = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( WebGLRenderTarget.prototype, {\n\t\twrapS: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\treturn this.texture.wrapS;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\tthis.texture.wrapS = value;\n\t\t\t}\n\t\t},\n\t\twrapT: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\treturn this.texture.wrapT;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\tthis.texture.wrapT = value;\n\t\t\t}\n\t\t},\n\t\tmagFilter: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\treturn this.texture.magFilter;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\tthis.texture.magFilter = value;\n\t\t\t}\n\t\t},\n\t\tminFilter: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\treturn this.texture.minFilter;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\tthis.texture.minFilter = value;\n\t\t\t}\n\t\t},\n\t\tanisotropy: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\treturn this.texture.anisotropy;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\tthis.texture.anisotropy = value;\n\t\t\t}\n\t\t},\n\t\toffset: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\treturn this.texture.offset;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\tthis.texture.offset = value;\n\t\t\t}\n\t\t},\n\t\trepeat: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\treturn this.texture.repeat;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\tthis.texture.repeat = value;\n\t\t\t}\n\t\t},\n\t\tformat: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\treturn this.texture.format;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\tthis.texture.format = value;\n\t\t\t}\n\t\t},\n\t\ttype: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\treturn this.texture.type;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\tthis.texture.type = value;\n\t\t\t}\n\t\t},\n\t\tgenerateMipmaps: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\treturn this.texture.generateMipmaps;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\tthis.texture.generateMipmaps = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.assign( Audio.prototype, {\n\t\tload: function ( file ) {\n\t\t\tconsole.warn( 'THREE.Audio: .load has been deprecated. Please use THREE.AudioLoader.' );\n\t\t\tvar scope = this;\n\t\t\tvar audioLoader = new AudioLoader();\n\t\t\taudioLoader.load( file, function ( buffer ) {\n\t\t\t\tscope.setBuffer( buffer );\n\t\t\t} );\n\t\t\treturn this;\n\t\t}\n\t} );\n\n\tObject.assign( AudioAnalyser.prototype, {\n\t\tgetData: function ( file ) {\n\t\t\tconsole.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );\n\t\t\treturn this.getFrequencyData();\n\t\t}\n\t} );\n\n\t//\n\n\tvar GeometryUtils = {\n\n\t\tmerge: function ( geometry1, geometry2, materialIndexOffset ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );\n\n\t\t\tvar matrix;\n\n\t\t\tif ( geometry2.isMesh ) {\n\n\t\t\t\tgeometry2.matrixAutoUpdate && geometry2.updateMatrix();\n\n\t\t\t\tmatrix = geometry2.matrix;\n\t\t\t\tgeometry2 = geometry2.geometry;\n\n\t\t\t}\n\n\t\t\tgeometry1.merge( geometry2, matrix, materialIndexOffset );\n\n\t\t},\n\n\t\tcenter: function ( geometry ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );\n\t\t\treturn geometry.center();\n\n\t\t}\n\n\t};\n\n\tvar ImageUtils = {\n\n\t\tcrossOrigin: undefined,\n\n\t\tloadTexture: function ( url, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\n\n\t\t\tvar loader = new TextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( url, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadTextureCube: function ( urls, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\n\n\t\t\tvar loader = new CubeTextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( urls, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadCompressedTexture: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t},\n\n\t\tloadCompressedTextureCube: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Projector () {\n\n\t\tconsole.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' );\n\n\t\tthis.projectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .projectVector() is now vector.project().' );\n\t\t\tvector.project( camera );\n\n\t\t};\n\n\t\tthis.unprojectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' );\n\t\t\tvector.unproject( camera );\n\n\t\t};\n\n\t\tthis.pickingRay = function ( vector, camera ) {\n\n\t\t\tconsole.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' );\n\n\t\t};\n\n\t}\n\n\t//\n\n\tfunction CanvasRenderer () {\n\n\t\tconsole.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' );\n\n\t\tthis.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\tthis.clear = function () {};\n\t\tthis.render = function () {};\n\t\tthis.setClearColor = function () {};\n\t\tthis.setSize = function () {};\n\n\t}\n\n\texports.WebGLRenderTargetCube = WebGLRenderTargetCube;\n\texports.WebGLRenderTarget = WebGLRenderTarget;\n\texports.WebGLRenderer = WebGLRenderer;\n\texports.ShaderLib = ShaderLib;\n\texports.UniformsLib = UniformsLib;\n\texports.UniformsUtils = UniformsUtils;\n\texports.ShaderChunk = ShaderChunk;\n\texports.FogExp2 = FogExp2;\n\texports.Fog = Fog;\n\texports.Scene = Scene;\n\texports.LensFlare = LensFlare;\n\texports.Sprite = Sprite;\n\texports.LOD = LOD;\n\texports.SkinnedMesh = SkinnedMesh;\n\texports.Skeleton = Skeleton;\n\texports.Bone = Bone;\n\texports.Mesh = Mesh;\n\texports.LineSegments = LineSegments;\n\texports.Line = Line;\n\texports.Points = Points;\n\texports.Group = Group;\n\texports.VideoTexture = VideoTexture;\n\texports.DataTexture = DataTexture;\n\texports.CompressedTexture = CompressedTexture;\n\texports.CubeTexture = CubeTexture;\n\texports.CanvasTexture = CanvasTexture;\n\texports.DepthTexture = DepthTexture;\n\texports.TextureIdCount = TextureIdCount;\n\texports.Texture = Texture;\n\texports.MaterialIdCount = MaterialIdCount;\n\texports.CompressedTextureLoader = CompressedTextureLoader;\n\texports.BinaryTextureLoader = BinaryTextureLoader;\n\texports.DataTextureLoader = DataTextureLoader;\n\texports.CubeTextureLoader = CubeTextureLoader;\n\texports.TextureLoader = TextureLoader;\n\texports.ObjectLoader = ObjectLoader;\n\texports.MaterialLoader = MaterialLoader;\n\texports.BufferGeometryLoader = BufferGeometryLoader;\n\texports.DefaultLoadingManager = DefaultLoadingManager;\n\texports.LoadingManager = LoadingManager;\n\texports.JSONLoader = JSONLoader;\n\texports.ImageLoader = ImageLoader;\n\texports.FontLoader = FontLoader;\n\texports.XHRLoader = XHRLoader;\n\texports.Loader = Loader;\n\texports.Cache = Cache;\n\texports.AudioLoader = AudioLoader;\n\texports.SpotLightShadow = SpotLightShadow;\n\texports.SpotLight = SpotLight;\n\texports.PointLight = PointLight;\n\texports.HemisphereLight = HemisphereLight;\n\texports.DirectionalLightShadow = DirectionalLightShadow;\n\texports.DirectionalLight = DirectionalLight;\n\texports.AmbientLight = AmbientLight;\n\texports.LightShadow = LightShadow;\n\texports.Light = Light;\n\texports.StereoCamera = StereoCamera;\n\texports.PerspectiveCamera = PerspectiveCamera;\n\texports.OrthographicCamera = OrthographicCamera;\n\texports.CubeCamera = CubeCamera;\n\texports.Camera = Camera;\n\texports.AudioListener = AudioListener;\n\texports.PositionalAudio = PositionalAudio;\n\texports.getAudioContext = getAudioContext;\n\texports.AudioAnalyser = AudioAnalyser;\n\texports.Audio = Audio;\n\texports.VectorKeyframeTrack = VectorKeyframeTrack;\n\texports.StringKeyframeTrack = StringKeyframeTrack;\n\texports.QuaternionKeyframeTrack = QuaternionKeyframeTrack;\n\texports.NumberKeyframeTrack = NumberKeyframeTrack;\n\texports.ColorKeyframeTrack = ColorKeyframeTrack;\n\texports.BooleanKeyframeTrack = BooleanKeyframeTrack;\n\texports.PropertyMixer = PropertyMixer;\n\texports.PropertyBinding = PropertyBinding;\n\texports.KeyframeTrack = KeyframeTrack;\n\texports.AnimationUtils = AnimationUtils;\n\texports.AnimationObjectGroup = AnimationObjectGroup;\n\texports.AnimationMixer = AnimationMixer;\n\texports.AnimationClip = AnimationClip;\n\texports.Uniform = Uniform;\n\texports.InstancedBufferGeometry = InstancedBufferGeometry;\n\texports.BufferGeometry = BufferGeometry;\n\texports.GeometryIdCount = GeometryIdCount;\n\texports.Geometry = Geometry;\n\texports.InterleavedBufferAttribute = InterleavedBufferAttribute;\n\texports.InstancedInterleavedBuffer = InstancedInterleavedBuffer;\n\texports.InterleavedBuffer = InterleavedBuffer;\n\texports.InstancedBufferAttribute = InstancedBufferAttribute;\n\texports.DynamicBufferAttribute = DynamicBufferAttribute;\n\texports.Float64Attribute = Float64Attribute;\n\texports.Float32Attribute = Float32Attribute;\n\texports.Uint32Attribute = Uint32Attribute;\n\texports.Int32Attribute = Int32Attribute;\n\texports.Uint16Attribute = Uint16Attribute;\n\texports.Int16Attribute = Int16Attribute;\n\texports.Uint8ClampedAttribute = Uint8ClampedAttribute;\n\texports.Uint8Attribute = Uint8Attribute;\n\texports.Int8Attribute = Int8Attribute;\n\texports.BufferAttribute = BufferAttribute;\n\texports.Face3 = Face3;\n\texports.Object3DIdCount = Object3DIdCount;\n\texports.Object3D = Object3D;\n\texports.Raycaster = Raycaster;\n\texports.Layers = Layers;\n\texports.EventDispatcher = EventDispatcher;\n\texports.Clock = Clock;\n\texports.QuaternionLinearInterpolant = QuaternionLinearInterpolant;\n\texports.LinearInterpolant = LinearInterpolant;\n\texports.DiscreteInterpolant = DiscreteInterpolant;\n\texports.CubicInterpolant = CubicInterpolant;\n\texports.Interpolant = Interpolant;\n\texports.Triangle = Triangle;\n\texports.Spline = Spline;\n\texports.Math = _Math;\n\texports.Spherical = Spherical;\n\texports.Plane = Plane;\n\texports.Frustum = Frustum;\n\texports.Sphere = Sphere;\n\texports.Ray = Ray;\n\texports.Matrix4 = Matrix4;\n\texports.Matrix3 = Matrix3;\n\texports.Box3 = Box3;\n\texports.Box2 = Box2;\n\texports.Line3 = Line3;\n\texports.Euler = Euler;\n\texports.Vector4 = Vector4;\n\texports.Vector3 = Vector3;\n\texports.Vector2 = Vector2;\n\texports.Quaternion = Quaternion;\n\texports.ColorKeywords = ColorKeywords;\n\texports.Color = Color;\n\texports.MorphBlendMesh = MorphBlendMesh;\n\texports.ImmediateRenderObject = ImmediateRenderObject;\n\texports.VertexNormalsHelper = VertexNormalsHelper;\n\texports.SpotLightHelper = SpotLightHelper;\n\texports.SkeletonHelper = SkeletonHelper;\n\texports.PointLightHelper = PointLightHelper;\n\texports.HemisphereLightHelper = HemisphereLightHelper;\n\texports.GridHelper = GridHelper;\n\texports.FaceNormalsHelper = FaceNormalsHelper;\n\texports.DirectionalLightHelper = DirectionalLightHelper;\n\texports.CameraHelper = CameraHelper;\n\texports.BoundingBoxHelper = BoundingBoxHelper;\n\texports.BoxHelper = BoxHelper;\n\texports.ArrowHelper = ArrowHelper;\n\texports.AxisHelper = AxisHelper;\n\texports.ClosedSplineCurve3 = ClosedSplineCurve3;\n\texports.CatmullRomCurve3 = CatmullRomCurve3;\n\texports.SplineCurve3 = SplineCurve3;\n\texports.CubicBezierCurve3 = CubicBezierCurve3;\n\texports.QuadraticBezierCurve3 = QuadraticBezierCurve3;\n\texports.LineCurve3 = LineCurve3;\n\texports.ArcCurve = ArcCurve;\n\texports.EllipseCurve = EllipseCurve;\n\texports.SplineCurve = SplineCurve;\n\texports.CubicBezierCurve = CubicBezierCurve;\n\texports.QuadraticBezierCurve = QuadraticBezierCurve;\n\texports.LineCurve = LineCurve;\n\texports.Shape = Shape;\n\texports.ShapePath = ShapePath;\n\texports.Path = Path;\n\texports.Font = Font;\n\texports.CurvePath = CurvePath;\n\texports.Curve = Curve;\n\texports.ShapeUtils = ShapeUtils;\n\texports.SceneUtils = SceneUtils;\n\texports.CurveUtils = CurveUtils;\n\texports.WireframeGeometry = WireframeGeometry;\n\texports.ParametricGeometry = ParametricGeometry;\n\texports.ParametricBufferGeometry = ParametricBufferGeometry;\n\texports.TetrahedronGeometry = TetrahedronGeometry;\n\texports.TetrahedronBufferGeometry = TetrahedronBufferGeometry;\n\texports.OctahedronGeometry = OctahedronGeometry;\n\texports.OctahedronBufferGeometry = OctahedronBufferGeometry;\n\texports.IcosahedronGeometry = IcosahedronGeometry;\n\texports.IcosahedronBufferGeometry = IcosahedronBufferGeometry;\n\texports.DodecahedronGeometry = DodecahedronGeometry;\n\texports.DodecahedronBufferGeometry = DodecahedronBufferGeometry;\n\texports.PolyhedronGeometry = PolyhedronGeometry;\n\texports.PolyhedronBufferGeometry = PolyhedronBufferGeometry;\n\texports.TubeGeometry = TubeGeometry;\n\texports.TubeBufferGeometry = TubeBufferGeometry;\n\texports.TorusKnotGeometry = TorusKnotGeometry;\n\texports.TorusKnotBufferGeometry = TorusKnotBufferGeometry;\n\texports.TorusGeometry = TorusGeometry;\n\texports.TorusBufferGeometry = TorusBufferGeometry;\n\texports.TextGeometry = TextGeometry;\n\texports.SphereBufferGeometry = SphereBufferGeometry;\n\texports.SphereGeometry = SphereGeometry;\n\texports.RingGeometry = RingGeometry;\n\texports.RingBufferGeometry = RingBufferGeometry;\n\texports.PlaneBufferGeometry = PlaneBufferGeometry;\n\texports.PlaneGeometry = PlaneGeometry;\n\texports.LatheGeometry = LatheGeometry;\n\texports.LatheBufferGeometry = LatheBufferGeometry;\n\texports.ShapeGeometry = ShapeGeometry;\n\texports.ExtrudeGeometry = ExtrudeGeometry;\n\texports.EdgesGeometry = EdgesGeometry;\n\texports.ConeGeometry = ConeGeometry;\n\texports.ConeBufferGeometry = ConeBufferGeometry;\n\texports.CylinderGeometry = CylinderGeometry;\n\texports.CylinderBufferGeometry = CylinderBufferGeometry;\n\texports.CircleBufferGeometry = CircleBufferGeometry;\n\texports.CircleGeometry = CircleGeometry;\n\texports.BoxBufferGeometry = BoxBufferGeometry;\n\texports.BoxGeometry = BoxGeometry;\n\texports.ShadowMaterial = ShadowMaterial;\n\texports.SpriteMaterial = SpriteMaterial;\n\texports.RawShaderMaterial = RawShaderMaterial;\n\texports.ShaderMaterial = ShaderMaterial;\n\texports.PointsMaterial = PointsMaterial;\n\texports.MultiMaterial = MultiMaterial;\n\texports.MeshPhysicalMaterial = MeshPhysicalMaterial;\n\texports.MeshStandardMaterial = MeshStandardMaterial;\n\texports.MeshPhongMaterial = MeshPhongMaterial;\n\texports.MeshNormalMaterial = MeshNormalMaterial;\n\texports.MeshLambertMaterial = MeshLambertMaterial;\n\texports.MeshDepthMaterial = MeshDepthMaterial;\n\texports.MeshBasicMaterial = MeshBasicMaterial;\n\texports.LineDashedMaterial = LineDashedMaterial;\n\texports.LineBasicMaterial = LineBasicMaterial;\n\texports.Material = Material;\n\texports.REVISION = REVISION;\n\texports.MOUSE = MOUSE;\n\texports.CullFaceNone = CullFaceNone;\n\texports.CullFaceBack = CullFaceBack;\n\texports.CullFaceFront = CullFaceFront;\n\texports.CullFaceFrontBack = CullFaceFrontBack;\n\texports.FrontFaceDirectionCW = FrontFaceDirectionCW;\n\texports.FrontFaceDirectionCCW = FrontFaceDirectionCCW;\n\texports.BasicShadowMap = BasicShadowMap;\n\texports.PCFShadowMap = PCFShadowMap;\n\texports.PCFSoftShadowMap = PCFSoftShadowMap;\n\texports.FrontSide = FrontSide;\n\texports.BackSide = BackSide;\n\texports.DoubleSide = DoubleSide;\n\texports.FlatShading = FlatShading;\n\texports.SmoothShading = SmoothShading;\n\texports.NoColors = NoColors;\n\texports.FaceColors = FaceColors;\n\texports.VertexColors = VertexColors;\n\texports.NoBlending = NoBlending;\n\texports.NormalBlending = NormalBlending;\n\texports.AdditiveBlending = AdditiveBlending;\n\texports.SubtractiveBlending = SubtractiveBlending;\n\texports.MultiplyBlending = MultiplyBlending;\n\texports.CustomBlending = CustomBlending;\n\texports.BlendingMode = BlendingMode;\n\texports.AddEquation = AddEquation;\n\texports.SubtractEquation = SubtractEquation;\n\texports.ReverseSubtractEquation = ReverseSubtractEquation;\n\texports.MinEquation = MinEquation;\n\texports.MaxEquation = MaxEquation;\n\texports.ZeroFactor = ZeroFactor;\n\texports.OneFactor = OneFactor;\n\texports.SrcColorFactor = SrcColorFactor;\n\texports.OneMinusSrcColorFactor = OneMinusSrcColorFactor;\n\texports.SrcAlphaFactor = SrcAlphaFactor;\n\texports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor;\n\texports.DstAlphaFactor = DstAlphaFactor;\n\texports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor;\n\texports.DstColorFactor = DstColorFactor;\n\texports.OneMinusDstColorFactor = OneMinusDstColorFactor;\n\texports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor;\n\texports.NeverDepth = NeverDepth;\n\texports.AlwaysDepth = AlwaysDepth;\n\texports.LessDepth = LessDepth;\n\texports.LessEqualDepth = LessEqualDepth;\n\texports.EqualDepth = EqualDepth;\n\texports.GreaterEqualDepth = GreaterEqualDepth;\n\texports.GreaterDepth = GreaterDepth;\n\texports.NotEqualDepth = NotEqualDepth;\n\texports.MultiplyOperation = MultiplyOperation;\n\texports.MixOperation = MixOperation;\n\texports.AddOperation = AddOperation;\n\texports.NoToneMapping = NoToneMapping;\n\texports.LinearToneMapping = LinearToneMapping;\n\texports.ReinhardToneMapping = ReinhardToneMapping;\n\texports.Uncharted2ToneMapping = Uncharted2ToneMapping;\n\texports.CineonToneMapping = CineonToneMapping;\n\texports.UVMapping = UVMapping;\n\texports.CubeReflectionMapping = CubeReflectionMapping;\n\texports.CubeRefractionMapping = CubeRefractionMapping;\n\texports.EquirectangularReflectionMapping = EquirectangularReflectionMapping;\n\texports.EquirectangularRefractionMapping = EquirectangularRefractionMapping;\n\texports.SphericalReflectionMapping = SphericalReflectionMapping;\n\texports.CubeUVReflectionMapping = CubeUVReflectionMapping;\n\texports.CubeUVRefractionMapping = CubeUVRefractionMapping;\n\texports.TextureMapping = TextureMapping;\n\texports.RepeatWrapping = RepeatWrapping;\n\texports.ClampToEdgeWrapping = ClampToEdgeWrapping;\n\texports.MirroredRepeatWrapping = MirroredRepeatWrapping;\n\texports.TextureWrapping = TextureWrapping;\n\texports.NearestFilter = NearestFilter;\n\texports.NearestMipMapNearestFilter = NearestMipMapNearestFilter;\n\texports.NearestMipMapLinearFilter = NearestMipMapLinearFilter;\n\texports.LinearFilter = LinearFilter;\n\texports.LinearMipMapNearestFilter = LinearMipMapNearestFilter;\n\texports.LinearMipMapLinearFilter = LinearMipMapLinearFilter;\n\texports.TextureFilter = TextureFilter;\n\texports.UnsignedByteType = UnsignedByteType;\n\texports.ByteType = ByteType;\n\texports.ShortType = ShortType;\n\texports.UnsignedShortType = UnsignedShortType;\n\texports.IntType = IntType;\n\texports.UnsignedIntType = UnsignedIntType;\n\texports.FloatType = FloatType;\n\texports.HalfFloatType = HalfFloatType;\n\texports.UnsignedShort4444Type = UnsignedShort4444Type;\n\texports.UnsignedShort5551Type = UnsignedShort5551Type;\n\texports.UnsignedShort565Type = UnsignedShort565Type;\n\texports.UnsignedInt248Type = UnsignedInt248Type;\n\texports.AlphaFormat = AlphaFormat;\n\texports.RGBFormat = RGBFormat;\n\texports.RGBAFormat = RGBAFormat;\n\texports.LuminanceFormat = LuminanceFormat;\n\texports.LuminanceAlphaFormat = LuminanceAlphaFormat;\n\texports.RGBEFormat = RGBEFormat;\n\texports.DepthFormat = DepthFormat;\n\texports.DepthStencilFormat = DepthStencilFormat;\n\texports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format;\n\texports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format;\n\texports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format;\n\texports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format;\n\texports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format;\n\texports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format;\n\texports.RGB_ETC1_Format = RGB_ETC1_Format;\n\texports.LoopOnce = LoopOnce;\n\texports.LoopRepeat = LoopRepeat;\n\texports.LoopPingPong = LoopPingPong;\n\texports.InterpolateDiscrete = InterpolateDiscrete;\n\texports.InterpolateLinear = InterpolateLinear;\n\texports.InterpolateSmooth = InterpolateSmooth;\n\texports.ZeroCurvatureEnding = ZeroCurvatureEnding;\n\texports.ZeroSlopeEnding = ZeroSlopeEnding;\n\texports.WrapAroundEnding = WrapAroundEnding;\n\texports.TrianglesDrawMode = TrianglesDrawMode;\n\texports.TriangleStripDrawMode = TriangleStripDrawMode;\n\texports.TriangleFanDrawMode = TriangleFanDrawMode;\n\texports.LinearEncoding = LinearEncoding;\n\texports.sRGBEncoding = sRGBEncoding;\n\texports.GammaEncoding = GammaEncoding;\n\texports.RGBEEncoding = RGBEEncoding;\n\texports.LogLuvEncoding = LogLuvEncoding;\n\texports.RGBM7Encoding = RGBM7Encoding;\n\texports.RGBM16Encoding = RGBM16Encoding;\n\texports.RGBDEncoding = RGBDEncoding;\n\texports.BasicDepthPacking = BasicDepthPacking;\n\texports.RGBADepthPacking = RGBADepthPacking;\n\texports.CubeGeometry = BoxGeometry;\n\texports.Face4 = Face4;\n\texports.LineStrip = LineStrip;\n\texports.LinePieces = LinePieces;\n\texports.MeshFaceMaterial = MultiMaterial;\n\texports.PointCloud = PointCloud;\n\texports.Particle = Sprite;\n\texports.ParticleSystem = ParticleSystem;\n\texports.PointCloudMaterial = PointCloudMaterial;\n\texports.ParticleBasicMaterial = ParticleBasicMaterial;\n\texports.ParticleSystemMaterial = ParticleSystemMaterial;\n\texports.Vertex = Vertex;\n\texports.EdgesHelper = EdgesHelper;\n\texports.WireframeHelper = WireframeHelper;\n\texports.GeometryUtils = GeometryUtils;\n\texports.ImageUtils = ImageUtils;\n\texports.Projector = Projector;\n\texports.CanvasRenderer = CanvasRenderer;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n\tObject.defineProperty( exports, 'AudioContext', {\n\t\tget: function () {\n\t\t\treturn exports.getAudioContext();\n\t\t}\n\t});\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three/build/three.js\n// module id = 2\n// module chunks = 0","const THREE = require('three');\n\nexport default class Agent {\n constructor(id, pos, vel, goal, size, col) {\n \tthis.id = id;\n this.position = pos;\n this.velocity = vel;\n this.goal = goal\n this.size = size;\n this.markers = [];\n this.color = col;\n this.mesh = null;\n }\n} \n\n\n// WEBPACK FOOTER //\n// ./src/agent.js","export default class Marker {\n\tconstructor(position) {\n\t\tthis.position = position;\n\t\tthis.color = 0xff0000;\n\t\tthis.owned = false;\n\t\tthis.mesh = null;\n\t\tthis.agent = null;\n\t}\n}\n\n\n// WEBPACK FOOTER //\n// ./src/marker.js","const THREE = require('three');\nimport Grid from './grid.js'\nimport Agent from './agent.js'\nimport Marker from './marker.js'\n\nexport default class Crowd {\n constructor(renderengine) {\n \tthis.renderengine = renderengine;\n \tthis.markers = [];\n \tthis.agents = [];\n \tthis.board = new Grid(10.0, 100.0);\n\n \tthis.create_agents();\n \tthis.populate_board();\n \tthis.create_markers();\n \tthis.renderengine.render_plane(100.0);\n \tthis.renderengine.render_agents(this.agents);\n \tthis.renderengine.render_markers(this.markers);\n }\n\n create_agents() {\n \tvar agent_1_pos = new THREE.Vector3(-49, 1, 49);\n \tvar agent_2_pos = new THREE.Vector3(49, 1, 49);\n \tvar agent_1_goal = new THREE.Vector3(49, 0, -49);\n \tvar agent_2_goal = new THREE.Vector3(-49, 0, -49);\n \tvar zero = new THREE.Vector3(0, 0, 0);\n\n \tvar agent_1 = new Agent(0, agent_1_pos, zero, agent_1_goal, 2.0, 0x00ff00);\n \tvar agent_2 = new Agent(1, agent_2_pos, zero, agent_2_goal, 2.0, 0x0000ff);\n\tthis.agents.push(agent_1);\n\tthis.agents.push(agent_2);\n }\n\n populate_board() {\n \tfor (var i = 0; i < this.agents.length; i++) {\n \t\tvar agent = this.agents[i];\n \t\tvar gs = this.board.find_absolute_grid(agent.position.x, agent.position.z);\n \t\tthis.board.grid[gs.z][gs.x].add(agent);\n \t}\n }\n\n create_markers() {\n\tfor (var i = 0; i < 2000; i++) {\n\t\tvar x = Math.random() * 98 - 49;\n\t\tvar z = Math.random() * 98 - 49;\n\t\tvar marker = new Marker(new THREE.Vector3(x, 0.5, z));\n\t\tthis.markers.push(marker);\n\t}\n }\n\n /* \n\tupdate() - for each agent in the crowd, the velocity is calculated based off of the markers that belongs to each agent. \n */ \n update(time) {\n \tthis.update_marker_ownership();\n \tthis.update_agent_velocities(time);\n \tthis.renderengine.update_agents(this.agents);\n \tthis.renderengine.update_markers(this.markers);\n \tthis.reset_ownership();\n }\n\n reset_ownership() {\n \tfor (var i = 0; i < this.agents.length; i++) {\n \t\tthis.agents[i].markers = [];\n \t}\n\n \tfor (var i = 0; i < this.markers.length; i++) {\n \t\tthis.markers[i].owned = false;\n \t\tthis.markers[i].color = 0xff0000;\n \t\tthis.markers[i].agent = null;\n \t}\n }\n\n update_marker_ownership() {\n \tfor (var i = 0; i < this.markers.length; i++) {\n \t\tvar marker = this.markers[i];\n \t\tif (marker.owned) {\n \t\t\tcontinue;\n \t\t}\n \t\tvar ngs = this.board.find_nearest_grid(marker.position.x, marker.position.z);\n \t\tvar top_left = {x: ngs.x -1, z: ngs.z - 1};\n \t\tvar top = {x: ngs.x, z: ngs.z - 1};\n \t\tvar left = {x: ngs.x - 1, z: ngs.z};\n \t\tvar grid = this.board.grid;\n \t\tvar eligible_agents = [];\n \t\tif (top_left.z > -1 && top_left.x > -1 && grid[top_left.z][top_left.x].size > 0) {\n \t\t\tgrid[top_left.z][top_left.x].forEach(function(agent) {\n \t\t\t\teligible_agents.push(agent);\n \t\t\t});\n \t\t}\n \t\tif (top.z > -1 && top.x > -1 && grid[top.z][top.x].size > 0) {\n \t\t\tgrid[top.z][top.x].forEach(function(agent) {\n \t\t\t\teligible_agents.push(agent);\n \t\t\t});\n\t\t}\n \t\tif (left.z > -1 && left.x > -1 && grid[left.z][left.x].size > 0) {\n \t\t\tgrid[left.z][left.x].forEach(function(agent) {\n \t\t\t\teligible_agents.push(agent);\n \t\t\t});\n \t\t}\n \t\tif (ngs.z > -1 && ngs.x > -1 && grid[ngs.z][ngs.x].size > 0) {\n \t\t\tgrid[ngs.z][ngs.x].forEach(function(agent) {\n \t\t\t\teligible_agents.push(agent);\n \t\t\t});\n \t\t}\n \t\tthis.assign_marker_to_agent(eligible_agents, marker);\n \t}\n }\n\n assign_marker_to_agent(agents, marker) {\n \tif (agents.length === 0) {\n \t\tmarker.color = 0xff0000;\n \t\tmarker.owned = false;\n \t\tmarker.agent = null;\n \t\treturn;\n \t}\n \tvar closest = {dist: marker.position.distanceTo(agents[0].position), agent: agents[0]};\n \tagents.forEach(function(agent) {\n \t\tvar test_dist = marker.position.distanceTo(agent.position);\n \t\tif (test_dist < closest.dist) {\n \t\t\tclosest.dist = test_dist;\n \t\t\tclosest.agent = agent;\n \t\t}\n \t});\n \tmarker.agent = closest.agent;\n \tmarker.color = closest.agent.color;\n \tmarker.owned = true;\n \tclosest.agent.markers.push(marker);\n \treturn;\n }\n\n update_agent_velocities(time) {\n \tfor (var i = 0; i < this.agents.length; i++) {\n \t\tvar agent = this.agents[i];\n \t\tif (agent.position.distanceTo(agent.goal) > 2.0) {\n\t \t\tvar old_gs = this.board.find_absolute_grid(agent.position.x, agent.position.z);\n\n\t \t\t// computing total marker influence\n\t \t\tvar G = new THREE.Vector3().subVectors(agent.goal, agent.position)\n\t \t\tvar total_weight = 0.0;\n\t \t\tvar total_velocity = new THREE.Vector3(0, 0, 0);\n\t \t\tfor (var j = 0; j < agent.markers.length; j++) {\n\t \t\t\tvar marker = agent.markers[j];\n\t \t\t\tvar m = new THREE.Vector3().subVectors(marker.position, agent.position);\n\t \t\t\tm.y = 0.0;\n\t \t\t\tvar weight = (1.0 + m.dot(G) / (m.length() * G.length())) / (1.0 + m.length());\n\t \t\t\ttotal_weight += weight;\n\t \t\t}\n\t \t\tfor (var j = 0; j < agent.markers.length; j++) {\n\t \t\t\tvar marker = agent.markers[j];\n\t \t\t\tvar m = new THREE.Vector3().subVectors(marker.position, agent.position);\n\t \t\t\tm.y = 0.0;\n\t\t\t\tvar weight = (1.0 + m.dot(G) / (m.length() * G.length())) / (1.0 + m.length());\n\t \t\t\ttotal_velocity.add(m.multiplyScalar(weight / total_weight));\n\t \t\t}\n\t\t\tif (i === 1) {\n\t \t\t}\n\t \t\t// agent.velocity = total_velocity.normalize();\n\t \t\tagent.position.add(total_velocity.multiplyScalar(time).normalize());\n\t \t\t// agent.position.add(G.divideScalar(100.0));\n\t \t\t// check if the movement of this agent causes it to leave its current grid\n\t\t\tvar agent_gs = this.board.find_absolute_grid(agent.position.x, agent.position.z);\n\t\t\tif (old_gs.x !== agent_gs.x || old_gs.z !== agent_gs.z) {\n \t\t\t\tthis.board.grid[old_gs.z][old_gs.x].delete(agent);\n \t\t\t\tthis.board.grid[agent_gs.z][agent_gs.x].add(agent);\n\t\t\t}\n\t \t}\n \t}\n }\n}\n\n\n// WEBPACK FOOTER //\n// ./src/crowd.js","const THREE = require('three');\n\nexport default class RenderEngine {\n\n\tconstructor(scene) {\n\t\tthis.scene = scene;\n \t}\n\n \trender_plane(size) {\n\t \tvar plane_geo = new THREE.PlaneGeometry(size, size);\n\t\tvar plane_mesh = new THREE.Mesh(plane_geo, new THREE.MeshBasicMaterial( {color: 0xcccccc, side: THREE.DoubleSide}));\n\t\tplane_mesh.rotation.x = Math.PI / 2.0;\n\t\tplane_mesh.position.set(0.0, 0.0, 0.0);\n\t\tthis.scene.add(plane_mesh);\n \t}\n\n \trender_agents(agents) {\n\t \tvar cylinder_geo = new THREE.CylinderGeometry(1, 1, 2, 20);\n\t\tvar agent; \n\t\tfor (var i = 0; i < agents.length; i++) {\n\t\t\tagent = new THREE.Mesh(cylinder_geo, new THREE.MeshBasicMaterial( {color: agents[i].color, side: THREE.DoubleSide}));\n\t\t\tagent.position.set(agents[i].position.x, agents[i].position.y, agents[i].position.z);\n\t\t\tagents[i].mesh = agent;\n\t\t\tthis.scene.add(agent);\n\t\t}\n \t}\n \n \trender_markers(markers) {\n\t\tvar cube_geo = new THREE.BoxGeometry(0.5, 0.5, 0.5);\n\t\tvar marker;\n\t\tfor (var i = 0; i < markers.length; i++) {\n\t\t\tmarker = new THREE.Mesh(cube_geo, new THREE.MeshBasicMaterial( {color: markers[i].color, side: THREE.DoubleSide}));\n\t\t\tmarker.position.set(markers[i].position.x, markers[i].position.y, markers[i].position.z);\n\t\t\tmarkers[i].mesh = marker;\n\t\t\tthis.scene.add(marker);\n\t\t}\n \t}\n\n \tupdate_agents(agents) {\n \t\tfor (var i = 0; i < agents.length; i++) {\n \t\t\tvar pos = agents[i].position;\n \t\t\tvar mesh = agents[i].mesh;\n \t\t\tmesh.position.set(pos.x, pos.y, pos.z);\n \t\t\tmesh.geometry.verticesNeedUpdate = true;\n \t\t}\n \t}\n\n \tupdate_markers(markers) {\n \t\tmarkers.forEach(function(marker) {\n \t\t\tmarker.mesh.material.color.setHex(marker.color);\n \t\t});\n \t}\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/renderengine.js","\nconst THREE = require('three');\nconst OrbitControls = require('three-orbit-controls')(THREE)\nimport Stats from 'stats-js'\nimport DAT from 'dat-gui'\n\n// when the scene is done initializing, the function passed as `callback` will be executed\n// then, every frame, the function passed as `update` will be executed\nfunction init(callback, update) {\n var stats = new Stats();\n stats.setMode(1);\n stats.domElement.style.position = 'absolute';\n stats.domElement.style.left = '0px';\n stats.domElement.style.top = '0px';\n document.body.appendChild(stats.domElement);\n\n var gui = new DAT.GUI();\n\n var framework = {\n gui: gui,\n stats: stats\n };\n\n // run this function after the window loads\n window.addEventListener('load', function() {\n\n var scene = new THREE.Scene();\n var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );\n var renderer = new THREE.WebGLRenderer( { antialias: true } );\n renderer.setPixelRatio(window.devicePixelRatio);\n renderer.setSize(window.innerWidth, window.innerHeight);\n renderer.setClearColor(0x020202, 0);\n\n var controls = new OrbitControls(camera, renderer.domElement);\n controls.enableDamping = true;\n controls.enableZoom = true;\n controls.target.set(0, 0, 0);\n controls.rotateSpeed = 0.3;\n controls.zoomSpeed = 1.0;\n controls.panSpeed = 2.0;\n\n document.body.appendChild(renderer.domElement);\n\n // resize the canvas when the window changes\n window.addEventListener('resize', function() {\n camera.aspect = window.innerWidth / window.innerHeight;\n camera.updateProjectionMatrix();\n renderer.setSize(window.innerWidth, window.innerHeight);\n }, false);\n\n // assign THREE.js objects to the object we will return\n framework.scene = scene;\n framework.camera = camera;\n framework.renderer = renderer;\n\n // begin the animation loop\n (function tick() {\n stats.begin();\n update(framework); // perform any requested updates\n renderer.render(scene, camera); // render the scene\n stats.end();\n requestAnimationFrame(tick); // register to call this again when the browser renders a new frame\n })();\n\n // we will pass the scene, gui, renderer, camera, etc... to the callback function\n return callback(framework);\n });\n}\n\nexport default {\n init: init\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/framework.js","// stats.js - http://github.com/mrdoob/stats.js\nvar Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement(\"div\");f.id=\"stats\";f.addEventListener(\"mousedown\",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText=\"width:80px;opacity:0.9;cursor:pointer\";var a=document.createElement(\"div\");a.id=\"fps\";a.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#002\";f.appendChild(a);var i=document.createElement(\"div\");i.id=\"fpsText\";i.style.cssText=\"color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";\ni.innerHTML=\"FPS\";a.appendChild(i);var c=document.createElement(\"div\");c.id=\"fpsGraph\";c.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0ff\";for(a.appendChild(c);74>c.children.length;){var j=document.createElement(\"span\");j.style.cssText=\"width:1px;height:30px;float:left;background-color:#113\";c.appendChild(j)}var d=document.createElement(\"div\");d.id=\"ms\";d.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#020;display:none\";f.appendChild(d);var k=document.createElement(\"div\");\nk.id=\"msText\";k.style.cssText=\"color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";k.innerHTML=\"MS\";d.appendChild(k);var e=document.createElement(\"div\");e.id=\"msGraph\";e.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0f0\";for(d.appendChild(e);74>e.children.length;)j=document.createElement(\"span\"),j.style.cssText=\"width:1px;height:30px;float:left;background-color:#131\",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display=\n\"block\";d.style.display=\"none\";break;case 1:a.style.display=\"none\",d.style.display=\"block\"}};return{REVISION:12,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+\" MS (\"+n+\"-\"+o+\")\";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+\"px\";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+\" FPS (\"+p+\"-\"+q+\")\",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height=\na+\"px\",m=b,r=0);return b},update:function(){l=this.end()}}};\"object\"===typeof module&&(module.exports=Stats);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/stats-js/build/stats.min.js\n// module id = 8\n// module chunks = 0","module.exports = require('./vendor/dat.gui')\nmodule.exports.color = require('./vendor/dat.color')\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/index.js\n// module id = 9\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.gui = dat.gui || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\n/** @namespace */\ndat.controllers = dat.controllers || {};\n\n/** @namespace */\ndat.dom = dat.dom || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\ndat.utils.css = (function () {\n return {\n load: function (url, doc) {\n doc = doc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function(css, doc) {\n doc = doc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = css;\n doc.getElementsByTagName('head')[0].appendChild(injected);\n }\n }\n})();\n\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.controllers.Controller = (function (common) {\n\n /**\n * @class An \"abstract\" class that represents a given property of an object.\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var Controller = function(object, property) {\n\n this.initialValue = object[property];\n\n /**\n * Those who extend this class will put their DOM elements in here.\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n\n /**\n * The object to manipulate\n * @type {Object}\n */\n this.object = object;\n\n /**\n * The name of the property to manipulate\n * @type {String}\n */\n this.property = property;\n\n /**\n * The function to be called on change.\n * @type {Function}\n * @ignore\n */\n this.__onChange = undefined;\n\n /**\n * The function to be called on finishing change.\n * @type {Function}\n * @ignore\n */\n this.__onFinishChange = undefined;\n\n };\n\n common.extend(\n\n Controller.prototype,\n\n /** @lends dat.controllers.Controller.prototype */\n {\n\n /**\n * Specify that a function fire every time someone changes the value with\n * this Controller.\n *\n * @param {Function} fnc This function will be called whenever the value\n * is modified via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onChange: function(fnc) {\n this.__onChange = fnc;\n return this;\n },\n\n /**\n * Specify that a function fire every time someone \"finishes\" changing\n * the value wih this Controller. Useful for values that change\n * incrementally like numbers or strings.\n *\n * @param {Function} fnc This function will be called whenever\n * someone \"finishes\" changing the value via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onFinishChange: function(fnc) {\n this.__onFinishChange = fnc;\n return this;\n },\n\n /**\n * Change the value of object[property]\n *\n * @param {Object} newValue The new value of object[property]\n */\n setValue: function(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n },\n\n /**\n * Gets the value of object[property]\n *\n * @returns {Object} The current value of object[property]\n */\n getValue: function() {\n return this.object[this.property];\n },\n\n /**\n * Refreshes the visual display of a Controller in order to keep sync\n * with the object's current value.\n * @returns {dat.controllers.Controller} this\n */\n updateDisplay: function() {\n return this;\n },\n\n /**\n * @returns {Boolean} true if the value has deviated from initialValue\n */\n isModified: function() {\n return this.initialValue !== this.getValue()\n }\n\n }\n\n );\n\n return Controller;\n\n\n})(dat.utils.common);\n\n\ndat.dom.dom = (function (common) {\n\n var EVENT_MAP = {\n 'HTMLEvents': ['change'],\n 'MouseEvents': ['click','mousemove','mousedown','mouseup', 'mouseover'],\n 'KeyboardEvents': ['keydown']\n };\n\n var EVENT_MAP_INV = {};\n common.each(EVENT_MAP, function(v, k) {\n common.each(v, function(e) {\n EVENT_MAP_INV[e] = k;\n });\n });\n\n var CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\n\n function cssValueToPixels(val) {\n\n if (val === '0' || common.isUndefined(val)) return 0;\n\n var match = val.match(CSS_VALUE_PIXELS);\n\n if (!common.isNull(match)) {\n return parseFloat(match[1]);\n }\n\n // TODO ...ems? %?\n\n return 0;\n\n }\n\n /**\n * @namespace\n * @member dat.dom\n */\n var dom = {\n\n /**\n * \n * @param elem\n * @param selectable\n */\n makeSelectable: function(elem, selectable) {\n\n if (elem === undefined || elem.style === undefined) return;\n\n elem.onselectstart = selectable ? function() {\n return false;\n } : function() {\n };\n\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n\n },\n\n /**\n *\n * @param elem\n * @param horizontal\n * @param vertical\n */\n makeFullscreen: function(elem, horizontal, vertical) {\n\n if (common.isUndefined(horizontal)) horizontal = true;\n if (common.isUndefined(vertical)) vertical = true;\n\n elem.style.position = 'absolute';\n\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n\n },\n\n /**\n *\n * @param elem\n * @param eventType\n * @param params\n */\n fakeEvent: function(elem, eventType, params, aux) {\n params = params || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false,\n params.cancelable || true, window, params.clickCount || 1,\n 0, //screen X\n 0, //screen Y\n clientX, //client X\n clientY, //client Y\n false, false, false, false, 0, null);\n break;\n case 'KeyboardEvents':\n var init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz\n common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false,\n params.cancelable, window,\n params.ctrlKey, params.altKey,\n params.shiftKey, params.metaKey,\n params.keyCode, params.charCode);\n break;\n default:\n evt.initEvent(eventType, params.bubbles || false,\n params.cancelable || true);\n break;\n }\n common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n bind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.addEventListener)\n elem.addEventListener(event, func, bool);\n else if (elem.attachEvent)\n elem.attachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n unbind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.removeEventListener)\n elem.removeEventListener(event, func, bool);\n else if (elem.detachEvent)\n elem.detachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n addClass: function(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) == -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n removeClass: function(elem, className) {\n if (className) {\n if (elem.className === undefined) {\n // elem.className = className;\n } else if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index != -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n\n hasClass: function(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n\n /**\n *\n * @param elem\n */\n getWidth: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-left-width']) +\n cssValueToPixels(style['border-right-width']) +\n cssValueToPixels(style['padding-left']) +\n cssValueToPixels(style['padding-right']) +\n cssValueToPixels(style['width']);\n },\n\n /**\n *\n * @param elem\n */\n getHeight: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-top-width']) +\n cssValueToPixels(style['border-bottom-width']) +\n cssValueToPixels(style['padding-top']) +\n cssValueToPixels(style['padding-bottom']) +\n cssValueToPixels(style['height']);\n },\n\n /**\n *\n * @param elem\n */\n getOffset: function(elem) {\n var offset = {left: 0, top:0};\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n } while (elem = elem.offsetParent);\n }\n return offset;\n },\n\n // http://stackoverflow.com/posts/2684561/revisions\n /**\n * \n * @param elem\n */\n isActive: function(elem) {\n return elem === document.activeElement && ( elem.type || elem.href );\n }\n\n };\n\n return dom;\n\n})(dat.utils.common);\n\n\ndat.controllers.OptionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a select input to alter the property of an object, using a\n * list of accepted values.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object|string[]} options A map of labels to acceptable values, or\n * a list of acceptable string values.\n *\n * @member dat.controllers\n */\n var OptionController = function(object, property, options) {\n\n OptionController.superclass.call(this, object, property);\n\n var _this = this;\n\n /**\n * The drop down menu\n * @ignore\n */\n this.__select = document.createElement('select');\n\n if (common.isArray(options)) {\n var map = {};\n common.each(options, function(element) {\n map[element] = element;\n });\n options = map;\n }\n\n common.each(options, function(value, key) {\n\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n\n });\n\n // Acknowledge original value\n this.updateDisplay();\n\n dom.bind(this.__select, 'change', function() {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n\n this.domElement.appendChild(this.__select);\n\n };\n\n OptionController.superclass = Controller;\n\n common.extend(\n\n OptionController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = OptionController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n },\n\n updateDisplay: function() {\n this.__select.value = this.getValue();\n return OptionController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return OptionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberController = (function (Controller, common) {\n\n /**\n * @class Represents a given property of an object that is a number.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberController = function(object, property, params) {\n\n NumberController.superclass.call(this, object, property);\n\n params = params || {};\n\n this.__min = params.min;\n this.__max = params.max;\n this.__step = params.step;\n\n if (common.isUndefined(this.__step)) {\n\n if (this.initialValue == 0) {\n this.__impliedStep = 1; // What are we, psychics?\n } else {\n // Hey Doug, check this out.\n this.__impliedStep = Math.pow(10, Math.floor(Math.log(this.initialValue)/Math.LN10))/10;\n }\n\n } else {\n\n this.__impliedStep = this.__step;\n\n }\n\n this.__precision = numDecimals(this.__impliedStep);\n\n\n };\n\n NumberController.superclass = Controller;\n\n common.extend(\n\n NumberController.prototype,\n Controller.prototype,\n\n /** @lends dat.controllers.NumberController.prototype */\n {\n\n setValue: function(v) {\n\n if (this.__min !== undefined && v < this.__min) {\n v = this.__min;\n } else if (this.__max !== undefined && v > this.__max) {\n v = this.__max;\n }\n\n if (this.__step !== undefined && v % this.__step != 0) {\n v = Math.round(v / this.__step) * this.__step;\n }\n\n return NumberController.superclass.prototype.setValue.call(this, v);\n\n },\n\n /**\n * Specify a minimum value for object[property].\n *\n * @param {Number} minValue The minimum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n min: function(v) {\n this.__min = v;\n return this;\n },\n\n /**\n * Specify a maximum value for object[property].\n *\n * @param {Number} maxValue The maximum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n max: function(v) {\n this.__max = v;\n return this;\n },\n\n /**\n * Specify a step value that dat.controllers.NumberController\n * increments by.\n *\n * @param {Number} stepValue The step value for\n * dat.controllers.NumberController\n * @default if minimum and maximum specified increment is 1% of the\n * difference otherwise stepValue is 1\n * @returns {dat.controllers.NumberController} this\n */\n step: function(v) {\n this.__step = v;\n return this;\n }\n\n }\n\n );\n\n function numDecimals(x) {\n x = x.toString();\n if (x.indexOf('.') > -1) {\n return x.length - x.indexOf('.') - 1;\n } else {\n return 0;\n }\n }\n\n return NumberController;\n\n})(dat.controllers.Controller,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerBox = (function (NumberController, dom, common) {\n\n /**\n * @class Represents a given property of an object that is a number and\n * provides an input element with which to manipulate it.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerBox = function(object, property, params) {\n\n this.__truncationSuspended = false;\n\n NumberControllerBox.superclass.call(this, object, property, params);\n\n var _this = this;\n\n /**\n * {Number} Previous mouse y position\n * @ignore\n */\n var prev_y;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n // Makes it so manually specified values are not truncated.\n\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'mousedown', onMouseDown);\n dom.bind(this.__input, 'keydown', function(e) {\n\n // When pressing entire, you can be as precise as you want.\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n }\n\n });\n\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!common.isNaN(attempted)) _this.setValue(attempted);\n }\n\n function onBlur() {\n onChange();\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prev_y = e.clientY;\n }\n\n function onMouseDrag(e) {\n\n var diff = prev_y - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n\n prev_y = e.clientY;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n NumberControllerBox.superclass = NumberController;\n\n common.extend(\n\n NumberControllerBox.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return NumberControllerBox.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n function roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n }\n\n return NumberControllerBox;\n\n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerSlider = (function (NumberController, dom, css, common, styleSheet) {\n\n /**\n * @class Represents a given property of an object that is a number, contains\n * a minimum and maximum, and provides a slider element with which to\n * manipulate it. It should be noted that the slider element is made up of\n * <div> tags, not the html5\n * <slider> element.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n * \n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Number} minValue Minimum allowed value\n * @param {Number} maxValue Maximum allowed value\n * @param {Number} stepValue Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerSlider = function(object, property, min, max, step) {\n\n NumberControllerSlider.superclass.call(this, object, property, { min: min, max: max, step: step });\n\n var _this = this;\n\n this.__background = document.createElement('div');\n this.__foreground = document.createElement('div');\n \n\n\n dom.bind(this.__background, 'mousedown', onMouseDown);\n \n dom.addClass(this.__background, 'slider');\n dom.addClass(this.__foreground, 'slider-fg');\n\n function onMouseDown(e) {\n\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n\n onMouseDrag(e);\n }\n\n function onMouseDrag(e) {\n\n e.preventDefault();\n\n var offset = dom.getOffset(_this.__background);\n var width = dom.getWidth(_this.__background);\n \n _this.setValue(\n map(e.clientX, offset.left, offset.left + width, _this.__min, _this.__max)\n );\n\n return false;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.__background.appendChild(this.__foreground);\n this.domElement.appendChild(this.__background);\n\n };\n\n NumberControllerSlider.superclass = NumberController;\n\n /**\n * Injects default stylesheet for slider elements.\n */\n NumberControllerSlider.useDefaultStyles = function() {\n css.inject(styleSheet);\n };\n\n common.extend(\n\n NumberControllerSlider.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n var pct = (this.getValue() - this.__min)/(this.__max - this.__min);\n this.__foreground.style.width = pct*100+'%';\n return NumberControllerSlider.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n\n\n );\n\n function map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n }\n\n return NumberControllerSlider;\n \n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.css,\ndat.utils.common,\n\".slider {\\n box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);\\n height: 1em;\\n border-radius: 1em;\\n background-color: #eee;\\n padding: 0 0.5em;\\n overflow: hidden;\\n}\\n\\n.slider-fg {\\n padding: 1px 0 2px 0;\\n background-color: #aaa;\\n height: 1em;\\n margin-left: -0.5em;\\n padding-right: 0.5em;\\n border-radius: 1em 0 0 1em;\\n}\\n\\n.slider-fg:after {\\n display: inline-block;\\n border-radius: 1em;\\n background-color: #fff;\\n border: 1px solid #aaa;\\n content: '';\\n float: right;\\n margin-right: -1em;\\n margin-top: -1px;\\n height: 0.9em;\\n width: 0.9em;\\n}\");\n\n\ndat.controllers.FunctionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a GUI interface to fire a specified method, a property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var FunctionController = function(object, property, text) {\n\n FunctionController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__button = document.createElement('div');\n this.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(this.__button, 'click', function(e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n\n dom.addClass(this.__button, 'button');\n\n this.domElement.appendChild(this.__button);\n\n\n };\n\n FunctionController.superclass = Controller;\n\n common.extend(\n\n FunctionController.prototype,\n Controller.prototype,\n {\n \n fire: function() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.getValue().call(this.object);\n }\n }\n\n );\n\n return FunctionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.BooleanController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a checkbox input to alter the boolean property of an object.\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var BooleanController = function(object, property) {\n\n BooleanController.superclass.call(this, object, property);\n\n var _this = this;\n this.__prev = this.getValue();\n\n this.__checkbox = document.createElement('input');\n this.__checkbox.setAttribute('type', 'checkbox');\n\n\n dom.bind(this.__checkbox, 'change', onChange, false);\n\n this.domElement.appendChild(this.__checkbox);\n\n // Match original value\n this.updateDisplay();\n\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n\n };\n\n BooleanController.superclass = Controller;\n\n common.extend(\n\n BooleanController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = BooleanController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n },\n\n updateDisplay: function() {\n \n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true; \n } else {\n this.__checkbox.checked = false;\n }\n\n return BooleanController.superclass.prototype.updateDisplay.call(this);\n\n }\n\n\n }\n\n );\n\n return BooleanController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common);\n\n\ndat.GUI = dat.gui.GUI = (function (css, saveDialogueContents, styleSheet, controllerFactory, Controller, BooleanController, FunctionController, NumberControllerBox, NumberControllerSlider, OptionController, ColorController, requestAnimationFrame, CenteredDiv, dom, common) {\n\n css.inject(styleSheet);\n\n /** Outer-most className for GUI's */\n var CSS_NAMESPACE = 'dg';\n\n var HIDE_KEY_CODE = 72;\n\n /** The only value shared between the JS and SCSS. Use caution. */\n var CLOSE_BUTTON_HEIGHT = 20;\n\n var DEFAULT_DEFAULT_PRESET_NAME = 'Default';\n\n var SUPPORTS_LOCAL_STORAGE = (function() {\n try {\n return 'localStorage' in window && window['localStorage'] !== null;\n } catch (e) {\n return false;\n }\n })();\n\n var SAVE_DIALOGUE;\n\n /** Have we yet to create an autoPlace GUI? */\n var auto_place_virgin = true;\n\n /** Fixed position div that auto place GUI's go inside */\n var auto_place_container;\n\n /** Are we hiding the GUI's ? */\n var hide = false;\n\n /** GUI's which should be hidden */\n var hideable_guis = [];\n\n /**\n * A lightweight controller library for JavaScript. It allows you to easily\n * manipulate variables and fire functions on the fly.\n * @class\n *\n * @member dat.gui\n *\n * @param {Object} [params]\n * @param {String} [params.name] The name of this GUI.\n * @param {Object} [params.load] JSON object representing the saved state of\n * this GUI.\n * @param {Boolean} [params.auto=true]\n * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.\n * @param {Boolean} [params.closed] If true, starts closed\n */\n var GUI = function(params) {\n\n var _this = this;\n\n /**\n * Outermost DOM Element\n * @type DOMElement\n */\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n\n dom.addClass(this.domElement, CSS_NAMESPACE);\n\n /**\n * Nested GUI's by name\n * @ignore\n */\n this.__folders = {};\n\n this.__controllers = [];\n\n /**\n * List of objects I'm remembering for save, only used in top level GUI\n * @ignore\n */\n this.__rememberedObjects = [];\n\n /**\n * Maps the index of remembered objects to a map of controllers, only used\n * in top level GUI.\n *\n * @private\n * @ignore\n *\n * @example\n * [\n * {\n * propertyName: Controller,\n * anotherPropertyName: Controller\n * },\n * {\n * propertyName: Controller\n * }\n * ]\n */\n this.__rememberedObjectIndecesToControllers = [];\n\n this.__listening = [];\n\n params = params || {};\n\n // Default parameters\n params = common.defaults(params, {\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n\n params = common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n\n\n if (!common.isUndefined(params.load)) {\n\n // Explicit preset\n if (params.preset) params.load.preset = params.preset;\n\n } else {\n\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n\n }\n\n if (common.isUndefined(params.parent) && params.hideable) {\n hideable_guis.push(this);\n }\n\n // Only root level GUI's are resizable.\n params.resizable = common.isUndefined(params.parent) && params.resizable;\n\n\n if (params.autoPlace && common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;\n\n // Not part of params because I don't want people passing this in via\n // constructor. Should be a 'remembered' value.\n var use_local_storage =\n SUPPORTS_LOCAL_STORAGE &&\n localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n\n Object.defineProperties(this,\n\n /** @lends dat.gui.GUI.prototype */\n {\n\n /**\n * The parent GUI\n * @type dat.gui.GUI\n */\n parent: {\n get: function() {\n return params.parent;\n }\n },\n\n scrollable: {\n get: function() {\n return params.scrollable;\n }\n },\n\n /**\n * Handles GUI's element placement for you\n * @type Boolean\n */\n autoPlace: {\n get: function() {\n return params.autoPlace;\n }\n },\n\n /**\n * The identifier for a set of saved values\n * @type String\n */\n preset: {\n\n get: function() {\n if (_this.parent) {\n return _this.getRoot().preset;\n } else {\n return params.load.preset;\n }\n },\n\n set: function(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n\n },\n\n /**\n * The width of GUI element\n * @type Number\n */\n width: {\n get: function() {\n return params.width;\n },\n set: function(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n\n /**\n * The name of GUI. Used for folders. i.e\n * a folder's name\n * @type String\n */\n name: {\n get: function() {\n return params.name;\n },\n set: function(v) {\n // TODO Check for collisions among sibling folders\n params.name = v;\n if (title_row_name) {\n title_row_name.innerHTML = params.name;\n }\n }\n },\n\n /**\n * Whether the GUI is collapsed or not\n * @type Boolean\n */\n closed: {\n get: function() {\n return params.closed;\n },\n set: function(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n // For browsers that aren't going to respect the CSS transition,\n // Lets just check our height against the window height right off\n // the bat.\n this.onResize();\n\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n\n /**\n * Contains all presets\n * @type Object\n */\n load: {\n get: function() {\n return params.load;\n }\n },\n\n /**\n * Determines whether or not to use localStorage as the means for\n * remembering\n * @type Boolean\n */\n useLocalStorage: {\n\n get: function() {\n return use_local_storage;\n },\n set: function(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n use_local_storage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n\n }\n\n });\n\n // Are we a root level GUI?\n if (common.isUndefined(params.parent)) {\n\n params.closed = false;\n\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n\n // Are we supposed to be loading locally?\n if (SUPPORTS_LOCAL_STORAGE) {\n\n if (use_local_storage) {\n\n _this.useLocalStorage = true;\n\n var saved_gui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n\n if (saved_gui) {\n params.load = JSON.parse(saved_gui);\n }\n\n }\n\n }\n\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n this.domElement.appendChild(this.__closeButton);\n\n dom.bind(this.__closeButton, 'click', function() {\n\n _this.closed = !_this.closed;\n\n\n });\n\n\n // Oh, you're a nested GUI!\n } else {\n\n if (params.closed === undefined) {\n params.closed = true;\n }\n\n var title_row_name = document.createTextNode(params.name);\n dom.addClass(title_row_name, 'controller-name');\n\n var title_row = addRow(_this, title_row_name);\n\n var on_click_title = function(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n\n dom.addClass(title_row, 'title');\n dom.bind(title_row, 'click', on_click_title);\n\n if (!params.closed) {\n this.closed = false;\n }\n\n }\n\n if (params.autoPlace) {\n\n if (common.isUndefined(params.parent)) {\n\n if (auto_place_virgin) {\n auto_place_container = document.createElement('div');\n dom.addClass(auto_place_container, CSS_NAMESPACE);\n dom.addClass(auto_place_container, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(auto_place_container);\n auto_place_virgin = false;\n }\n\n // Put it in the dom for you.\n auto_place_container.appendChild(this.domElement);\n\n // Apply the auto styles\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n\n }\n\n\n // Make it not elastic.\n if (!this.parent) setWidth(_this, params.width);\n\n }\n\n dom.bind(window, 'resize', function() { _this.onResize() });\n dom.bind(this.__ul, 'webkitTransitionEnd', function() { _this.onResize(); });\n dom.bind(this.__ul, 'transitionend', function() { _this.onResize() });\n dom.bind(this.__ul, 'oTransitionEnd', function() { _this.onResize() });\n this.onResize();\n\n\n if (params.resizable) {\n addResizeHandle(this);\n }\n\n function saveToLocalStorage() {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n\n var root = _this.getRoot();\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n common.defer(function() {\n root.width -= 1;\n });\n }\n\n if (!params.parent) {\n resetWidth();\n }\n\n };\n\n GUI.toggleHide = function() {\n\n hide = !hide;\n common.each(hideable_guis, function(gui) {\n gui.domElement.style.zIndex = hide ? -999 : 999;\n gui.domElement.style.opacity = hide ? 0 : 1;\n });\n };\n\n GUI.CLASS_AUTO_PLACE = 'a';\n GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\n GUI.CLASS_MAIN = 'main';\n GUI.CLASS_CONTROLLER_ROW = 'cr';\n GUI.CLASS_TOO_TALL = 'taller-than-window';\n GUI.CLASS_CLOSED = 'closed';\n GUI.CLASS_CLOSE_BUTTON = 'close-button';\n GUI.CLASS_DRAG = 'drag';\n\n GUI.DEFAULT_WIDTH = 245;\n GUI.TEXT_CLOSED = 'Close Controls';\n GUI.TEXT_OPEN = 'Open Controls';\n\n dom.bind(window, 'keydown', function(e) {\n\n if (document.activeElement.type !== 'text' &&\n (e.which === HIDE_KEY_CODE || e.keyCode == HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n\n }, false);\n\n common.extend(\n\n GUI.prototype,\n\n /** @lends dat.gui.GUI */\n {\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.Controller} The new controller that was added.\n * @instance\n */\n add: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n }\n );\n\n },\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.ColorController} The new controller that was added.\n * @instance\n */\n addColor: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n color: true\n }\n );\n\n },\n\n /**\n * @param controller\n * @instance\n */\n remove: function(controller) {\n\n // TODO listening?\n this.__ul.removeChild(controller.__li);\n this.__controllers.slice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n common.defer(function() {\n _this.onResize();\n });\n\n },\n\n destroy: function() {\n\n if (this.autoPlace) {\n auto_place_container.removeChild(this.domElement);\n }\n\n },\n\n /**\n * @param name\n * @returns {dat.gui.GUI} The new folder.\n * @throws {Error} if this GUI already has a folder by the specified\n * name\n * @instance\n */\n addFolder: function(name) {\n\n // We have to prevent collisions on names in order to have a key\n // by which to remember saved values\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' +\n ' name \"' + name + '\"');\n }\n\n var new_gui_params = { name: name, parent: this };\n\n // We need to pass down the autoPlace trait so that we can\n // attach event listeners to open/close folder actions to\n // ensure that a scrollbar appears if the window is too short.\n new_gui_params.autoPlace = this.autoPlace;\n\n // Do we have saved appearance data for this folder?\n\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[name]) { // Did daddy remember me?\n\n // Start me closed if I was closed\n new_gui_params.closed = this.load.folders[name].closed;\n\n // Pass down the loaded data\n new_gui_params.load = this.load.folders[name];\n\n }\n\n var gui = new GUI(new_gui_params);\n this.__folders[name] = gui;\n\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n\n },\n\n open: function() {\n this.closed = false;\n },\n\n close: function() {\n this.closed = true;\n },\n\n onResize: function() {\n\n var root = this.getRoot();\n\n if (root.scrollable) {\n\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n\n common.each(root.__ul.childNodes, function(node) {\n if (! (root.autoPlace && node === root.__save_row))\n h += dom.getHeight(node);\n });\n\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n\n }\n\n if (root.__resize_handle) {\n common.defer(function() {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n\n },\n\n /**\n * Mark objects for saving. The order of these objects cannot change as\n * the GUI grows. When remembering new objects, append them to the end\n * of the list.\n *\n * @param {Object...} objects\n * @throws {Error} if not called on a top level GUI.\n * @instance\n */\n remember: function() {\n\n if (common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;\n }\n\n if (this.parent) {\n throw new Error(\"You can only call remember on a top level GUI.\");\n }\n\n var _this = this;\n\n common.each(Array.prototype.slice.call(arguments), function(object) {\n if (_this.__rememberedObjects.length == 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) == -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n\n if (this.autoPlace) {\n // Set save row width\n setWidth(this, this.width);\n }\n\n },\n\n /**\n * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.\n * @instance\n */\n getRoot: function() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n\n /**\n * @returns {Object} a JSON object representing the current state of\n * this GUI as well as its remembered properties.\n * @instance\n */\n getSaveObject: function() {\n\n var toReturn = this.load;\n\n toReturn.closed = this.closed;\n\n // Am I remembering any values?\n if (this.__rememberedObjects.length > 0) {\n\n toReturn.preset = this.preset;\n\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n\n }\n\n toReturn.folders = {};\n common.each(this.__folders, function(element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n\n return toReturn;\n\n },\n\n save: function() {\n\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n\n },\n\n saveAs: function(presetName) {\n\n if (!this.load.remembered) {\n\n // Retain default values upon first save\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n\n }\n\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n\n },\n\n revert: function(gui) {\n\n common.each(this.__controllers, function(controller) {\n // Make revert work on Default.\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n }, this);\n\n common.each(this.__folders, function(folder) {\n folder.revert(folder);\n });\n\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n\n\n },\n\n listen: function(controller) {\n\n var init = this.__listening.length == 0;\n this.__listening.push(controller);\n if (init) updateDisplays(this.__listening);\n\n }\n\n }\n\n );\n\n function add(gui, object, property, params) {\n\n if (object[property] === undefined) {\n throw new Error(\"Object \" + object + \" has no property \\\"\" + property + \"\\\"\");\n }\n\n var controller;\n\n if (params.color) {\n\n controller = new ColorController(object, property);\n\n } else {\n\n var factoryArgs = [object,property].concat(params.factoryArgs);\n controller = controllerFactory.apply(gui, factoryArgs);\n\n }\n\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n\n recallSavedValue(gui, controller);\n\n dom.addClass(controller.domElement, 'c');\n\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n\n var li = addRow(gui, container, params.before);\n\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n dom.addClass(li, typeof controller.getValue());\n\n augmentController(gui, li, controller);\n\n gui.__controllers.push(controller);\n\n return controller;\n\n }\n\n /**\n * Add a row to the end of the GUI or before another row.\n *\n * @param gui\n * @param [dom] If specified, inserts the dom content in the new row\n * @param [liBefore] If specified, places the new row before another row\n */\n function addRow(gui, dom, liBefore) {\n var li = document.createElement('li');\n if (dom) li.appendChild(dom);\n if (liBefore) {\n gui.__ul.insertBefore(li, params.before);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n }\n\n function augmentController(gui, li, controller) {\n\n controller.__li = li;\n controller.__gui = gui;\n\n common.extend(controller, {\n\n options: function(options) {\n\n if (arguments.length > 1) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [common.toArray(arguments)]\n }\n );\n\n }\n\n if (common.isArray(options) || common.isObject(options)) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [options]\n }\n );\n\n }\n\n },\n\n name: function(v) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = v;\n return controller;\n },\n\n listen: function() {\n controller.__gui.listen(controller);\n return controller;\n },\n\n remove: function() {\n controller.__gui.remove(controller);\n return controller;\n }\n\n });\n\n // All sliders should be accompanied by a box.\n if (controller instanceof NumberControllerSlider) {\n\n var box = new NumberControllerBox(controller.object, controller.property,\n { min: controller.__min, max: controller.__max, step: controller.__step });\n\n common.each(['updateDisplay', 'onChange', 'onFinishChange'], function(method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function() {\n var args = Array.prototype.slice.call(arguments);\n pc.apply(controller, args);\n return pb.apply(box, args);\n }\n });\n\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n\n }\n else if (controller instanceof NumberControllerBox) {\n\n var r = function(returned) {\n\n // Have we defined both boundaries?\n if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {\n\n // Well, then lets just replace this with a slider.\n controller.remove();\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n\n }\n\n return returned;\n\n };\n\n controller.min = common.compose(r, controller.min);\n controller.max = common.compose(r, controller.max);\n\n }\n else if (controller instanceof BooleanController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n\n dom.bind(controller.__checkbox, 'click', function(e) {\n e.stopPropagation(); // Prevents double-toggle\n })\n\n }\n else if (controller instanceof FunctionController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__button, 'click');\n });\n\n dom.bind(li, 'mouseover', function() {\n dom.addClass(controller.__button, 'hover');\n });\n\n dom.bind(li, 'mouseout', function() {\n dom.removeClass(controller.__button, 'hover');\n });\n\n }\n else if (controller instanceof ColorController) {\n\n dom.addClass(li, 'color');\n controller.updateDisplay = common.compose(function(r) {\n li.style.borderLeftColor = controller.__color.toString();\n return r;\n }, controller.updateDisplay);\n\n controller.updateDisplay();\n\n }\n\n controller.setValue = common.compose(function(r) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return r;\n }, controller.setValue);\n\n }\n\n function recallSavedValue(gui, controller) {\n\n // Find the topmost GUI, that's where remembered objects live.\n var root = gui.getRoot();\n\n // Does the object we're controlling match anything we've been told to\n // remember?\n var matched_index = root.__rememberedObjects.indexOf(controller.object);\n\n // Why yes, it does!\n if (matched_index != -1) {\n\n // Let me fetch a map of controllers for thcommon.isObject.\n var controller_map =\n root.__rememberedObjectIndecesToControllers[matched_index];\n\n // Ohp, I believe this is the first controller we've created for this\n // object. Lets make the map fresh.\n if (controller_map === undefined) {\n controller_map = {};\n root.__rememberedObjectIndecesToControllers[matched_index] =\n controller_map;\n }\n\n // Keep track of this controller\n controller_map[controller.property] = controller;\n\n // Okay, now have we saved any values for this controller?\n if (root.load && root.load.remembered) {\n\n var preset_map = root.load.remembered;\n\n // Which preset are we trying to load?\n var preset;\n\n if (preset_map[gui.preset]) {\n\n preset = preset_map[gui.preset];\n\n } else if (preset_map[DEFAULT_DEFAULT_PRESET_NAME]) {\n\n // Uhh, you can have the default instead?\n preset = preset_map[DEFAULT_DEFAULT_PRESET_NAME];\n\n } else {\n\n // Nada.\n\n return;\n\n }\n\n\n // Did the loaded object remember thcommon.isObject?\n if (preset[matched_index] &&\n\n // Did we remember this particular property?\n preset[matched_index][controller.property] !== undefined) {\n\n // We did remember something for this guy ...\n var value = preset[matched_index][controller.property];\n\n // And that's what it is.\n controller.initialValue = value;\n controller.setValue(value);\n\n }\n\n }\n\n }\n\n }\n\n function getLocalStorageHash(gui, key) {\n // TODO how does this deal with multiple GUI's?\n return document.location.href + '.' + key;\n\n }\n\n function addSaveMenu(gui) {\n\n var div = gui.__save_row = document.createElement('li');\n\n dom.addClass(gui.domElement, 'has-save');\n\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n\n dom.addClass(div, 'save-row');\n\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n\n // TODO replace with FunctionController\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n\n var select = gui.__preset_select = document.createElement('select');\n\n if (gui.load && gui.load.remembered) {\n\n common.each(gui.load.remembered, function(value, key) {\n addPresetOption(gui, key, key == gui.preset);\n });\n\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n\n dom.bind(select, 'change', function() {\n\n\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n\n gui.preset = this.value;\n\n });\n\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n\n if (SUPPORTS_LOCAL_STORAGE) {\n\n var saveLocally = document.getElementById('dg-save-locally');\n var explain = document.getElementById('dg-local-explain');\n\n saveLocally.style.display = 'block';\n\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n\n function showHideExplain() {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n }\n\n showHideExplain();\n\n // TODO: Use a boolean controller, fool!\n dom.bind(localStorageCheckBox, 'change', function() {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain();\n });\n\n }\n\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n\n dom.bind(newConstructorTextArea, 'keydown', function(e) {\n if (e.metaKey && (e.which === 67 || e.keyCode == 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n\n dom.bind(gears, 'click', function() {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n\n dom.bind(button, 'click', function() {\n gui.save();\n });\n\n dom.bind(button2, 'click', function() {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) gui.saveAs(presetName);\n });\n\n dom.bind(button3, 'click', function() {\n gui.revert();\n });\n\n// div.appendChild(button2);\n\n }\n\n function addResizeHandle(gui) {\n\n gui.__resize_handle = document.createElement('div');\n\n common.extend(gui.__resize_handle.style, {\n\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n// border: '1px solid blue'\n\n });\n\n var pmouseX;\n\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n\n function dragStart(e) {\n\n e.preventDefault();\n\n pmouseX = e.clientX;\n\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n\n return false;\n\n }\n\n function drag(e) {\n\n e.preventDefault();\n\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n\n return false;\n\n }\n\n function dragStop() {\n\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n\n }\n\n }\n\n function setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n // Auto placed save-rows are position fixed, so we have to\n // set the width manually if we want it to bleed to the edge\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n }\n\n function getCurrentPreset(gui, useInitialValues) {\n\n var toReturn = {};\n\n // For each object I'm remembering\n common.each(gui.__rememberedObjects, function(val, index) {\n\n var saved_values = {};\n\n // The controllers I've made for thcommon.isObject by property\n var controller_map =\n gui.__rememberedObjectIndecesToControllers[index];\n\n // Remember each value for each property\n common.each(controller_map, function(controller, property) {\n saved_values[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n\n // Save the values for thcommon.isObject\n toReturn[index] = saved_values;\n\n });\n\n return toReturn;\n\n }\n\n function addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n }\n\n function setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value == gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n }\n\n function markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n// console.log('mark', modified, opt);\n if (modified) {\n opt.innerHTML = opt.value + \"*\";\n } else {\n opt.innerHTML = opt.value;\n }\n }\n\n function updateDisplays(controllerArray) {\n\n\n if (controllerArray.length != 0) {\n\n requestAnimationFrame(function() {\n updateDisplays(controllerArray);\n });\n\n }\n\n common.each(controllerArray, function(c) {\n c.updateDisplay();\n });\n\n }\n\n return GUI;\n\n})(dat.utils.css,\n\"
\\n\\n Here's the new load parameter for your GUI's constructor:\\n\\n \\n\\n
\\n\\n Automatically save\\n values to localStorage on exit.\\n\\n
The values saved to localStorage will\\n override those passed to dat.GUI's constructor. This makes it\\n easier to work incrementally, but localStorage is fragile,\\n and your friends may not see the same values you do.\\n \\n
\\n \\n
\\n\\n
\",\n\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear;border:0;position:absolute;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save ul{margin-top:27px}.dg.a.has-save ul.closed{margin-top:0}.dg.a .save-row{position:fixed;top:0;z-index:1002}.dg li{-webkit-transition:height 0.1s ease-out;-o-transition:height 0.1s ease-out;-moz-transition:height 0.1s ease-out;transition:height 0.1s ease-out}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:hidden;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li > *{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:9px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\",\ndat.controllers.factory = (function (OptionController, NumberControllerBox, NumberControllerSlider, StringController, FunctionController, BooleanController, common) {\n\n return function(object, property) {\n\n var initialValue = object[property];\n\n // Providing options?\n if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n\n // Providing a map?\n\n if (common.isNumber(initialValue)) {\n\n if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {\n\n // Has min and max.\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n\n } else {\n\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n\n }\n\n }\n\n if (common.isString(initialValue)) {\n return new StringController(object, property);\n }\n\n if (common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n\n if (common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n\n }\n\n })(dat.controllers.OptionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.StringController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a text input to alter the string property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var StringController = function(object, property) {\n\n StringController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n dom.bind(this.__input, 'keyup', onChange);\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n \n\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n StringController.superclass = Controller;\n\n common.extend(\n\n StringController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n // Stops the caret from moving on account of:\n // keyup -> setValue -> updateDisplay\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return StringController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return StringController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common),\ndat.controllers.FunctionController,\ndat.controllers.BooleanController,\ndat.utils.common),\ndat.controllers.Controller,\ndat.controllers.BooleanController,\ndat.controllers.FunctionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.OptionController,\ndat.controllers.ColorController = (function (Controller, dom, Color, interpret, common) {\n\n var ColorController = function(object, property) {\n\n ColorController.superclass.call(this, object, property);\n\n this.__color = new Color(this.getValue());\n this.__temp = new Color(0);\n\n var _this = this;\n\n this.domElement = document.createElement('div');\n\n dom.makeSelectable(this.domElement, false);\n\n this.__selector = document.createElement('div');\n this.__selector.className = 'selector';\n\n this.__saturation_field = document.createElement('div');\n this.__saturation_field.className = 'saturation-field';\n\n this.__field_knob = document.createElement('div');\n this.__field_knob.className = 'field-knob';\n this.__field_knob_border = '2px solid ';\n\n this.__hue_knob = document.createElement('div');\n this.__hue_knob.className = 'hue-knob';\n\n this.__hue_field = document.createElement('div');\n this.__hue_field.className = 'hue-field';\n\n this.__input = document.createElement('input');\n this.__input.type = 'text';\n this.__input_textShadow = '0 1px 1px ';\n\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) { // on enter\n onBlur.call(this);\n }\n });\n\n dom.bind(this.__input, 'blur', onBlur);\n\n dom.bind(this.__selector, 'mousedown', function(e) {\n\n dom\n .addClass(this, 'drag')\n .bind(window, 'mouseup', function(e) {\n dom.removeClass(_this.__selector, 'drag');\n });\n\n });\n\n var value_field = document.createElement('div');\n\n common.extend(this.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n\n common.extend(this.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: this.__field_knob_border + (this.__color.v < .5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n \n common.extend(this.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n\n common.extend(this.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n\n common.extend(value_field.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n \n linearGradient(value_field, 'top', 'rgba(0,0,0,0)', '#000');\n\n common.extend(this.__hue_field.style, {\n width: '15px',\n height: '100px',\n display: 'inline-block',\n border: '1px solid #555',\n cursor: 'ns-resize'\n });\n\n hueGradient(this.__hue_field);\n\n common.extend(this.__input.style, {\n outline: 'none',\n// width: '120px',\n textAlign: 'center',\n// padding: '4px',\n// marginBottom: '6px',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n\n dom.bind(this.__saturation_field, 'mousedown', fieldDown);\n dom.bind(this.__field_knob, 'mousedown', fieldDown);\n\n dom.bind(this.__hue_field, 'mousedown', function(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'mouseup', unbindH);\n });\n\n function fieldDown(e) {\n setSV(e);\n // document.body.style.cursor = 'none';\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'mouseup', unbindSV);\n }\n\n function unbindSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'mouseup', unbindSV);\n // document.body.style.cursor = 'default';\n }\n\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n\n function unbindH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'mouseup', unbindH);\n }\n\n this.__saturation_field.appendChild(value_field);\n this.__selector.appendChild(this.__field_knob);\n this.__selector.appendChild(this.__saturation_field);\n this.__selector.appendChild(this.__hue_field);\n this.__hue_field.appendChild(this.__hue_knob);\n\n this.domElement.appendChild(this.__input);\n this.domElement.appendChild(this.__selector);\n\n this.updateDisplay();\n\n function setSV(e) {\n\n e.preventDefault();\n\n var w = dom.getWidth(_this.__saturation_field);\n var o = dom.getOffset(_this.__saturation_field);\n var s = (e.clientX - o.left + document.body.scrollLeft) / w;\n var v = 1 - (e.clientY - o.top + document.body.scrollTop) / w;\n\n if (v > 1) v = 1;\n else if (v < 0) v = 0;\n\n if (s > 1) s = 1;\n else if (s < 0) s = 0;\n\n _this.__color.v = v;\n _this.__color.s = s;\n\n _this.setValue(_this.__color.toOriginal());\n\n\n return false;\n\n }\n\n function setH(e) {\n\n e.preventDefault();\n\n var s = dom.getHeight(_this.__hue_field);\n var o = dom.getOffset(_this.__hue_field);\n var h = 1 - (e.clientY - o.top + document.body.scrollTop) / s;\n\n if (h > 1) h = 1;\n else if (h < 0) h = 0;\n\n _this.__color.h = h * 360;\n\n _this.setValue(_this.__color.toOriginal());\n\n return false;\n\n }\n\n };\n\n ColorController.superclass = Controller;\n\n common.extend(\n\n ColorController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n\n var i = interpret(this.getValue());\n\n if (i !== false) {\n\n var mismatch = false;\n\n // Check for mismatch on the interpreted value.\n\n common.each(Color.COMPONENTS, function(component) {\n if (!common.isUndefined(i[component]) &&\n !common.isUndefined(this.__color.__state[component]) &&\n i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {}; // break\n }\n }, this);\n\n // If nothing diverges, we keep our previous values\n // for statefulness, otherwise we recalculate fresh\n if (mismatch) {\n common.extend(this.__color.__state, i);\n }\n\n }\n\n common.extend(this.__temp.__state, this.__color.__state);\n\n this.__temp.a = 1;\n\n var flip = (this.__color.v < .5 || this.__color.s > .5) ? 255 : 0;\n var _flip = 255 - flip;\n\n common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip +')'\n });\n\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'\n\n this.__temp.s = 1;\n this.__temp.v = 1;\n\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toString());\n\n common.extend(this.__input.style, {\n backgroundColor: this.__input.value = this.__color.toString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip +')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip +',.7)'\n });\n\n }\n\n }\n\n );\n \n var vendors = ['-moz-','-o-','-webkit-','-ms-',''];\n \n function linearGradient(elem, x, a, b) {\n elem.style.background = '';\n common.each(vendors, function(vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient('+x+', '+a+' 0%, ' + b + ' 100%); ';\n });\n }\n \n function hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n }\n\n\n return ColorController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret,\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common),\ndat.color.interpret,\ndat.utils.common),\ndat.utils.requestAnimationFrame = (function () {\n\n /**\n * requirejs version of Paul Irish's RequestAnimationFrame\n * http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n */\n\n return window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function(callback, element) {\n\n window.setTimeout(callback, 1000 / 60);\n\n };\n})(),\ndat.dom.CenteredDiv = (function (dom, common) {\n\n\n var CenteredDiv = function() {\n\n this.backgroundElement = document.createElement('div');\n common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear'\n });\n\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n\n this.domElement = document.createElement('div');\n common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear'\n });\n\n\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function() {\n _this.hide();\n });\n\n\n };\n\n CenteredDiv.prototype.show = function() {\n\n var _this = this;\n \n\n\n this.backgroundElement.style.display = 'block';\n\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n// this.domElement.style.top = '52%';\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n this.layout();\n\n common.defer(function() {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n\n };\n\n CenteredDiv.prototype.hide = function() {\n\n var _this = this;\n\n var hide = function() {\n\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n\n };\n\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n\n this.backgroundElement.style.opacity = 0;\n// this.domElement.style.top = '48%';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n };\n\n CenteredDiv.prototype.layout = function() {\n this.domElement.style.left = window.innerWidth/2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight/2 - dom.getHeight(this.domElement) / 2 + 'px';\n };\n \n function lockScroll(e) {\n console.log(e);\n }\n\n return CenteredDiv;\n\n})(dat.dom.dom,\ndat.utils.common),\ndat.dom.dom,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.gui.js\n// module id = 10\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.Color = dat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common),\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.color.js\n// module id = 11\n// module chunks = 0","module.exports = function( THREE ) {\n\t/**\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one finger move\n// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n// Pan - right mouse, or arrow keys / touch: three finter swipe\n\n\tfunction OrbitControls( object, domElement ) {\n\n\t\tthis.object = object;\n\n\t\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new THREE.Vector3();\n\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = - Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t//\n\t\t// public methods\n\t\t//\n\n\t\tthis.getPolarAngle = function () {\n\n\t\t\treturn spherical.phi;\n\n\t\t};\n\n\t\tthis.getAzimuthalAngle = function () {\n\n\t\t\treturn spherical.theta;\n\n\t\t};\n\n\t\tthis.reset = function () {\n\n\t\t\tscope.target.copy( scope.target0 );\n\t\t\tscope.object.position.copy( scope.position0 );\n\t\t\tscope.object.zoom = scope.zoom0;\n\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\tscope.update();\n\n\t\t\tstate = STATE.NONE;\n\n\t\t};\n\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\t// so camera.up is the orbit axis\n\t\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\t\tvar quatInverse = quat.clone().inverse();\n\n\t\t\tvar lastPosition = new THREE.Vector3();\n\t\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\t\treturn function update () {\n\n\t\t\t\tvar position = scope.object.position;\n\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t\t// angle from z-axis around y-axis\n\t\t\t\tspherical.setFromVector3( offset );\n\n\t\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t\t}\n\n\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\tspherical.phi += sphericalDelta.phi;\n\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\tspherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) );\n\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tspherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n\t\t\t\tspherical.makeSafe();\n\n\n\t\t\t\tspherical.radius *= scale;\n\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tspherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n\t\t\t\t// move target to panned location\n\t\t\t\tscope.target.add( panOffset );\n\n\t\t\t\toffset.setFromSpherical( spherical );\n\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\t\tsphericalDelta.theta *= ( 1 - scope.dampingFactor );\n\t\t\t\t\tsphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsphericalDelta.set( 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\t\tif ( zoomChanged ||\n\t\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\t\tzoomChanged = false;\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t};\n\n\t\t}();\n\n\t\tthis.dispose = function() {\n\n\t\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\t\tscope.domElement.removeEventListener( 'wheel', onMouseWheel, false );\n\n\t\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t\t};\n\n\t\t//\n\t\t// internals\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tvar changeEvent = { type: 'change' };\n\t\tvar startEvent = { type: 'start' };\n\t\tvar endEvent = { type: 'end' };\n\n\t\tvar STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\n\t\tvar state = STATE.NONE;\n\n\t\tvar EPS = 0.000001;\n\n\t\t// current position in spherical coordinates\n\t\tvar spherical = new THREE.Spherical();\n\t\tvar sphericalDelta = new THREE.Spherical();\n\n\t\tvar scale = 1;\n\t\tvar panOffset = new THREE.Vector3();\n\t\tvar zoomChanged = false;\n\n\t\tvar rotateStart = new THREE.Vector2();\n\t\tvar rotateEnd = new THREE.Vector2();\n\t\tvar rotateDelta = new THREE.Vector2();\n\n\t\tvar panStart = new THREE.Vector2();\n\t\tvar panEnd = new THREE.Vector2();\n\t\tvar panDelta = new THREE.Vector2();\n\n\t\tvar dollyStart = new THREE.Vector2();\n\t\tvar dollyEnd = new THREE.Vector2();\n\t\tvar dollyDelta = new THREE.Vector2();\n\n\t\tfunction getAutoRotationAngle() {\n\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t\t}\n\n\t\tfunction getZoomScale() {\n\n\t\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t\t}\n\n\t\tfunction rotateLeft( angle ) {\n\n\t\t\tsphericalDelta.theta -= angle;\n\n\t\t}\n\n\t\tfunction rotateUp( angle ) {\n\n\t\t\tsphericalDelta.phi -= angle;\n\n\t\t}\n\n\t\tvar panLeft = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panLeft( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t\t\tv.multiplyScalar( - distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\tvar panUp = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panUp( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 1 ); // get Y column of objectMatrix\n\t\t\t\tv.multiplyScalar( distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tvar pan = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\treturn function pan ( deltaX, deltaY ) {\n\n\t\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\t\t// perspective\n\t\t\t\t\tvar position = scope.object.position;\n\t\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n\t\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\t\tscope.enablePan = false;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}();\n\n\t\tfunction dollyIn( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale /= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction dollyOut( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale *= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\n\t\tfunction handleMouseDownRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseDownRotate' );\n\n\t\t\trotateStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseDownDolly' );\n\n\t\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownPan( event ) {\n\n\t\t\t//console.log( 'handleMouseDownPan' );\n\n\t\t\tpanStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveRotate' );\n\n\t\t\trotateEnd.set( event.clientX, event.clientY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveDolly' );\n\n\t\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMovePan( event ) {\n\n\t\t\t//console.log( 'handleMouseMovePan' );\n\n\t\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseUp( event ) {\n\n\t\t\t//console.log( 'handleMouseUp' );\n\n\t\t}\n\n\t\tfunction handleMouseWheel( event ) {\n\n\t\t\t//console.log( 'handleMouseWheel' );\n\n\t\t\tif ( event.deltaY < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleKeyDown( event ) {\n\n\t\t\t//console.log( 'handleKeyDown' );\n\n\t\t\tswitch ( event.keyCode ) {\n\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction handleTouchStartRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchStartRotate' );\n\n\t\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchStartDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchStartDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyStart.set( 0, distance );\n\n\t\t}\n\n\t\tfunction handleTouchStartPan( event ) {\n\n\t\t\t//console.log( 'handleTouchStartPan' );\n\n\t\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveRotate' );\n\n\t\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyEnd.set( 0, distance );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMovePan( event ) {\n\n\t\t\t//console.log( 'handleTouchMovePan' );\n\n\t\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchEnd( event ) {\n\n\t\t\t//console.log( 'handleTouchEnd' );\n\n\t\t}\n\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\n\t\tfunction onMouseDown( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( event.button === scope.mouseButtons.ORBIT ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.ZOOM ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseDownDolly( event );\n\n\t\t\t\tstate = STATE.DOLLY;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\tstate = STATE.PAN;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseMoveRotate( event );\n\n\t\t\t} else if ( state === STATE.DOLLY ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseMoveDolly( event );\n\n\t\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseMovePan( event );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseUp( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleMouseUp( event );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onMouseWheel( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\thandleMouseWheel( event );\n\n\t\t\tscope.dispatchEvent( startEvent ); // not sure why these are here...\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t}\n\n\t\tfunction onKeyDown( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\t\thandleKeyDown( event );\n\n\t\t}\n\n\t\tfunction onTouchStart( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\t// two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\t\thandleTouchStartDolly( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleTouchStartPan( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2: // two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveDolly( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchEnd( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleTouchEnd( event );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onContextMenu( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t}\n\n\t\t//\n\n\t\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\t\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.addEventListener( 'wheel', onMouseWheel, false );\n\n\t\tscope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\t\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t\t// force an update at start\n\n\t\tthis.update();\n\n\t};\n\n\tOrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\n\tOrbitControls.prototype.constructor = OrbitControls;\n\n\tObject.defineProperties( OrbitControls.prototype, {\n\n\t\tcenter: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .center has been renamed to .target' );\n\t\t\t\treturn this.target;\n\n\t\t\t}\n\n\t\t},\n\n\t\t// backward compatibility\n\n\t\tnoZoom: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\treturn ! this.enableZoom;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\tthis.enableZoom = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoRotate: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\treturn ! this.enableRotate;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\tthis.enableRotate = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoPan: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\treturn ! this.enablePan;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\tthis.enablePan = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoKeys: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\treturn ! this.enableKeys;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\tthis.enableKeys = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tstaticMoving : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\treturn ! this.enableDamping;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\tthis.enableDamping = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tdynamicDampingFactor : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\treturn this.dampingFactor;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\tthis.dampingFactor = value;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\treturn OrbitControls;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-orbit-controls/index.js\n// module id = 12\n// module chunks = 0","'use strict';\n\nmodule.exports = function (THREE) {\n\n /**\n * @author mrdoob / http://mrdoob.com/\n */\n THREE.OBJLoader = function (manager) {\n\n this.manager = manager !== undefined ? manager : THREE.DefaultLoadingManager;\n };\n\n THREE.OBJLoader.prototype = {\n\n constructor: THREE.OBJLoader,\n\n load: function load(url, onLoad, onProgress, onError) {\n\n var scope = this;\n\n var loader = new THREE.XHRLoader(scope.manager);\n loader.load(url, function (text) {\n\n onLoad(scope.parse(text));\n }, onProgress, onError);\n },\n\n parse: function parse(text) {\n\n console.time('OBJLoader');\n\n var object,\n objects = [];\n var geometry, material;\n\n function parseVertexIndex(value) {\n\n var index = parseInt(value);\n\n return (index >= 0 ? index - 1 : index + vertices.length / 3) * 3;\n }\n\n function parseNormalIndex(value) {\n\n var index = parseInt(value);\n\n return (index >= 0 ? index - 1 : index + normals.length / 3) * 3;\n }\n\n function parseUVIndex(value) {\n\n var index = parseInt(value);\n\n return (index >= 0 ? index - 1 : index + uvs.length / 2) * 2;\n }\n\n function addVertex(a, b, c) {\n\n geometry.vertices.push(vertices[a], vertices[a + 1], vertices[a + 2], vertices[b], vertices[b + 1], vertices[b + 2], vertices[c], vertices[c + 1], vertices[c + 2]);\n }\n\n function addNormal(a, b, c) {\n\n geometry.normals.push(normals[a], normals[a + 1], normals[a + 2], normals[b], normals[b + 1], normals[b + 2], normals[c], normals[c + 1], normals[c + 2]);\n }\n\n function addUV(a, b, c) {\n\n geometry.uvs.push(uvs[a], uvs[a + 1], uvs[b], uvs[b + 1], uvs[c], uvs[c + 1]);\n }\n\n function addFace(a, b, c, d, ua, ub, uc, ud, na, nb, nc, nd) {\n\n var ia = parseVertexIndex(a);\n var ib = parseVertexIndex(b);\n var ic = parseVertexIndex(c);\n var id;\n\n if (d === undefined) {\n\n addVertex(ia, ib, ic);\n } else {\n\n id = parseVertexIndex(d);\n\n addVertex(ia, ib, id);\n addVertex(ib, ic, id);\n }\n\n if (ua !== undefined) {\n\n ia = parseUVIndex(ua);\n ib = parseUVIndex(ub);\n ic = parseUVIndex(uc);\n\n if (d === undefined) {\n\n addUV(ia, ib, ic);\n } else {\n\n id = parseUVIndex(ud);\n\n addUV(ia, ib, id);\n addUV(ib, ic, id);\n }\n }\n\n if (na !== undefined) {\n\n ia = parseNormalIndex(na);\n ib = parseNormalIndex(nb);\n ic = parseNormalIndex(nc);\n\n if (d === undefined) {\n\n addNormal(ia, ib, ic);\n } else {\n\n id = parseNormalIndex(nd);\n\n addNormal(ia, ib, id);\n addNormal(ib, ic, id);\n }\n }\n }\n\n // create mesh if no objects in text\n\n if (/^o /gm.test(text) === false) {\n\n geometry = {\n vertices: [],\n normals: [],\n uvs: []\n };\n\n material = {\n name: ''\n };\n\n object = {\n name: '',\n geometry: geometry,\n material: material\n };\n\n objects.push(object);\n }\n\n var vertices = [];\n var normals = [];\n var uvs = [];\n\n // v float float float\n\n var vertex_pattern = /v( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)/;\n\n // vn float float float\n\n var normal_pattern = /vn( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)/;\n\n // vt float float\n\n var uv_pattern = /vt( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)/;\n\n // f vertex vertex vertex ...\n\n var face_pattern1 = /f( +-?\\d+)( +-?\\d+)( +-?\\d+)( +-?\\d+)?/;\n\n // f vertex/uv vertex/uv vertex/uv ...\n\n var face_pattern2 = /f( +(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+))?/;\n\n // f vertex/uv/normal vertex/uv/normal vertex/uv/normal ...\n\n var face_pattern3 = /f( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))?/;\n\n // f vertex//normal vertex//normal vertex//normal ...\n\n var face_pattern4 = /f( +(-?\\d+)\\/\\/(-?\\d+))( +(-?\\d+)\\/\\/(-?\\d+))( +(-?\\d+)\\/\\/(-?\\d+))( +(-?\\d+)\\/\\/(-?\\d+))?/;\n\n //\n\n var lines = text.split('\\n');\n\n for (var i = 0; i < lines.length; i++) {\n\n var line = lines[i];\n line = line.trim();\n\n var result;\n\n if (line.length === 0 || line.charAt(0) === '#') {\n\n continue;\n } else if ((result = vertex_pattern.exec(line)) !== null) {\n\n // [\"v 1.0 2.0 3.0\", \"1.0\", \"2.0\", \"3.0\"]\n\n vertices.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3]));\n } else if ((result = normal_pattern.exec(line)) !== null) {\n\n // [\"vn 1.0 2.0 3.0\", \"1.0\", \"2.0\", \"3.0\"]\n\n normals.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3]));\n } else if ((result = uv_pattern.exec(line)) !== null) {\n\n // [\"vt 0.1 0.2\", \"0.1\", \"0.2\"]\n\n uvs.push(parseFloat(result[1]), parseFloat(result[2]));\n } else if ((result = face_pattern1.exec(line)) !== null) {\n\n // [\"f 1 2 3\", \"1\", \"2\", \"3\", undefined]\n\n addFace(result[1], result[2], result[3], result[4]);\n } else if ((result = face_pattern2.exec(line)) !== null) {\n\n // [\"f 1/1 2/2 3/3\", \" 1/1\", \"1\", \"1\", \" 2/2\", \"2\", \"2\", \" 3/3\", \"3\", \"3\", undefined, undefined, undefined]\n\n addFace(result[2], result[5], result[8], result[11], result[3], result[6], result[9], result[12]);\n } else if ((result = face_pattern3.exec(line)) !== null) {\n\n // [\"f 1/1/1 2/2/2 3/3/3\", \" 1/1/1\", \"1\", \"1\", \"1\", \" 2/2/2\", \"2\", \"2\", \"2\", \" 3/3/3\", \"3\", \"3\", \"3\", undefined, undefined, undefined, undefined]\n\n addFace(result[2], result[6], result[10], result[14], result[3], result[7], result[11], result[15], result[4], result[8], result[12], result[16]);\n } else if ((result = face_pattern4.exec(line)) !== null) {\n\n // [\"f 1//1 2//2 3//3\", \" 1//1\", \"1\", \"1\", \" 2//2\", \"2\", \"2\", \" 3//3\", \"3\", \"3\", undefined, undefined, undefined]\n\n addFace(result[2], result[5], result[8], result[11], undefined, undefined, undefined, undefined, result[3], result[6], result[9], result[12]);\n } else if (/^o /.test(line)) {\n\n geometry = {\n vertices: [],\n normals: [],\n uvs: []\n };\n\n material = {\n name: ''\n };\n\n object = {\n name: line.substring(2).trim(),\n geometry: geometry,\n material: material\n };\n\n objects.push(object);\n } else if (/^g /.test(line)) {\n\n // group\n\n } else if (/^usemtl /.test(line)) {\n\n // material\n\n material.name = line.substring(7).trim();\n } else if (/^mtllib /.test(line)) {\n\n // mtl file\n\n } else if (/^s /.test(line)) {\n\n // smooth shading\n\n } else {\n\n // console.log( \"THREE.OBJLoader: Unhandled line \" + line );\n\n }\n }\n\n var container = new THREE.Object3D();\n var l;\n\n for (i = 0, l = objects.length; i < l; i++) {\n\n object = objects[i];\n geometry = object.geometry;\n\n var buffergeometry = new THREE.BufferGeometry();\n\n buffergeometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array(geometry.vertices), 3));\n\n if (geometry.normals.length > 0) {\n\n buffergeometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(geometry.normals), 3));\n }\n\n if (geometry.uvs.length > 0) {\n\n buffergeometry.addAttribute('uv', new THREE.BufferAttribute(new Float32Array(geometry.uvs), 2));\n }\n\n material = new THREE.MeshLambertMaterial({\n color: 0xff0000\n });\n material.name = object.material.name;\n\n var mesh = new THREE.Mesh(buffergeometry, material);\n mesh.name = object.name;\n\n container.add(mesh);\n }\n\n console.timeEnd('OBJLoader');\n\n return container;\n }\n\n };\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-obj-loader/dist/index.js\n// module id = 13\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file From 9c1f9255cdd13cf8271bd7330768d8436a687eb2 Mon Sep 17 00:00:00 2001 From: Joseph Gao Date: Wed, 29 Mar 2017 12:22:57 -0400 Subject: [PATCH 07/12] fixed lots of big bugs --- src/crowd.js | 52 +++++++++++++++++++++++++++++++++++++--------------- src/main.js | 8 ++++---- 2 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/crowd.js b/src/crowd.js index 0ae36927..c3efdd76 100644 --- a/src/crowd.js +++ b/src/crowd.js @@ -19,16 +19,33 @@ export default class Crowd { } create_agents() { - var agent_1_pos = new THREE.Vector3(-49, 1, 49); - var agent_2_pos = new THREE.Vector3(49, 1, 49); - var agent_1_goal = new THREE.Vector3(49, 0, -49); - var agent_2_goal = new THREE.Vector3(-49, 0, -49); + // var agent_1_pos = new THREE.Vector3(-49, 1, 49); + // var agent_2_pos = new THREE.Vector3(49, 1, 49); + // var agent_1_goal = new THREE.Vector3(49, 0, -49); + // var agent_2_goal = new THREE.Vector3(-49, 0, -49); var zero = new THREE.Vector3(0, 0, 0); - var agent_1 = new Agent(0, agent_1_pos, zero, agent_1_goal, 2.0, 0x00ff00); - var agent_2 = new Agent(1, agent_2_pos, zero, agent_2_goal, 2.0, 0x0000ff); - this.agents.push(agent_1); - this.agents.push(agent_2); + // var agent_1 = new Agent(0, agent_1_pos, zero, agent_1_goal, 2.0, 0x00ff00); + // var agent_2 = new Agent(1, agent_2_pos, zero, agent_2_goal, 2.0, 0x0000ff); + // this.agents.push(agent_1); + // this.agents.push(agent_2); + + // top row + for (var i = 0; i < 10; i ++) { + var pos = new THREE.Vector3(-49 + 10 * i, 1, 49); + var goal = new THREE.Vector3(-49 + 10 * i, 1, -49); + var color = (Math.random()*0xFFFFFF<<0); + var agent = new Agent(i, pos, zero, goal, 2.0, color); + this.agents.push(agent); + } + // bot row + for (var i = 0; i < 10; i ++) { + var pos = new THREE.Vector3(-49 + 10 * i, 1, -49); + var goal = new THREE.Vector3(-49 + 10 * i, 1, 49); + var color = (Math.random()*0xFFFFFF<<0); + var agent = new Agent(i+10, pos, zero, goal, 2.0, color); + this.agents.push(agent); + } } populate_board() { @@ -51,9 +68,9 @@ export default class Crowd { /* update() - for each agent in the crowd, the velocity is calculated based off of the markers that belongs to each agent. */ - update(time) { + update() { this.update_marker_ownership(); - this.update_agent_velocities(time); + this.update_agent_velocities(); this.renderengine.update_agents(this.agents); this.renderengine.update_markers(this.markers); this.reset_ownership(); @@ -129,10 +146,10 @@ export default class Crowd { return; } - update_agent_velocities(time) { + update_agent_velocities() { for (var i = 0; i < this.agents.length; i++) { var agent = this.agents[i]; - if (agent.position.distanceTo(agent.goal) > 2.0) { + if (agent.position.distanceTo(agent.goal) > 8.0) { var old_gs = this.board.find_absolute_grid(agent.position.x, agent.position.z); // computing total marker influence @@ -153,13 +170,18 @@ export default class Crowd { var weight = (1.0 + m.dot(G) / (m.length() * G.length())) / (1.0 + m.length()); total_velocity.add(m.multiplyScalar(weight / total_weight)); } - if (i === 1) { - } // agent.velocity = total_velocity.normalize(); - agent.position.add(total_velocity.multiplyScalar(time).normalize()); + if (total_velocity.x < 0.1 || total_velocity.z < 0.1) { + total_velocity.add(new THREE.Vector3(G.x, G.y, G.z).multiplyScalar(0.1)); + } + agent.position.add(total_velocity.multiplyScalar(0.2)); + // agent.position.add(G.divideScalar(100.0)); // check if the movement of this agent causes it to leave its current grid var agent_gs = this.board.find_absolute_grid(agent.position.x, agent.position.z); + // if (i === 1) { + // console.log(agent_gs); + // } if (old_gs.x !== agent_gs.x || old_gs.z !== agent_gs.z) { this.board.grid[old_gs.z][old_gs.x].delete(agent); this.board.grid[agent_gs.z][agent_gs.x].add(agent); diff --git a/src/main.js b/src/main.js index 480d9e27..7b3e72c2 100755 --- a/src/main.js +++ b/src/main.js @@ -9,7 +9,7 @@ import RenderEngine from './renderengine.js' import Framework from './framework' var crowd, renderengine; -var time = 0.0; +var time = 0; // called after the scene loads function onLoad(framework) { var scene = framework.scene; @@ -42,9 +42,9 @@ function onLoad(framework) { // called on frame updates function onUpdate(framework) { - time += 1.0; - if (crowd) { - crowd.update(time); + time += 1; + if (crowd && time % 5 === 0) { + crowd.update(); } } From 93b7d0b04e7c1ed3e59353d32f0cc959d1640e21 Mon Sep 17 00:00:00 2001 From: Joseph Gao Date: Wed, 29 Mar 2017 12:23:41 -0400 Subject: [PATCH 08/12] added build --- bundle.js | 59 +++++++++++++++++++++++++++++++++++---------------- bundle.js.map | 2 +- 2 files changed, 42 insertions(+), 19 deletions(-) diff --git a/bundle.js b/bundle.js index 4ef7447a..752ddd1a 100644 --- a/bundle.js +++ b/bundle.js @@ -77,7 +77,7 @@ var crowd, renderengine; - var time = 0.0; + var time = 0; // called after the scene loads function onLoad(framework) { var scene = framework.scene; @@ -110,9 +110,9 @@ // called on frame updates function onUpdate(framework) { - time += 1.0; - if (crowd) { - crowd.update(time); + time += 1; + if (crowd && time % 5 === 0) { + crowd.update(); } } @@ -42606,16 +42606,33 @@ _createClass(Crowd, [{ key: 'create_agents', value: function create_agents() { - var agent_1_pos = new THREE.Vector3(-49, 1, 49); - var agent_2_pos = new THREE.Vector3(49, 1, 49); - var agent_1_goal = new THREE.Vector3(49, 0, -49); - var agent_2_goal = new THREE.Vector3(-49, 0, -49); + // var agent_1_pos = new THREE.Vector3(-49, 1, 49); + // var agent_2_pos = new THREE.Vector3(49, 1, 49); + // var agent_1_goal = new THREE.Vector3(49, 0, -49); + // var agent_2_goal = new THREE.Vector3(-49, 0, -49); var zero = new THREE.Vector3(0, 0, 0); - var agent_1 = new _agent2.default(0, agent_1_pos, zero, agent_1_goal, 2.0, 0x00ff00); - var agent_2 = new _agent2.default(1, agent_2_pos, zero, agent_2_goal, 2.0, 0x0000ff); - this.agents.push(agent_1); - this.agents.push(agent_2); + // var agent_1 = new Agent(0, agent_1_pos, zero, agent_1_goal, 2.0, 0x00ff00); + // var agent_2 = new Agent(1, agent_2_pos, zero, agent_2_goal, 2.0, 0x0000ff); + // this.agents.push(agent_1); + // this.agents.push(agent_2); + + // top row + for (var i = 0; i < 10; i++) { + var pos = new THREE.Vector3(-49 + 10 * i, 1, 49); + var goal = new THREE.Vector3(-49 + 10 * i, 1, -49); + var color = Math.random() * 0xFFFFFF << 0; + var agent = new _agent2.default(i, pos, zero, goal, 2.0, color); + this.agents.push(agent); + } + // bot row + for (var i = 0; i < 10; i++) { + var pos = new THREE.Vector3(-49 + 10 * i, 1, -49); + var goal = new THREE.Vector3(-49 + 10 * i, 1, 49); + var color = Math.random() * 0xFFFFFF << 0; + var agent = new _agent2.default(i + 10, pos, zero, goal, 2.0, color); + this.agents.push(agent); + } } }, { key: 'populate_board', @@ -42643,9 +42660,9 @@ }, { key: 'update', - value: function update(time) { + value: function update() { this.update_marker_ownership(); - this.update_agent_velocities(time); + this.update_agent_velocities(); this.renderengine.update_agents(this.agents); this.renderengine.update_markers(this.markers); this.reset_ownership(); @@ -42725,10 +42742,10 @@ } }, { key: 'update_agent_velocities', - value: function update_agent_velocities(time) { + value: function update_agent_velocities() { for (var i = 0; i < this.agents.length; i++) { var agent = this.agents[i]; - if (agent.position.distanceTo(agent.goal) > 2.0) { + if (agent.position.distanceTo(agent.goal) > 8.0) { var old_gs = this.board.find_absolute_grid(agent.position.x, agent.position.z); // computing total marker influence @@ -42749,12 +42766,18 @@ var weight = (1.0 + m.dot(G) / (m.length() * G.length())) / (1.0 + m.length()); total_velocity.add(m.multiplyScalar(weight / total_weight)); } - if (i === 1) {} // agent.velocity = total_velocity.normalize(); - agent.position.add(total_velocity.multiplyScalar(time).normalize()); + if (total_velocity.x < 0.1 || total_velocity.z < 0.1) { + total_velocity.add(new THREE.Vector3(G.x, G.y, G.z).multiplyScalar(0.1)); + } + agent.position.add(total_velocity.multiplyScalar(0.2)); + // agent.position.add(G.divideScalar(100.0)); // check if the movement of this agent causes it to leave its current grid var agent_gs = this.board.find_absolute_grid(agent.position.x, agent.position.z); + // if (i === 1) { + // console.log(agent_gs); + // } if (old_gs.x !== agent_gs.x || old_gs.z !== agent_gs.z) { this.board.grid[old_gs.z][old_gs.x].delete(agent); this.board.grid[agent_gs.z][agent_gs.x].add(agent); diff --git a/bundle.js.map b/bundle.js.map index 3cac6978..1d9e1397 100644 --- a/bundle.js.map +++ b/bundle.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 2c8bb8e21ffab54f0a10","webpack:///./src/main.js","webpack:///./src/grid.js","webpack:///./~/three/build/three.js","webpack:///./src/agent.js","webpack:///./src/marker.js","webpack:///./src/crowd.js","webpack:///./src/renderengine.js","webpack:///./src/framework.js","webpack:///./~/stats-js/build/stats.min.js","webpack:///./~/dat-gui/index.js","webpack:///./~/dat-gui/vendor/dat.gui.js","webpack:///./~/dat-gui/vendor/dat.color.js","webpack:///./~/three-orbit-controls/index.js","webpack:///./~/three-obj-loader/dist/index.js"],"names":["THREE","require","OBJLoader","crowd","renderengine","time","onLoad","framework","scene","camera","renderer","gui","stats","directionalLight","DirectionalLight","color","setHSL","position","set","multiplyScalar","add","ambientLight","AmbientLight","lookAt","Vector3","onChange","newVal","updateProjectionMatrix","onUpdate","update","init","Grid","cell_size","plane_size","grid_cell_size","grid_len","grid","push","Array","i","j","Set","ws_x","ws_z","tgs","ws_to_tgs","gs_z","Math","round","z","gs_x","x","floor","tgs_x","tgs_z","Agent","id","pos","vel","goal","size","col","velocity","markers","mesh","Marker","owned","agent","Crowd","agents","board","create_agents","populate_board","create_markers","render_plane","render_agents","render_markers","agent_1_pos","agent_2_pos","agent_1_goal","agent_2_goal","zero","agent_1","agent_2","length","gs","find_absolute_grid","random","marker","update_marker_ownership","update_agent_velocities","update_agents","update_markers","reset_ownership","ngs","find_nearest_grid","top_left","top","left","eligible_agents","forEach","assign_marker_to_agent","closest","dist","distanceTo","test_dist","old_gs","G","subVectors","total_weight","total_velocity","m","y","weight","dot","normalize","agent_gs","delete","RenderEngine","plane_geo","PlaneGeometry","plane_mesh","Mesh","MeshBasicMaterial","side","DoubleSide","rotation","PI","cylinder_geo","CylinderGeometry","cube_geo","BoxGeometry","geometry","verticesNeedUpdate","material","setHex","OrbitControls","callback","setMode","domElement","style","document","body","appendChild","GUI","window","addEventListener","Scene","PerspectiveCamera","innerWidth","innerHeight","WebGLRenderer","antialias","setPixelRatio","devicePixelRatio","setSize","setClearColor","controls","enableDamping","enableZoom","target","rotateSpeed","zoomSpeed","panSpeed","aspect","tick","begin","render","end","requestAnimationFrame"],"mappings":"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AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,qBAAoB,QAAQ;;AAE5B;;AAEA;;AAEA,OAAM;;AAEN;;AAEA,OAAM;;AAEN;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4BAA2B;AAC3B,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AA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AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA,oEAAmE;;AAEnE;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;A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;;AAE7zB,wCAAuC,sBAAsB,8KAA8K,wKAAwK,mCAAmC,gJAAgJ;;AAEtkB,2CAA0C,yKAAyK,+EAA+E,GAAG;;AAErS,oEAAmE,wHAAwH;;AAE3L;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;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EA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA,+CAA8C;;AAE9C;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AA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AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;A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EA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AA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B;AACpB;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,8BAA8B;;AAEjD;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA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;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,oEAAmE;;AAEnE;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA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A;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,eAAc,sBAAsB;;AAEpC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,gBAAe,qBAAqB;;AAEpC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,sBAAsB;;AAEpC,gBAAe,qBAAqB;;AAEpC;AACA;AACA;AACA;AACA;;AAEA;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,eAAc,qBAAqB;;AAEnC,gBAAe,sBAAsB;;AAErC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAE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AAoC;;AAEpC,MAAK;;AAEL;AACA,yCAAwC;AACxC,qCAAoC;AACpC,qCAAoC;;AAEpC;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,mCAAkC,eAAe;;AAEjD;;AAEA;AACA;;AAEA,yBAAwB;;AAExB;AACA;;AAEA;;AAEA;;AAEA,mBAAkB,eAAe;;AAEjC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA,0CAAyC,OAAO;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,2BAA2B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,2BAA0B;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;;AAErC;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA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ACA;AACA,0FAAyF,4CAA4C;AACrI;;AAEA;AACA;AACA,8FAA6F,4CAA4C;AACzI;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AA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MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,QAAQ;AAC7B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,qBAAoB;AACpB;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,gBAAgB;AAC7B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,gCAA+B;AAC/B,QAAO;AACP;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,SAAQ,OAAO;AACf;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;A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ACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA,cAAa,QAAQ;AACrB,cAAa,YAAY;AACzB,cAAa,QAAQ;AACrB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;AACA;;AAEA,MAAK;;AAEL,sBAAqB;;AAErB;;AAEA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;;AAGA,QAAO;;;AAGP;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;AACA;;AAEA;;AAEA,4CAA2C,mBAAmB;AAC9D,4DAA2D,kBAAkB,EAAE;AAC/E,sDAAqD,mBAAmB;AACxE,uDAAsD,mBAAmB;AACzE;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,gCAAgC;AACrD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,sBAAqB,YAAY;AACjC,qBAAoB,MAAM;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAgC;;AAEhC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,yCAAwC;;AAExC;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAa;AACb;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,UAAU;AAC7B,qBAAoB,MAAM;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA,sBAAqB,YAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,YAAW;;AAEX;AACA;AACA,YAAW;;AAEX;AACA;AACA;;;AAGA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA,YAAW,wEAAwE;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;;A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AK;;;AAGL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,8BAA6B;AAC7B;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;AACA;AACA,UAAS;;AAET,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,2BAA0B;AAC1B;AACA,cAAa;;AAEb;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,yGAAwG;AACxG,MAAK;AACL;;AAEA;AACA;AACA,8JAA6J;AAC7J,2JAA0J;AAC1J,sJAAqJ;AACrJ,uJAAsJ;AACtJ,mJAAkJ;AAClJ;;;AAGA;;AAEA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;AAGL;AACA;;AAEA;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;;AAEA;;;;AAIA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA,mB;;;;;;AC3kHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,W;;AAEA,cAAa;;AAEb;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA,6CAA4C,QAAQ;AACpD;AACA;AACA;AACA;AACA,MAAK;;AAEL;;;AAGA,kD;;AAEA;;AAEA,QAAO,0CAA0C;;AAEjD,0CAAyC,SAAS;AAClD;AACA;;AAEA,QAAO;;AAEP;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAC;;AAED;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA,oDAAmD,EAAE;AACrD;;AAEA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA,mB;;;;;;AClvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,0BAAyB;AACzB,gCAA+B;;AAE/B;AACA;AACA,qCAAoC;AACpC,mCAAkC;;AAElC;AACA;AACA;AACA;;AAEA,uDAAsD;AACtD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,0BAAyB;;AAEzB;AACA;AACA;AACA,8BAA6B;;AAE7B;AACA;;AAEA;AACA,gBAAe;;AAEf;AACA,wBAAuB;;AAEvB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;A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","file":"./bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 2c8bb8e21ffab54f0a10","\nconst THREE = require('three'); // older modules are imported like this. You shouldn't have to worry about this much\nconst OBJLoader = require('three-obj-loader')(THREE)\nimport Grid from './grid.js'\nimport Agent from './agent.js'\nimport Marker from './marker.js'\nimport Crowd from './crowd.js'\nimport RenderEngine from './renderengine.js'\nimport Framework from './framework'\n\nvar crowd, renderengine;\nvar time = 0.0;\n// called after the scene loads\nfunction onLoad(framework) {\n var scene = framework.scene;\n var camera = framework.camera;\n var renderer = framework.renderer;\n var gui = framework.gui;\n var stats = framework.stats;\n\n // initialize a simple box and material\n var directionalLight = new THREE.DirectionalLight( 0xffffff, 1.25 );\n directionalLight.color.setHSL(0.1, 1, 0.95);\n directionalLight.position.set(1, 3, 2);\n directionalLight.position.multiplyScalar(10);\n scene.add(directionalLight);\n\n var ambientLight = new THREE.AmbientLight(0x404040);\n scene.add(ambientLight);\n\n // set camera position\n camera.position.set(50, 50, 100);\n camera.lookAt(new THREE.Vector3(0,0,0));\n\n gui.add(camera, 'fov', 0, 180).onChange(function(newVal) {\n camera.updateProjectionMatrix();\n });\n\n renderengine = new RenderEngine(scene);\n crowd = new Crowd(renderengine);\n}\n\n// called on frame updates\nfunction onUpdate(framework) {\n time += 1.0;\n if (crowd) {\n crowd.update(time);\n }\n}\n\n// when the scene is done initializing, it will call onLoad, then on frame updates, call onUpdate\nFramework.init(onLoad, onUpdate);\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.js","const THREE = require('three');\n\n// GRID IS ASSUMED TO BE A SQUARE\nexport default class Grid {\n\tconstructor(cell_size, plane_size) {\n\t\tthis.plane_size = plane_size;\n\t\tthis.grid_cell_size = cell_size;\n\t\tthis.grid_len = plane_size / cell_size;\n\t\tthis.grid = [];\n\t\twhile(this.grid.push(new Array(this.grid_len)) < this.grid_len);\n\t\tfor (var i = 0; i < this.grid_len; i++) {\n\t\t\tfor (var j = 0; j < this.grid_len; j++) {\n\t\t\t\tthis.grid[i][j] = new Set();\n\t\t\t}\n\t\t}\n\t}\n\n\t// find_nearest_grid will be used by marker to ultimately find nearest 4 grid\n\tfind_nearest_grid(ws_x, ws_z) {\n\t\tvar tgs = this.ws_to_tgs(ws_x, ws_z);\n\t\tvar gs_z = Math.round(tgs.z / this.grid_cell_size);\n\t\tvar gs_x = Math.round(tgs.x / this.grid_cell_size);\n\t\tif (gs_z === 10.0) {\n\t\t\tgs_z = 9.0;\n\t\t}\n\t\tif (gs_x === 10.0) {\n\t\t\tgs_x = 9.0;\n\t\t}\n\t\treturn {z: gs_z, x: gs_x};\n\t}\n\n\t// find_absolute_grid will be used by agent to demarcate it's exact grid location\n\tfind_absolute_grid(ws_x, ws_z) {\n\t\tvar tgs = this.ws_to_tgs(ws_x, ws_z);\n\t\t// console.log('tgs:', tgs);\n\t\tvar gs_z = Math.floor(tgs.z / this.grid_cell_size);\n\t\tvar gs_x = Math.floor(tgs.x / this.grid_cell_size);\n\t\treturn {z: gs_z, x: gs_x};\n\t}\n\n\t// convert from world space to uniform grid space\n\tws_to_tgs(ws_x, ws_z) {\n\t\t// perform translation\n\t\tvar tgs_x = ws_x + 50.0;\n\t\tvar tgs_z = ws_z + 50.0;\n\t\treturn {x: tgs_x, z: tgs_z};\n\t}\n}\n\n\n// WEBPACK FOOTER //\n// ./src/grid.js","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.THREE = global.THREE || {})));\n}(this, (function (exports) { 'use strict';\n\n\t// Polyfills\n\n\tif ( Number.EPSILON === undefined ) {\n\n\t\tNumber.EPSILON = Math.pow( 2, - 52 );\n\n\t}\n\n\t//\n\n\tif ( Math.sign === undefined ) {\n\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign\n\n\t\tMath.sign = function ( x ) {\n\n\t\t\treturn ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;\n\n\t\t};\n\n\t}\n\n\tif ( Function.prototype.name === undefined ) {\n\n\t\t// Missing in IE9-11.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\n\n\t\tObject.defineProperty( Function.prototype, 'name', {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.toString().match( /^\\s*function\\s*(\\S*)\\s*\\(/ )[ 1 ];\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tif ( Object.assign === undefined ) {\n\n\t\t// Missing in IE.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n\n\t\t( function () {\n\n\t\t\tObject.assign = function ( target ) {\n\n\t\t\t\t'use strict';\n\n\t\t\t\tif ( target === undefined || target === null ) {\n\n\t\t\t\t\tthrow new TypeError( 'Cannot convert undefined or null to object' );\n\n\t\t\t\t}\n\n\t\t\t\tvar output = Object( target );\n\n\t\t\t\tfor ( var index = 1; index < arguments.length; index ++ ) {\n\n\t\t\t\t\tvar source = arguments[ index ];\n\n\t\t\t\t\tif ( source !== undefined && source !== null ) {\n\n\t\t\t\t\t\tfor ( var nextKey in source ) {\n\n\t\t\t\t\t\t\tif ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {\n\n\t\t\t\t\t\t\t\toutput[ nextKey ] = source[ nextKey ];\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\treturn output;\n\n\t\t\t};\n\n\t\t} )();\n\n\t}\n\n\t/**\n\t * https://github.com/mrdoob/eventdispatcher.js/\n\t */\n\n\tfunction EventDispatcher() {}\n\n\tObject.assign( EventDispatcher.prototype, {\n\n\t\taddEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\t\tlisteners[ type ] = [];\n\n\t\t\t}\n\n\t\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\t\tlisteners[ type ].push( listener );\n\n\t\t\t}\n\n\t\t},\n\n\t\thasEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return false;\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\tif ( listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tremoveEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tvar index = listenerArray.indexOf( listener );\n\n\t\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tdispatchEvent: function ( event ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ event.type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tevent.target = this;\n\n\t\t\t\tvar array = [], i = 0;\n\t\t\t\tvar length = listenerArray.length;\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ] = listenerArray[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\tvar REVISION = '82';\n\tvar MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };\n\tvar CullFaceNone = 0;\n\tvar CullFaceBack = 1;\n\tvar CullFaceFront = 2;\n\tvar CullFaceFrontBack = 3;\n\tvar FrontFaceDirectionCW = 0;\n\tvar FrontFaceDirectionCCW = 1;\n\tvar BasicShadowMap = 0;\n\tvar PCFShadowMap = 1;\n\tvar PCFSoftShadowMap = 2;\n\tvar FrontSide = 0;\n\tvar BackSide = 1;\n\tvar DoubleSide = 2;\n\tvar FlatShading = 1;\n\tvar SmoothShading = 2;\n\tvar NoColors = 0;\n\tvar FaceColors = 1;\n\tvar VertexColors = 2;\n\tvar NoBlending = 0;\n\tvar NormalBlending = 1;\n\tvar AdditiveBlending = 2;\n\tvar SubtractiveBlending = 3;\n\tvar MultiplyBlending = 4;\n\tvar CustomBlending = 5;\n\tvar BlendingMode = {\n\t\tNoBlending: NoBlending,\n\t\tNormalBlending: NormalBlending,\n\t\tAdditiveBlending: AdditiveBlending,\n\t\tSubtractiveBlending: SubtractiveBlending,\n\t\tMultiplyBlending: MultiplyBlending,\n\t\tCustomBlending: CustomBlending\n\t};\n\tvar AddEquation = 100;\n\tvar SubtractEquation = 101;\n\tvar ReverseSubtractEquation = 102;\n\tvar MinEquation = 103;\n\tvar MaxEquation = 104;\n\tvar ZeroFactor = 200;\n\tvar OneFactor = 201;\n\tvar SrcColorFactor = 202;\n\tvar OneMinusSrcColorFactor = 203;\n\tvar SrcAlphaFactor = 204;\n\tvar OneMinusSrcAlphaFactor = 205;\n\tvar DstAlphaFactor = 206;\n\tvar OneMinusDstAlphaFactor = 207;\n\tvar DstColorFactor = 208;\n\tvar OneMinusDstColorFactor = 209;\n\tvar SrcAlphaSaturateFactor = 210;\n\tvar NeverDepth = 0;\n\tvar AlwaysDepth = 1;\n\tvar LessDepth = 2;\n\tvar LessEqualDepth = 3;\n\tvar EqualDepth = 4;\n\tvar GreaterEqualDepth = 5;\n\tvar GreaterDepth = 6;\n\tvar NotEqualDepth = 7;\n\tvar MultiplyOperation = 0;\n\tvar MixOperation = 1;\n\tvar AddOperation = 2;\n\tvar NoToneMapping = 0;\n\tvar LinearToneMapping = 1;\n\tvar ReinhardToneMapping = 2;\n\tvar Uncharted2ToneMapping = 3;\n\tvar CineonToneMapping = 4;\n\tvar UVMapping = 300;\n\tvar CubeReflectionMapping = 301;\n\tvar CubeRefractionMapping = 302;\n\tvar EquirectangularReflectionMapping = 303;\n\tvar EquirectangularRefractionMapping = 304;\n\tvar SphericalReflectionMapping = 305;\n\tvar CubeUVReflectionMapping = 306;\n\tvar CubeUVRefractionMapping = 307;\n\tvar TextureMapping = {\n\t\tUVMapping: UVMapping,\n\t\tCubeReflectionMapping: CubeReflectionMapping,\n\t\tCubeRefractionMapping: CubeRefractionMapping,\n\t\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\t\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\t\tSphericalReflectionMapping: SphericalReflectionMapping,\n\t\tCubeUVReflectionMapping: CubeUVReflectionMapping,\n\t\tCubeUVRefractionMapping: CubeUVRefractionMapping\n\t};\n\tvar RepeatWrapping = 1000;\n\tvar ClampToEdgeWrapping = 1001;\n\tvar MirroredRepeatWrapping = 1002;\n\tvar TextureWrapping = {\n\t\tRepeatWrapping: RepeatWrapping,\n\t\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\t\tMirroredRepeatWrapping: MirroredRepeatWrapping\n\t};\n\tvar NearestFilter = 1003;\n\tvar NearestMipMapNearestFilter = 1004;\n\tvar NearestMipMapLinearFilter = 1005;\n\tvar LinearFilter = 1006;\n\tvar LinearMipMapNearestFilter = 1007;\n\tvar LinearMipMapLinearFilter = 1008;\n\tvar TextureFilter = {\n\t\tNearestFilter: NearestFilter,\n\t\tNearestMipMapNearestFilter: NearestMipMapNearestFilter,\n\t\tNearestMipMapLinearFilter: NearestMipMapLinearFilter,\n\t\tLinearFilter: LinearFilter,\n\t\tLinearMipMapNearestFilter: LinearMipMapNearestFilter,\n\t\tLinearMipMapLinearFilter: LinearMipMapLinearFilter\n\t};\n\tvar UnsignedByteType = 1009;\n\tvar ByteType = 1010;\n\tvar ShortType = 1011;\n\tvar UnsignedShortType = 1012;\n\tvar IntType = 1013;\n\tvar UnsignedIntType = 1014;\n\tvar FloatType = 1015;\n\tvar HalfFloatType = 1016;\n\tvar UnsignedShort4444Type = 1017;\n\tvar UnsignedShort5551Type = 1018;\n\tvar UnsignedShort565Type = 1019;\n\tvar UnsignedInt248Type = 1020;\n\tvar AlphaFormat = 1021;\n\tvar RGBFormat = 1022;\n\tvar RGBAFormat = 1023;\n\tvar LuminanceFormat = 1024;\n\tvar LuminanceAlphaFormat = 1025;\n\tvar RGBEFormat = RGBAFormat;\n\tvar DepthFormat = 1026;\n\tvar DepthStencilFormat = 1027;\n\tvar RGB_S3TC_DXT1_Format = 2001;\n\tvar RGBA_S3TC_DXT1_Format = 2002;\n\tvar RGBA_S3TC_DXT3_Format = 2003;\n\tvar RGBA_S3TC_DXT5_Format = 2004;\n\tvar RGB_PVRTC_4BPPV1_Format = 2100;\n\tvar RGB_PVRTC_2BPPV1_Format = 2101;\n\tvar RGBA_PVRTC_4BPPV1_Format = 2102;\n\tvar RGBA_PVRTC_2BPPV1_Format = 2103;\n\tvar RGB_ETC1_Format = 2151;\n\tvar LoopOnce = 2200;\n\tvar LoopRepeat = 2201;\n\tvar LoopPingPong = 2202;\n\tvar InterpolateDiscrete = 2300;\n\tvar InterpolateLinear = 2301;\n\tvar InterpolateSmooth = 2302;\n\tvar ZeroCurvatureEnding = 2400;\n\tvar ZeroSlopeEnding = 2401;\n\tvar WrapAroundEnding = 2402;\n\tvar TrianglesDrawMode = 0;\n\tvar TriangleStripDrawMode = 1;\n\tvar TriangleFanDrawMode = 2;\n\tvar LinearEncoding = 3000;\n\tvar sRGBEncoding = 3001;\n\tvar GammaEncoding = 3007;\n\tvar RGBEEncoding = 3002;\n\tvar LogLuvEncoding = 3003;\n\tvar RGBM7Encoding = 3004;\n\tvar RGBM16Encoding = 3005;\n\tvar RGBDEncoding = 3006;\n\tvar BasicDepthPacking = 3200;\n\tvar RGBADepthPacking = 3201;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar _Math = {\n\n\t\tDEG2RAD: Math.PI / 180,\n\t\tRAD2DEG: 180 / Math.PI,\n\n\t\tgenerateUUID: function () {\n\n\t\t\t// http://www.broofa.com/Tools/Math.uuid.htm\n\n\t\t\tvar chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' );\n\t\t\tvar uuid = new Array( 36 );\n\t\t\tvar rnd = 0, r;\n\n\t\t\treturn function generateUUID() {\n\n\t\t\t\tfor ( var i = 0; i < 36; i ++ ) {\n\n\t\t\t\t\tif ( i === 8 || i === 13 || i === 18 || i === 23 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '-';\n\n\t\t\t\t\t} else if ( i === 14 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '4';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0;\n\t\t\t\t\t\tr = rnd & 0xf;\n\t\t\t\t\t\trnd = rnd >> 4;\n\t\t\t\t\t\tuuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn uuid.join( '' );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclamp: function ( value, min, max ) {\n\n\t\t\treturn Math.max( min, Math.min( max, value ) );\n\n\t\t},\n\n\t\t// compute euclidian modulo of m % n\n\t\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\t\teuclideanModulo: function ( n, m ) {\n\n\t\t\treturn ( ( n % m ) + m ) % m;\n\n\t\t},\n\n\t\t// Linear mapping from range to range \n\n\t\tmapLinear: function ( x, a1, a2, b1, b2 ) {\n\n\t\t\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n\t\t},\n\n\t\t// https://en.wikipedia.org/wiki/Linear_interpolation\n\n\t\tlerp: function ( x, y, t ) {\n\n\t\t\treturn ( 1 - t ) * x + t * y;\n\n\t\t},\n\n\t\t// http://en.wikipedia.org/wiki/Smoothstep\n\n\t\tsmoothstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * ( 3 - 2 * x );\n\n\t\t},\n\n\t\tsmootherstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n\t\t},\n\n\t\trandom16: function () {\n\n\t\t\tconsole.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' );\n\t\t\treturn Math.random();\n\n\t\t},\n\n\t\t// Random integer from interval\n\n\t\trandInt: function ( low, high ) {\n\n\t\t\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n\t\t},\n\n\t\t// Random float from interval\n\n\t\trandFloat: function ( low, high ) {\n\n\t\t\treturn low + Math.random() * ( high - low );\n\n\t\t},\n\n\t\t// Random float from <-range/2, range/2> interval\n\n\t\trandFloatSpread: function ( range ) {\n\n\t\t\treturn range * ( 0.5 - Math.random() );\n\n\t\t},\n\n\t\tdegToRad: function ( degrees ) {\n\n\t\t\treturn degrees * _Math.DEG2RAD;\n\n\t\t},\n\n\t\tradToDeg: function ( radians ) {\n\n\t\t\treturn radians * _Math.RAD2DEG;\n\n\t\t},\n\n\t\tisPowerOfTwo: function ( value ) {\n\n\t\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t\t},\n\n\t\tnearestPowerOfTwo: function ( value ) {\n\n\t\t\treturn Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) );\n\n\t\t},\n\n\t\tnextPowerOfTwo: function ( value ) {\n\n\t\t\tvalue --;\n\t\t\tvalue |= value >> 1;\n\t\t\tvalue |= value >> 2;\n\t\t\tvalue |= value >> 4;\n\t\t\tvalue |= value >> 8;\n\t\t\tvalue |= value >> 16;\n\t\t\tvalue ++;\n\n\t\t\treturn value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author egraether / http://egraether.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tfunction Vector2( x, y ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\n\t}\n\n\tVector2.prototype = {\n\n\t\tconstructor: Vector2,\n\n\t\tisVector2: true,\n\n\t\tget width() {\n\n\t\t\treturn this.x;\n\n\t\t},\n\n\t\tset width( value ) {\n\n\t\t\tthis.x = value;\n\n\t\t},\n\n\t\tget height() {\n\n\t\t\treturn this.y;\n\n\t\t},\n\n\t\tset height( value ) {\n\n\t\t\tthis.y = value;\n\n\t\t},\n\n\t\t//\n\n\t\tset: function ( x, y ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\t\t\t\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v ) {\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector2();\n\t\t\t\t\tmax = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t\t},\n\n\t\tlengthManhattan: function() {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tangle: function () {\n\n\t\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\t\tvar angle = Math.atan2( this.y, this.x );\n\n\t\t\tif ( angle < 0 ) angle += 2 * Math.PI;\n\n\t\t\treturn angle;\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y;\n\t\t\treturn dx * dx + dy * dy;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tindex = index * attribute.itemSize + offset;\n\n\t\t\tthis.x = attribute.array[ index ];\n\t\t\tthis.y = attribute.array[ index + 1 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateAround: function ( center, angle ) {\n\n\t\t\tvar c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\t\tvar x = this.x - center.x;\n\t\t\tvar y = this.y - center.y;\n\n\t\t\tthis.x = x * c - y * s + center.x;\n\t\t\tthis.y = x * s + y * c + center.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t */\n\n\tfunction Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\tObject.defineProperty( this, 'id', { value: TextureIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.sourceFile = '';\n\n\t\tthis.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;\n\n\t\tthis.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;\n\t\tthis.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter;\n\n\t\tthis.anisotropy = anisotropy !== undefined ? anisotropy : 1;\n\n\t\tthis.format = format !== undefined ? format : RGBAFormat;\n\t\tthis.type = type !== undefined ? type : UnsignedByteType;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\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\n\t\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t\t//\n\t\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\t\tthis.encoding = encoding !== undefined ? encoding : LinearEncoding;\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t}\n\n\tTexture.DEFAULT_IMAGE = undefined;\n\tTexture.DEFAULT_MAPPING = UVMapping;\n\n\tTexture.prototype = {\n\n\t\tconstructor: Texture,\n\n\t\tisTexture: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.image = source.image;\n\t\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\t\tthis.mapping = source.mapping;\n\n\t\t\tthis.wrapS = source.wrapS;\n\t\t\tthis.wrapT = source.wrapT;\n\n\t\t\tthis.magFilter = source.magFilter;\n\t\t\tthis.minFilter = source.minFilter;\n\n\t\t\tthis.anisotropy = source.anisotropy;\n\n\t\t\tthis.format = source.format;\n\t\t\tthis.type = source.type;\n\n\t\t\tthis.offset.copy( source.offset );\n\t\t\tthis.repeat.copy( source.repeat );\n\n\t\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\t\tthis.flipY = source.flipY;\n\t\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\t\tthis.encoding = source.encoding;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tif ( meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t\t}\n\n\t\t\tfunction getDataURL( image ) {\n\n\t\t\t\tvar canvas;\n\n\t\t\t\tif ( image.toDataURL !== undefined ) {\n\n\t\t\t\t\tcanvas = image;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcanvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\t\tcanvas.width = image.width;\n\t\t\t\t\tcanvas.height = image.height;\n\n\t\t\t\t\tcanvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Texture',\n\t\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t\t},\n\n\t\t\t\tuuid: this.uuid,\n\t\t\t\tname: this.name,\n\n\t\t\t\tmapping: this.mapping,\n\n\t\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\t\tminFilter: this.minFilter,\n\t\t\t\tmagFilter: this.magFilter,\n\t\t\t\tanisotropy: this.anisotropy,\n\n\t\t\t\tflipY: this.flipY\n\t\t\t};\n\n\t\t\tif ( this.image !== undefined ) {\n\n\t\t\t\t// TODO: Move to THREE.Image\n\n\t\t\t\tvar image = this.image;\n\n\t\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\t\timage.uuid = _Math.generateUUID(); // UGH\n\n\t\t\t\t}\n\n\t\t\t\tif ( meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\t\turl: getDataURL( image )\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\toutput.image = image.uuid;\n\n\t\t\t}\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t},\n\n\t\ttransformUv: function ( uv ) {\n\n\t\t\tif ( this.mapping !== UVMapping ) return;\n\n\t\t\tuv.multiply( this.repeat );\n\t\t\tuv.add( this.offset );\n\n\t\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.flipY ) {\n\n\t\t\t\tuv.y = 1 - uv.y;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tObject.assign( Texture.prototype, EventDispatcher.prototype );\n\n\tvar count = 0;\n\tfunction TextureIdCount() { return count++; }\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector4( x, y, z, w ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\t\tthis.w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tVector4.prototype = {\n\n\t\tconstructor: Vector4,\n\n\t\tisVector4: true,\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\t\t\tthis.w = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( w ) {\n\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tcase 3: this.w = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\t\t\t\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tcase 3: return this.w;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\t\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\t\t\tthis.w += v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\t\t\tthis.w += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\t\t\tthis.w = a.w + b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\t\t\tthis.w += v.w * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\t\t\tthis.w -= v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\t\t\tthis.w -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\t\t\tthis.w = a.w - b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\t\t\t\tthis.w *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\t\t\t\tthis.w = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z, w = this.w;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tsetAxisAngleFromQuaternion: function ( q ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t\t// q is assumed to be normalized\n\n\t\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\t\tvar s = Math.sqrt( 1 - q.w * q.w );\n\n\t\t\tif ( s < 0.0001 ) {\n\n\t\t\t\t this.x = 1;\n\t\t\t\t this.y = 0;\n\t\t\t\t this.z = 0;\n\n\t\t\t} else {\n\n\t\t\t\t this.x = q.x / s;\n\t\t\t\t this.y = q.y / s;\n\t\t\t\t this.z = q.z / s;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetAxisAngleFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar angle, x, y, z,\t\t// variables for result\n\t\t\t\tepsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\t\tte = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t\t// singularity found\n\t\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t\t}\n\n\t\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\t\tangle = Math.PI;\n\n\t\t\t\tvar xx = ( m11 + 1 ) / 2;\n\t\t\t\tvar yy = ( m22 + 1 ) / 2;\n\t\t\t\tvar zz = ( m33 + 1 ) / 2;\n\t\t\t\tvar xy = ( m12 + m21 ) / 4;\n\t\t\t\tvar xz = ( m13 + m31 ) / 4;\n\t\t\t\tvar yz = ( m23 + m32 ) / 4;\n\n\t\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\t\tx = 0;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\t\ty = xy / x;\n\t\t\t\t\t\tz = xz / x;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\t\tx = xy / y;\n\t\t\t\t\t\tz = yz / y;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\t\tx = xz / z;\n\t\t\t\t\t\ty = yz / z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.set( x, y, z, angle );\n\n\t\t\t\treturn this; // return 180 deg rotation\n\n\t\t\t}\n\n\t\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\t\tvar 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\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t\t// caught by singularity test above, but I've left it in just in case\n\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\t\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\t\t\tthis.w = Math.min( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\t\t\tthis.w = Math.max( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector4();\n\t\t\t\t\tmax = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\t\t\tthis.w = Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\t\t\tthis.w = Math.ceil( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\t\t\tthis.w = Math.round( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\t\t\tthis.w = - this.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\t\t\tthis.w = array[ offset + 3 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\t\t\tarray[ offset + 3 ] = this.w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tindex = index * attribute.itemSize + offset;\n\n\t\t\tthis.x = attribute.array[ index ];\n\t\t\tthis.y = attribute.array[ index + 1 ];\n\t\t\tthis.z = attribute.array[ index + 2 ];\n\t\t\tthis.w = attribute.array[ index + 3 ];\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author szimek / https://github.com/szimek/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Marius Kintel / https://github.com/kintel\n\t */\n\n\t/*\n\t In options, we can specify:\n\t * Texture parameters for an auto-generated target texture\n\t * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n\t*/\n\tfunction WebGLRenderTarget( width, height, options ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\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\toptions = options || {};\n\n\t\tif ( options.minFilter === undefined ) options.minFilter = LinearFilter;\n\n\t\tthis.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\t\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\t\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;\n\t\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n\t}\n\n\tObject.assign( WebGLRenderTarget.prototype, EventDispatcher.prototype, {\n\n\t\tisWebGLRenderTarget: true,\n\n\t\tsetSize: function ( width, height ) {\n\n\t\t\tif ( this.width !== width || this.height !== height ) {\n\n\t\t\t\tthis.width = width;\n\t\t\t\tthis.height = height;\n\n\t\t\t\tthis.dispose();\n\n\t\t\t}\n\n\t\t\tthis.viewport.set( 0, 0, width, height );\n\t\t\tthis.scissor.set( 0, 0, width, height );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\tthis.viewport.copy( source.viewport );\n\n\t\t\tthis.texture = source.texture.clone();\n\n\t\t\tthis.depthBuffer = source.depthBuffer;\n\t\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\t\tthis.depthTexture = source.depthTexture;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com\n\t */\n\n\tfunction WebGLRenderTargetCube( width, height, options ) {\n\n\t\tWebGLRenderTarget.call( this, width, height, options );\n\n\t\tthis.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5\n\t\tthis.activeMipMapLevel = 0;\n\n\t}\n\n\tWebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype );\n\tWebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube;\n\n\tWebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true;\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Quaternion( x, y, z, w ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tQuaternion.prototype = {\n\n\t\tconstructor: Quaternion,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget w () {\n\n\t\t\treturn this._w;\n\n\t\t},\n\n\t\tset w ( value ) {\n\n\t\t\tthis._w = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._w = w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t\t},\n\n\t\tcopy: function ( quaternion ) {\n\n\t\t\tthis._x = quaternion.x;\n\t\t\tthis._y = quaternion.y;\n\t\t\tthis._z = quaternion.z;\n\t\t\tthis._w = quaternion.w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromEuler: function ( euler, update ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t\t//\tcontent/SpinCalc.m\n\n\t\t\tvar c1 = Math.cos( euler._x / 2 );\n\t\t\tvar c2 = Math.cos( euler._y / 2 );\n\t\t\tvar c3 = Math.cos( euler._z / 2 );\n\t\t\tvar s1 = Math.sin( euler._x / 2 );\n\t\t\tvar s2 = Math.sin( euler._y / 2 );\n\t\t\tvar s3 = Math.sin( euler._z / 2 );\n\n\t\t\tvar order = euler.order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\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\n\t\t\t} else if ( order === 'YXZ' ) {\n\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\n\t\t\t} else if ( order === 'ZXY' ) {\n\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\n\t\t\t} else if ( order === 'ZYX' ) {\n\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\n\t\t\t} else if ( order === 'YZX' ) {\n\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\n\t\t\t} else if ( order === 'XZY' ) {\n\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\n\t\t\t}\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tvar halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\t\tthis._x = axis.x * s;\n\t\t\tthis._y = axis.y * s;\n\t\t\tthis._z = axis.z * s;\n\t\t\tthis._w = Math.cos( halfAngle );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\t\ttrace = m11 + m22 + m33,\n\t\t\t\ts;\n\n\t\t\tif ( trace > 0 ) {\n\n\t\t\t\ts = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\t\tthis._w = 0.25 / s;\n\t\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\t\tthis._x = 0.25 * s;\n\t\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t\t} else if ( m22 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\t\tthis._y = 0.25 * s;\n\t\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t\t} else {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\t\tthis._z = 0.25 * s;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromUnitVectors: function () {\n\n\t\t\t// http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n\n\t\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\t\tvar v1, r;\n\n\t\t\tvar EPS = 0.000001;\n\n\t\t\treturn function setFromUnitVectors( vFrom, vTo ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tr = vFrom.dot( vTo ) + 1;\n\n\t\t\t\tif ( r < EPS ) {\n\n\t\t\t\t\tr = 0;\n\n\t\t\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\t\t\tv1.set( - vFrom.y, vFrom.x, 0 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv1.set( 0, - vFrom.z, vFrom.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv1.crossVectors( vFrom, vTo );\n\n\t\t\t\t}\n\n\t\t\t\tthis._x = v1.x;\n\t\t\t\tthis._y = v1.y;\n\t\t\t\tthis._z = v1.z;\n\t\t\t\tthis._w = r;\n\n\t\t\t\treturn this.normalize();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tinverse: function () {\n\n\t\t\treturn this.conjugate().normalize();\n\n\t\t},\n\n\t\tconjugate: function () {\n\n\t\t\tthis._x *= - 1;\n\t\t\tthis._y *= - 1;\n\t\t\tthis._z *= - 1;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tvar l = this.length();\n\n\t\t\tif ( l === 0 ) {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = 0;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = 1;\n\n\t\t\t} else {\n\n\t\t\t\tl = 1 / l;\n\n\t\t\t\tthis._x = this._x * l;\n\t\t\t\tthis._y = this._y * l;\n\t\t\t\tthis._z = this._z * l;\n\t\t\t\tthis._w = this._w * l;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( q, p ) {\n\n\t\t\tif ( p !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyQuaternions( this, q );\n\n\t\t},\n\n\t\tpremultiply: function ( q ) {\n\n\t\t\treturn this.multiplyQuaternions( q, this );\n\n\t\t},\n\n\t\tmultiplyQuaternions: function ( a, b ) {\n\n\t\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\t\tvar qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\t\tvar qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tslerp: function ( qb, t ) {\n\n\t\t\tif ( t === 0 ) return this;\n\t\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\t\tvar x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\t\tvar cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\t\tthis._w = - qb._w;\n\t\t\t\tthis._x = - qb._x;\n\t\t\t\tthis._y = - qb._y;\n\t\t\t\tthis._z = - qb._z;\n\n\t\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t\t} else {\n\n\t\t\t\tthis.copy( qb );\n\n\t\t\t}\n\n\t\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\t\tthis._w = w;\n\t\t\t\tthis._x = x;\n\t\t\t\tthis._y = y;\n\t\t\t\tthis._z = z;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n\t\t\tif ( Math.abs( sinHalfTheta ) < 0.001 ) {\n\n\t\t\t\tthis._w = 0.5 * ( w + this._w );\n\t\t\t\tthis._x = 0.5 * ( x + this._x );\n\t\t\t\tthis._y = 0.5 * ( y + this._y );\n\t\t\t\tthis._z = 0.5 * ( z + this._z );\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\t\tvar ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( quaternion ) {\n\n\t\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis._x = array[ offset ];\n\t\t\tthis._y = array[ offset + 1 ];\n\t\t\tthis._z = array[ offset + 2 ];\n\t\t\tthis._w = array[ offset + 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\tObject.assign( Quaternion, {\n\n\t\tslerp: function( qa, qb, qm, t ) {\n\n\t\t\treturn qm.copy( qa ).slerp( qb, t );\n\n\t\t},\n\n\t\tslerpFlat: function(\n\t\t\t\tdst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\t\tvar x0 = src0[ srcOffset0 + 0 ],\n\t\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\t\tw0 = src0[ srcOffset0 + 3 ],\n\n\t\t\t\tx1 = src1[ srcOffset1 + 0 ],\n\t\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\t\tvar s = 1 - t,\n\n\t\t\t\t\tcos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\n\t\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\t\tvar sin = Math.sqrt( sqrSin ),\n\t\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t\t}\n\n\t\t\t\tvar tDir = t * dir;\n\n\t\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t\t// Normalize in case we just did a lerp:\n\t\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\t\tvar f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\t\tx0 *= f;\n\t\t\t\t\ty0 *= f;\n\t\t\t\t\tz0 *= f;\n\t\t\t\t\tw0 *= f;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdst[ dstOffset ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author *kile / http://kile.stravaganza.org/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector3( x, y, z ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\n\t}\n\n\tVector3.prototype = {\n\n\t\tconstructor: Vector3,\n\n\t\tisVector3: true,\n\n\t\tset: function ( x, y, z ) {\n\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\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\t\t\t\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\t\t\tthis.z *= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x * b.x;\n\t\t\tthis.y = a.y * b.y;\n\t\t\tthis.z = a.z * b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyEuler: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyEuler( euler ) {\n\n\t\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromEuler( euler ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyAxisAngle: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyAxisAngle( axis, angle ) {\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix3: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 affine matrix\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ];\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ];\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyProjection: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 projection matrix\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\t\t\tvar d = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); // perspective divide\n\n\t\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * d;\n\t\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * d;\n\t\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * d;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyQuaternion: function ( q ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t\t// calculate quat * vector\n\n\t\t\tvar ix = qw * x + qy * z - qz * y;\n\t\t\tvar iy = qw * y + qz * x - qx * z;\n\t\t\tvar iz = qw * z + qx * y - qy * x;\n\t\t\tvar iw = - qx * x - qy * y - qz * z;\n\n\t\t\t// calculate result * inverse quat\n\n\t\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function project( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );\n\t\t\t\treturn this.applyProjection( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tunproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function unproject( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );\n\t\t\t\treturn this.applyProjection( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttransformDirection: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 affine matrix\n\t\t\t// vector interpreted as a direction\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\t\treturn this.normalize();\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\t\t\tthis.z /= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector3();\n\t\t\t\t\tmax = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tcross: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\t\treturn this.crossVectors( v, w );\n\n\t\t\t}\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\n\t\t\tthis.x = y * v.z - z * v.y;\n\t\t\tthis.y = z * v.x - x * v.z;\n\t\t\tthis.z = x * v.y - y * v.x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossVectors: function ( a, b ) {\n\n\t\t\tvar ax = a.x, ay = a.y, az = a.z;\n\t\t\tvar bx = b.x, by = b.y, bz = b.z;\n\n\t\t\tthis.x = ay * bz - az * by;\n\t\t\tthis.y = az * bx - ax * bz;\n\t\t\tthis.z = ax * by - ay * bx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tprojectOnVector: function ( vector ) {\n\n\t\t\tvar scalar = vector.dot( this ) / vector.lengthSq();\n\n\t\t\treturn this.copy( vector ).multiplyScalar( scalar );\n\n\t\t},\n\n\t\tprojectOnPlane: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function projectOnPlane( planeNormal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tv1.copy( this ).projectOnVector( planeNormal );\n\n\t\t\t\treturn this.sub( v1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\treflect: function () {\n\n\t\t\t// reflect incident vector off plane orthogonal to normal\n\t\t\t// normal is assumed to have unit length\n\n\t\t\tvar v1;\n\n\t\t\treturn function reflect( normal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\treturn this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tangleTo: function ( v ) {\n\n\t\t\tvar theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );\n\n\t\t\t// clamp, to handle numerical problems\n\n\t\t\treturn Math.acos( _Math.clamp( theta, - 1, 1 ) );\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t\t},\n\n\t\tsetFromSpherical: function( s ) {\n\n\t\t\tvar sinPhiRadius = Math.sin( s.phi ) * s.radius;\n\n\t\t\tthis.x = sinPhiRadius * Math.sin( s.theta );\n\t\t\tthis.y = Math.cos( s.phi ) * s.radius;\n\t\t\tthis.z = sinPhiRadius * Math.cos( s.theta );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixPosition: function ( m ) {\n\n\t\t\treturn this.setFromMatrixColumn( m, 3 );\n\n\t\t},\n\n\t\tsetFromMatrixScale: function ( m ) {\n\n\t\t\tvar sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\t\tvar sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\t\tvar sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\tthis.x = sx;\n\t\t\tthis.y = sy;\n\t\t\tthis.z = sz;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixColumn: function ( m, index ) {\n\n\t\t\tif ( typeof m === 'number' ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: setFromMatrixColumn now expects ( matrix, index ).' );\n\t\t\t\tvar temp = m;\n\t\t\t\tm = index;\n\t\t\t\tindex = temp;\n\n\t\t\t}\n\n\t\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tindex = index * attribute.itemSize + offset;\n\n\t\t\tthis.x = attribute.array[ index ];\n\t\t\tthis.y = attribute.array[ index + 1 ];\n\t\t\tthis.z = attribute.array[ index + 2 ];\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author jordi_ros / http://plattsoft.com\n\t * @author D1plo1d / http://github.com/D1plo1d\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author timknip / http://www.floorplanner.com/\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Matrix4() {\n\n\t\tthis.elements = new Float32Array( [\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 ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix4.prototype = {\n\n\t\tconstructor: Matrix4,\n\n\t\tisMatrix4: true,\n\n\t\tset: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, 1, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new Matrix4().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tthis.elements.set( m.elements );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyPosition: function ( m ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = m.elements;\n\n\t\t\tte[ 12 ] = me[ 12 ];\n\t\t\tte[ 13 ] = me[ 13 ];\n\t\t\tte[ 14 ] = me[ 14 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\tthis.set(\n\t\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractRotation: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function extractRotation( m ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tvar te = this.elements;\n\t\t\t\tvar me = m.elements;\n\n\t\t\t\tvar scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length();\n\t\t\t\tvar scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length();\n\t\t\t\tvar scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\t\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\t\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\n\t\t\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\t\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\t\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\n\t\t\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\t\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\t\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakeRotationFromEuler: function ( euler ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = euler.x, y = euler.y, z = euler.z;\n\t\t\tvar a = Math.cos( x ), b = Math.sin( x );\n\t\t\tvar c = Math.cos( y ), d = Math.sin( y );\n\t\t\tvar e = Math.cos( z ), f = Math.sin( z );\n\n\t\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - c * f;\n\t\t\t\tte[ 8 ] = d;\n\n\t\t\t\tte[ 1 ] = af + be * d;\n\t\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\t\tte[ 9 ] = - b * c;\n\n\t\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\t\tte[ 6 ] = be + af * d;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce + df * b;\n\t\t\t\tte[ 4 ] = de * b - cf;\n\t\t\t\tte[ 8 ] = a * d;\n\n\t\t\t\tte[ 1 ] = a * f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b;\n\n\t\t\t\tte[ 2 ] = cf * b - de;\n\t\t\t\tte[ 6 ] = df + ce * b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce - df * b;\n\t\t\t\tte[ 4 ] = - a * f;\n\t\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\t\tte[ 1 ] = cf + de * b;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\t\tte[ 2 ] = - a * d;\n\t\t\t\tte[ 6 ] = b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = be * d - af;\n\t\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\t\tte[ 1 ] = c * f;\n\t\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\t\tte[ 2 ] = - d;\n\t\t\t\tte[ 6 ] = b * c;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\t\tte[ 1 ] = f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b * e;\n\n\t\t\t\tte[ 2 ] = - d * e;\n\t\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - f;\n\t\t\t\tte[ 8 ] = d * e;\n\n\t\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\t\tte[ 6 ] = b * e;\n\t\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t\t}\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationFromQuaternion: function ( q ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = q.x, y = q.y, z = q.z, w = q.w;\n\t\t\tvar x2 = x + x, y2 = y + y, z2 = z + z;\n\t\t\tvar xx = x * x2, xy = x * y2, xz = x * z2;\n\t\t\tvar yy = y * y2, yz = y * z2, zz = z * z2;\n\t\t\tvar wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\t\tte[ 0 ] = 1 - ( yy + zz );\n\t\t\tte[ 4 ] = xy - wz;\n\t\t\tte[ 8 ] = xz + wy;\n\n\t\t\tte[ 1 ] = xy + wz;\n\t\t\tte[ 5 ] = 1 - ( xx + zz );\n\t\t\tte[ 9 ] = yz - wx;\n\n\t\t\tte[ 2 ] = xz - wy;\n\t\t\tte[ 6 ] = yz + wx;\n\t\t\tte[ 10 ] = 1 - ( xx + yy );\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlookAt: function () {\n\n\t\t\tvar x, y, z;\n\n\t\t\treturn function lookAt( eye, target, up ) {\n\n\t\t\t\tif ( x === undefined ) {\n\n\t\t\t\t\tx = new Vector3();\n\t\t\t\t\ty = new Vector3();\n\t\t\t\t\tz = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tz.subVectors( eye, target ).normalize();\n\n\t\t\t\tif ( z.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z = 1;\n\n\t\t\t\t}\n\n\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\tif ( x.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z += 0.0001;\n\t\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\ty.crossVectors( z, x );\n\n\n\t\t\t\tte[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;\n\t\t\t\tte[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;\n\t\t\t\tte[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiply: function ( m, n ) {\n\n\t\t\tif ( n !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyMatrices( this, m );\n\n\t\t},\n\n\t\tpremultiply: function ( m ) {\n\n\t\t\treturn this.multiplyMatrices( m, this );\n\n\t\t},\n\n\t\tmultiplyMatrices: function ( a, b ) {\n\n\t\t\tvar ae = a.elements;\n\t\t\tvar be = b.elements;\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\t\tvar a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\t\tvar a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\t\tvar a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\t\tvar b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\t\tvar b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\t\tvar b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\t\tvar b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyToArray: function ( a, b, r ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tthis.multiplyMatrices( a, b );\n\n\t\t\tr[ 0 ] = te[ 0 ]; r[ 1 ] = te[ 1 ]; r[ 2 ] = te[ 2 ]; r[ 3 ] = te[ 3 ];\n\t\t\tr[ 4 ] = te[ 4 ]; r[ 5 ] = te[ 5 ]; r[ 6 ] = te[ 6 ]; r[ 7 ] = te[ 7 ];\n\t\t\tr[ 8 ] = te[ 8 ]; r[ 9 ] = te[ 9 ]; r[ 10 ] = te[ 10 ]; r[ 11 ] = te[ 11 ];\n\t\t\tr[ 12 ] = te[ 12 ]; r[ 13 ] = te[ 13 ]; r[ 14 ] = te[ 14 ]; r[ 15 ] = te[ 15 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToVector3Array: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToVector3Array( array, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = array.length;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i += 3, j += 3 ) {\n\n\t\t\t\t\tv1.fromArray( array, j );\n\t\t\t\t\tv1.applyMatrix4( this );\n\t\t\t\t\tv1.toArray( array, j );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyToBuffer: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBuffer( buffer, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = buffer.length / buffer.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i ++, j ++ ) {\n\n\t\t\t\t\tv1.x = buffer.getX( j );\n\t\t\t\t\tv1.y = buffer.getY( j );\n\t\t\t\t\tv1.z = buffer.getZ( j );\n\n\t\t\t\t\tv1.applyMatrix4( this );\n\n\t\t\t\t\tbuffer.setXYZ( j, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn buffer;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\t\tvar n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\t\tvar n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\t\tvar n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t\t//TODO: make this more efficient\n\t\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\t\treturn (\n\t\t\t\tn41 * (\n\t\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t\t - n13 * n24 * n32\n\t\t\t\t\t - n14 * n22 * n33\n\t\t\t\t\t + n12 * n24 * n33\n\t\t\t\t\t + n13 * n22 * n34\n\t\t\t\t\t - n12 * n23 * n34\n\t\t\t\t) +\n\t\t\t\tn42 * (\n\t\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t\t - n11 * n24 * n33\n\t\t\t\t\t + n14 * n21 * n33\n\t\t\t\t\t - n13 * n21 * n34\n\t\t\t\t\t + n13 * n24 * n31\n\t\t\t\t\t - n14 * n23 * n31\n\t\t\t\t) +\n\t\t\t\tn43 * (\n\t\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t\t - n11 * n22 * n34\n\t\t\t\t\t - n14 * n21 * n32\n\t\t\t\t\t + n12 * n21 * n34\n\t\t\t\t\t + n14 * n22 * n31\n\t\t\t\t\t - n12 * n24 * n31\n\t\t\t\t) +\n\t\t\t\tn44 * (\n\t\t\t\t\t- n13 * n22 * n31\n\t\t\t\t\t - n11 * n23 * n32\n\t\t\t\t\t + n11 * n22 * n33\n\t\t\t\t\t + n13 * n21 * n32\n\t\t\t\t\t - n12 * n21 * n33\n\t\t\t\t\t + n12 * n23 * n31\n\t\t\t\t)\n\n\t\t\t);\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar tmp;\n\n\t\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset is deprecated \" +\n\t\t\t\t\t\"- just use .toArray instead.\" );\n\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\n\t\tgetPosition: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function getPosition() {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\n\n\t\t\t\treturn v1.setFromMatrixColumn( this, 3 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetPosition: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 12 ] = v.x;\n\t\t\tte[ 13 ] = v.y;\n\t\t\tte[ 14 ] = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetInverse: function ( m, throwOnDegenerate ) {\n\n\t\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\t\tvar te = this.elements,\n\t\t\t\tme = m.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],\n\t\t\t\tn12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],\n\t\t\t\tn13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],\n\t\t\t\tn14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],\n\n\t\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\t\tvar det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\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\t\tte[ 4 ] = t12 * detInv;\n\t\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\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\t\tte[ 8 ] = t13 * detInv;\n\t\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\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\t\tte[ 12 ] = t14 * detInv;\n\t\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\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\t\treturn this;\n\n\t\t},\n\n\t\tscale: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = v.x, y = v.y, z = v.z;\n\n\t\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetMaxScaleOnAxis: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\t\tvar scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\t\tvar scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t\t},\n\n\t\tmakeTranslation: function ( x, y, z ) {\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\treturn this;\n\n\t\t},\n\n\t\tmakeRotationX: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, c, - s, 0,\n\t\t\t\t0, s, c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationY: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t c, 0, s, 0,\n\t\t\t\t 0, 1, 0, 0,\n\t\t\t\t- s, 0, c, 0,\n\t\t\t\t 0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationZ: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\tc, - s, 0, 0,\n\t\t\t\ts, c, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationAxis: function ( axis, angle ) {\n\n\t\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\t\tvar c = Math.cos( angle );\n\t\t\tvar s = Math.sin( angle );\n\t\t\tvar t = 1 - c;\n\t\t\tvar x = axis.x, y = axis.y, z = axis.z;\n\t\t\tvar tx = t * x, ty = t * y;\n\n\t\t\tthis.set(\n\n\t\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\t return this;\n\n\t\t},\n\n\t\tmakeScale: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\tx, 0, 0, 0,\n\t\t\t\t0, y, 0, 0,\n\t\t\t\t0, 0, z, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcompose: function ( position, quaternion, scale ) {\n\n\t\t\tthis.makeRotationFromQuaternion( quaternion );\n\t\t\tthis.scale( scale );\n\t\t\tthis.setPosition( position );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdecompose: function () {\n\n\t\t\tvar vector, matrix;\n\n\t\t\treturn function decompose( position, quaternion, scale ) {\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tvector = new Vector3();\n\t\t\t\t\tmatrix = new Matrix4();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tvar sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\t\t\tvar sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\t\t\tvar sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t\t\t// if determine is negative, we need to invert one scale\n\t\t\t\tvar det = this.determinant();\n\t\t\t\tif ( det < 0 ) {\n\n\t\t\t\t\tsx = - sx;\n\n\t\t\t\t}\n\n\t\t\t\tposition.x = te[ 12 ];\n\t\t\t\tposition.y = te[ 13 ];\n\t\t\t\tposition.z = te[ 14 ];\n\n\t\t\t\t// scale the rotation part\n\n\t\t\t\tmatrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy()\n\n\t\t\t\tvar invSX = 1 / sx;\n\t\t\t\tvar invSY = 1 / sy;\n\t\t\t\tvar invSZ = 1 / sz;\n\n\t\t\t\tmatrix.elements[ 0 ] *= invSX;\n\t\t\t\tmatrix.elements[ 1 ] *= invSX;\n\t\t\t\tmatrix.elements[ 2 ] *= invSX;\n\n\t\t\t\tmatrix.elements[ 4 ] *= invSY;\n\t\t\t\tmatrix.elements[ 5 ] *= invSY;\n\t\t\t\tmatrix.elements[ 6 ] *= invSY;\n\n\t\t\t\tmatrix.elements[ 8 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 9 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 10 ] *= invSZ;\n\n\t\t\t\tquaternion.setFromRotationMatrix( matrix );\n\n\t\t\t\tscale.x = sx;\n\t\t\t\tscale.y = sy;\n\t\t\t\tscale.z = sz;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakeFrustum: function ( left, right, bottom, top, near, far ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = 2 * near / ( right - left );\n\t\t\tvar y = 2 * near / ( top - bottom );\n\n\t\t\tvar a = ( right + left ) / ( right - left );\n\t\t\tvar b = ( top + bottom ) / ( top - bottom );\n\t\t\tvar c = - ( far + near ) / ( far - near );\n\t\t\tvar d = - 2 * far * near / ( far - near );\n\n\t\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakePerspective: function ( fov, aspect, near, far ) {\n\n\t\t\tvar ymax = near * Math.tan( _Math.DEG2RAD * fov * 0.5 );\n\t\t\tvar ymin = - ymax;\n\t\t\tvar xmin = ymin * aspect;\n\t\t\tvar xmax = ymax * aspect;\n\n\t\t\treturn this.makeFrustum( xmin, xmax, ymin, ymax, near, far );\n\n\t\t},\n\n\t\tmakeOrthographic: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar w = 1.0 / ( right - left );\n\t\t\tvar h = 1.0 / ( top - bottom );\n\t\t\tvar p = 1.0 / ( far - near );\n\n\t\t\tvar x = ( right + left ) * w;\n\t\t\tvar y = ( top + bottom ) * h;\n\t\t\tvar z = ( far + near ) * p;\n\n\t\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( matrix ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = matrix.elements;\n\n\t\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tTexture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tCubeTexture.prototype = Object.create( Texture.prototype );\n\tCubeTexture.prototype.constructor = CubeTexture;\n\n\tCubeTexture.prototype.isCubeTexture = true;\n\n\tObject.defineProperty( CubeTexture.prototype, 'images', {\n\n\t\tget: function () {\n\n\t\t\treturn this.image;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.image = value;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t *\n\t * Uniforms of a program.\n\t * Those form a tree structure with a special top-level container for the root,\n\t * which you get by calling 'new WebGLUniforms( gl, program, renderer )'.\n\t *\n\t *\n\t * Properties of inner nodes including the top-level container:\n\t *\n\t * .seq - array of nested uniforms\n\t * .map - nested uniforms by name\n\t *\n\t *\n\t * Methods of all nodes except the top-level container:\n\t *\n\t * .setValue( gl, value, [renderer] )\n\t *\n\t * \t\tuploads a uniform value(s)\n\t * \tthe 'renderer' parameter is needed for sampler uniforms\n\t *\n\t *\n\t * Static methods of the top-level container (renderer factorizations):\n\t *\n\t * .upload( gl, seq, values, renderer )\n\t *\n\t * \t\tsets uniforms in 'seq' to 'values[id].value'\n\t *\n\t * .seqWithValue( seq, values ) : filteredSeq\n\t *\n\t * \t\tfilters 'seq' entries with corresponding entry in values\n\t *\n\t *\n\t * Methods of the top-level container (renderer factorizations):\n\t *\n\t * .setValue( gl, name, value )\n\t *\n\t * \t\tsets uniform with name 'name' to 'value'\n\t *\n\t * .set( gl, obj, prop )\n\t *\n\t * \t\tsets uniform from object and property with same name than uniform\n\t *\n\t * .setOptional( gl, obj, prop )\n\t *\n\t * \t\tlike .set for an optional property of the object\n\t *\n\t */\n\n\tvar emptyTexture = new Texture();\n\tvar emptyCubeTexture = new CubeTexture();\n\n\t// --- Base for inner nodes (including the root) ---\n\n\tfunction UniformContainer() {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\t// --- Utilities ---\n\n\t// Array Caches (provide typed arrays for temporary by size)\n\n\tvar arrayCacheF32 = [];\n\tvar arrayCacheI32 = [];\n\n\t// Flattening for arrays of vectors and matrices\n\n\tfunction flatten( array, nBlocks, blockSize ) {\n\n\t\tvar firstElem = array[ 0 ];\n\n\t\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t\t// unoptimized: ! isNaN( firstElem )\n\t\t// see http://jacksondunstan.com/articles/983\n\n\t\tvar n = nBlocks * blockSize,\n\t\t\tr = arrayCacheF32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Float32Array( n );\n\t\t\tarrayCacheF32[ n ] = r;\n\n\t\t}\n\n\t\tif ( nBlocks !== 0 ) {\n\n\t\t\tfirstElem.toArray( r, 0 );\n\n\t\t\tfor ( var i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\t\toffset += blockSize;\n\t\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n\t// Texture unit allocation\n\n\tfunction allocTexUnits( renderer, n ) {\n\n\t\tvar r = arrayCacheI32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Int32Array( n );\n\t\t\tarrayCacheI32[ n ] = r;\n\n\t\t}\n\n\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\tr[ i ] = renderer.allocTextureUnit();\n\n\t\treturn r;\n\n\t}\n\n\t// --- Setters ---\n\n\t// Note: Defining these methods externally, because they come in a bunch\n\t// and this way their names minify.\n\n\t// Single scalar\n\n\tfunction setValue1f( gl, v ) { gl.uniform1f( this.addr, v ); }\n\tfunction setValue1i( gl, v ) { gl.uniform1i( this.addr, v ); }\n\n\t// Single float vector (from flat array or THREE.VectorN)\n\n\tfunction setValue2fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform2fv( this.addr, v );\n\t\telse gl.uniform2f( this.addr, v.x, v.y );\n\n\t}\n\n\tfunction setValue3fv( gl, v ) {\n\n\t\tif ( v.x !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\t\telse if ( v.r !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\t\telse\n\t\t\tgl.uniform3fv( this.addr, v );\n\n\t}\n\n\tfunction setValue4fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform4fv( this.addr, v );\n\t\telse gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t}\n\n\t// Single matrix (from flat array or MatrixN)\n\n\tfunction setValue2fm( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue3fm( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue4fm( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v.elements || v );\n\n\t}\n\n\t// Single texture (2D / Cube)\n\n\tfunction setValueT1( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTexture2D( v || emptyTexture, unit );\n\n\t}\n\n\tfunction setValueT6( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTextureCube( v || emptyCubeTexture, unit );\n\n\t}\n\n\t// Integer / Boolean vectors or arrays thereof (always flat arrays)\n\n\tfunction setValue2iv( gl, v ) { gl.uniform2iv( this.addr, v ); }\n\tfunction setValue3iv( gl, v ) { gl.uniform3iv( this.addr, v ); }\n\tfunction setValue4iv( gl, v ) { gl.uniform4iv( this.addr, v ); }\n\n\t// Helper to pick the right setter for the singular case\n\n\tfunction getSingularSetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1f; // FLOAT\n\t\t\tcase 0x8b50: return setValue2fv; // _VEC2\n\t\t\tcase 0x8b51: return setValue3fv; // _VEC3\n\t\t\tcase 0x8b52: return setValue4fv; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValue2fm; // _MAT2\n\t\t\tcase 0x8b5b: return setValue3fm; // _MAT3\n\t\t\tcase 0x8b5c: return setValue4fm; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1i; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// Array of scalars\n\n\tfunction setValue1fv( gl, v ) { gl.uniform1fv( this.addr, v ); }\n\tfunction setValue1iv( gl, v ) { gl.uniform1iv( this.addr, v ); }\n\n\t// Array of vectors (flat or from THREE classes)\n\n\tfunction setValueV2a( gl, v ) {\n\n\t\tgl.uniform2fv( this.addr, flatten( v, this.size, 2 ) );\n\n\t}\n\n\tfunction setValueV3a( gl, v ) {\n\n\t\tgl.uniform3fv( this.addr, flatten( v, this.size, 3 ) );\n\n\t}\n\n\tfunction setValueV4a( gl, v ) {\n\n\t\tgl.uniform4fv( this.addr, flatten( v, this.size, 4 ) );\n\n\t}\n\n\t// Array of matrices (flat or from THREE clases)\n\n\tfunction setValueM2a( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) );\n\n\t}\n\n\tfunction setValueM3a( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) );\n\n\t}\n\n\tfunction setValueM4a( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) );\n\n\t}\n\n\t// Array of textures (2D / Cube)\n\n\tfunction setValueT1a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\tfunction setValueT6a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\t// Helper to pick the right setter for a pure (bottom-level) array\n\n\tfunction getPureArraySetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1fv; // FLOAT\n\t\t\tcase 0x8b50: return setValueV2a; // _VEC2\n\t\t\tcase 0x8b51: return setValueV3a; // _VEC3\n\t\t\tcase 0x8b52: return setValueV4a; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValueM2a; // _MAT2\n\t\t\tcase 0x8b5b: return setValueM3a; // _MAT3\n\t\t\tcase 0x8b5c: return setValueM4a; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1a; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6a; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// --- Uniform Classes ---\n\n\tfunction SingleUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\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\tfunction StructuredUniform( id ) {\n\n\t\tthis.id = id;\n\n\t\tUniformContainer.call( this ); // mix-in\n\n\t}\n\n\tStructuredUniform.prototype.setValue = function( gl, value ) {\n\n\t\t// Note: Don't need an extra 'renderer' parameter, since samplers\n\t\t// are not allowed in structured uniforms.\n\n\t\tvar seq = this.seq;\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ] );\n\n\t\t}\n\n\t};\n\n\t// --- Top-level ---\n\n\t// Parser - builds up the property tree from the path strings\n\n\tvar RePathPart = /([\\w\\d_]+)(\\])?(\\[|\\.)?/g;\n\n\t// extracts\n\t// \t- the identifier (member name or array index)\n\t// - followed by an optional right bracket (found when array index)\n\t// - followed by an optional left bracket or dot (type of subscript)\n\t//\n\t// Note: These portions can be read in a non-overlapping fashion and\n\t// allow straightforward parsing of the hierarchy that WebGL encodes\n\t// in the uniform names.\n\n\tfunction addUniform( container, uniformObject ) {\n\n\t\tcontainer.seq.push( uniformObject );\n\t\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n\t}\n\n\tfunction parseUniform( activeInfo, addr, container ) {\n\n\t\tvar path = activeInfo.name,\n\t\t\tpathLength = path.length;\n\n\t\t// reset RegExp object, because of the early exit of a previous run\n\t\tRePathPart.lastIndex = 0;\n\n\t\tfor (; ;) {\n\n\t\t\tvar match = RePathPart.exec( path ),\n\t\t\t\tmatchEnd = RePathPart.lastIndex,\n\n\t\t\t\tid = match[ 1 ],\n\t\t\t\tidIsIndex = match[ 2 ] === ']',\n\t\t\t\tsubscript = match[ 3 ];\n\n\t\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\t\tif ( subscript === undefined ||\n\t\t\t\t\tsubscript === '[' && matchEnd + 2 === pathLength ) {\n\t\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\t\tbreak;\n\n\t\t\t} else {\n\t\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\t\tvar map = container.map,\n\t\t\t\t\tnext = map[ id ];\n\n\t\t\t\tif ( next === undefined ) {\n\n\t\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\t\taddUniform( container, next );\n\n\t\t\t\t}\n\n\t\t\t\tcontainer = next;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Root Container\n\n\tfunction WebGLUniforms( gl, program, renderer ) {\n\n\t\tUniformContainer.call( this );\n\n\t\tthis.renderer = renderer;\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\tvar info = gl.getActiveUniform( program, i ),\n\t\t\t\tpath = info.name,\n\t\t\t\taddr = gl.getUniformLocation( program, path );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tWebGLUniforms.prototype.setValue = function( gl, name, value ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.set = function( gl, object, name ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, object[ name ], this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.setOptional = function( gl, object, name ) {\n\n\t\tvar v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t};\n\n\n\t// Static interface\n\n\tWebGLUniforms.upload = function( gl, seq, values, renderer ) {\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\n\t\t\t\tu.setValue( gl, v.value, renderer );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tWebGLUniforms.seqWithValue = function( seq, values ) {\n\n\t\tvar r = [];\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar 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\t/**\n\t * Uniform Utilities\n\t */\n\n\tvar UniformsUtils = {\n\n\t\tmerge: function ( uniforms ) {\n\n\t\t\tvar merged = {};\n\n\t\t\tfor ( var u = 0; u < uniforms.length; u ++ ) {\n\n\t\t\t\tvar tmp = this.clone( uniforms[ u ] );\n\n\t\t\t\tfor ( var p in tmp ) {\n\n\t\t\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn merged;\n\n\t\t},\n\n\t\tclone: function ( uniforms_src ) {\n\n\t\t\tvar uniforms_dst = {};\n\n\t\t\tfor ( var u in uniforms_src ) {\n\n\t\t\t\tuniforms_dst[ u ] = {};\n\n\t\t\t\tfor ( var p in uniforms_src[ u ] ) {\n\n\t\t\t\t\tvar parameter_src = uniforms_src[ u ][ p ];\n\n\t\t\t\t\tif ( parameter_src && ( parameter_src.isColor ||\n\t\t\t\t\t\tparameter_src.isMatrix3 || parameter_src.isMatrix4 ||\n\t\t\t\t\t\tparameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 ||\n\t\t\t\t\t\tparameter_src.isTexture ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.clone();\n\n\t\t\t\t\t} else if ( Array.isArray( parameter_src ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.slice();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn uniforms_dst;\n\n\t\t}\n\n\t};\n\n\tvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\\n\";\n\n\tvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\\n\";\n\n\tvar alphatest_fragment = \"#ifdef ALPHATEST\\n\\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\\n\";\n\n\tvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\\n\\t#endif\\n#endif\\n\";\n\n\tvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\n\tvar begin_vertex = \"\\nvec3 transformed = vec3( position );\\n\";\n\n\tvar beginnormal_vertex = \"\\nvec3 objectNormal = vec3( normal );\\n\";\n\n\tvar bsdfs = \"bool testLightInRange( const in float lightDistance, const in float cutoffDistance ) {\\n\\treturn any( bvec2( cutoffDistance == 0.0, lightDistance < cutoffDistance ) );\\n}\\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\t\\tif( decayExponent > 0.0 ) {\\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\\n\\t\\t\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\t\\t\\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t\\t\\treturn distanceFalloff * maxDistanceCutoffFactor;\\n#else\\n\\t\\t\\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\\n#endif\\n\\t\\t}\\n\\t\\treturn 1.0;\\n}\\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\\n\\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\\n\\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\\n}\\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\treturn 1.0 / ( gl * gv );\\n}\\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\tfloat D = D_GGX( alpha, dotNH );\\n\\treturn F * ( G * D );\\n}\\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\\n\\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\\n\\tvec4 r = roughness * c0 + c1;\\n\\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\\n\\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\\n\\treturn specularColor * AB.x + AB.y;\\n}\\nfloat G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n}\\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\\n\\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\\n}\\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\\n\\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\\n}\\n\";\n\n\tvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vUv );\\n\\t\\tvec2 dSTdy = dFdy( vUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\\n\\t\\tvec3 vSigmaX = dFdx( surf_pos );\\n\\t\\tvec3 vSigmaY = dFdy( surf_pos );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 );\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\\n\";\n\n\tvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\\n\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t\\t\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\\n\\t\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\tif ( clipped ) discard;\\n\\t\\n\\t#endif\\n#endif\\n\";\n\n\tvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\t\\tvarying vec3 vViewPosition;\\n\\t#endif\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\\n\";\n\n\tvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n\";\n\n\tvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n\";\n\n\tvar color_fragment = \"#ifdef USE_COLOR\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\n\tvar color_pars_fragment = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\\n\";\n\n\tvar color_pars_vertex = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\";\n\n\tvar color_vertex = \"#ifdef USE_COLOR\\n\\tvColor.xyz = color.xyz;\\n#endif\";\n\n\tvar common = \"#define PI 3.14159265359\\n#define PI2 6.28318530718\\n#define RECIPROCAL_PI 0.31830988618\\n#define RECIPROCAL_PI2 0.15915494\\n#define LOG2 1.442695\\n#define EPSILON 1e-6\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract(sin(sn) * c);\\n}\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\tfloat distance = dot( planeNormal, point - pointOnPlane );\\n\\treturn - distance * planeNormal + point;\\n}\\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn sign( dot( point - pointOnPlane, planeNormal ) );\\n}\\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\\n}\\n\";\n\n\tvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n#define cubeUV_textureSize (1024.0)\\nint getFaceFromDirection(vec3 direction) {\\n\\tvec3 absDirection = abs(direction);\\n\\tint face = -1;\\n\\tif( absDirection.x > absDirection.z ) {\\n\\t\\tif(absDirection.x > absDirection.y )\\n\\t\\t\\tface = direction.x > 0.0 ? 0 : 3;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\telse {\\n\\t\\tif(absDirection.z > absDirection.y )\\n\\t\\t\\tface = direction.z > 0.0 ? 2 : 5;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\treturn face;\\n}\\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\\n\\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\\n\\tfloat dxRoughness = dFdx(roughness);\\n\\tfloat dyRoughness = dFdy(roughness);\\n\\tvec3 dx = dFdx( vec * scale * dxRoughness );\\n\\tvec3 dy = dFdy( vec * scale * dyRoughness );\\n\\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\\n\\td = clamp(d, 1.0, cubeUV_rangeClamp);\\n\\tfloat mipLevel = 0.5 * log2(d);\\n\\treturn vec2(floor(mipLevel), fract(mipLevel));\\n}\\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\\n\\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\\n\\tfloat a = 16.0 * cubeUV_rcpTextureSize;\\n\\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\\n\\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\\n\\tfloat powScale = exp2_packed.x * exp2_packed.y;\\n\\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\\n\\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\\n\\tbool bRes = mipLevel == 0.0;\\n\\tscale = bRes && (scale < a) ? a : scale;\\n\\tvec3 r;\\n\\tvec2 offset;\\n\\tint face = getFaceFromDirection(direction);\\n\\tfloat rcpPowScale = 1.0 / powScale;\\n\\tif( face == 0) {\\n\\t\\tr = vec3(direction.x, -direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 1) {\\n\\t\\tr = vec3(direction.y, direction.x, direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 2) {\\n\\t\\tr = vec3(direction.z, direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 3) {\\n\\t\\tr = vec3(direction.x, direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse if( face == 4) {\\n\\t\\tr = vec3(direction.y, direction.x, -direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse {\\n\\t\\tr = vec3(direction.z, -direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\tr = normalize(r);\\n\\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\\n\\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\\n\\tvec2 base = offset + vec2( texelOffset );\\n\\treturn base + s * ( scale - 2.0 * texelOffset );\\n}\\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\\n\\tfloat roughnessVal = roughness* cubeUV_maxLods3;\\n\\tfloat r1 = floor(roughnessVal);\\n\\tfloat r2 = r1 + 1.0;\\n\\tfloat t = fract(roughnessVal);\\n\\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\\n\\tfloat s = mipInfo.y;\\n\\tfloat level0 = mipInfo.x;\\n\\tfloat level1 = level0 + 1.0;\\n\\tlevel1 = level1 > 5.0 ? 5.0 : level1;\\n\\tlevel0 += min( floor( s + 0.5 ), 5.0 );\\n\\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\\n\\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\\n\\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\\n\\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\\n\\tvec4 result = mix(color10, color20, t);\\n\\treturn vec4(result.rgb, 1.0);\\n}\\n#endif\\n\";\n\n\tvar defaultnormal_vertex = \"#ifdef FLIP_SIDED\\n\\tobjectNormal = -objectNormal;\\n#endif\\nvec3 transformedNormal = normalMatrix * objectNormal;\\n\";\n\n\tvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\\n\";\n\n\tvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\\n#endif\\n\";\n\n\tvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\\n\";\n\n\tvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\\n\";\n\n\tvar encodings_fragment = \" gl_FragColor = linearToOutputTexel( gl_FragColor );\\n\";\n\n\tvar encodings_pars_fragment = \"\\nvec4 LinearToLinear( in vec4 value ) {\\n return value;\\n}\\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\\n return vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\\n}\\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\\n return vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n return vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\\n}\\nvec4 RGBEToLinear( in vec4 value ) {\\n return vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n float maxComponent = max( max( value.r, value.g ), value.b );\\n float fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n return vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n return vec4( value.xyz * value.w * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n float maxRGB = max( value.x, max( value.g, value.b ) );\\n float M = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n M = ceil( M * 255.0 ) / 255.0;\\n return vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n return vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n float maxRGB = max( value.x, max( value.g, value.b ) );\\n float D = max( maxRange / maxRGB, 1.0 );\\n D = min( floor( D ) / 255.0, 1.0 );\\n return vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\\n}\\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\\nvec4 LinearToLogLuv( in vec4 value ) {\\n vec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\\n Xp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\\n vec4 vResult;\\n vResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n float Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n vResult.w = fract(Le);\\n vResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\\n return vResult;\\n}\\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\\nvec4 LogLuvToLinear( in vec4 value ) {\\n float Le = value.z * 255.0 + value.w;\\n vec3 Xp_Y_XYZp;\\n Xp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\\n Xp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n Xp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n vec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\\n return vec4( max(vRGB, 0.0), 1.0 );\\n}\\n\";\n\n\tvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\tvec2 sampleUV;\\n\\t\\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\\n\\t\\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\tvec4 envColor = texture2D( envMap, sampleUV );\\n\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\\n\\t\\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\tenvColor = envMapTexelToLinear( envColor );\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_pars_fragment = \"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\\n\\tuniform float reflectivity;\\n\\tuniform float envMapIntenstiy;\\n#endif\\n#ifdef USE_ENVMAP\\n\\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\tuniform float flipEnvMap;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\\n\";\n\n\tvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tfloat depth = gl_FragDepthEXT / gl_FragCoord.w;\\n\\t#else\\n\\t\\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\n\\t#endif\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, depth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\\n\";\n\n\tvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\n\tvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n#endif\\n\";\n\n\tvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\n\tvar lights_lambert_vertex = \"vec3 diffuse = vec3( 1.0 );\\nGeometricContext geometry;\\ngeometry.position = mvPosition.xyz;\\ngeometry.normal = normalize( transformedNormal );\\ngeometry.viewDir = normalize( -mvPosition.xyz );\\nGeometricContext backGeometry;\\nbackGeometry.position = geometry.position;\\nbackGeometry.normal = -geometry.normal;\\nbackGeometry.viewDir = geometry.viewDir;\\nvLightFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\n\\tvLightBack = vec3( 0.0 );\\n#endif\\nIncidentLight directLight;\\nfloat dotNL;\\nvec3 directLightColor_Diffuse;\\n#if NUM_POINT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_DIR_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar lights_pars = \"uniform vec3 ambientLightColor;\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treturn irradiance;\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tdirectLight.color = directionalLight.color;\\n\\t\\tdirectLight.direction = directionalLight.direction;\\n\\t\\tdirectLight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = pointLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tif ( testLightInRange( lightDistance, pointLight.distance ) ) {\\n\\t\\t\\tdirectLight.color = pointLight.color;\\n\\t\\t\\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tfloat angleCos = dot( directLight.direction, spotLight.direction );\\n\\t\\tif ( all( bvec2( angleCos > spotLight.coneCos, testLightInRange( lightDistance, spotLight.distance ) ) ) ) {\\n\\t\\t\\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\t\\tdirectLight.color = spotLight.color;\\n\\t\\t\\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\\n\\t\\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tirradiance *= PI;\\n\\t\\t#endif\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\\t\\t#include \\n\\t\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\\n\\t\\t#else\\n\\t\\t\\tvec4 envMapColor = vec4( 0.0 );\\n\\t\\t#endif\\n\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t}\\n\\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\tfloat maxMIPLevelScalar = float( maxMIPLevel );\\n\\t\\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\\n\\t\\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\\n\\t}\\n\\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\\n\\t\\t#endif\\n\\t\\t#include \\n\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\\n\\t\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\t\\tvec2 sampleUV;\\n\\t\\t\\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\\n\\t\\t\\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\t\\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#endif\\n\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t}\\n#endif\\n\";\n\n\tvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\\n\";\n\n\tvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\nstruct BlinnPhongMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tvec3\\tspecularColor;\\n\\tfloat\\tspecularShininess;\\n\\tfloat\\tspecularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\\n\";\n\n\tvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\\n#ifdef STANDARD\\n\\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.clearCoat = saturate( clearCoat );\\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\\n#endif\\n\";\n\n\tvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tfloat\\tspecularRoughness;\\n\\tvec3\\tspecularColor;\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoat;\\n\\t\\tfloat clearCoatRoughness;\\n\\t#endif\\n};\\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\\n\\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\\n}\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\\n\\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifndef STANDARD\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\tfloat dotNL = dotNV;\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\\n\";\n\n\tvar lights_template = \"\\nGeometricContext geometry;\\ngeometry.position = - vViewPosition;\\ngeometry.normal = normal;\\ngeometry.viewDir = normalize( vViewPosition );\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tlightMapIrradiance *= PI;\\n\\t\\t#endif\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t}\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t \\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\\n\\t#endif\\n\\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\\n\\t#ifndef STANDARD\\n\\t\\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\\n\\t#else\\n\\t\\tvec3 clearCoatRadiance = vec3( 0.0 );\\n\\t#endif\\n\\t\\t\\n\\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\\n#endif\\n\";\n\n\tvar logdepthbuf_fragment = \"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\\n\\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\\n#endif\";\n\n\tvar logdepthbuf_pars_fragment = \"#ifdef USE_LOGDEPTHBUF\\n\\tuniform float logDepthBufFC;\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n#endif\\n\";\n\n\tvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n\\tuniform float logDepthBufFC;\\n#endif\";\n\n\tvar logdepthbuf_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvFragDepth = 1.0 + gl_Position.w;\\n\\t#else\\n\\t\\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\\n\\t#endif\\n#endif\\n\";\n\n\tvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\ttexelColor = mapTexelToLinear( texelColor );\\n\\tdiffuseColor *= texelColor;\\n#endif\\n\";\n\n\tvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar map_particle_fragment = \"#ifdef USE_MAP\\n\\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\\n\\tdiffuseColor *= mapTexelToLinear( mapTexel );\\n#endif\\n\";\n\n\tvar map_particle_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform vec4 offsetRepeat;\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.r;\\n#endif\\n\";\n\n\tvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\n\tvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\n\\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\n\\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\n\\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\n#endif\\n\";\n\n\tvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_MORPHNORMALS\\n\\tuniform float morphTargetInfluences[ 8 ];\\n\\t#else\\n\\tuniform float morphTargetInfluences[ 4 ];\\n\\t#endif\\n#endif\";\n\n\tvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\n\\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\n\\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\n\\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n\\t#ifndef USE_MORPHNORMALS\\n\\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\n\\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\n\\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\n\\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n\\t#endif\\n#endif\\n\";\n\n\tvar normal_flip = \"#ifdef DOUBLE_SIDED\\n\\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n#else\\n\\tfloat flipNormal = 1.0;\\n#endif\\n\";\n\n\tvar normal_fragment = \"#ifdef FLAT_SHADED\\n\\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\\n\\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal ) * flipNormal;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tnormal = perturbNormal2Arb( -vViewPosition, normal );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\\n#endif\\n\";\n\n\tvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n\\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\\n\\t\\tvec3 q0 = dFdx( eye_pos.xyz );\\n\\t\\tvec3 q1 = dFdy( eye_pos.xyz );\\n\\t\\tvec2 st0 = dFdx( vUv.st );\\n\\t\\tvec2 st1 = dFdy( vUv.st );\\n\\t\\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\\n\\t\\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\\n\\t\\tvec3 N = normalize( surf_norm );\\n\\t\\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t\\tmapN.xy = normalScale * mapN.xy;\\n\\t\\tmat3 tsn = mat3( S, T, N );\\n\\t\\treturn normalize( tsn * mapN );\\n\\t}\\n#endif\\n\";\n\n\tvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n return normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n return 1.0 - 2.0 * rgb.xyz;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n return ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n return linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n return (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n return ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\\n\";\n\n\tvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\\n\";\n\n\tvar project_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 mvPosition = modelViewMatrix * skinned;\\n#else\\n\\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\\n#endif\\ngl_Position = projectionMatrix * mvPosition;\\n\";\n\n\tvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.r;\\n#endif\\n\";\n\n\tvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\n\tvar shadowmap_pars_fragment = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\\n\\t\\tconst vec2 offset = vec2( 0.0, 1.0 );\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / size;\\n\\t\\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\\n\\t\\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\\n\\t\\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\\n\\t\\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\\n\\t\\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\\n\\t\\tvec2 f = fract( uv * size + 0.5 );\\n\\t\\tfloat a = mix( lb, lt, f.y );\\n\\t\\tfloat b = mix( rb, rt, f.y );\\n\\t\\tfloat c = mix( a, b, f.x );\\n\\t\\treturn c;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\n\\t\\tbool inFrustum = all( inFrustumVec );\\n\\t\\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n\\t\\tbool frustumTest = all( frustumTestVec );\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn 1.0;\\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 ) {\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar shadowmap_pars_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n#endif\\n\";\n\n\tvar shadowmap_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n#endif\\n\";\n\n\tvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\tDirectionalLight directionalLight;\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\tSpotLight spotLight;\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\tPointLight pointLight;\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\\n\";\n\n\tvar 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\n\tvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\t#ifdef BONE_TEXTURE\\n\\t\\tuniform sampler2D boneTexture;\\n\\t\\tuniform int boneTextureWidth;\\n\\t\\tuniform int boneTextureHeight;\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tfloat j = i * 4.0;\\n\\t\\t\\tfloat x = mod( j, float( boneTextureWidth ) );\\n\\t\\t\\tfloat y = floor( j / float( boneTextureWidth ) );\\n\\t\\t\\tfloat dx = 1.0 / float( boneTextureWidth );\\n\\t\\t\\tfloat dy = 1.0 / float( boneTextureHeight );\\n\\t\\t\\ty = dy * ( y + 0.5 );\\n\\t\\t\\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n\\t\\t\\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n\\t\\t\\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n\\t\\t\\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n\\t\\t\\tmat4 bone = mat4( v1, v2, v3, v4 );\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#else\\n\\t\\tuniform mat4 boneMatrices[ MAX_BONES ];\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tmat4 bone = boneMatrices[ int(i) ];\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#endif\\n#endif\\n\";\n\n\tvar 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\\tskinned = bindMatrixInverse * skinned;\\n#endif\\n\";\n\n\tvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n#endif\\n\";\n\n\tvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\n\tvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\n\tvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\\n\";\n\n\tvar tonemapping_pars_fragment = \"#define saturate(a) clamp( a, 0.0, 1.0 )\\nuniform float toneMappingExposure;\\nuniform float toneMappingWhitePoint;\\nvec3 LinearToneMapping( vec3 color ) {\\n return toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n color *= toneMappingExposure;\\n return saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\\nvec3 Uncharted2ToneMapping( vec3 color ) {\\n color *= toneMappingExposure;\\n return saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n color *= toneMappingExposure;\\n color = max( vec3( 0.0 ), color - 0.004 );\\n return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\n\";\n\n\tvar uv_pars_fragment = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n#endif\";\n\n\tvar uv_pars_vertex = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n\\tuniform vec4 offsetRepeat;\\n#endif\\n\";\n\n\tvar uv_vertex = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\\n#endif\";\n\n\tvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = uv2;\\n#endif\";\n\n\tvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\\n\\t#ifdef USE_SKINNING\\n\\t\\tvec4 worldPosition = modelMatrix * skinned;\\n\\t#else\\n\\t\\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\\n\\t#endif\\n#endif\\n\";\n\n\tvar cube_frag = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\\n\\tgl_FragColor.a *= opacity;\\n}\\n\";\n\n\tvar cube_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar depth_frag = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\\n\\t#endif\\n}\\n\";\n\n\tvar depth_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar distanceRGBA_frag = \"uniform vec3 lightPos;\\nvarying vec4 vWorldPosition;\\n#include \\n#include \\n#include \\nvoid main () {\\n\\t#include \\n\\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\\n}\\n\";\n\n\tvar distanceRGBA_vert = \"varying vec4 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvWorldPosition = worldPosition;\\n}\\n\";\n\n\tvar equirect_frag = \"uniform sampler2D tEquirect;\\nuniform float tFlip;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvec3 direction = normalize( vWorldPosition );\\n\\tvec2 sampleUV;\\n\\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\\n\\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n}\\n\";\n\n\tvar equirect_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar linedashed_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar linedashed_vert = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvLineDistance = scale * lineDistance;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight;\\n\\treflectedLight.directDiffuse = vec3( 0.0 );\\n\\treflectedLight.directSpecular = vec3( 0.0 );\\n\\treflectedLight.indirectDiffuse = diffuseColor.rgb;\\n\\treflectedLight.indirectSpecular = vec3( 0.0 );\\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_ENVMAP\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshlambert_frag = \"uniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\\n\\t#else\\n\\t\\treflectedLight.directDiffuse = vLightFront;\\n\\t#endif\\n\\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshlambert_vert = \"#define LAMBERT\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphong_frag = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphong_vert = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphysical_frag = \"#define PHYSICAL\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifndef STANDARD\\n\\tuniform float clearCoat;\\n\\tuniform float clearCoatRoughness;\\n#endif\\nuniform float envMapIntensity;\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphysical_vert = \"#define PHYSICAL\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar normal_frag = \"uniform float opacity;\\nvarying vec3 vNormal;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( vNormal ), opacity );\\n\\t#include \\n}\\n\";\n\n\tvar normal_vert = \"varying vec3 vNormal;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvNormal = normalize( normalMatrix * normal );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar points_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar points_vert = \"uniform float size;\\nuniform float scale;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tgl_PointSize = size * ( scale / - mvPosition.z );\\n\\t#else\\n\\t\\tgl_PointSize = size;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar shadow_frag = \"uniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\\n}\\n\";\n\n\tvar shadow_vert = \"#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar ShaderChunk = {\n\t\talphamap_fragment: alphamap_fragment,\n\t\talphamap_pars_fragment: alphamap_pars_fragment,\n\t\talphatest_fragment: alphatest_fragment,\n\t\taomap_fragment: aomap_fragment,\n\t\taomap_pars_fragment: aomap_pars_fragment,\n\t\tbegin_vertex: begin_vertex,\n\t\tbeginnormal_vertex: beginnormal_vertex,\n\t\tbsdfs: bsdfs,\n\t\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\t\tclipping_planes_fragment: clipping_planes_fragment,\n\t\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\t\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\t\tclipping_planes_vertex: clipping_planes_vertex,\n\t\tcolor_fragment: color_fragment,\n\t\tcolor_pars_fragment: color_pars_fragment,\n\t\tcolor_pars_vertex: color_pars_vertex,\n\t\tcolor_vertex: color_vertex,\n\t\tcommon: common,\n\t\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\t\tdefaultnormal_vertex: defaultnormal_vertex,\n\t\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\t\tdisplacementmap_vertex: displacementmap_vertex,\n\t\temissivemap_fragment: emissivemap_fragment,\n\t\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\t\tencodings_fragment: encodings_fragment,\n\t\tencodings_pars_fragment: encodings_pars_fragment,\n\t\tenvmap_fragment: envmap_fragment,\n\t\tenvmap_pars_fragment: envmap_pars_fragment,\n\t\tenvmap_pars_vertex: envmap_pars_vertex,\n\t\tenvmap_vertex: envmap_vertex,\n\t\tfog_fragment: fog_fragment,\n\t\tfog_pars_fragment: fog_pars_fragment,\n\t\tlightmap_fragment: lightmap_fragment,\n\t\tlightmap_pars_fragment: lightmap_pars_fragment,\n\t\tlights_lambert_vertex: lights_lambert_vertex,\n\t\tlights_pars: lights_pars,\n\t\tlights_phong_fragment: lights_phong_fragment,\n\t\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\t\tlights_physical_fragment: lights_physical_fragment,\n\t\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\t\tlights_template: lights_template,\n\t\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\t\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\t\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\t\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\t\tmap_fragment: map_fragment,\n\t\tmap_pars_fragment: map_pars_fragment,\n\t\tmap_particle_fragment: map_particle_fragment,\n\t\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\t\tmetalnessmap_fragment: metalnessmap_fragment,\n\t\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\t\tmorphnormal_vertex: morphnormal_vertex,\n\t\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\t\tmorphtarget_vertex: morphtarget_vertex,\n\t\tnormal_flip: normal_flip,\n\t\tnormal_fragment: normal_fragment,\n\t\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\t\tpacking: packing,\n\t\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\t\tproject_vertex: project_vertex,\n\t\troughnessmap_fragment: roughnessmap_fragment,\n\t\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\t\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\t\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\t\tshadowmap_vertex: shadowmap_vertex,\n\t\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\t\tskinbase_vertex: skinbase_vertex,\n\t\tskinning_pars_vertex: skinning_pars_vertex,\n\t\tskinning_vertex: skinning_vertex,\n\t\tskinnormal_vertex: skinnormal_vertex,\n\t\tspecularmap_fragment: specularmap_fragment,\n\t\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\t\ttonemapping_fragment: tonemapping_fragment,\n\t\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\t\tuv_pars_fragment: uv_pars_fragment,\n\t\tuv_pars_vertex: uv_pars_vertex,\n\t\tuv_vertex: uv_vertex,\n\t\tuv2_pars_fragment: uv2_pars_fragment,\n\t\tuv2_pars_vertex: uv2_pars_vertex,\n\t\tuv2_vertex: uv2_vertex,\n\t\tworldpos_vertex: worldpos_vertex,\n\n\t\tcube_frag: cube_frag,\n\t\tcube_vert: cube_vert,\n\t\tdepth_frag: depth_frag,\n\t\tdepth_vert: depth_vert,\n\t\tdistanceRGBA_frag: distanceRGBA_frag,\n\t\tdistanceRGBA_vert: distanceRGBA_vert,\n\t\tequirect_frag: equirect_frag,\n\t\tequirect_vert: equirect_vert,\n\t\tlinedashed_frag: linedashed_frag,\n\t\tlinedashed_vert: linedashed_vert,\n\t\tmeshbasic_frag: meshbasic_frag,\n\t\tmeshbasic_vert: meshbasic_vert,\n\t\tmeshlambert_frag: meshlambert_frag,\n\t\tmeshlambert_vert: meshlambert_vert,\n\t\tmeshphong_frag: meshphong_frag,\n\t\tmeshphong_vert: meshphong_vert,\n\t\tmeshphysical_frag: meshphysical_frag,\n\t\tmeshphysical_vert: meshphysical_vert,\n\t\tnormal_frag: normal_frag,\n\t\tnormal_vert: normal_vert,\n\t\tpoints_frag: points_frag,\n\t\tpoints_vert: points_vert,\n\t\tshadow_frag: shadow_frag,\n\t\tshadow_vert: shadow_vert\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Color( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\t\t\treturn this.set( r );\n\n\t\t}\n\n\t\treturn this.setRGB( r, g, b );\n\n\t}\n\n\tColor.prototype = {\n\n\t\tconstructor: Color,\n\n\t\tisColor: true,\n\n\t\tr: 1, g: 1, b: 1,\n\n\t\tset: function ( value ) {\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\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.r = scalar;\n\t\t\tthis.g = scalar;\n\t\t\tthis.b = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHex: function ( hex ) {\n\n\t\t\thex = Math.floor( hex );\n\n\t\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetRGB: function ( r, g, b ) {\n\n\t\t\tthis.r = r;\n\t\t\tthis.g = g;\n\t\t\tthis.b = b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHSL: function () {\n\n\t\t\tfunction hue2rgb( p, q, t ) {\n\n\t\t\t\tif ( t < 0 ) t += 1;\n\t\t\t\tif ( t > 1 ) t -= 1;\n\t\t\t\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\t\t\t\tif ( t < 1 / 2 ) return q;\n\t\t\t\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\t\t\t\treturn p;\n\n\t\t\t}\n\n\t\t\treturn function setHSL( h, s, l ) {\n\n\t\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\t\t\th = _Math.euclideanModulo( h, 1 );\n\t\t\t\ts = _Math.clamp( s, 0, 1 );\n\t\t\t\tl = _Math.clamp( l, 0, 1 );\n\n\t\t\t\tif ( s === 0 ) {\n\n\t\t\t\t\tthis.r = this.g = this.b = l;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\t\t\tvar q = ( 2 * l ) - p;\n\n\t\t\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetStyle: function ( style ) {\n\n\t\t\tfunction handleAlpha( string ) {\n\n\t\t\t\tif ( string === undefined ) return;\n\n\t\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tvar m;\n\n\t\t\tif ( m = /^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t\t// rgb / hsl\n\n\t\t\t\tvar color;\n\t\t\t\tvar name = m[ 1 ];\n\t\t\t\tvar components = m[ 2 ];\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'rgb':\n\t\t\t\t\tcase 'rgba':\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'hsl':\n\t\t\t\t\tcase 'hsla':\n\n\t\t\t\t\t\tif ( color = /^([0-9]*\\.?[0-9]+)\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\t\tvar h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\t\tvar s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\t\tvar l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( m = /^\\#([A-Fa-f0-9]+)$/.exec( style ) ) {\n\n\t\t\t\t// hex color\n\n\t\t\t\tvar hex = m[ 1 ];\n\t\t\t\tvar size = hex.length;\n\n\t\t\t\tif ( size === 3 ) {\n\n\t\t\t\t\t// #ff0\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t\t// #ff0000\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( style && style.length > 0 ) {\n\n\t\t\t\t// color keywords\n\t\t\t\tvar hex = ColorKeywords[ style ];\n\n\t\t\t\tif ( hex !== undefined ) {\n\n\t\t\t\t\t// red\n\t\t\t\t\tthis.setHex( hex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// unknown color\n\t\t\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t\t},\n\n\t\tcopy: function ( color ) {\n\n\t\t\tthis.r = color.r;\n\t\t\tthis.g = color.g;\n\t\t\tthis.b = color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyGammaToLinear: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tthis.r = Math.pow( color.r, gammaFactor );\n\t\t\tthis.g = Math.pow( color.g, gammaFactor );\n\t\t\tthis.b = Math.pow( color.b, gammaFactor );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyLinearToGamma: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tvar safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;\n\n\t\t\tthis.r = Math.pow( color.r, safeInverse );\n\t\t\tthis.g = Math.pow( color.g, safeInverse );\n\t\t\tthis.b = Math.pow( color.b, safeInverse );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertGammaToLinear: function () {\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tthis.r = r * r;\n\t\t\tthis.g = g * g;\n\t\t\tthis.b = b * b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertLinearToGamma: function () {\n\n\t\t\tthis.r = Math.sqrt( this.r );\n\t\t\tthis.g = Math.sqrt( this.g );\n\t\t\tthis.b = Math.sqrt( this.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetHex: function () {\n\n\t\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t\t},\n\n\t\tgetHexString: function () {\n\n\t\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t\t},\n\n\t\tgetHSL: function ( optionalTarget ) {\n\n\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\t\tvar hsl = optionalTarget || { h: 0, s: 0, l: 0 };\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tvar max = Math.max( r, g, b );\n\t\t\tvar min = Math.min( r, g, b );\n\n\t\t\tvar hue, saturation;\n\t\t\tvar lightness = ( min + max ) / 2.0;\n\n\t\t\tif ( min === max ) {\n\n\t\t\t\thue = 0;\n\t\t\t\tsaturation = 0;\n\n\t\t\t} else {\n\n\t\t\t\tvar delta = max - min;\n\n\t\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\t\tswitch ( max ) {\n\n\t\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t\t}\n\n\t\t\t\thue /= 6;\n\n\t\t\t}\n\n\t\t\thsl.h = hue;\n\t\t\thsl.s = saturation;\n\t\t\thsl.l = lightness;\n\n\t\t\treturn hsl;\n\n\t\t},\n\n\t\tgetStyle: function () {\n\n\t\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t\t},\n\n\t\toffsetHSL: function ( h, s, l ) {\n\n\t\t\tvar hsl = this.getHSL();\n\n\t\t\thsl.h += h; hsl.s += s; hsl.l += l;\n\n\t\t\tthis.setHSL( hsl.h, hsl.s, hsl.l );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( color ) {\n\n\t\t\tthis.r += color.r;\n\t\t\tthis.g += color.g;\n\t\t\tthis.b += color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddColors: function ( color1, color2 ) {\n\n\t\t\tthis.r = color1.r + color2.r;\n\t\t\tthis.g = color1.g + color2.g;\n\t\t\tthis.b = color1.b + color2.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.r += s;\n\t\t\tthis.g += s;\n\t\t\tthis.b += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function( color ) {\n\n\t\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( color ) {\n\n\t\t\tthis.r *= color.r;\n\t\t\tthis.g *= color.g;\n\t\t\tthis.b *= color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tthis.r *= s;\n\t\t\tthis.g *= s;\n\t\t\tthis.b *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerp: function ( color, alpha ) {\n\n\t\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( c ) {\n\n\t\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.r = array[ offset ];\n\t\t\tthis.g = array[ offset + 1 ];\n\t\t\tthis.b = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.r;\n\t\t\tarray[ offset + 1 ] = this.g;\n\t\t\tarray[ offset + 2 ] = this.b;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\treturn this.getHex();\n\n\t\t}\n\n\t};\n\n\tvar 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, '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\n\t/**\n\t * Uniforms library for shared webgl shaders\n\t */\n\n\tvar UniformsLib = {\n\n\t\tcommon: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) },\n\n\t\t\tspecularMap: { value: null },\n\t\t\talphaMap: { value: null },\n\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: - 1 },\n\t\t\treflectivity: { value: 1.0 },\n\t\t\trefractionRatio: { value: 0.98 }\n\n\t\t},\n\n\t\taomap: {\n\n\t\t\taoMap: { value: null },\n\t\t\taoMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\tlightmap: {\n\n\t\t\tlightMap: { value: null },\n\t\t\tlightMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\temissivemap: {\n\n\t\t\temissiveMap: { value: null }\n\n\t\t},\n\n\t\tbumpmap: {\n\n\t\t\tbumpMap: { value: null },\n\t\t\tbumpScale: { value: 1 }\n\n\t\t},\n\n\t\tnormalmap: {\n\n\t\t\tnormalMap: { value: null },\n\t\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t\t},\n\n\t\tdisplacementmap: {\n\n\t\t\tdisplacementMap: { value: null },\n\t\t\tdisplacementScale: { value: 1 },\n\t\t\tdisplacementBias: { value: 0 }\n\n\t\t},\n\n\t\troughnessmap: {\n\n\t\t\troughnessMap: { value: null }\n\n\t\t},\n\n\t\tmetalnessmap: {\n\n\t\t\tmetalnessMap: { value: null }\n\n\t\t},\n\n\t\tfog: {\n\n\t\t\tfogDensity: { value: 0.00025 },\n\t\t\tfogNear: { value: 1 },\n\t\t\tfogFar: { value: 2000 },\n\t\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t\t},\n\n\t\tlights: {\n\n\t\t\tambientLightColor: { value: [] },\n\n\t\t\tdirectionalLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tcolor: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tdirectionalShadowMap: { value: [] },\n\t\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\t\tspotLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdirection: {},\n\t\t\t\tdistance: {},\n\t\t\t\tconeCos: {},\n\t\t\t\tpenumbraCos: {},\n\t\t\t\tdecay: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tspotShadowMap: { value: [] },\n\t\t\tspotShadowMatrix: { value: [] },\n\n\t\t\tpointLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdecay: {},\n\t\t\t\tdistance: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tpointShadowMap: { value: [] },\n\t\t\tpointShadowMatrix: { value: [] },\n\n\t\t\themisphereLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tskyColor: {},\n\t\t\t\tgroundColor: {}\n\t\t\t} }\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\t\t\tsize: { value: 1.0 },\n\t\t\tscale: { value: 1.0 },\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) }\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t */\n\n\tvar ShaderLib = {\n\n\t\tbasic: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.fog\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t\t},\n\n\t\tlambert: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\n\t\t\t\t{\n\t\t\t\t\temissive : { value: new Color( 0x000000 ) }\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t\t},\n\n\t\tphong: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\n\t\t\t\t{\n\t\t\t\t\temissive : { value: new Color( 0x000000 ) },\n\t\t\t\t\tspecular : { value: new Color( 0x111111 ) },\n\t\t\t\t\tshininess: { value: 30 }\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t\t},\n\n\t\tstandard: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.roughnessmap,\n\t\t\t\tUniformsLib.metalnessmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\n\t\t\t\t{\n\t\t\t\t\temissive : { value: new Color( 0x000000 ) },\n\t\t\t\t\troughness: { value: 0.5 },\n\t\t\t\t\tmetalness: { value: 0 },\n\t\t\t\t\tenvMapIntensity : { value: 1 }, // temporary\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.points,\n\t\t\t\tUniformsLib.fog\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.points_vert,\n\t\t\tfragmentShader: ShaderChunk.points_frag\n\n\t\t},\n\n\t\tdashed: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.fog,\n\n\t\t\t\t{\n\t\t\t\t\tscale : { value: 1 },\n\t\t\t\t\tdashSize : { value: 1 },\n\t\t\t\t\ttotalSize: { value: 2 }\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t\t},\n\n\t\tdepth: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.displacementmap\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.depth_vert,\n\t\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t\t},\n\n\t\tnormal: {\n\n\t\t\tuniforms: {\n\n\t\t\t\topacity : { value: 1.0 }\n\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.normal_vert,\n\t\t\tfragmentShader: ShaderChunk.normal_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tcube: {\n\n\t\t\tuniforms: {\n\t\t\t\ttCube: { value: null },\n\t\t\t\ttFlip: { value: - 1 },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.cube_vert,\n\t\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tequirect: {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t\ttFlip: { value: - 1 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t\t},\n\n\t\tdistanceRGBA: {\n\n\t\t\tuniforms: {\n\n\t\t\t\tlightPos: { value: new Vector3() }\n\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t\t}\n\n\t};\n\n\tShaderLib.physical = {\n\n\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\tShaderLib.standard.uniforms,\n\n\t\t\t{\n\t\t\t\tclearCoat: { value: 0 },\n\t\t\t\tclearCoatRoughness: { value: 0 }\n\t\t\t}\n\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Box2( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );\n\n\t}\n\n\tBox2.prototype = {\n\n\t\tconstructor: Box2,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = + Infinity;\n\t\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\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\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tif ( point.x < this.min.x || point.x > this.max.x ||\n\t\t\t point.y < this.min.y || point.y > this.max.y ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\tif ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) &&\n\t\t\t ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\n\t\t\tif ( box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t box.max.y < this.min.y || box.min.y > this.max.y ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlarePlugin( renderer, flares ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar shader, program, attributes, uniforms;\n\n\t\tvar tempTexture, occlusionTexture;\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 1, - 1, 0, 0,\n\t\t\t\t 1, - 1, 1, 0,\n\t\t\t\t 1, 1, 1, 1,\n\t\t\t\t- 1, 1, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\t// buffers\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\t// textures\n\n\t\t\ttempTexture = gl.createTexture();\n\t\t\tocclusionTexture = gl.createTexture();\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tshader = {\n\n\t\t\t\tvertexShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform vec3 screenPosition;\",\n\t\t\t\t\t\"uniform vec2 scale;\",\n\t\t\t\t\t\"uniform float rotation;\",\n\n\t\t\t\t\t\"uniform sampler2D occlusionMap;\",\n\n\t\t\t\t\t\"attribute vec2 position;\",\n\t\t\t\t\t\"attribute vec2 uv;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t\"vUV = uv;\",\n\n\t\t\t\t\t\t\"vec2 pos = position;\",\n\n\t\t\t\t\t\t\"if ( renderType == 2 ) {\",\n\n\t\t\t\t\t\t\t\"vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\",\n\n\t\t\t\t\t\t\t\"vVisibility = visibility.r / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.g / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= visibility.b / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.a / 9.0;\",\n\n\t\t\t\t\t\t\t\"pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\",\n\t\t\t\t\t\t\t\"pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\t\"gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" ),\n\n\t\t\t\tfragmentShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform sampler2D map;\",\n\t\t\t\t\t\"uniform float opacity;\",\n\t\t\t\t\t\"uniform vec3 color;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t// pink square\n\n\t\t\t\t\t\t\"if ( renderType == 0 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\",\n\n\t\t\t\t\t\t// restore\n\n\t\t\t\t\t\t\"} else if ( renderType == 1 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = texture2D( map, vUV );\",\n\n\t\t\t\t\t\t// flare\n\n\t\t\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\t\t\"vec4 texture = texture2D( map, vUV );\",\n\t\t\t\t\t\t\t\"texture.a *= opacity * vVisibility;\",\n\t\t\t\t\t\t\t\"gl_FragColor = texture;\",\n\t\t\t\t\t\t\t\"gl_FragColor.rgb *= color;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" )\n\n\t\t\t};\n\n\t\t\tprogram = createProgram( shader );\n\n\t\t\tattributes = {\n\t\t\t\tvertex: gl.getAttribLocation ( program, \"position\" ),\n\t\t\t\tuv: gl.getAttribLocation ( program, \"uv\" )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\trenderType: gl.getUniformLocation( program, \"renderType\" ),\n\t\t\t\tmap: gl.getUniformLocation( program, \"map\" ),\n\t\t\t\tocclusionMap: gl.getUniformLocation( program, \"occlusionMap\" ),\n\t\t\t\topacity: gl.getUniformLocation( program, \"opacity\" ),\n\t\t\t\tcolor: gl.getUniformLocation( program, \"color\" ),\n\t\t\t\tscale: gl.getUniformLocation( program, \"scale\" ),\n\t\t\t\trotation: gl.getUniformLocation( program, \"rotation\" ),\n\t\t\t\tscreenPosition: gl.getUniformLocation( program, \"screenPosition\" )\n\t\t\t};\n\n\t\t}\n\n\t\t/*\n\t\t * Render lens flares\n\t\t * Method: renders 16x16 0xff00ff-colored points scattered over the light source area,\n\t\t * reads these back and calculates occlusion.\n\t\t */\n\n\t\tthis.render = function ( scene, camera, viewport ) {\n\n\t\t\tif ( flares.length === 0 ) return;\n\n\t\t\tvar tempPosition = new Vector3();\n\n\t\t\tvar invAspect = viewport.w / viewport.z,\n\t\t\t\thalfViewportWidth = viewport.z * 0.5,\n\t\t\t\thalfViewportHeight = viewport.w * 0.5;\n\n\t\t\tvar size = 16 / viewport.w,\n\t\t\t\tscale = new Vector2( size * invAspect, size );\n\n\t\t\tvar screenPosition = new Vector3( 1, 1, 0 ),\n\t\t\t\tscreenPositionPixels = new Vector2( 1, 1 );\n\n\t\t\tvar validArea = new Box2();\n\n\t\t\tvalidArea.min.set( viewport.x, viewport.y );\n\t\t\tvalidArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) );\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.vertex );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t// loop through all lens flares to update their occlusion and positions\n\t\t\t// setup gl and common used attribs/uniforms\n\n\t\t\tgl.uniform1i( uniforms.occlusionMap, 0 );\n\t\t\tgl.uniform1i( uniforms.map, 1 );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.setDepthWrite( false );\n\n\t\t\tfor ( var i = 0, l = flares.length; i < l; i ++ ) {\n\n\t\t\t\tsize = 16 / viewport.w;\n\t\t\t\tscale.set( size * invAspect, size );\n\n\t\t\t\t// calc object screen position\n\n\t\t\t\tvar flare = flares[ i ];\n\n\t\t\t\ttempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] );\n\n\t\t\t\ttempPosition.applyMatrix4( camera.matrixWorldInverse );\n\t\t\t\ttempPosition.applyProjection( camera.projectionMatrix );\n\n\t\t\t\t// setup arrays for gl programs\n\n\t\t\t\tscreenPosition.copy( tempPosition );\n\n\t\t\t\t// horizontal and vertical coordinate of the lower left corner of the pixels to copy\n\n\t\t\t\tscreenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8;\n\t\t\t\tscreenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8;\n\n\t\t\t\t// screen cull\n\n\t\t\t\tif ( validArea.containsPoint( screenPositionPixels ) === true ) {\n\n\t\t\t\t\t// save current RGB to temp texture\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, null );\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// render pink quad\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\n\t\t\t\t\tstate.disable( gl.BLEND );\n\t\t\t\t\tstate.enable( gl.DEPTH_TEST );\n\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// copy result to occlusionMap\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// restore graphics\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 1 );\n\t\t\t\t\tstate.disable( gl.DEPTH_TEST );\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// update object positions\n\n\t\t\t\t\tflare.positionScreen.copy( screenPosition );\n\n\t\t\t\t\tif ( flare.customUpdateCallback ) {\n\n\t\t\t\t\t\tflare.customUpdateCallback( flare );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tflare.updateLensFlares();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// render flares\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 2 );\n\t\t\t\t\tstate.enable( gl.BLEND );\n\n\t\t\t\t\tfor ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar sprite = flare.lensFlares[ j ];\n\n\t\t\t\t\t\tif ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) {\n\n\t\t\t\t\t\t\tscreenPosition.x = sprite.x;\n\t\t\t\t\t\t\tscreenPosition.y = sprite.y;\n\t\t\t\t\t\t\tscreenPosition.z = sprite.z;\n\n\t\t\t\t\t\t\tsize = sprite.size * sprite.scale / viewport.w;\n\n\t\t\t\t\t\t\tscale.x = size * invAspect;\n\t\t\t\t\t\t\tscale.y = size;\n\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\t\t\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.rotation, sprite.rotation );\n\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.opacity, sprite.opacity );\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b );\n\n\t\t\t\t\t\t\tstate.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst );\n\t\t\t\t\t\t\trenderer.setTexture2D( sprite.texture, 1 );\n\n\t\t\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\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// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.DEPTH_TEST );\n\t\t\tstate.setDepthWrite( true );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram( shader ) {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\n\t\t\tvar prefix = \"precision \" + renderer.getPrecision() + \" float;\\n\";\n\n\t\t\tgl.shaderSource( fragmentShader, prefix + shader.fragmentShader );\n\t\t\tgl.shaderSource( vertexShader, prefix + shader.vertexShader );\n\n\t\t\tgl.compileShader( fragmentShader );\n\t\t\tgl.compileShader( vertexShader );\n\n\t\t\tgl.attachShader( program, fragmentShader );\n\t\t\tgl.attachShader( program, vertexShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpritePlugin( renderer, sprites ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar program, attributes, uniforms;\n\n\t\tvar texture;\n\n\t\t// decompose matrixWorld\n\n\t\tvar spritePosition = new Vector3();\n\t\tvar spriteRotation = new Quaternion();\n\t\tvar spriteScale = new Vector3();\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 0.5, - 0.5, 0, 0,\n\t\t\t\t 0.5, - 0.5, 1, 0,\n\t\t\t\t 0.5, 0.5, 1, 1,\n\t\t\t\t- 0.5, 0.5, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\tprogram = createProgram();\n\n\t\t\tattributes = {\n\t\t\t\tposition:\t\t\tgl.getAttribLocation ( program, 'position' ),\n\t\t\t\tuv:\t\t\t\t\tgl.getAttribLocation ( program, 'uv' )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\tuvOffset:\t\t\tgl.getUniformLocation( program, 'uvOffset' ),\n\t\t\t\tuvScale:\t\t\tgl.getUniformLocation( program, 'uvScale' ),\n\n\t\t\t\trotation:\t\t\tgl.getUniformLocation( program, 'rotation' ),\n\t\t\t\tscale:\t\t\t\tgl.getUniformLocation( program, 'scale' ),\n\n\t\t\t\tcolor:\t\t\t\tgl.getUniformLocation( program, 'color' ),\n\t\t\t\tmap:\t\t\t\tgl.getUniformLocation( program, 'map' ),\n\t\t\t\topacity:\t\t\tgl.getUniformLocation( program, 'opacity' ),\n\n\t\t\t\tmodelViewMatrix: \tgl.getUniformLocation( program, 'modelViewMatrix' ),\n\t\t\t\tprojectionMatrix:\tgl.getUniformLocation( program, 'projectionMatrix' ),\n\n\t\t\t\tfogType:\t\t\tgl.getUniformLocation( program, 'fogType' ),\n\t\t\t\tfogDensity:\t\t\tgl.getUniformLocation( program, 'fogDensity' ),\n\t\t\t\tfogNear:\t\t\tgl.getUniformLocation( program, 'fogNear' ),\n\t\t\t\tfogFar:\t\t\t\tgl.getUniformLocation( program, 'fogFar' ),\n\t\t\t\tfogColor:\t\t\tgl.getUniformLocation( program, 'fogColor' ),\n\n\t\t\t\talphaTest:\t\t\tgl.getUniformLocation( program, 'alphaTest' )\n\t\t\t};\n\n\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\tcanvas.width = 8;\n\t\t\tcanvas.height = 8;\n\n\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\tcontext.fillStyle = 'white';\n\t\t\tcontext.fillRect( 0, 0, 8, 8 );\n\n\t\t\ttexture = new Texture( canvas );\n\t\t\ttexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( sprites.length === 0 ) return;\n\n\t\t\t// setup gl\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.position );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.BLEND );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tgl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );\n\n\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\tgl.uniform1i( uniforms.map, 0 );\n\n\t\t\tvar oldFogType = 0;\n\t\t\tvar sceneFogType = 0;\n\t\t\tvar fog = scene.fog;\n\n\t\t\tif ( fog ) {\n\n\t\t\t\tgl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );\n\n\t\t\t\tif ( (fog && fog.isFog) ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogNear, fog.near );\n\t\t\t\t\tgl.uniform1f( uniforms.fogFar, fog.far );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 1 );\n\t\t\t\t\toldFogType = 1;\n\t\t\t\t\tsceneFogType = 1;\n\n\t\t\t\t} else if ( (fog && fog.isFogExp2) ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogDensity, fog.density );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 2 );\n\t\t\t\t\toldFogType = 2;\n\t\t\t\t\tsceneFogType = 2;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tgl.uniform1i( uniforms.fogType, 0 );\n\t\t\t\toldFogType = 0;\n\t\t\t\tsceneFogType = 0;\n\n\t\t\t}\n\n\n\t\t\t// update positions and sort\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\n\t\t\t\tsprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld );\n\t\t\t\tsprite.z = - sprite.modelViewMatrix.elements[ 14 ];\n\n\t\t\t}\n\n\t\t\tsprites.sort( painterSortStable );\n\n\t\t\t// render all sprites\n\n\t\t\tvar scale = [];\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\t\t\t\tvar material = sprite.material;\n\n\t\t\t\tif ( material.visible === false ) continue;\n\n\t\t\t\tgl.uniform1f( uniforms.alphaTest, material.alphaTest );\n\t\t\t\tgl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements );\n\n\t\t\t\tsprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale );\n\n\t\t\t\tscale[ 0 ] = spriteScale.x;\n\t\t\t\tscale[ 1 ] = spriteScale.y;\n\n\t\t\t\tvar fogType = 0;\n\n\t\t\t\tif ( scene.fog && material.fog ) {\n\n\t\t\t\t\tfogType = sceneFogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( oldFogType !== fogType ) {\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, fogType );\n\t\t\t\t\toldFogType = fogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.map !== null ) {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, 0, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, 1, 1 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.uniform1f( uniforms.opacity, material.opacity );\n\t\t\t\tgl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );\n\n\t\t\t\tgl.uniform1f( uniforms.rotation, material.rotation );\n\t\t\t\tgl.uniform2fv( uniforms.scale, scale );\n\n\t\t\t\tstate.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );\n\t\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\t\tstate.setDepthWrite( material.depthWrite );\n\n\t\t\t\tif ( material.map ) {\n\n\t\t\t\t\trenderer.setTexture2D( material.map, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setTexture2D( texture, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram() {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\n\t\t\tgl.shaderSource( vertexShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform float rotation;',\n\t\t\t\t'uniform vec2 scale;',\n\t\t\t\t'uniform vec2 uvOffset;',\n\t\t\t\t'uniform vec2 uvScale;',\n\n\t\t\t\t'attribute vec2 position;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vUV = uvOffset + uv * uvScale;',\n\n\t\t\t\t\t'vec2 alignedPosition = position * scale;',\n\n\t\t\t\t\t'vec2 rotatedPosition;',\n\t\t\t\t\t'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',\n\t\t\t\t\t'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',\n\n\t\t\t\t\t'vec4 finalPosition;',\n\n\t\t\t\t\t'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',\n\t\t\t\t\t'finalPosition.xy += rotatedPosition;',\n\t\t\t\t\t'finalPosition = projectionMatrix * finalPosition;',\n\n\t\t\t\t\t'gl_Position = finalPosition;',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.shaderSource( fragmentShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform vec3 color;',\n\t\t\t\t'uniform sampler2D map;',\n\t\t\t\t'uniform float opacity;',\n\n\t\t\t\t'uniform int fogType;',\n\t\t\t\t'uniform vec3 fogColor;',\n\t\t\t\t'uniform float fogDensity;',\n\t\t\t\t'uniform float fogNear;',\n\t\t\t\t'uniform float fogFar;',\n\t\t\t\t'uniform float alphaTest;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vec4 texture = texture2D( map, vUV );',\n\n\t\t\t\t\t'if ( texture.a < alphaTest ) discard;',\n\n\t\t\t\t\t'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',\n\n\t\t\t\t\t'if ( fogType > 0 ) {',\n\n\t\t\t\t\t\t'float depth = gl_FragCoord.z / gl_FragCoord.w;',\n\t\t\t\t\t\t'float fogFactor = 0.0;',\n\n\t\t\t\t\t\t'if ( fogType == 1 ) {',\n\n\t\t\t\t\t\t\t'fogFactor = smoothstep( fogNear, fogFar, depth );',\n\n\t\t\t\t\t\t'} else {',\n\n\t\t\t\t\t\t\t'const float LOG2 = 1.442695;',\n\t\t\t\t\t\t\t'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );',\n\t\t\t\t\t\t\t'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',\n\n\t\t\t\t\t\t'}',\n\n\t\t\t\t\t\t'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );',\n\n\t\t\t\t\t'}',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.compileShader( vertexShader );\n\t\t\tgl.compileShader( fragmentShader );\n\n\t\t\tgl.attachShader( program, vertexShader );\n\t\t\tgl.attachShader( program, fragmentShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\t\treturn a.renderOrder - b.renderOrder;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn b.id - a.id;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Material() {\n\n\t\tObject.defineProperty( this, 'id', { value: MaterialIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.fog = true;\n\t\tthis.lights = true;\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading\n\t\tthis.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = 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\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\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.alphaTest = 0;\n\t\tthis.premultipliedAlpha = false;\n\n\t\tthis.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer\n\n\t\tthis.visible = true;\n\n\t\tthis._needsUpdate = true;\n\n\t}\n\n\tMaterial.prototype = {\n\n\t\tconstructor: Material,\n\n\t\tisMaterial: true,\n\n\t\tget needsUpdate() {\n\n\t\t\treturn this._needsUpdate;\n\n\t\t},\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.update();\n\t\t\tthis._needsUpdate = value;\n\n\t\t},\n\n\t\tsetValues: function ( values ) {\n\n\t\t\tif ( values === undefined ) return;\n\n\t\t\tfor ( var key in values ) {\n\n\t\t\t\tvar newValue = values[ key ];\n\n\t\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.Material: '\" + key + \"' parameter is undefined.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar currentValue = this[ key ];\n\n\t\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.\" + this.type + \": '\" + key + \"' is not a property of this material.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tif ( (currentValue && currentValue.isColor) ) {\n\n\t\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t\t} else if ( (currentValue && currentValue.isVector3) && (newValue && newValue.isVector3) ) {\n\n\t\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t\t} else if ( key === 'overdraw' ) {\n\n\t\t\t\t\t// ensure overdraw is backwards-compatible with legacy boolean type\n\t\t\t\t\tthis[ key ] = Number( newValue );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar isRoot = meta === undefined;\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tmeta = {\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Material',\n\t\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Material serialization\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( (this.color && this.color.isColor) ) data.color = this.color.getHex();\n\n\t\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\t\tif ( (this.emissive && this.emissive.isColor) ) data.emissive = this.emissive.getHex();\n\t\t\tif ( (this.specular && this.specular.isColor) ) data.specular = this.specular.getHex();\n\t\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\n\t\t\tif ( (this.map && this.map.isTexture) ) data.map = this.map.toJSON( meta ).uuid;\n\t\t\tif ( (this.alphaMap && this.alphaMap.isTexture) ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.lightMap && this.lightMap.isTexture) ) data.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.bumpMap && this.bumpMap.isTexture) ) {\n\n\t\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t\t}\n\t\t\tif ( (this.normalMap && this.normalMap.isTexture) ) {\n\n\t\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t\t}\n\t\t\tif ( (this.displacementMap && this.displacementMap.isTexture) ) {\n\n\t\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t\t}\n\t\t\tif ( (this.roughnessMap && this.roughnessMap.isTexture) ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.metalnessMap && this.metalnessMap.isTexture) ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\t\tif ( (this.emissiveMap && this.emissiveMap.isTexture) ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.specularMap && this.specularMap.isTexture) ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\n\t\t\tif ( (this.envMap && this.envMap.isTexture) ) {\n\n\t\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\t\t\t\tdata.reflectivity = this.reflectivity; // Scale behind envMap\n\n\t\t\t}\n\n\t\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\t\tif ( this.shading !== SmoothShading ) data.shading = this.shading;\n\t\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\t\tif ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors;\n\n\t\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\t\tdata.depthFunc = this.depthFunc;\n\t\t\tdata.depthTest = this.depthTest;\n\t\t\tdata.depthWrite = this.depthWrite;\n\n\t\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\t\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\t\tdata.skinning = this.skinning;\n\t\t\tdata.morphTargets = this.morphTargets;\n\n\t\t\t// TODO: Copied from Object3D.toJSON\n\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.fog = source.fog;\n\t\t\tthis.lights = source.lights;\n\n\t\t\tthis.blending = source.blending;\n\t\t\tthis.side = source.side;\n\t\t\tthis.shading = source.shading;\n\t\t\tthis.vertexColors = source.vertexColors;\n\n\t\t\tthis.opacity = source.opacity;\n\t\t\tthis.transparent = source.transparent;\n\n\t\t\tthis.blendSrc = source.blendSrc;\n\t\t\tthis.blendDst = source.blendDst;\n\t\t\tthis.blendEquation = source.blendEquation;\n\t\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\t\tthis.depthFunc = source.depthFunc;\n\t\t\tthis.depthTest = source.depthTest;\n\t\t\tthis.depthWrite = source.depthWrite;\n\n\t\t\tthis.colorWrite = source.colorWrite;\n\n\t\t\tthis.precision = source.precision;\n\n\t\t\tthis.polygonOffset = source.polygonOffset;\n\t\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\t\tthis.alphaTest = source.alphaTest;\n\n\t\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\t\tthis.overdraw = source.overdraw;\n\n\t\t\tthis.visible = source.visible;\n\t\t\tthis.clipShadows = source.clipShadows;\n\t\t\tthis.clipIntersection = source.clipIntersection;\n\n\t\t\tvar srcPlanes = source.clippingPlanes,\n\t\t\t\tdstPlanes = null;\n\n\t\t\tif ( srcPlanes !== null ) {\n\n\t\t\t\tvar n = srcPlanes.length;\n\t\t\t\tdstPlanes = new Array( n );\n\n\t\t\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t\tthis.clippingPlanes = dstPlanes;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdate: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'update' } );\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( Material.prototype, EventDispatcher.prototype );\n\n\tvar count$1 = 0;\n\tfunction MaterialIdCount() { return count$1++; }\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * defines: { \"label\" : \"value\" },\n\t * uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n\t *\n\t * fragmentShader: ,\n\t * vertexShader: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * lights: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction ShaderMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\n\t\tthis.vertexShader = 'void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}';\n\t\tthis.fragmentShader = 'void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}';\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.skinning = false; // set to use skinning attribute streams\n\t\tthis.morphTargets = false; // set to use morph targets\n\t\tthis.morphNormals = false; // set to use morph normals\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'uv2': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tShaderMaterial.prototype = Object.create( Material.prototype );\n\tShaderMaterial.prototype.constructor = ShaderMaterial;\n\n\tShaderMaterial.prototype.isShaderMaterial = true;\n\n\tShaderMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = UniformsUtils.clone( source.uniforms );\n\n\t\tthis.defines = source.defines;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.skinning = source.skinning;\n\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\tthis.extensions = source.extensions;\n\n\t\treturn this;\n\n\t};\n\n\tShaderMaterial.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Material.prototype.toJSON.call( this, meta );\n\n\t\tdata.uniforms = this.uniforms;\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / https://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t *\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t * }\n\t */\n\n\tfunction MeshDepthMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\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.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshDepthMaterial.prototype = Object.create( Material.prototype );\n\tMeshDepthMaterial.prototype.constructor = MeshDepthMaterial;\n\n\tMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\n\tMeshDepthMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\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\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Box3( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );\n\n\t}\n\n\tBox3.prototype = {\n\n\t\tconstructor: Box3,\n\n\t\tisBox3: true,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromArray: function ( array ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tvar x = array[ i ];\n\t\t\t\tvar y = array[ i + 1 ];\n\t\t\t\tvar z = array[ i + 2 ];\n\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\t\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromObject: function () {\n\n\t\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t\t// accounting for both the object's, and children's, world transforms\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function setFromObject( object ) {\n\n\t\t\t\tvar scope = this;\n\n\t\t\t\tobject.updateMatrixWorld( true );\n\n\t\t\t\tthis.makeEmpty();\n\n\t\t\t\tobject.traverse( function ( node ) {\n\n\t\t\t\t\tvar geometry = node.geometry;\n\n\t\t\t\t\tif ( geometry !== undefined ) {\n\n\t\t\t\t\t\tif ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\tv1.copy( vertices[ i ] );\n\t\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\t\t\tvar attribute = geometry.attributes.position;\n\n\t\t\t\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\t\t\t\tvar array, offset, stride;\n\n\t\t\t\t\t\t\t\tif ( (attribute && attribute.isInterleavedBufferAttribute) ) {\n\n\t\t\t\t\t\t\t\t\tarray = attribute.data.array;\n\t\t\t\t\t\t\t\t\toffset = attribute.offset;\n\t\t\t\t\t\t\t\t\tstride = attribute.data.stride;\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tarray = attribute.array;\n\t\t\t\t\t\t\t\t\toffset = 0;\n\t\t\t\t\t\t\t\t\tstride = 3;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tfor ( var i = offset, il = array.length; i < il; i += stride ) {\n\n\t\t\t\t\t\t\t\t\tv1.fromArray( array, i );\n\t\t\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\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} );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\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\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tif ( point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\t\t point.y < this.min.y || point.y > this.max.y ||\n\t\t\t\t\t point.z < this.min.z || point.z > this.max.z ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\tif ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) &&\n\t\t\t\t ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) &&\n\t\t\t\t ( this.min.z <= box.min.z ) && ( box.max.z <= this.max.z ) ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\n\t\t\tif ( box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\t\t box.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\t\t\t box.max.z < this.min.z || box.min.z > this.max.z ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tintersectsSphere: ( function () {\n\n\t\t\tvar closestPoint;\n\n\t\t\treturn function intersectsSphere( sphere ) {\n\n\t\t\t\tif ( closestPoint === undefined ) closestPoint = new Vector3();\n\n\t\t\t\t// Find the point on the AABB closest to the sphere center.\n\t\t\t\tthis.clampPoint( sphere.center, closestPoint );\n\n\t\t\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\t\t\treturn closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\t\tvar min, max;\n\n\t\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t\t} else {\n\n\t\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t\t}\n\n\t\t\treturn ( min <= plane.constant && max >= plane.constant );\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetBoundingSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function getBoundingSphere( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Sphere();\n\n\t\t\t\tthis.getCenter( result.center );\n\n\t\t\t\tresult.radius = this.getSize( v1 ).length() * 0.5;\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\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\t\tif( this.isEmpty() ) this.makeEmpty();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar points = [\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3()\n\t\t\t];\n\n\t\t\treturn function applyMatrix4( matrix ) {\n\n\t\t\t\t// transform of empty box is an empty box.\n\t\t\t\tif( this.isEmpty() ) return this;\n\n\t\t\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t\t\tpoints[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t\t\tpoints[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t\t\tpoints[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t\t\tpoints[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t\t\tpoints[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t\t\tpoints[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t\t\tpoints[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t\t\tpoints[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix );\t// 111\n\n\t\t\t\tthis.setFromPoints( points );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Sphere( center, radius ) {\n\n\t\tthis.center = ( center !== undefined ) ? center : new Vector3();\n\t\tthis.radius = ( radius !== undefined ) ? radius : 0;\n\n\t}\n\n\tSphere.prototype = {\n\n\t\tconstructor: Sphere,\n\n\t\tset: function ( center, radius ) {\n\n\t\t\tthis.center.copy( center );\n\t\t\tthis.radius = radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function () {\n\n\t\t\tvar box = new Box3();\n\n\t\t\treturn function setFromPoints( points, optionalCenter ) {\n\n\t\t\t\tvar center = this.center;\n\n\t\t\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\t\t\tcenter.copy( optionalCenter );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbox.setFromPoints( points ).getCenter( center );\n\n\t\t\t\t}\n\n\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( sphere ) {\n\n\t\t\tthis.center.copy( sphere.center );\n\t\t\tthis.radius = sphere.radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tempty: function () {\n\n\t\t\treturn ( this.radius <= 0 );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar radiusSum = this.radius + sphere.radius;\n\n\t\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsSphere( this );\n\n\t\t},\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We use the following equation to compute the signed distance from\n\t\t\t// the center of the sphere to the plane.\n\t\t\t//\n\t\t\t// distance = q * n - d\n\t\t\t//\n\t\t\t// If this distance is greater than the radius of the sphere,\n\t\t\t// then there is no intersection.\n\n\t\t\treturn Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.copy( point );\n\n\t\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t\tresult.sub( this.center ).normalize();\n\t\t\t\tresult.multiplyScalar( this.radius ).add( this.center );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\tgetBoundingBox: function ( optionalTarget ) {\n\n\t\t\tvar box = optionalTarget || new Box3();\n\n\t\t\tbox.set( this.center, this.center );\n\t\t\tbox.expandByScalar( this.radius );\n\n\t\t\treturn box;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.center.applyMatrix4( matrix );\n\t\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.center.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( sphere ) {\n\n\t\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t * @author tschw\n\t */\n\n\tfunction Matrix3() {\n\n\t\tthis.elements = new Float32Array( [\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 ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix3.prototype = {\n\n\t\tconstructor: Matrix3,\n\n\t\tisMatrix3: true,\n\n\t\tset: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0,\n\t\t\t\t0, 1, 0,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 3 ], me[ 6 ],\n\t\t\t\tme[ 1 ], me[ 4 ], me[ 7 ],\n\t\t\t\tme[ 2 ], me[ 5 ], me[ 8 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix4: function( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToVector3Array: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToVector3Array( array, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = array.length;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i += 3, j += 3 ) {\n\n\t\t\t\t\tv1.fromArray( array, j );\n\t\t\t\t\tv1.applyMatrix3( this );\n\t\t\t\t\tv1.toArray( array, j );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyToBuffer: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBuffer( buffer, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = buffer.length / buffer.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i ++, j ++ ) {\n\n\t\t\t\t\tv1.x = buffer.getX( j );\n\t\t\t\t\tv1.y = buffer.getY( j );\n\t\t\t\t\tv1.z = buffer.getZ( j );\n\n\t\t\t\t\tv1.applyMatrix3( this );\n\n\t\t\t\t\tbuffer.setXYZ( j, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn buffer;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t\t},\n\n\t\tgetInverse: function ( matrix, throwOnDegenerate ) {\n\n\t\t\tif ( (matrix && matrix.isMatrix4) ) {\n\n\t\t\t\tconsole.error( \"THREE.Matrix3.getInverse no longer takes a Matrix4 argument.\" );\n\n\t\t\t}\n\n\t\t\tvar me = matrix.elements,\n\t\t\t\tte = this.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],\n\t\t\t\tn12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],\n\t\t\t\tn13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],\n\n\t\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\t\tte[ 3 ] = t12 * detInv;\n\t\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\t\tte[ 6 ] = t13 * detInv;\n\t\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar tmp, m = this.elements;\n\n\t\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset is deprecated \" +\n\t\t\t\t\t\"- just use .toArray instead.\" );\n\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\n\t\tgetNormalMatrix: function ( matrix4 ) {\n\n\t\t\treturn this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();\n\n\t\t},\n\n\t\ttransposeIntoArray: function ( r ) {\n\n\t\t\tvar m = this.elements;\n\n\t\t\tr[ 0 ] = m[ 0 ];\n\t\t\tr[ 1 ] = m[ 3 ];\n\t\t\tr[ 2 ] = m[ 6 ];\n\t\t\tr[ 3 ] = m[ 1 ];\n\t\t\tr[ 4 ] = m[ 4 ];\n\t\t\tr[ 5 ] = m[ 7 ];\n\t\t\tr[ 6 ] = m[ 2 ];\n\t\t\tr[ 7 ] = m[ 5 ];\n\t\t\tr[ 8 ] = m[ 8 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 9; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Plane( normal, constant ) {\n\n\t\tthis.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );\n\t\tthis.constant = ( constant !== undefined ) ? constant : 0;\n\n\t}\n\n\tPlane.prototype = {\n\n\t\tconstructor: Plane,\n\n\t\tset: function ( normal, constant ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponents: function ( x, y, z, w ) {\n\n\t\t\tthis.normal.set( x, y, z );\n\t\t\tthis.constant = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromNormalAndCoplanarPoint: function ( normal, point ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = - point.dot( this.normal );\t// must be this.normal, not normal, as this.normal is normalized\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCoplanarPoints: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function setFromCoplanarPoints( a, b, c ) {\n\n\t\t\t\tvar normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();\n\n\t\t\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\t\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( plane ) {\n\n\t\t\tthis.normal.copy( plane.normal );\n\t\t\tthis.constant = plane.constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\t\tvar inverseNormalLength = 1.0 / this.normal.length();\n\t\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\t\tthis.constant *= inverseNormalLength;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.constant *= - 1;\n\t\t\tthis.normal.negate();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn this.normal.dot( point ) + this.constant;\n\n\t\t},\n\n\t\tdistanceToSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t\t},\n\n\t\tprojectPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn this.orthoPoint( point, optionalTarget ).sub( point ).negate();\n\n\t\t},\n\n\t\torthoPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar perpendicularMagnitude = this.distanceToPoint( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( perpendicularMagnitude );\n\n\t\t},\n\n\t\tintersectLine: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectLine( line, optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tvar direction = line.delta( v1 );\n\n\t\t\t\tvar denominator = this.normal.dot( direction );\n\n\t\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t\t// line is coplanar, return origin\n\t\t\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\t\t\treturn result.copy( line.start );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\tvar t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\t\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\treturn result.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsLine: function ( line ) {\n\n\t\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\t\tvar startSign = this.distanceToPoint( line.start );\n\t\t\tvar endSign = this.distanceToPoint( line.end );\n\n\t\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsPlane( this );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn sphere.intersectsPlane( this );\n\n\t\t},\n\n\t\tcoplanarPoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar m1 = new Matrix3();\n\n\t\t\treturn function applyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\t\t\tvar referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix );\n\n\t\t\t\t// transform normal based on theory here:\n\t\t\t\t// http://www.songho.ca/opengl/gl_normaltransform.html\n\t\t\t\tvar normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix );\n\t\t\t\tvar normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t// recalculate constant (like in setFromNormalAndCoplanarPoint)\n\t\t\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.constant = this.constant - offset.dot( this.normal );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( plane ) {\n\n\t\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Frustum( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tthis.planes = [\n\n\t\t\t( p0 !== undefined ) ? p0 : new Plane(),\n\t\t\t( p1 !== undefined ) ? p1 : new Plane(),\n\t\t\t( p2 !== undefined ) ? p2 : new Plane(),\n\t\t\t( p3 !== undefined ) ? p3 : new Plane(),\n\t\t\t( p4 !== undefined ) ? p4 : new Plane(),\n\t\t\t( p5 !== undefined ) ? p5 : new Plane()\n\n\t\t];\n\n\t}\n\n\tFrustum.prototype = {\n\n\t\tconstructor: Frustum,\n\n\t\tset: function ( p0, p1, p2, p3, p4, p5 ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tplanes[ 0 ].copy( p0 );\n\t\t\tplanes[ 1 ].copy( p1 );\n\t\t\tplanes[ 2 ].copy( p2 );\n\t\t\tplanes[ 3 ].copy( p3 );\n\t\t\tplanes[ 4 ].copy( p4 );\n\t\t\tplanes[ 5 ].copy( p5 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( frustum ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix: function ( m ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar me = m.elements;\n\t\t\tvar me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\t\tvar me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\t\tvar me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\t\tvar me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tintersectsObject: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsObject( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere )\n\t\t\t\t\t.applyMatrix4( object.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSprite: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsSprite( sprite ) {\n\n\t\t\t\tsphere.center.set( 0, 0, 0 );\n\t\t\t\tsphere.radius = 0.7071067811865476;\n\t\t\t\tsphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar center = sphere.center;\n\t\t\tvar negRadius = - sphere.radius;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tvar distance = planes[ i ].distanceToPoint( center );\n\n\t\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tintersectsBox: function () {\n\n\t\t\tvar p1 = new Vector3(),\n\t\t\t\tp2 = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\tvar planes = this.planes;\n\n\t\t\t\tfor ( var i = 0; i < 6 ; i ++ ) {\n\n\t\t\t\t\tvar plane = planes[ i ];\n\n\t\t\t\t\tp1.x = plane.normal.x > 0 ? box.min.x : box.max.x;\n\t\t\t\t\tp2.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t\t\tp1.y = plane.normal.y > 0 ? box.min.y : box.max.y;\n\t\t\t\t\tp2.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t\t\tp1.z = plane.normal.z > 0 ? box.min.z : box.max.z;\n\t\t\t\t\tp2.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\t\t\tvar d1 = plane.distanceToPoint( p1 );\n\t\t\t\t\tvar d2 = plane.distanceToPoint( p2 );\n\n\t\t\t\t\t// if both outside plane, no intersection\n\n\t\t\t\t\tif ( d1 < 0 && d2 < 0 ) {\n\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t};\n\n\t\t}(),\n\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {\n\n\t\tvar _gl = _renderer.context,\n\t\t_state = _renderer.state,\n\t\t_frustum = new Frustum(),\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_lightShadows = _lights.shadows,\n\n\t\t_shadowMapSize = new Vector2(),\n\t\t_maxShadowMapSize = new Vector2( capabilities.maxTextureSize, capabilities.maxTextureSize ),\n\n\t\t_lookTarget = new Vector3(),\n\t\t_lightPositionWorld = new Vector3(),\n\n\t\t_renderList = [],\n\n\t\t_MorphingFlag = 1,\n\t\t_SkinningFlag = 2,\n\n\t\t_NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1,\n\n\t\t_depthMaterials = new Array( _NumberOfMaterialVariants ),\n\t\t_distanceMaterials = new Array( _NumberOfMaterialVariants ),\n\n\t\t_materialCache = {};\n\n\t\tvar 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\tvar 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\tvar cube2DViewPorts = [\n\t\t\tnew Vector4(), new Vector4(), new Vector4(),\n\t\t\tnew Vector4(), new Vector4(), new Vector4()\n\t\t];\n\n\t\t// init\n\n\t\tvar depthMaterialTemplate = new MeshDepthMaterial();\n\t\tdepthMaterialTemplate.depthPacking = RGBADepthPacking;\n\t\tdepthMaterialTemplate.clipping = true;\n\n\t\tvar distanceShader = ShaderLib[ \"distanceRGBA\" ];\n\t\tvar distanceUniforms = UniformsUtils.clone( distanceShader.uniforms );\n\n\t\tfor ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {\n\n\t\t\tvar useMorphing = ( i & _MorphingFlag ) !== 0;\n\t\t\tvar useSkinning = ( i & _SkinningFlag ) !== 0;\n\n\t\t\tvar depthMaterial = depthMaterialTemplate.clone();\n\t\t\tdepthMaterial.morphTargets = useMorphing;\n\t\t\tdepthMaterial.skinning = useSkinning;\n\n\t\t\t_depthMaterials[ i ] = depthMaterial;\n\n\t\t\tvar distanceMaterial = new ShaderMaterial( {\n\t\t\t\tdefines: {\n\t\t\t\t\t'USE_SHADOWMAP': ''\n\t\t\t\t},\n\t\t\t\tuniforms: distanceUniforms,\n\t\t\t\tvertexShader: distanceShader.vertexShader,\n\t\t\t\tfragmentShader: distanceShader.fragmentShader,\n\t\t\t\tmorphTargets: useMorphing,\n\t\t\t\tskinning: useSkinning,\n\t\t\t\tclipping: true\n\t\t\t} );\n\n\t\t\t_distanceMaterials[ i ] = distanceMaterial;\n\n\t\t}\n\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tthis.enabled = false;\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis.type = PCFShadowMap;\n\n\t\tthis.renderReverseSided = true;\n\t\tthis.renderSingleSided = true;\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\t\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\t\tif ( _lightShadows.length === 0 ) return;\n\n\t\t\t// Set GL state for depth map.\n\t\t\t_state.clearColor( 1, 1, 1, 1 );\n\t\t\t_state.disable( _gl.BLEND );\n\t\t\t_state.setDepthTest( true );\n\t\t\t_state.setScissorTest( false );\n\n\t\t\t// render depth map\n\n\t\t\tvar faceCount, isPointLight;\n\n\t\t\tfor ( var i = 0, il = _lightShadows.length; i < il; i ++ ) {\n\n\t\t\t\tvar light = _lightShadows[ i ];\n\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowCamera = shadow.camera;\n\n\t\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\t\t\t\t_shadowMapSize.min( _maxShadowMapSize );\n\n\t\t\t\tif ( (light && light.isPointLight) ) {\n\n\t\t\t\t\tfaceCount = 6;\n\t\t\t\t\tisPointLight = true;\n\n\t\t\t\t\tvar vpWidth = _shadowMapSize.x;\n\t\t\t\t\tvar vpHeight = _shadowMapSize.y;\n\n\t\t\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t\t\t// following orientation:\n\t\t\t\t\t//\n\t\t\t\t\t// xzXZ\n\t\t\t\t\t// y Y\n\t\t\t\t\t//\n\t\t\t\t\t// X - Positive x direction\n\t\t\t\t\t// x - Negative x direction\n\t\t\t\t\t// Y - Positive y direction\n\t\t\t\t\t// y - Negative y direction\n\t\t\t\t\t// Z - Positive z direction\n\t\t\t\t\t// z - Negative z direction\n\n\t\t\t\t\t// positive X\n\t\t\t\t\tcube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative X\n\t\t\t\t\tcube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Z\n\t\t\t\t\tcube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative Z\n\t\t\t\t\tcube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Y\n\t\t\t\t\tcube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight );\n\t\t\t\t\t// negative Y\n\t\t\t\t\tcube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight );\n\n\t\t\t\t\t_shadowMapSize.x *= 4.0;\n\t\t\t\t\t_shadowMapSize.y *= 2.0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfaceCount = 1;\n\t\t\t\t\tisPointLight = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\t\tvar pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\n\t\t\t\t\tshadowCamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tif ( (shadow && shadow.isSpotLightShadow) ) {\n\n\t\t\t\t\tshadow.update( light );\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowMap = shadow.map;\n\t\t\t\tvar shadowMatrix = shadow.matrix;\n\n\t\t\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tshadowCamera.position.copy( _lightPositionWorld );\n\n\t\t\t\t_renderer.setRenderTarget( shadowMap );\n\t\t\t\t_renderer.clear();\n\n\t\t\t\t// render shadow map for each cube face (if omni-directional) or\n\t\t\t\t// run a single pass if not\n\n\t\t\t\tfor ( var face = 0; face < faceCount; face ++ ) {\n\n\t\t\t\t\tif ( isPointLight ) {\n\n\t\t\t\t\t\t_lookTarget.copy( shadowCamera.position );\n\t\t\t\t\t\t_lookTarget.add( cubeDirections[ face ] );\n\t\t\t\t\t\tshadowCamera.up.copy( cubeUps[ face ] );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t\tvar vpDimensions = cube2DViewPorts[ face ];\n\t\t\t\t\t\t_state.viewport( vpDimensions );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_lookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tshadowCamera.updateMatrixWorld();\n\t\t\t\t\tshadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld );\n\n\t\t\t\t\t// compute shadow matrix\n\n\t\t\t\t\tshadowMatrix.set(\n\t\t\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t\t\t);\n\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t\t\t\t\t// update camera matrices and frustum\n\n\t\t\t\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\t\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\t\t\t// set object matrices & frustum culling\n\n\t\t\t\t\t_renderList.length = 0;\n\n\t\t\t\t\tprojectObject( scene, camera, shadowCamera );\n\n\t\t\t\t\t// render shadow map\n\t\t\t\t\t// render regular objects\n\n\t\t\t\t\tfor ( var j = 0, jl = _renderList.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar object = _renderList[ j ];\n\t\t\t\t\t\tvar geometry = _objects.update( object );\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( (material && material.isMultiMaterial) ) {\n\n\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\tfor ( var k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\t\t\tvar group = groups[ k ];\n\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, 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 {\n\n\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, 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\t// Restore GL state.\n\t\t\tvar clearColor = _renderer.getClearColor(),\n\t\t\tclearAlpha = _renderer.getClearAlpha();\n\t\t\t_renderer.setClearColor( clearColor, clearAlpha );\n\n\t\t\tscope.needsUpdate = false;\n\n\t\t};\n\n\t\tfunction getDepthMaterial( object, material, isPointLight, lightPositionWorld ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tvar result = null;\n\n\t\t\tvar materialVariants = _depthMaterials;\n\t\t\tvar customMaterial = object.customDepthMaterial;\n\n\t\t\tif ( isPointLight ) {\n\n\t\t\t\tmaterialVariants = _distanceMaterials;\n\t\t\t\tcustomMaterial = object.customDistanceMaterial;\n\n\t\t\t}\n\n\t\t\tif ( ! customMaterial ) {\n\n\t\t\t\tvar useMorphing = false;\n\n\t\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;\n\n\t\t\t\t\t} else if ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphTargets && geometry.morphTargets.length > 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar useSkinning = object.isSkinnedMesh && material.skinning;\n\n\t\t\t\tvar variantIndex = 0;\n\n\t\t\t\tif ( useMorphing ) variantIndex |= _MorphingFlag;\n\t\t\t\tif ( useSkinning ) variantIndex |= _SkinningFlag;\n\n\t\t\t\tresult = materialVariants[ variantIndex ];\n\n\t\t\t} else {\n\n\t\t\t\tresult = customMaterial;\n\n\t\t\t}\n\n\t\t\tif ( _renderer.localClippingEnabled &&\n\t\t\t\t material.clipShadows === true &&\n\t\t\t\t\tmaterial.clippingPlanes.length !== 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\tvar keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tvar 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\tvar 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\tresult.visible = material.visible;\n\t\t\tresult.wireframe = material.wireframe;\n\n\t\t\tvar side = material.side;\n\n\t\t\tif ( scope.renderSingleSided && side == DoubleSide ) {\n\n\t\t\t\tside = FrontSide;\n\n\t\t\t}\n\n\t\t\tif ( scope.renderReverseSided ) {\n\n\t\t\t\tif ( side === FrontSide ) side = BackSide;\n\t\t\t\telse if ( side === BackSide ) side = FrontSide;\n\n\t\t\t}\n\n\t\t\tresult.side = side;\n\n\t\t\tresult.clipShadows = material.clipShadows;\n\t\t\tresult.clippingPlanes = material.clippingPlanes;\n\n\t\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\t\tresult.linewidth = material.linewidth;\n\n\t\t\tif ( isPointLight && result.uniforms.lightPos !== undefined ) {\n\n\t\t\t\tresult.uniforms.lightPos.value.copy( lightPositionWorld );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera, shadowCamera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\t\tif ( object.castShadow && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) {\n\n\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\t\t\t_renderList.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, shadowCamera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Ray( origin, direction ) {\n\n\t\tthis.origin = ( origin !== undefined ) ? origin : new Vector3();\n\t\tthis.direction = ( direction !== undefined ) ? direction : new Vector3();\n\n\t}\n\n\tRay.prototype = {\n\n\t\tconstructor: Ray,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\tthis.origin.copy( origin );\n\t\t\tthis.direction.copy( direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( ray ) {\n\n\t\t\tthis.origin.copy( ray.origin );\n\t\t\tthis.direction.copy( ray.direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t\t},\n\n\t\tlookAt: function ( v ) {\n\n\t\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trecast: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function recast( t ) {\n\n\t\t\t\tthis.origin.copy( this.at( t, v1 ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\tresult.subVectors( point, this.origin );\n\t\t\tvar directionDistance = result.dot( this.direction );\n\n\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\treturn result.copy( this.origin );\n\n\t\t\t}\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t\t},\n\n\t\tdistanceSqToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceSqToPoint( point ) {\n\n\t\t\t\tvar directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t\t\t// point behind the ray\n\n\t\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t\t\t}\n\n\t\t\t\tv1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t\t\treturn v1.distanceToSquared( point );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdistanceSqToSegment: function () {\n\n\t\t\tvar segCenter = new Vector3();\n\t\t\tvar segDir = new Vector3();\n\t\t\tvar diff = new Vector3();\n\n\t\t\treturn function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t\t\t// It returns the min distance between the ray and the segment\n\t\t\t\t// defined by v0 and v1\n\t\t\t\t// It can also set two optional targets :\n\t\t\t\t// - The closest point on the ray\n\t\t\t\t// - The closest point on the segment\n\n\t\t\t\tsegCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t\t\tsegDir.copy( v1 ).sub( v0 ).normalize();\n\t\t\t\tdiff.copy( this.origin ).sub( segCenter );\n\n\t\t\t\tvar segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\t\t\tvar a01 = - this.direction.dot( segDir );\n\t\t\t\tvar b0 = diff.dot( this.direction );\n\t\t\t\tvar b1 = - diff.dot( segDir );\n\t\t\t\tvar c = diff.lengthSq();\n\t\t\t\tvar det = Math.abs( 1 - a01 * a01 );\n\t\t\t\tvar s0, s1, sqrDist, extDet;\n\n\t\t\t\tif ( det > 0 ) {\n\n\t\t\t\t\t// The ray and segment are not parallel.\n\n\t\t\t\t\ts0 = a01 * b1 - b0;\n\t\t\t\t\ts1 = a01 * b0 - b1;\n\t\t\t\t\textDet = segExtent * det;\n\n\t\t\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\t\t\tvar invDet = 1 / det;\n\t\t\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\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\t// region 5\n\n\t\t\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t\t\t// region 4\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t// region 3\n\n\t\t\t\t\t\t\ts0 = 0;\n\t\t\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 2\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Ray and segment are parallel.\n\n\t\t\t\t\ts1 = ( a01 > 0 ) ? - segExtent : 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\tif ( optionalPointOnRay ) {\n\n\t\t\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnSegment ) {\n\n\t\t\t\t\toptionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter );\n\n\t\t\t\t}\n\n\t\t\t\treturn sqrDist;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectSphere( sphere, optionalTarget ) {\n\n\t\t\t\tv1.subVectors( sphere.center, this.origin );\n\t\t\t\tvar tca = v1.dot( this.direction );\n\t\t\t\tvar d2 = v1.dot( v1 ) - tca * tca;\n\t\t\t\tvar radius2 = sphere.radius * sphere.radius;\n\n\t\t\t\tif ( d2 > radius2 ) return null;\n\n\t\t\t\tvar thc = Math.sqrt( radius2 - d2 );\n\n\t\t\t\t// t0 = first intersect point - entrance on front of sphere\n\t\t\t\tvar t0 = tca - thc;\n\n\t\t\t\t// t1 = second intersect point - exit point on back of sphere\n\t\t\t\tvar t1 = tca + thc;\n\n\t\t\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\t\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t\t\t// test to see if t0 is behind the ray:\n\t\t\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t\t\t// in order to always return an intersect point that is in front of the ray.\n\t\t\t\tif ( t0 < 0 ) return this.at( t1, optionalTarget );\n\n\t\t\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\t\t\treturn this.at( t0, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) <= sphere.radius;\n\n\t\t},\n\n\t\tdistanceToPlane: function ( plane ) {\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t// line is coplanar, return origin\n\t\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\t\treturn 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t\t// Return if the ray never intersects the plane\n\n\t\t\treturn t >= 0 ? t : null;\n\n\t\t},\n\n\t\tintersectPlane: function ( plane, optionalTarget ) {\n\n\t\t\tvar t = this.distanceToPlane( plane );\n\n\t\t\tif ( t === null ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\treturn this.at( t, optionalTarget );\n\n\t\t},\n\n\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// check if the ray lies on the plane first\n\n\t\t\tvar distToPoint = plane.distanceToPoint( this.origin );\n\n\t\t\tif ( distToPoint === 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tintersectBox: function ( box, optionalTarget ) {\n\n\t\t\tvar tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\t\tvar invdirx = 1 / this.direction.x,\n\t\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\t\tvar origin = this.origin;\n\n\t\t\tif ( invdirx >= 0 ) {\n\n\t\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t\t} else {\n\n\t\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t\t}\n\n\t\t\tif ( invdiry >= 0 ) {\n\n\t\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t\t} else {\n\n\t\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\t\tif ( invdirz >= 0 ) {\n\n\t\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t\t} else {\n\n\t\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t\t//return point closest to the ray (positive side)\n\n\t\t\tif ( tmax < 0 ) return null;\n\n\t\t\treturn this.at( tmin >= 0 ? tmin : tmax, optionalTarget );\n\n\t\t},\n\n\t\tintersectsBox: ( function () {\n\n\t\t\tvar v = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\treturn this.intersectBox( box, v ) !== null;\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectTriangle: function () {\n\n\t\t\t// Compute the offset origin, edges, and normal.\n\t\t\tvar diff = new Vector3();\n\t\t\tvar edge1 = new Vector3();\n\t\t\tvar edge2 = new Vector3();\n\t\t\tvar normal = new Vector3();\n\n\t\t\treturn function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t\t\tedge1.subVectors( b, a );\n\t\t\t\tedge2.subVectors( c, a );\n\t\t\t\tnormal.crossVectors( edge1, edge2 );\n\n\t\t\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\t\t\tvar DdN = this.direction.dot( normal );\n\t\t\t\tvar sign;\n\n\t\t\t\tif ( DdN > 0 ) {\n\n\t\t\t\t\tif ( backfaceCulling ) return null;\n\t\t\t\t\tsign = 1;\n\n\t\t\t\t} else if ( DdN < 0 ) {\n\n\t\t\t\t\tsign = - 1;\n\t\t\t\t\tDdN = - DdN;\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\tdiff.subVectors( this.origin, a );\n\t\t\t\tvar DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) );\n\n\t\t\t\t// b1 < 0, no intersection\n\t\t\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tvar DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) );\n\n\t\t\t\t// b2 < 0, no intersection\n\t\t\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// b1+b2 > 1, no intersection\n\t\t\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Line intersects triangle, check if ray does.\n\t\t\t\tvar QdN = - sign * diff.dot( normal );\n\n\t\t\t\t// t < 0, no intersection\n\t\t\t\tif ( QdN < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Ray intersects triangle.\n\t\t\t\treturn this.at( QdN / DdN, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix4: function ( matrix4 ) {\n\n\t\t\tthis.direction.add( this.origin ).applyMatrix4( matrix4 );\n\t\t\tthis.origin.applyMatrix4( matrix4 );\n\t\t\tthis.direction.sub( this.origin );\n\t\t\tthis.direction.normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( ray ) {\n\n\t\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Euler( x, y, z, order ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._order = order || Euler.DefaultOrder;\n\n\t}\n\n\tEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\n\tEuler.DefaultOrder = 'XYZ';\n\n\tEuler.prototype = {\n\n\t\tconstructor: Euler,\n\n\t\tisEuler: true,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget order () {\n\n\t\t\treturn this._order;\n\n\t\t},\n\n\t\tset order ( value ) {\n\n\t\t\tthis._order = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, order ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._order = order || this._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t\t},\n\n\t\tcopy: function ( euler ) {\n\n\t\t\tthis._x = euler._x;\n\t\t\tthis._y = euler._y;\n\t\t\tthis._z = euler._z;\n\t\t\tthis._order = euler._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m, order, update ) {\n\n\t\t\tvar clamp = _Math.clamp;\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements;\n\t\t\tvar m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\t\tvar m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\t\tvar m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\torder = order || this._order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.99999 ) {\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} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.99999 ) {\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} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.99999 ) {\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} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.99999 ) {\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} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.99999 ) {\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} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.99999 ) {\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} else {\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order );\n\n\t\t\t}\n\n\t\t\tthis._order = order;\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromQuaternion: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function setFromQuaternion( q, order, update ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.makeRotationFromQuaternion( q );\n\n\t\t\t\treturn this.setFromRotationMatrix( matrix, order, update );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromVector3: function ( v, order ) {\n\n\t\t\treturn this.set( v.x, v.y, v.z, order || this._order );\n\n\t\t},\n\n\t\treorder: function () {\n\n\t\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t\tvar q = new Quaternion();\n\n\t\t\treturn function reorder( newOrder ) {\n\n\t\t\t\tq.setFromEuler( this );\n\n\t\t\t\treturn this.setFromQuaternion( q, newOrder );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( euler ) {\n\n\t\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t\t},\n\n\t\tfromArray: function ( array ) {\n\n\t\t\tthis._x = array[ 0 ];\n\t\t\tthis._y = array[ 1 ];\n\t\t\tthis._z = array[ 2 ];\n\t\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._order;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoVector3: function ( optionalResult ) {\n\n\t\t\tif ( optionalResult ) {\n\n\t\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t\t} else {\n\n\t\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t\t}\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Layers() {\n\n\t\tthis.mask = 1;\n\n\t}\n\n\tLayers.prototype = {\n\n\t\tconstructor: Layers,\n\n\t\tset: function ( channel ) {\n\n\t\t\tthis.mask = 1 << channel;\n\n\t\t},\n\n\t\tenable: function ( channel ) {\n\n\t\t\tthis.mask |= 1 << channel;\n\n\t\t},\n\n\t\ttoggle: function ( channel ) {\n\n\t\t\tthis.mask ^= 1 << channel;\n\n\t\t},\n\n\t\tdisable: function ( channel ) {\n\n\t\t\tthis.mask &= ~ ( 1 << channel );\n\n\t\t},\n\n\t\ttest: function ( layers ) {\n\n\t\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author elephantatwork / www.elephantatwork.ch\n\t */\n\n\tfunction Object3D() {\n\n\t\tObject.defineProperty( this, 'id', { value: Object3DIdCount() } );\n\n\t\tthis.uuid = _Math.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.DefaultUp.clone();\n\n\t\tvar position = new Vector3();\n\t\tvar rotation = new Euler();\n\t\tvar quaternion = new Quaternion();\n\t\tvar 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\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\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.DefaultMatrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = false;\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.userData = {};\n\n\t\tthis.onBeforeRender = function(){}; \n\t\tthis.onAfterRender = function(){};\n\n\t}\n\n\tObject3D.DefaultUp = new Vector3( 0, 1, 0 );\n\tObject3D.DefaultMatrixAutoUpdate = true;\n\n\tObject.assign( Object3D.prototype, EventDispatcher.prototype, {\n\n\t\tisObject3D: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tthis.matrix.multiplyMatrices( matrix, this.matrix );\n\n\t\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t\t},\n\n\t\tsetRotationFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t\t},\n\n\t\tsetRotationFromEuler: function ( euler ) {\n\n\t\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t\t},\n\n\t\tsetRotationFromMatrix: function ( m ) {\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t\t},\n\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\t// assumes q is normalized\n\n\t\t\tthis.quaternion.copy( q );\n\n\t\t},\n\n\t\trotateOnAxis: function () {\n\n\t\t\t// rotate object on axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar q1 = new Quaternion();\n\n\t\t\treturn function rotateOnAxis( axis, angle ) {\n\n\t\t\t\tq1.setFromAxisAngle( axis, angle );\n\n\t\t\t\tthis.quaternion.multiply( q1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateOnAxis: function () {\n\n\t\t\t// translate object by distance along axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function translateOnAxis( axis, distance ) {\n\n\t\t\t\tv1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\t\t\tthis.position.add( v1.multiplyScalar( distance ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function translateX( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function translateY( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function translateZ( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlocalToWorld: function ( vector ) {\n\n\t\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t\t},\n\n\t\tworldToLocal: function () {\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function worldToLocal( vector ) {\n\n\t\t\t\treturn vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\t// This routine does not support objects with rotated and/or translated parent(s)\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tm1.lookAt( vector, this.position, this.up );\n\n\t\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tadd: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( object === this ) {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object can't be added as a child of itself.\", object );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( (object && object.isObject3D) ) {\n\n\t\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\t\tobject.parent.remove( object );\n\n\t\t\t\t}\n\n\t\t\t\tobject.parent = this;\n\t\t\t\tobject.dispatchEvent( { type: 'added' } );\n\n\t\t\t\tthis.children.push( object );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object not an instance of THREE.Object3D.\", object );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tremove: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar index = this.children.indexOf( object );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tobject.parent = null;\n\n\t\t\t\tobject.dispatchEvent( { type: 'removed' } );\n\n\t\t\t\tthis.children.splice( index, 1 );\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetObjectById: function ( id ) {\n\n\t\t\treturn this.getObjectByProperty( 'id', id );\n\n\t\t},\n\n\t\tgetObjectByName: function ( name ) {\n\n\t\t\treturn this.getObjectByProperty( 'name', name );\n\n\t\t},\n\n\t\tgetObjectByProperty: function ( name, value ) {\n\n\t\t\tif ( this[ name ] === value ) return this;\n\n\t\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = this.children[ i ];\n\t\t\t\tvar object = child.getObjectByProperty( name, value );\n\n\t\t\t\tif ( object !== undefined ) {\n\n\t\t\t\t\treturn object;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\n\t\t},\n\n\t\tgetWorldPosition: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\treturn result.setFromMatrixPosition( this.matrixWorld );\n\n\t\t},\n\n\t\tgetWorldQuaternion: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar scale = new Vector3();\n\n\t\t\treturn function getWorldQuaternion( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Quaternion();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, result, scale );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldRotation: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldRotation( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Euler();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.setFromQuaternion( quaternion, this.rotation.order, false );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldScale: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldScale( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, result );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldDirection: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.set( 0, 0, 1 ).applyQuaternion( quaternion );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\traycast: function () {},\n\n\t\ttraverse: function ( callback ) {\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverse( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseVisible: function ( callback ) {\n\n\t\t\tif ( this.visible === false ) return;\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseAncestors: function ( callback ) {\n\n\t\t\tvar parent = this.parent;\n\n\t\t\tif ( parent !== null ) {\n\n\t\t\t\tcallback( parent );\n\n\t\t\t\tparent.traverseAncestors( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrix: function () {\n\n\t\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t\t},\n\n\t\tupdateMatrixWorld: function ( force ) {\n\n\t\t\tif ( this.matrixAutoUpdate === true ) this.updateMatrix();\n\n\t\t\tif ( this.matrixWorldNeedsUpdate === true || force === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\t\tforce = true;\n\n\t\t\t}\n\n\t\t\t// update children\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\t// meta is '' when called from JSON.stringify\n\t\t\tvar isRootObject = ( meta === undefined || meta === '' );\n\n\t\t\tvar output = {};\n\n\t\t\t// meta is a hash used to collect geometries, materials.\n\t\t\t// not providing it implies that this is the root object\n\t\t\t// being serialized.\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\t// initialize meta obj\n\t\t\t\tmeta = {\n\t\t\t\t\tgeometries: {},\n\t\t\t\t\tmaterials: {},\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t\toutput.metadata = {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Object',\n\t\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t// standard Object3D serialization\n\n\t\t\tvar object = {};\n\n\t\t\tobject.uuid = this.uuid;\n\t\t\tobject.type = this.type;\n\n\t\t\tif ( this.name !== '' ) object.name = this.name;\n\t\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\t\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\t\tif ( this.visible === false ) object.visible = false;\n\n\t\t\tobject.matrix = this.matrix.toArray();\n\n\t\t\t//\n\n\t\t\tif ( this.geometry !== undefined ) {\n\n\t\t\t\tif ( meta.geometries[ this.geometry.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.geometries[ this.geometry.uuid ] = this.geometry.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.geometry = this.geometry.uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.material !== undefined ) {\n\n\t\t\t\tif ( meta.materials[ this.material.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.materials[ this.material.uuid ] = this.material.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = this.material.uuid;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( this.children.length > 0 ) {\n\n\t\t\t\tobject.children = [];\n\n\t\t\t\tfor ( var i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\tvar geometries = extractFromCache( meta.geometries );\n\t\t\t\tvar materials = extractFromCache( meta.materials );\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\t\tif ( images.length > 0 ) output.images = images;\n\n\t\t\t}\n\n\t\t\toutput.object = object;\n\n\t\t\treturn output;\n\n\t\t\t// extract data from the cache hash\n\t\t\t// remove metadata on each item\n\t\t\t// and return as array\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function ( recursive ) {\n\n\t\t\treturn new this.constructor().copy( this, recursive );\n\n\t\t},\n\n\t\tcopy: function ( source, recursive ) {\n\n\t\t\tif ( recursive === undefined ) recursive = true;\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.up.copy( source.up );\n\n\t\t\tthis.position.copy( source.position );\n\t\t\tthis.quaternion.copy( source.quaternion );\n\t\t\tthis.scale.copy( source.scale );\n\n\t\t\tthis.matrix.copy( source.matrix );\n\t\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\t\tthis.visible = source.visible;\n\n\t\t\tthis.castShadow = source.castShadow;\n\t\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\t\tthis.frustumCulled = source.frustumCulled;\n\t\t\tthis.renderOrder = source.renderOrder;\n\n\t\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\t\tif ( recursive === true ) {\n\n\t\t\t\tfor ( var i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\t\tvar child = source.children[ i ];\n\t\t\t\t\tthis.add( child.clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\tvar count$2 = 0;\n\tfunction Object3DIdCount() { return count$2++; }\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Line3( start, end ) {\n\n\t\tthis.start = ( start !== undefined ) ? start : new Vector3();\n\t\tthis.end = ( end !== undefined ) ? end : new Vector3();\n\n\t}\n\n\tLine3.prototype = {\n\n\t\tconstructor: Line3,\n\n\t\tset: function ( start, end ) {\n\n\t\t\tthis.start.copy( start );\n\t\t\tthis.end.copy( end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( line ) {\n\n\t\t\tthis.start.copy( line.start );\n\t\t\tthis.end.copy( line.end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tdelta: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.subVectors( this.end, this.start );\n\n\t\t},\n\n\t\tdistanceSq: function () {\n\n\t\t\treturn this.start.distanceToSquared( this.end );\n\n\t\t},\n\n\t\tdistance: function () {\n\n\t\t\treturn this.start.distanceTo( this.end );\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tclosestPointToPointParameter: function () {\n\n\t\t\tvar startP = new Vector3();\n\t\t\tvar startEnd = new Vector3();\n\n\t\t\treturn function closestPointToPointParameter( point, clampToLine ) {\n\n\t\t\t\tstartP.subVectors( point, this.start );\n\t\t\t\tstartEnd.subVectors( this.end, this.start );\n\n\t\t\t\tvar startEnd2 = startEnd.dot( startEnd );\n\t\t\t\tvar startEnd_startP = startEnd.dot( startP );\n\n\t\t\t\tvar t = startEnd_startP / startEnd2;\n\n\t\t\t\tif ( clampToLine ) {\n\n\t\t\t\t\tt = _Math.clamp( t, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t\treturn t;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, clampToLine, optionalTarget ) {\n\n\t\t\tvar t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.start.applyMatrix4( matrix );\n\t\t\tthis.end.applyMatrix4( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( line ) {\n\n\t\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Triangle( a, b, c ) {\n\n\t\tthis.a = ( a !== undefined ) ? a : new Vector3();\n\t\tthis.b = ( b !== undefined ) ? b : new Vector3();\n\t\tthis.c = ( c !== undefined ) ? c : new Vector3();\n\n\t}\n\n\tTriangle.normal = function () {\n\n\t\tvar v0 = new Vector3();\n\n\t\treturn function normal( a, b, c, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.subVectors( c, b );\n\t\t\tv0.subVectors( a, b );\n\t\t\tresult.cross( v0 );\n\n\t\t\tvar resultLengthSq = result.lengthSq();\n\t\t\tif ( resultLengthSq > 0 ) {\n\n\t\t\t\treturn result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) );\n\n\t\t\t}\n\n\t\t\treturn result.set( 0, 0, 0 );\n\n\t\t};\n\n\t}();\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tTriangle.barycoordFromPoint = function () {\n\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function barycoordFromPoint( point, a, b, c, optionalTarget ) {\n\n\t\t\tv0.subVectors( c, a );\n\t\t\tv1.subVectors( b, a );\n\t\t\tv2.subVectors( point, a );\n\n\t\t\tvar dot00 = v0.dot( v0 );\n\t\t\tvar dot01 = v0.dot( v1 );\n\t\t\tvar dot02 = v0.dot( v2 );\n\t\t\tvar dot11 = v1.dot( v1 );\n\t\t\tvar dot12 = v1.dot( v2 );\n\n\t\t\tvar denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t// collinear or singular triangle\n\t\t\tif ( denom === 0 ) {\n\n\t\t\t\t// arbitrary location outside of triangle?\n\t\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\t\treturn result.set( - 2, - 1, - 1 );\n\n\t\t\t}\n\n\t\t\tvar invDenom = 1 / denom;\n\t\t\tvar u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\t\tvar v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t\t// barycentric coordinates must always sum to 1\n\t\t\treturn result.set( 1 - u - v, v, u );\n\n\t\t};\n\n\t}();\n\n\tTriangle.containsPoint = function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function containsPoint( point, a, b, c ) {\n\n\t\t\tvar result = Triangle.barycoordFromPoint( point, a, b, c, v1 );\n\n\t\t\treturn ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 );\n\n\t\t};\n\n\t}();\n\n\tTriangle.prototype = {\n\n\t\tconstructor: Triangle,\n\n\t\tset: function ( a, b, c ) {\n\n\t\t\tthis.a.copy( a );\n\t\t\tthis.b.copy( b );\n\t\t\tthis.c.copy( c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPointsAndIndices: function ( points, i0, i1, i2 ) {\n\n\t\t\tthis.a.copy( points[ i0 ] );\n\t\t\tthis.b.copy( points[ i1 ] );\n\t\t\tthis.c.copy( points[ i2 ] );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( triangle ) {\n\n\t\t\tthis.a.copy( triangle.a );\n\t\t\tthis.b.copy( triangle.b );\n\t\t\tthis.c.copy( triangle.c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tarea: function () {\n\n\t\t\tvar v0 = new Vector3();\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function area() {\n\n\t\t\t\tv0.subVectors( this.c, this.b );\n\t\t\t\tv1.subVectors( this.a, this.b );\n\n\t\t\t\treturn v0.cross( v1 ).length() * 0.5;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmidpoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t\t},\n\n\t\tnormal: function ( optionalTarget ) {\n\n\t\t\treturn Triangle.normal( this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tplane: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Plane();\n\n\t\t\treturn result.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t\t},\n\n\t\tbarycoordFromPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t\t},\n\n\t\tclosestPointToPoint: function () {\n\n\t\t\tvar plane, edgeList, projectedPoint, closestPoint;\n\n\t\t\treturn function closestPointToPoint( point, optionalTarget ) {\n\n\t\t\t\tif ( plane === undefined ) {\n\n\t\t\t\t\tplane = new Plane();\n\t\t\t\t\tedgeList = [ new Line3(), new Line3(), new Line3() ];\n\t\t\t\t\tprojectedPoint = new Vector3();\n\t\t\t\t\tclosestPoint = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\t\tvar minDistance = Infinity;\n\n\t\t\t\t// project the point onto the plane of the triangle\n\n\t\t\t\tplane.setFromCoplanarPoints( this.a, this.b, this.c );\n\t\t\t\tplane.projectPoint( point, projectedPoint );\n\n\t\t\t\t// check if the projection lies within the triangle\n\n\t\t\t\tif( this.containsPoint( projectedPoint ) === true ) {\n\n\t\t\t\t\t// if so, this is the closest point\n\n\t\t\t\t\tresult.copy( projectedPoint );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// if not, the point falls outside the triangle. the result is the closest point to the triangle's edges or vertices\n\n\t\t\t\t\tedgeList[ 0 ].set( this.a, this.b );\n\t\t\t\t\tedgeList[ 1 ].set( this.b, this.c );\n\t\t\t\t\tedgeList[ 2 ].set( this.c, this.a );\n\n\t\t\t\t\tfor( var i = 0; i < edgeList.length; i ++ ) {\n\n\t\t\t\t\t\tedgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint );\n\n\t\t\t\t\t\tvar distance = projectedPoint.distanceToSquared( closestPoint );\n\n\t\t\t\t\t\tif( distance < minDistance ) {\n\n\t\t\t\t\t\t\tminDistance = distance;\n\n\t\t\t\t\t\t\tresult.copy( closestPoint );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( triangle ) {\n\n\t\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Face3( a, b, c, normal, color, materialIndex ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t\tthis.normal = (normal && normal.isVector3) ? normal : new Vector3();\n\t\tthis.vertexNormals = Array.isArray( normal ) ? normal : [];\n\n\t\tthis.color = (color && color.isColor) ? color : new Color();\n\t\tthis.vertexColors = Array.isArray( color ) ? color : [];\n\n\t\tthis.materialIndex = materialIndex !== undefined ? materialIndex : 0;\n\n\t}\n\n\tFace3.prototype = {\n\n\t\tconstructor: Face3,\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.a = source.a;\n\t\t\tthis.b = source.b;\n\t\t\tthis.c = source.c;\n\n\t\t\tthis.normal.copy( source.normal );\n\t\t\tthis.color.copy( source.color );\n\n\t\t\tthis.materialIndex = source.materialIndex;\n\n\t\t\tfor ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexNormals[ i ] = source.vertexNormals[ i ].clone();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexColors[ i ] = source.vertexColors[ i ].clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * shading: THREE.SmoothShading,\n\t * depthTest: ,\n\t * depthWrite: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: \n\t * }\n\t */\n\n\tfunction MeshBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\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.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.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshBasicMaterial.prototype = Object.create( Material.prototype );\n\tMeshBasicMaterial.prototype.constructor = MeshBasicMaterial;\n\n\tMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\n\tMeshBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\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.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferAttribute( array, itemSize, normalized ) {\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.uuid = _Math.generateUUID();\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 === true;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t}\n\n\tBufferAttribute.prototype = {\n\n\t\tconstructor: BufferAttribute,\n\n\t\tisBufferAttribute: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.itemSize : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.itemSize = source.itemSize;\n\t\t\tthis.count = source.count;\n\t\t\tthis.normalized = source.normalized;\n\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.itemSize;\n\t\t\tindex2 *= attribute.itemSize;\n\n\t\t\tfor ( var i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyArray: function ( array ) {\n\n\t\t\tthis.array.set( array );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyColorsArray: function ( colors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\t\tvar color = colors[ i ];\n\n\t\t\t\tif ( color === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\t\tcolor = new Color();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = color.r;\n\t\t\t\tarray[ offset ++ ] = color.g;\n\t\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyIndicesArray: function ( indices ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tvar index = indices[ i ];\n\n\t\t\t\tarray[ offset ++ ] = index.a;\n\t\t\t\tarray[ offset ++ ] = index.b;\n\t\t\t\tarray[ offset ++ ] = index.c;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector2sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector3sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector4sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize ];\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\t\t\tthis.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Int8Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Int8Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint8Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint8Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint8ClampedAttribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint8ClampedArray( array ), itemSize );\n\n\t}\n\n\tfunction Int16Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Int16Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint16Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint16Array( array ), itemSize );\n\n\t}\n\n\tfunction Int32Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Int32Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint32Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint32Array( array ), itemSize );\n\n\t}\n\n\tfunction Float32Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Float32Array( array ), itemSize );\n\n\t}\n\n\tfunction Float64Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Float64Array( array ), itemSize );\n\n\t}\n\n\t// Deprecated\n\n\tfunction DynamicBufferAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' );\n\t\treturn new BufferAttribute( array, itemSize ).setDynamic( true );\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author kile / http://kile.stravaganza.org/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Geometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Geometry';\n\n\t\tthis.vertices = [];\n\t\tthis.colors = [];\n\t\tthis.faces = [];\n\t\tthis.faceVertexUvs = [ [] ];\n\n\t\tthis.morphTargets = [];\n\t\tthis.morphNormals = [];\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\tthis.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.elementsNeedUpdate = false;\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.lineDistancesNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tObject.assign( Geometry.prototype, EventDispatcher.prototype, {\n\n\t\tisGeometry: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tfor ( var i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertex.applyMatrix4( matrix );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\t\t\t\tface.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tface.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\tthis.verticesNeedUpdate = true;\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfromBufferGeometry: function ( geometry ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar indices = geometry.index !== null ? geometry.index.array : undefined;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tvar positions = attributes.position.array;\n\t\t\tvar normals = attributes.normal !== undefined ? attributes.normal.array : undefined;\n\t\t\tvar colors = attributes.color !== undefined ? attributes.color.array : undefined;\n\t\t\tvar uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;\n\t\t\tvar uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;\n\n\t\t\tif ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = [];\n\n\t\t\tvar tempNormals = [];\n\t\t\tvar tempUVs = [];\n\t\t\tvar tempUVs2 = [];\n\n\t\t\tfor ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {\n\n\t\t\t\tscope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) );\n\n\t\t\t\tif ( normals !== undefined ) {\n\n\t\t\t\t\ttempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( colors !== undefined ) {\n\n\t\t\t\t\tscope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\ttempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\ttempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction addFace( a, b, c, materialIndex ) {\n\n\t\t\t\tvar vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : [];\n\t\t\t\tvar vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : [];\n\n\t\t\t\tvar face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );\n\n\t\t\t\tscope.faces.push( face );\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( indices !== undefined ) {\n\n\t\t\t\tvar groups = geometry.groups;\n\n\t\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\t\tfor ( var i = 0; i < groups.length; i ++ ) {\n\n\t\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\taddFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t\t\taddFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( var i = 0; i < positions.length / 3; i += 3 ) {\n\n\t\t\t\t\taddFace( i, i + 1, i + 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t\tvar center = this.boundingSphere.center;\n\t\t\tvar radius = this.boundingSphere.radius;\n\n\t\t\tvar s = radius === 0 ? 1 : 1.0 / radius;\n\n\t\t\tvar matrix = new Matrix4();\n\t\t\tmatrix.set(\n\t\t\t\ts, 0, 0, - s * center.x,\n\t\t\t\t0, s, 0, - s * center.y,\n\t\t\t\t0, 0, s, - s * center.z,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\tthis.applyMatrix( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\tfor ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tvar face = this.faces[ f ];\n\n\t\t\t\tvar vA = this.vertices[ face.a ];\n\t\t\t\tvar vB = this.vertices[ face.b ];\n\t\t\t\tvar vC = this.vertices[ face.c ];\n\n\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\tcb.cross( ab );\n\n\t\t\t\tcb.normalize();\n\n\t\t\t\tface.normal.copy( cb );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeVertexNormals: function ( areaWeighted ) {\n\n\t\t\tif ( areaWeighted === undefined ) areaWeighted = true;\n\n\t\t\tvar v, vl, f, fl, face, vertices;\n\n\t\t\tvertices = new Array( this.vertices.length );\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ] = new Vector3();\n\n\t\t\t}\n\n\t\t\tif ( areaWeighted ) {\n\n\t\t\t\t// vertex normals weighted by triangle areas\n\t\t\t\t// http://www.iquilezles.org/www/articles/normals/normals.htm\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvA = this.vertices[ face.a ];\n\t\t\t\t\tvB = this.vertices[ face.b ];\n\t\t\t\t\tvC = this.vertices[ face.c ];\n\n\t\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tvertices[ face.a ].add( cb );\n\t\t\t\t\tvertices[ face.b ].add( cb );\n\t\t\t\t\tvertices[ face.c ].add( cb );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.computeFaceNormals();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvertices[ face.a ].add( face.normal );\n\t\t\t\t\tvertices[ face.b ].add( face.normal );\n\t\t\t\t\tvertices[ face.c ].add( face.normal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ].normalize();\n\n\t\t\t}\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( vertices[ face.a ] );\n\t\t\t\t\tvertexNormals[ 1 ].copy( vertices[ face.b ] );\n\t\t\t\t\tvertexNormals[ 2 ].copy( vertices[ face.c ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = vertices[ face.a ].clone();\n\t\t\t\t\tvertexNormals[ 1 ] = vertices[ face.b ].clone();\n\t\t\t\t\tvertexNormals[ 2 ] = vertices[ face.c ].clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeFlatVertexNormals: function () {\n\n\t\t\tvar f, fl, face;\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 1 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 2 ].copy( face.normal );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 1 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 2 ] = face.normal.clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeMorphNormals: function () {\n\n\t\t\tvar i, il, f, fl, face;\n\n\t\t\t// save original normals\n\t\t\t// - create temp variables on first access\n\t\t\t// otherwise just copy (for faster repeated calls)\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tif ( ! face.__originalFaceNormal ) {\n\n\t\t\t\t\tface.__originalFaceNormal = face.normal.clone();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface.__originalFaceNormal.copy( face.normal );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];\n\n\t\t\t\tfor ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\t\tif ( ! face.__originalVertexNormals[ i ] ) {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// use temp geometry to compute face and vertex normals for each morph\n\n\t\t\tvar tmpGeo = new Geometry();\n\t\t\ttmpGeo.faces = this.faces;\n\n\t\t\tfor ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\t// create on first access\n\n\t\t\t\tif ( ! this.morphNormals[ i ] ) {\n\n\t\t\t\t\tthis.morphNormals[ i ] = {};\n\t\t\t\t\tthis.morphNormals[ i ].faceNormals = [];\n\t\t\t\t\tthis.morphNormals[ i ].vertexNormals = [];\n\n\t\t\t\t\tvar dstNormalsFace = this.morphNormals[ i ].faceNormals;\n\t\t\t\t\tvar dstNormalsVertex = this.morphNormals[ i ].vertexNormals;\n\n\t\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tfaceNormal = new Vector3();\n\t\t\t\t\t\tvertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };\n\n\t\t\t\t\t\tdstNormalsFace.push( faceNormal );\n\t\t\t\t\t\tdstNormalsVertex.push( vertexNormals );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar morphNormals = this.morphNormals[ i ];\n\n\t\t\t\t// set vertices to morph target\n\n\t\t\t\ttmpGeo.vertices = this.morphTargets[ i ].vertices;\n\n\t\t\t\t// compute morph normals\n\n\t\t\t\ttmpGeo.computeFaceNormals();\n\t\t\t\ttmpGeo.computeVertexNormals();\n\n\t\t\t\t// store morph normals\n\n\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tfaceNormal = morphNormals.faceNormals[ f ];\n\t\t\t\t\tvertexNormals = morphNormals.vertexNormals[ f ];\n\n\t\t\t\t\tfaceNormal.copy( face.normal );\n\n\t\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\n\t\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\n\t\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore original normals\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tface.normal = face.__originalFaceNormal;\n\t\t\t\tface.vertexNormals = face.__originalVertexNormals;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeTangents: function () {\n\n\t\t\tconsole.warn( 'THREE.Geometry: .computeTangents() has been removed.' );\n\n\t\t},\n\n\t\tcomputeLineDistances: function () {\n\n\t\t\tvar d = 0;\n\t\t\tvar vertices = this.vertices;\n\n\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tif ( i > 0 ) {\n\n\t\t\t\t\td += vertices[ i ].distanceTo( vertices[ i - 1 ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.lineDistances[ i ] = d;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tthis.boundingBox.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tmerge: function ( geometry, matrix, materialIndexOffset ) {\n\n\t\t\tif ( (geometry && geometry.isGeometry) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar normalMatrix,\n\t\t\tvertexOffset = this.vertices.length,\n\t\t\tvertices1 = this.vertices,\n\t\t\tvertices2 = geometry.vertices,\n\t\t\tfaces1 = this.faces,\n\t\t\tfaces2 = geometry.faces,\n\t\t\tuvs1 = this.faceVertexUvs[ 0 ],\n\t\t\tuvs2 = geometry.faceVertexUvs[ 0 ],\n\t\t\tcolors1 = this.colors,\n\t\t\tcolors2 = geometry.colors;\n\n\t\t\tif ( materialIndexOffset === undefined ) materialIndexOffset = 0;\n\n\t\t\tif ( matrix !== undefined ) {\n\n\t\t\t\tnormalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t}\n\n\t\t\t// vertices\n\n\t\t\tfor ( var i = 0, il = vertices2.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = vertices2[ i ];\n\n\t\t\t\tvar vertexCopy = vertex.clone();\n\n\t\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\n\n\t\t\t\tvertices1.push( vertexCopy );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tfor ( var i = 0, il = colors2.length; i < il; i ++ ) {\n\n\t\t\t\tcolors1.push( colors2[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tfor ( i = 0, il = faces2.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = faces2[ i ], faceCopy, normal, color,\n\t\t\t\tfaceVertexNormals = face.vertexNormals,\n\t\t\t\tfaceVertexColors = face.vertexColors;\n\n\t\t\t\tfaceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );\n\t\t\t\tfaceCopy.normal.copy( face.normal );\n\n\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\tfaceCopy.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tnormal = faceVertexNormals[ j ].clone();\n\n\t\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCopy.vertexNormals.push( normal );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.color.copy( face.color );\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {\n\n\t\t\t\t\tcolor = faceVertexColors[ j ];\n\t\t\t\t\tfaceCopy.vertexColors.push( color.clone() );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\n\n\t\t\t\tfaces1.push( faceCopy );\n\n\t\t\t}\n\n\t\t\t// uvs\n\n\t\t\tfor ( i = 0, il = uvs2.length; i < il; i ++ ) {\n\n\t\t\t\tvar uv = uvs2[ i ], uvCopy = [];\n\n\t\t\t\tif ( uv === undefined ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = uv.length; j < jl; j ++ ) {\n\n\t\t\t\t\tuvCopy.push( uv[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tuvs1.push( uvCopy );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmergeMesh: function ( mesh ) {\n\n\t\t\tif ( (mesh && mesh.isMesh) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tmesh.matrixAutoUpdate && mesh.updateMatrix();\n\n\t\t\tthis.merge( mesh.geometry, mesh.matrix );\n\n\t\t},\n\n\t\t/*\n\t\t * Checks for duplicate vertices with hashmap.\n\t\t * Duplicated vertices are removed\n\t\t * and faces' vertices are updated.\n\t\t */\n\n\t\tmergeVertices: function () {\n\n\t\t\tvar verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n\t\t\tvar unique = [], changes = [];\n\n\t\t\tvar v, key;\n\t\t\tvar precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n\t\t\tvar precision = Math.pow( 10, precisionPoints );\n\t\t\tvar i, il, face;\n\t\t\tvar indices, j, jl;\n\n\t\t\tfor ( i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tv = this.vertices[ i ];\n\t\t\t\tkey = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );\n\n\t\t\t\tif ( verticesMap[ key ] === undefined ) {\n\n\t\t\t\t\tverticesMap[ key ] = i;\n\t\t\t\t\tunique.push( this.vertices[ i ] );\n\t\t\t\t\tchanges[ i ] = unique.length - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\n\t\t\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// if faces are completely degenerate after merging vertices, we\n\t\t\t// have to remove them from the geometry.\n\t\t\tvar faceIndicesToRemove = [];\n\n\t\t\tfor ( i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tface = this.faces[ i ];\n\n\t\t\t\tface.a = changes[ face.a ];\n\t\t\t\tface.b = changes[ face.b ];\n\t\t\t\tface.c = changes[ face.c ];\n\n\t\t\t\tindices = [ face.a, face.b, face.c ];\n\n\t\t\t\tvar dupIndex = - 1;\n\n\t\t\t\t// if any duplicate vertices are found in a Face3\n\t\t\t\t// we have to remove the face as nothing can be saved\n\t\t\t\tfor ( var n = 0; n < 3; n ++ ) {\n\n\t\t\t\t\tif ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {\n\n\t\t\t\t\t\tdupIndex = n;\n\t\t\t\t\t\tfaceIndicesToRemove.push( i );\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\tfor ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\n\n\t\t\t\tvar idx = faceIndicesToRemove[ i ];\n\n\t\t\t\tthis.faces.splice( idx, 1 );\n\n\t\t\t\tfor ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ j ].splice( idx, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Use unique set of vertices\n\n\t\t\tvar diff = this.vertices.length - unique.length;\n\t\t\tthis.vertices = unique;\n\t\t\treturn diff;\n\n\t\t},\n\n\t\tsortFacesByMaterialIndex: function () {\n\n\t\t\tvar faces = this.faces;\n\t\t\tvar length = faces.length;\n\n\t\t\t// tag faces\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tfaces[ i ]._id = i;\n\n\t\t\t}\n\n\t\t\t// sort faces\n\n\t\t\tfunction materialIndexSort( a, b ) {\n\n\t\t\t\treturn a.materialIndex - b.materialIndex;\n\n\t\t\t}\n\n\t\t\tfaces.sort( materialIndexSort );\n\n\t\t\t// sort uvs\n\n\t\t\tvar uvs1 = this.faceVertexUvs[ 0 ];\n\t\t\tvar uvs2 = this.faceVertexUvs[ 1 ];\n\n\t\t\tvar newUvs1, newUvs2;\n\n\t\t\tif ( uvs1 && uvs1.length === length ) newUvs1 = [];\n\t\t\tif ( uvs2 && uvs2.length === length ) newUvs2 = [];\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tvar id = faces[ i ]._id;\n\n\t\t\t\tif ( newUvs1 ) newUvs1.push( uvs1[ id ] );\n\t\t\t\tif ( newUvs2 ) newUvs2.push( uvs2[ id ] );\n\n\t\t\t}\n\n\t\t\tif ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;\n\t\t\tif ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Geometry',\n\t\t\t\t\tgenerator: 'Geometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Geometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tvar vertices = [];\n\n\t\t\tfor ( var i = 0; i < this.vertices.length; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t\tvar faces = [];\n\t\t\tvar normals = [];\n\t\t\tvar normalsHash = {};\n\t\t\tvar colors = [];\n\t\t\tvar colorsHash = {};\n\t\t\tvar uvs = [];\n\t\t\tvar uvsHash = {};\n\n\t\t\tfor ( var i = 0; i < this.faces.length; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\n\t\t\t\tvar hasMaterial = true;\n\t\t\t\tvar hasFaceUv = false; // deprecated\n\t\t\t\tvar hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;\n\t\t\t\tvar hasFaceNormal = face.normal.length() > 0;\n\t\t\t\tvar hasFaceVertexNormal = face.vertexNormals.length > 0;\n\t\t\t\tvar hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;\n\t\t\t\tvar hasFaceVertexColor = face.vertexColors.length > 0;\n\n\t\t\t\tvar faceType = 0;\n\n\t\t\t\tfaceType = setBit( faceType, 0, 0 ); // isQuad\n\t\t\t\tfaceType = setBit( faceType, 1, hasMaterial );\n\t\t\t\tfaceType = setBit( faceType, 2, hasFaceUv );\n\t\t\t\tfaceType = setBit( faceType, 3, hasFaceVertexUv );\n\t\t\t\tfaceType = setBit( faceType, 4, hasFaceNormal );\n\t\t\t\tfaceType = setBit( faceType, 5, hasFaceVertexNormal );\n\t\t\t\tfaceType = setBit( faceType, 6, hasFaceColor );\n\t\t\t\tfaceType = setBit( faceType, 7, hasFaceVertexColor );\n\n\t\t\t\tfaces.push( faceType );\n\t\t\t\tfaces.push( face.a, face.b, face.c );\n\t\t\t\tfaces.push( face.materialIndex );\n\n\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\tvar faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 0 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 1 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\tfaces.push( getNormalIndex( face.normal ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 0 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 1 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\tfaces.push( getColorIndex( face.color ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 0 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 1 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction setBit( value, position, enabled ) {\n\n\t\t\t\treturn enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );\n\n\t\t\t}\n\n\t\t\tfunction getNormalIndex( normal ) {\n\n\t\t\t\tvar hash = normal.x.toString() + normal.y.toString() + normal.z.toString();\n\n\t\t\t\tif ( normalsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tnormalsHash[ hash ] = normals.length / 3;\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getColorIndex( color ) {\n\n\t\t\t\tvar hash = color.r.toString() + color.g.toString() + color.b.toString();\n\n\t\t\t\tif ( colorsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tcolorsHash[ hash ] = colors.length;\n\t\t\t\tcolors.push( color.getHex() );\n\n\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getUvIndex( uv ) {\n\n\t\t\t\tvar hash = uv.x.toString() + uv.y.toString();\n\n\t\t\t\tif ( uvsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tuvsHash[ hash ] = uvs.length / 2;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tdata.data = {};\n\n\t\t\tdata.data.vertices = vertices;\n\t\t\tdata.data.normals = normals;\n\t\t\tif ( colors.length > 0 ) data.data.colors = colors;\n\t\t\tif ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility\n\t\t\tdata.data.faces = faces;\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new Geometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.vertices = [];\n\t\t\tthis.faces = [];\n\t\t\tthis.faceVertexUvs = [ [] ];\n\t\t\tthis.colors = [];\n\n\t\t\tvar vertices = source.vertices;\n\n\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertices.push( vertices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tvar colors = source.colors;\n\n\t\t\tfor ( var i = 0, il = colors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.colors.push( colors[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tvar faces = source.faces;\n\n\t\t\tfor ( var i = 0, il = faces.length; i < il; i ++ ) {\n\n\t\t\t\tthis.faces.push( faces[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\t\t\tvar faceVertexUvs = source.faceVertexUvs[ i ];\n\n\t\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar uvs = faceVertexUvs[ j ], uvsCopy = [];\n\n\t\t\t\t\tfor ( var k = 0, kl = uvs.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tvar uv = uvs[ k ];\n\n\t\t\t\t\t\tuvsCopy.push( uv.clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\tvar count$3 = 0;\n\tfunction GeometryIdCount() { return count$3++; }\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectGeometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'DirectGeometry';\n\n\t\tthis.indices = [];\n\t\tthis.vertices = [];\n\t\tthis.normals = [];\n\t\tthis.colors = [];\n\t\tthis.uvs = [];\n\t\tthis.uvs2 = [];\n\n\t\tthis.groups = [];\n\n\t\tthis.morphTargets = {};\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\t// this.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tObject.assign( DirectGeometry.prototype, EventDispatcher.prototype, {\n\n\t\tcomputeBoundingBox: Geometry.prototype.computeBoundingBox,\n\t\tcomputeBoundingSphere: Geometry.prototype.computeBoundingSphere,\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\tconsole.warn( 'THREE.DirectGeometry: computeFaceNormals() is not a method of this type of geometry.' );\n\n\t\t},\n\n\t\tcomputeVertexNormals: function () {\n\n\t\t\tconsole.warn( 'THREE.DirectGeometry: computeVertexNormals() is not a method of this type of geometry.' );\n\n\t\t},\n\n\t\tcomputeGroups: function ( geometry ) {\n\n\t\t\tvar group;\n\t\t\tvar groups = [];\n\t\t\tvar materialIndex;\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t// materials\n\n\t\t\t\tif ( face.materialIndex !== materialIndex ) {\n\n\t\t\t\t\tmaterialIndex = face.materialIndex;\n\n\t\t\t\t\tif ( group !== undefined ) {\n\n\t\t\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\t\t\tgroups.push( group );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgroup = {\n\t\t\t\t\t\tstart: i * 3,\n\t\t\t\t\t\tmaterialIndex: materialIndex\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( group !== undefined ) {\n\n\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\tgroups.push( group );\n\n\t\t\t}\n\n\t\t\tthis.groups = groups;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tvar faces = geometry.faces;\n\t\t\tvar vertices = geometry.vertices;\n\t\t\tvar faceVertexUvs = geometry.faceVertexUvs;\n\n\t\t\tvar hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;\n\t\t\tvar hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;\n\n\t\t\t// morphs\n\n\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\tvar morphTargetsLength = morphTargets.length;\n\n\t\t\tvar morphTargetsPosition;\n\n\t\t\tif ( morphTargetsLength > 0 ) {\n\n\t\t\t\tmorphTargetsPosition = [];\n\n\t\t\t\tfor ( var i = 0; i < morphTargetsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsPosition[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.position = morphTargetsPosition;\n\n\t\t\t}\n\n\t\t\tvar morphNormals = geometry.morphNormals;\n\t\t\tvar morphNormalsLength = morphNormals.length;\n\n\t\t\tvar morphTargetsNormal;\n\n\t\t\tif ( morphNormalsLength > 0 ) {\n\n\t\t\t\tmorphTargetsNormal = [];\n\n\t\t\t\tfor ( var i = 0; i < morphNormalsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsNormal[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.normal = morphTargetsNormal;\n\n\t\t\t}\n\n\t\t\t// skins\n\n\t\t\tvar skinIndices = geometry.skinIndices;\n\t\t\tvar skinWeights = geometry.skinWeights;\n\n\t\t\tvar hasSkinIndices = skinIndices.length === vertices.length;\n\t\t\tvar hasSkinWeights = skinWeights.length === vertices.length;\n\n\t\t\t//\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tthis.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tthis.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar normal = face.normal;\n\n\t\t\t\t\tthis.normals.push( normal, normal, normal );\n\n\t\t\t\t}\n\n\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\tif ( vertexColors.length === 3 ) {\n\n\t\t\t\t\tthis.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar color = face.color;\n\n\t\t\t\t\tthis.colors.push( color, color, color );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );\n\n\t\t\t\t\t\tthis.uvs.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv2 === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 1 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );\n\n\t\t\t\t\t\tthis.uvs2.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// morphs\n\n\t\t\t\tfor ( var j = 0; j < morphTargetsLength; j ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ j ].vertices;\n\n\t\t\t\t\tmorphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0; j < morphNormalsLength; j ++ ) {\n\n\t\t\t\t\tvar morphNormal = morphNormals[ j ].vertexNormals[ i ];\n\n\t\t\t\t\tmorphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );\n\n\t\t\t\t}\n\n\t\t\t\t// skins\n\n\t\t\t\tif ( hasSkinIndices ) {\n\n\t\t\t\t\tthis.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasSkinWeights ) {\n\n\t\t\t\t\tthis.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeGroups( geometry );\n\n\t\t\tthis.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.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\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}\n\n\tObject.assign( BufferGeometry.prototype, EventDispatcher.prototype, {\n\n\t\tisBufferGeometry: true,\n\n\t\tgetIndex: function () {\n\n\t\t\treturn this.index;\n\n\t\t},\n\n\t\tsetIndex: function ( index ) {\n\n\t\t\tthis.index = index;\n\n\t\t},\n\n\t\taddAttribute: function ( name, attribute ) {\n\n\t\t\tif ( (attribute && attribute.isBufferAttribute) === false && (attribute && attribute.isInterleavedBufferAttribute) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\n\n\t\t\t\tthis.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( name === 'index' ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\n\t\t\t\tthis.setIndex( attribute );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.attributes[ name ] = attribute;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetAttribute: function ( name ) {\n\n\t\t\treturn this.attributes[ name ];\n\n\t\t},\n\n\t\tremoveAttribute: function ( name ) {\n\n\t\t\tdelete this.attributes[ name ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddGroup: function ( start, count, materialIndex ) {\n\n\t\t\tthis.groups.push( {\n\n\t\t\t\tstart: start,\n\t\t\t\tcount: count,\n\t\t\t\tmaterialIndex: materialIndex !== undefined ? materialIndex : 0\n\n\t\t\t} );\n\n\t\t},\n\n\t\tclearGroups: function () {\n\n\t\t\tthis.groups = [];\n\n\t\t},\n\n\t\tsetDrawRange: function ( start, count ) {\n\n\t\t\tthis.drawRange.start = start;\n\t\t\tthis.drawRange.count = count;\n\n\t\t},\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tmatrix.applyToVector3Array( position.array );\n\t\t\t\tposition.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tvar normal = this.attributes.normal;\n\n\t\t\tif ( normal !== undefined ) {\n\n\t\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t\tnormalMatrix.applyToVector3Array( normal.array );\n\t\t\t\tnormal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\t// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( (object && object.isPoints) || (object && object.isLine) ) {\n\n\t\t\t\tvar positions = new Float32Attribute( geometry.vertices.length * 3, 3 );\n\t\t\t\tvar colors = new Float32Attribute( geometry.colors.length * 3, 3 );\n\n\t\t\t\tthis.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\n\t\t\t\tthis.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\n\n\t\t\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\n\n\t\t\t\t\tvar lineDistances = new Float32Attribute( geometry.lineDistances.length, 1 );\n\n\t\t\t\t\tthis.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( (object && object.isMesh) ) {\n\n\t\t\t\tif ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\tthis.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateFromObject: function ( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( (object && object.isMesh) ) {\n\n\t\t\t\tvar direct = geometry.__directGeometry;\n\n\t\t\t\tif ( geometry.elementsNeedUpdate === true ) {\n\n\t\t\t\t\tdirect = undefined;\n\t\t\t\t\tgeometry.elementsNeedUpdate = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( direct === undefined ) {\n\n\t\t\t\t\treturn this.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t\tdirect.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\t\tdirect.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\t\tdirect.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\t\tdirect.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\t\tdirect.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t\tgeometry = direct;\n\n\t\t\t}\n\n\t\t\tvar attribute;\n\n\t\t\tif ( geometry.verticesNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.position;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.vertices );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.normalsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.normal;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.normals );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.colorsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.color;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyColorsArray( geometry.colors );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvsNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.uv;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector2sArray( geometry.uvs );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.lineDistancesNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.lineDistance;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyArray( geometry.lineDistances );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.lineDistancesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.groupsNeedUpdate ) {\n\n\t\t\t\tgeometry.computeGroups( object.geometry );\n\t\t\t\tthis.groups = geometry.groups;\n\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tgeometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );\n\n\t\t\treturn this.fromDirectGeometry( geometry.__directGeometry );\n\n\t\t},\n\n\t\tfromDirectGeometry: function ( geometry ) {\n\n\t\t\tvar positions = new Float32Array( geometry.vertices.length * 3 );\n\t\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );\n\n\t\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\t\tvar normals = new Float32Array( geometry.normals.length * 3 );\n\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\t\tvar colors = new Float32Array( geometry.colors.length * 3 );\n\t\t\t\tthis.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs.length > 0 ) {\n\n\t\t\t\tvar uvs = new Float32Array( geometry.uvs.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs2.length > 0 ) {\n\n\t\t\t\tvar uvs2 = new Float32Array( geometry.uvs2.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.indices.length > 0 ) {\n\n\t\t\t\tvar TypeArray = geometry.vertices.length > 65535 ? Uint32Array : Uint16Array;\n\t\t\t\tvar indices = new TypeArray( geometry.indices.length * 3 );\n\t\t\t\tthis.setIndex( new BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) );\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tthis.groups = geometry.groups;\n\n\t\t\t// morphs\n\n\t\t\tfor ( var name in geometry.morphTargets ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphTargets = geometry.morphTargets[ name ];\n\n\t\t\t\tfor ( var i = 0, l = morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ i ];\n\n\t\t\t\t\tvar attribute = new Float32Attribute( morphTarget.length * 3, 3 );\n\n\t\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// skinning\n\n\t\t\tif ( geometry.skinIndices.length > 0 ) {\n\n\t\t\t\tvar skinIndices = new Float32Attribute( geometry.skinIndices.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.skinWeights.length > 0 ) {\n\n\t\t\t\tvar skinWeights = new Float32Attribute( geometry.skinWeights.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tvar positions = this.attributes.position.array;\n\n\t\t\tif ( positions !== undefined ) {\n\n\t\t\t\tthis.boundingBox.setFromArray( positions );\n\n\t\t\t} else {\n\n\t\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t\t}\n\n\t\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\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\t}\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tvar box = new Box3();\n\t\t\tvar vector = new Vector3();\n\n\t\t\treturn function computeBoundingSphere() {\n\n\t\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t\t}\n\n\t\t\t\tvar positions = this.attributes.position;\n\n\t\t\t\tif ( positions ) {\n\n\t\t\t\t\tvar array = positions.array;\n\t\t\t\t\tvar center = this.boundingSphere.center;\n\n\t\t\t\t\tbox.setFromArray( array );\n\t\t\t\t\tbox.getCenter( center );\n\n\t\t\t\t\t// hoping to find a boundingSphere with a radius smaller than the\n\t\t\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\t\tfor ( var i = 0, il = array.length; i < il; i += 3 ) {\n\n\t\t\t\t\t\tvector.fromArray( array, i );\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\t// backwards compatibility\n\n\t\t},\n\n\t\tcomputeVertexNormals: function () {\n\n\t\t\tvar index = this.index;\n\t\t\tvar attributes = this.attributes;\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( attributes.position ) {\n\n\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\tif ( attributes.normal === undefined ) {\n\n\t\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// reset existing normals to zero\n\n\t\t\t\t\tvar array = attributes.normal.array;\n\n\t\t\t\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tarray[ i ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar normals = attributes.normal.array;\n\n\t\t\t\tvar vA, vB, vC,\n\n\t\t\t\tpA = new Vector3(),\n\t\t\t\tpB = new Vector3(),\n\t\t\t\tpC = new Vector3(),\n\n\t\t\t\tcb = new Vector3(),\n\t\t\t\tab = new Vector3();\n\n\t\t\t\t// indexed elements\n\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\t\tthis.addGroup( 0, indices.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var j = 0, jl = groups.length; j < jl; ++ j ) {\n\n\t\t\t\t\t\tvar group = groups[ j ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\t\tvA = indices[ i + 0 ] * 3;\n\t\t\t\t\t\t\tvB = indices[ i + 1 ] * 3;\n\t\t\t\t\t\t\tvC = indices[ i + 2 ] * 3;\n\n\t\t\t\t\t\t\tpA.fromArray( positions, vA );\n\t\t\t\t\t\t\tpB.fromArray( positions, vB );\n\t\t\t\t\t\t\tpC.fromArray( positions, vC );\n\n\t\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\t\tnormals[ vA ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vA + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vA + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vB ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vB + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vB + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vC ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vC + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vC + 2 ] += cb.z;\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\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\t\tfor ( var i = 0, il = positions.length; i < il; i += 9 ) {\n\n\t\t\t\t\t\tpA.fromArray( positions, i );\n\t\t\t\t\t\tpB.fromArray( positions, i + 3 );\n\t\t\t\t\t\tpC.fromArray( positions, i + 6 );\n\n\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\tnormals[ i ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 1 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 2 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 3 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 4 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 5 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 6 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 7 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 8 ] = cb.z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.normalizeNormals();\n\n\t\t\t\tattributes.normal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tmerge: function ( geometry, offset ) {\n\n\t\t\tif ( (geometry && geometry.isBufferGeometry) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\t\tvar attribute1 = attributes[ key ];\n\t\t\t\tvar attributeArray1 = attribute1.array;\n\n\t\t\t\tvar attribute2 = geometry.attributes[ key ];\n\t\t\t\tvar attributeArray2 = attribute2.array;\n\n\t\t\t\tvar attributeSize = attribute2.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) {\n\n\t\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalizeNormals: function () {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\n\t\t\tvar x, y, z, n;\n\n\t\t\tfor ( var i = 0, il = normals.length; i < il; i += 3 ) {\n\n\t\t\t\tx = normals[ i ];\n\t\t\t\ty = normals[ i + 1 ];\n\t\t\t\tz = normals[ i + 2 ];\n\n\t\t\t\tn = 1.0 / Math.sqrt( x * x + y * y + z * z );\n\n\t\t\t\tnormals[ i ] *= n;\n\t\t\t\tnormals[ i + 1 ] *= n;\n\t\t\t\tnormals[ i + 2 ] *= n;\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoNonIndexed: function () {\n\n\t\t\tif ( this.index === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar geometry2 = new BufferGeometry();\n\n\t\t\tvar indices = this.index.array;\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\n\t\t\t\tvar array = attribute.array;\n\t\t\t\tvar itemSize = attribute.itemSize;\n\n\t\t\t\tvar array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\t\tvar index = 0, index2 = 0;\n\n\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t\tfor ( var j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) );\n\n\t\t\t}\n\n\t\t\treturn geometry2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard BufferGeometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tdata.data = { attributes: {} };\n\n\t\t\tvar index = this.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar array = Array.prototype.slice.call( index.array );\n\n\t\t\t\tdata.data.index = {\n\t\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\t\tarray: array\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\n\t\t\t\tvar array = Array.prototype.slice.call( attribute.array );\n\n\t\t\t\tdata.data.attributes[ key ] = {\n\t\t\t\t\titemSize: attribute.itemSize,\n\t\t\t\t\ttype: attribute.array.constructor.name,\n\t\t\t\t\tarray: array,\n\t\t\t\t\tnormalized: attribute.normalized\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = this.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tdata.data.boundingSphere = {\n\t\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\t\tradius: boundingSphere.radius\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new BufferGeometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar index = source.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tthis.setIndex( index.clone() );\n\n\t\t\t}\n\n\t\t\tvar attributes = source.attributes;\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\t\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t\t}\n\n\t\t\tvar groups = source.groups;\n\n\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\tvar group = groups[ i ];\n\t\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\tBufferGeometry.MaxIndex = 65535;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author jonobr1 / http://jonobr1.com/\n\t */\n\n\tfunction Mesh( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t\tthis.drawMode = TrianglesDrawMode;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tMesh.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Mesh,\n\n\t\tisMesh: true,\n\n\t\tsetDrawMode: function ( value ) {\n\n\t\t\tthis.drawMode = value;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.drawMode = source.drawMode;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateMorphTargets: function () {\n\n\t\t\tvar morphTargets = this.geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( var m = 0, ml = morphTargets.length; m < ml; m ++ ) {\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ morphTargets[ m ].name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\tvar vA = new Vector3();\n\t\t\tvar vB = new Vector3();\n\t\t\tvar vC = new Vector3();\n\n\t\t\tvar tempA = new Vector3();\n\t\t\tvar tempB = new Vector3();\n\t\t\tvar tempC = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tvar barycoord = new Vector3();\n\n\t\t\tvar intersectionPoint = new Vector3();\n\t\t\tvar intersectionPointWorld = new Vector3();\n\n\t\t\tfunction uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) {\n\n\t\t\t\tTriangle.barycoordFromPoint( point, p1, p2, p3, barycoord );\n\n\t\t\t\tuv1.multiplyScalar( barycoord.x );\n\t\t\t\tuv2.multiplyScalar( barycoord.y );\n\t\t\t\tuv3.multiplyScalar( barycoord.z );\n\n\t\t\t\tuv1.add( uv2 ).add( uv3 );\n\n\t\t\t\treturn uv1.clone();\n\n\t\t\t}\n\n\t\t\tfunction checkIntersection( object, raycaster, ray, pA, pB, pC, point ) {\n\n\t\t\t\tvar intersect;\n\t\t\t\tvar material = object.material;\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t\t\t\t}\n\n\t\t\t\tif ( intersect === null ) return null;\n\n\t\t\t\tintersectionPointWorld.copy( point );\n\t\t\t\tintersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\t\t\t\treturn {\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\tpoint: intersectionPointWorld.clone(),\n\t\t\t\t\tobject: object\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tfunction checkBufferGeometryIntersection( object, raycaster, ray, positions, uvs, a, b, c ) {\n\n\t\t\t\tvA.fromArray( positions, a * 3 );\n\t\t\t\tvB.fromArray( positions, b * 3 );\n\t\t\t\tvC.fromArray( positions, c * 3 );\n\n\t\t\t\tvar intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint );\n\n\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\t\tuvA.fromArray( uvs, a * 2 );\n\t\t\t\t\t\tuvB.fromArray( uvs, b * 2 );\n\t\t\t\t\t\tuvC.fromArray( uvs, c * 2 );\n\n\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tintersection.face = new Face3( a, b, c, Triangle.normal( vA, vB, vC ) );\n\t\t\t\t\tintersection.faceIndex = a;\n\n\t\t\t\t}\n\n\t\t\t\treturn intersection;\n\n\t\t\t}\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar material = this.material;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\tif ( material === undefined ) return;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\t// Check boundingBox before continuing\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tif ( ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t\t\t}\n\n\t\t\t\tvar uvs, intersection;\n\n\t\t\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\tvar a, b, c;\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( attributes.uv !== undefined ) {\n\n\t\t\t\t\t\tuvs = attributes.uv.array;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = indices[ i ];\n\t\t\t\t\t\t\tb = indices[ i + 1 ];\n\t\t\t\t\t\t\tc = indices[ i + 2 ];\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\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\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length; i < l; i += 9 ) {\n\n\t\t\t\t\t\t\ta = i / 3;\n\t\t\t\t\t\t\tb = a + 1;\n\t\t\t\t\t\t\tc = a + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.index = a; // triangle number in positions buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\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 if ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\tvar fvA, fvB, fvC;\n\t\t\t\t\tvar isFaceMaterial = (material && material.isMultiMaterial);\n\t\t\t\t\tvar materials = isFaceMaterial === true ? material.materials : null;\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar faceVertexUvs = geometry.faceVertexUvs[ 0 ];\n\t\t\t\t\tif ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;\n\n\t\t\t\t\tfor ( var f = 0, fl = faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tvar face = faces[ f ];\n\t\t\t\t\t\tvar faceMaterial = isFaceMaterial === true ? materials[ face.materialIndex ] : material;\n\n\t\t\t\t\t\tif ( faceMaterial === undefined ) continue;\n\n\t\t\t\t\t\tfvA = vertices[ face.a ];\n\t\t\t\t\t\tfvB = vertices[ face.b ];\n\t\t\t\t\t\tfvC = vertices[ face.c ];\n\n\t\t\t\t\t\tif ( faceMaterial.morphTargets === true ) {\n\n\t\t\t\t\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\t\t\t\t\tvar morphInfluences = this.morphTargetInfluences;\n\n\t\t\t\t\t\t\tvA.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvB.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvC.set( 0, 0, 0 );\n\n\t\t\t\t\t\t\tfor ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {\n\n\t\t\t\t\t\t\t\tvar influence = morphInfluences[ t ];\n\n\t\t\t\t\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t\t\t\t\tvar targets = morphTargets[ t ].vertices;\n\n\t\t\t\t\t\t\t\tvA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence );\n\t\t\t\t\t\t\t\tvB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence );\n\t\t\t\t\t\t\t\tvC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvA.add( fvA );\n\t\t\t\t\t\t\tvB.add( fvB );\n\t\t\t\t\t\t\tvC.add( fvC );\n\n\t\t\t\t\t\t\tfvA = vA;\n\t\t\t\t\t\t\tfvB = vB;\n\t\t\t\t\t\t\tfvC = vC;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tintersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\t\t\t\tvar uvs_f = uvs[ f ];\n\t\t\t\t\t\t\t\tuvA.copy( uvs_f[ 0 ] );\n\t\t\t\t\t\t\t\tuvB.copy( uvs_f[ 1 ] );\n\t\t\t\t\t\t\t\tuvC.copy( uvs_f[ 2 ] );\n\n\t\t\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tintersection.face = face;\n\t\t\t\t\t\t\tintersection.faceIndex = f;\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};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'BoxBufferGeometry';\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\tvar scope = this;\n\n\t\t// segments\n\t\twidthSegments = Math.floor( widthSegments ) || 1;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\t\tdepthSegments = Math.floor( depthSegments ) || 1;\n\n\t\t// these are used to calculate buffer length\n\t\tvar vertexCount = calculateVertexCount( widthSegments, heightSegments, depthSegments );\n\t\tvar indexCount = calculateIndexCount( widthSegments, heightSegments, depthSegments );\n\n\t\t// buffers\n\t\tvar indices = new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount );\n\t\tvar vertices = new Float32Array( vertexCount * 3 );\n\t\tvar normals = new Float32Array( vertexCount * 3 );\n\t\tvar uvs = new Float32Array( vertexCount * 2 );\n\n\t\t// offset variables\n\t\tvar vertexBufferOffset = 0;\n\t\tvar uvBufferOffset = 0;\n\t\tvar indexBufferOffset = 0;\n\t\tvar numberOfVertices = 0;\n\n\t\t// group variables\n\t\tvar groupStart = 0;\n\n\t\t// build each side of the box geometry\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\t\tthis.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t\t// helper functions\n\n\t\tfunction calculateVertexCount( w, h, d ) {\n\n\t\t\tvar vertices = 0;\n\n\t\t\t// calculate the amount of vertices for each side (plane)\n\t\t\tvertices += (w + 1) * (h + 1) * 2; // xy\n\t\t\tvertices += (w + 1) * (d + 1) * 2; // xz\n\t\t\tvertices += (d + 1) * (h + 1) * 2; // zy\n\n\t\t\treturn vertices;\n\n\t\t}\n\n\t\tfunction calculateIndexCount( w, h, d ) {\n\n\t\t\tvar index = 0;\n\n\t\t\t// calculate the amount of squares for each side\n\t\t\tindex += w * h * 2; // xy\n\t\t\tindex += w * d * 2; // xz\n\t\t\tindex += d * h * 2; // zy\n\n\t\t\treturn index * 6; // two triangles per square => six vertices per square\n\n\t\t}\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tvar segmentWidth\t= width / gridX;\n\t\t\tvar segmentHeight = height / gridY;\n\n\t\t\tvar widthHalf = width / 2;\n\t\t\tvar heightHalf = height / 2;\n\t\t\tvar depthHalf = depth / 2;\n\n\t\t\tvar gridX1 = gridX + 1;\n\t\t\tvar gridY1 = gridY + 1;\n\n\t\t\tvar vertexCounter = 0;\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( var iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tvar y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( var ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tvar x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\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\t\t\t\t\tvertices[ vertexBufferOffset ] = vector.x;\n\t\t\t\t\tvertices[ vertexBufferOffset + 1 ] = vector.y;\n\t\t\t\t\tvertices[ vertexBufferOffset + 2 ] = vector.z;\n\n\t\t\t\t\t// set values to correct vector component\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\t\t\t\t\tnormals[ vertexBufferOffset ] = vector.x;\n\t\t\t\t\tnormals[ vertexBufferOffset + 1 ] = vector.y;\n\t\t\t\t\tnormals[ vertexBufferOffset + 2 ] = vector.z;\n\n\t\t\t\t\t// uvs\n\t\t\t\t\tuvs[ uvBufferOffset ] = ix / gridX;\n\t\t\t\t\tuvs[ uvBufferOffset + 1 ] = 1 - ( iy / gridY );\n\n\t\t\t\t\t// update offsets and counters\n\t\t\t\t\tvertexBufferOffset += 3;\n\t\t\t\t\tuvBufferOffset += 2;\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\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 ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\t// indices\n\t\t\t\t\tvar a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tvar b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// face one\n\t\t\t\t\tindices[ indexBufferOffset ] = a;\n\t\t\t\t\tindices[ indexBufferOffset + 1 ] = b;\n\t\t\t\t\tindices[ indexBufferOffset + 2 ] = d;\n\n\t\t\t\t\t// face two\n\t\t\t\t\tindices[ indexBufferOffset + 3 ] = b;\n\t\t\t\t\tindices[ indexBufferOffset + 4 ] = c;\n\t\t\t\t\tindices[ indexBufferOffset + 5 ] = d;\n\n\t\t\t\t\t// update offsets and counters\n\t\t\t\t\tindexBufferOffset += 6;\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\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tBoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tBoxBufferGeometry.prototype.constructor = BoxBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PlaneBufferGeometry';\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\tvar width_half = width / 2;\n\t\tvar height_half = height / 2;\n\n\t\tvar gridX = Math.floor( widthSegments ) || 1;\n\t\tvar gridY = Math.floor( heightSegments ) || 1;\n\n\t\tvar gridX1 = gridX + 1;\n\t\tvar gridY1 = gridY + 1;\n\n\t\tvar segment_width = width / gridX;\n\t\tvar segment_height = height / gridY;\n\n\t\tvar vertices = new Float32Array( gridX1 * gridY1 * 3 );\n\t\tvar normals = new Float32Array( gridX1 * gridY1 * 3 );\n\t\tvar uvs = new Float32Array( gridX1 * gridY1 * 2 );\n\n\t\tvar offset = 0;\n\t\tvar offset2 = 0;\n\n\t\tfor ( var iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tvar y = iy * segment_height - height_half;\n\n\t\t\tfor ( var ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tvar x = ix * segment_width - width_half;\n\n\t\t\t\tvertices[ offset ] = x;\n\t\t\t\tvertices[ offset + 1 ] = - y;\n\n\t\t\t\tnormals[ offset + 2 ] = 1;\n\n\t\t\t\tuvs[ offset2 ] = ix / gridX;\n\t\t\t\tuvs[ offset2 + 1 ] = 1 - ( iy / gridY );\n\n\t\t\t\toffset += 3;\n\t\t\t\toffset2 += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\toffset = 0;\n\n\t\tvar indices = new ( ( vertices.length / 3 ) > 65535 ? Uint32Array : Uint16Array )( gridX * gridY * 6 );\n\n\t\tfor ( var iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( var ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tvar a = ix + gridX1 * iy;\n\t\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices[ offset ] = a;\n\t\t\t\tindices[ offset + 1 ] = b;\n\t\t\t\tindices[ offset + 2 ] = d;\n\n\t\t\t\tindices[ offset + 3 ] = b;\n\t\t\t\tindices[ offset + 4 ] = c;\n\t\t\t\tindices[ offset + 5 ] = d;\n\n\t\t\t\toffset += 6;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tPlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction Camera() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t}\n\n\tCamera.prototype = Object.create( Object3D.prototype );\n\tCamera.prototype.constructor = Camera;\n\n\tCamera.prototype.isCamera = true;\n\n\tCamera.prototype.getWorldDirection = function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\treturn result.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.lookAt = function () {\n\n\t\t// This routine does not support cameras with rotated and/or translated parent(s)\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function lookAt( vector ) {\n\n\t\t\tm1.lookAt( this.position, vector, this.up );\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.clone = function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t};\n\n\tCamera.prototype.copy = function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author greggman / http://games.greggman.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author tschw\n\t */\n\n\tfunction PerspectiveCamera( fov, aspect, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov !== undefined ? fov : 50;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near !== undefined ? near : 0.1;\n\t\tthis.far = far !== undefined ? far : 2000;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect !== undefined ? aspect : 1;\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\tPerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: PerspectiveCamera,\n\n\t\tisPerspectiveCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.fov = source.fov;\n\t\t\tthis.zoom = source.zoom;\n\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\t\t\tthis.focus = source.focus;\n\n\t\t\tthis.aspect = source.aspect;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\tthis.filmGauge = source.filmGauge;\n\t\t\tthis.filmOffset = source.filmOffset;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t\t *\n\t\t * The default film gauge is 35, so that the focal length can be specified for\n\t\t * a 35mm (full frame) camera.\n\t\t *\n\t\t * Values for focal length and film gauge must have the same unit.\n\t\t */\n\t\tsetFocalLength: function ( focalLength ) {\n\n\t\t\t// see http://www.bobatkins.com/photography/technical/field_of_view.html\n\t\t\tvar vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\t\tthis.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\t/**\n\t\t * Calculates the focal length from the current .fov and .filmGauge.\n\t\t */\n\t\tgetFocalLength: function () {\n\n\t\t\tvar vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov );\n\n\t\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t\t},\n\n\t\tgetEffectiveFOV: function () {\n\n\t\t\treturn _Math.RAD2DEG * 2 * Math.atan(\n\t\t\t\t\tMath.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t\t},\n\n\t\tgetFilmWidth: function () {\n\n\t\t\t// film not completely covered in portrait format (aspect < 1)\n\t\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t\t},\n\n\t\tgetFilmHeight: function () {\n\n\t\t\t// film not completely covered in landscape format (aspect > 1)\n\t\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t\t},\n\n\t\t/**\n\t\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t\t * multi-monitor/multi-machine setups.\n\t\t *\n\t\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t\t * the monitors are in grid like this\n\t\t *\n\t\t * +---+---+---+\n\t\t * | A | B | C |\n\t\t * +---+---+---+\n\t\t * | D | E | F |\n\t\t * +---+---+---+\n\t\t *\n\t\t * then for each monitor you would call it like this\n\t\t *\n\t\t * var w = 1920;\n\t\t * var h = 1080;\n\t\t * var fullWidth = w * 3;\n\t\t * var fullHeight = h * 2;\n\t\t *\n\t\t * --A--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t\t * --B--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t\t * --C--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t\t * --D--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t\t * --E--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t\t * --F--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t\t *\n\t\t * Note there is no reason monitors have to be the same size or in a grid.\n\t\t */\n\t\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar near = this.near,\n\t\t\t\ttop = near * Math.tan(\n\t\t\t\t\t\t_Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,\n\t\t\t\theight = 2 * top,\n\t\t\t\twidth = this.aspect * height,\n\t\t\t\tleft = - 0.5 * width,\n\t\t\t\tview = this.view;\n\n\t\t\tif ( view !== null ) {\n\n\t\t\t\tvar fullWidth = view.fullWidth,\n\t\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\t\twidth *= view.width / fullWidth;\n\t\t\t\theight *= view.height / fullHeight;\n\n\t\t\t}\n\n\t\t\tvar skew = this.filmOffset;\n\t\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\t\tthis.projectionMatrix.makeFrustum(\n\t\t\t\t\tleft, left + width, top - height, top, near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.fov = this.fov;\n\t\t\tdata.object.zoom = this.zoom;\n\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\t\t\tdata.object.focus = this.focus;\n\n\t\t\tdata.object.aspect = this.aspect;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\tdata.object.filmGauge = this.filmGauge;\n\t\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author arose / http://github.com/arose\n\t */\n\n\tfunction OrthographicCamera( left, right, top, bottom, near, far ) {\n\n\t\tCamera.call( this );\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 !== undefined ) ? near : 0.1;\n\t\tthis.far = ( far !== undefined ) ? far : 2000;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tOrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: OrthographicCamera,\n\n\t\tisOrthographicCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.left = source.left;\n\t\t\tthis.right = source.right;\n\t\t\tthis.top = source.top;\n\t\t\tthis.bottom = source.bottom;\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\n\t\t\tthis.zoom = source.zoom;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetViewOffset: function( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\t\tvar dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\t\tvar cx = ( this.right + this.left ) / 2;\n\t\t\tvar cy = ( this.top + this.bottom ) / 2;\n\n\t\t\tvar left = cx - dx;\n\t\t\tvar right = cx + dx;\n\t\t\tvar top = cy + dy;\n\t\t\tvar bottom = cy - dy;\n\n\t\t\tif ( this.view !== null ) {\n\n\t\t\t\tvar zoomW = this.zoom / ( this.view.width / this.view.fullWidth );\n\t\t\t\tvar zoomH = this.zoom / ( this.view.height / this.view.fullHeight );\n\t\t\t\tvar scaleW = ( this.right - this.left ) / this.view.width;\n\t\t\t\tvar scaleH = ( this.top - this.bottom ) / this.view.height;\n\n\t\t\t\tleft += scaleW * ( this.view.offsetX / zoomW );\n\t\t\t\tright = left + scaleW * ( this.view.width / zoomW );\n\t\t\t\ttop -= scaleH * ( this.view.offsetY / zoomH );\n\t\t\t\tbottom = top - scaleH * ( this.view.height / zoomH );\n\n\t\t\t}\n\n\t\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.zoom = this.zoom;\n\t\t\tdata.object.left = this.left;\n\t\t\tdata.object.right = this.right;\n\t\t\tdata.object.top = this.top;\n\t\t\tdata.object.bottom = this.bottom;\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLIndexedBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tvar type, size;\n\n\t\tfunction setIndex( index ) {\n\n\t\t\tif ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\t\ttype = gl.UNSIGNED_INT;\n\t\t\t\tsize = 4;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\t\t\t\tsize = 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawElements( mode, count, type, start * size );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry, start, count ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\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\textension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tsetMode: setMode,\n\t\t\tsetIndex: setIndex,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawArrays( mode, start, count );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\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\tvar position = geometry.attributes.position;\n\n\t\t\tvar count = 0;\n\n\t\t\tif ( (position && position.isInterleavedBufferAttribute) ) {\n\n\t\t\t\tcount = position.data.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t} else {\n\n\t\t\t\tcount = position.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t}\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\t\t\tsetMode: setMode,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLLights() {\n\n\t\tvar lights = {};\n\n\t\treturn {\n\n\t\t\tget: function ( light ) {\n\n\t\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\t\treturn lights[ light.id ];\n\n\t\t\t\t}\n\n\t\t\t\tvar uniforms;\n\n\t\t\t\tswitch ( light.type ) {\n\n\t\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\t\treturn uniforms;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction addLineNumbers( string ) {\n\n\t\tvar lines = string.split( '\\n' );\n\n\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t\t}\n\n\t\treturn lines.join( '\\n' );\n\n\t}\n\n\tfunction WebGLShader( gl, type, string ) {\n\n\t\tvar shader = gl.createShader( type );\n\n\t\tgl.shaderSource( shader, string );\n\t\tgl.compileShader( shader );\n\n\t\tif ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {\n\n\t\t\tconsole.error( 'THREE.WebGLShader: Shader couldn\\'t compile.' );\n\n\t\t}\n\n\t\tif ( gl.getShaderInfoLog( shader ) !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );\n\n\t\t}\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\treturn shader;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar programIdCount = 0;\n\n\tfunction getEncodingComponents( encoding ) {\n\n\t\tswitch ( encoding ) {\n\n\t\t\tcase LinearEncoding:\n\t\t\t\treturn [ 'Linear','( value )' ];\n\t\t\tcase sRGBEncoding:\n\t\t\t\treturn [ 'sRGB','( value )' ];\n\t\t\tcase RGBEEncoding:\n\t\t\t\treturn [ 'RGBE','( value )' ];\n\t\t\tcase RGBM7Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 7.0 )' ];\n\t\t\tcase RGBM16Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 16.0 )' ];\n\t\t\tcase RGBDEncoding:\n\t\t\t\treturn [ 'RGBD','( value, 256.0 )' ];\n\t\t\tcase GammaEncoding:\n\t\t\t\treturn [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ];\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported encoding: ' + encoding );\n\n\t\t}\n\n\t}\n\n\tfunction getTexelDecodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return \" + components[ 0 ] + \"ToLinear\" + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return LinearTo\" + components[ 0 ] + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\t\tvar toneMappingName;\n\n\t\tswitch ( toneMapping ) {\n\n\t\t\tcase LinearToneMapping:\n\t\t\t\ttoneMappingName = \"Linear\";\n\t\t\t\tbreak;\n\n\t\t\tcase ReinhardToneMapping:\n\t\t\t\ttoneMappingName = \"Reinhard\";\n\t\t\t\tbreak;\n\n\t\t\tcase Uncharted2ToneMapping:\n\t\t\t\ttoneMappingName = \"Uncharted2\";\n\t\t\t\tbreak;\n\n\t\t\tcase CineonToneMapping:\n\t\t\t\ttoneMappingName = \"OptimizedCineon\";\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported toneMapping: ' + toneMapping );\n\n\t\t}\n\n\t\treturn \"vec3 \" + functionName + \"( vec3 color ) { return \" + toneMappingName + \"ToneMapping( color ); }\";\n\n\t}\n\n\tfunction generateExtensions( extensions, parameters, rendererExtensions ) {\n\n\t\textensions = extensions || {};\n\n\t\tvar chunks = [\n\t\t\t( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t\t( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t\t( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t\t( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '',\n\t\t];\n\n\t\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tfunction generateDefines( defines ) {\n\n\t\tvar chunks = [];\n\n\t\tfor ( var name in defines ) {\n\n\t\t\tvar value = defines[ name ];\n\n\t\t\tif ( value === false ) continue;\n\n\t\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t\t}\n\n\t\treturn chunks.join( '\\n' );\n\n\t}\n\n\tfunction fetchAttributeLocations( gl, program, identifiers ) {\n\n\t\tvar attributes = {};\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\t\tfor ( var i = 0; i < n; i ++ ) {\n\n\t\t\tvar info = gl.getActiveAttrib( program, i );\n\t\t\tvar name = info.name;\n\n\t\t\t// console.log(\"THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:\", name, i );\n\n\t\t\tattributes[ name ] = gl.getAttribLocation( program, name );\n\n\t\t}\n\n\t\treturn attributes;\n\n\t}\n\n\tfunction filterEmptyLine( string ) {\n\n\t\treturn string !== '';\n\n\t}\n\n\tfunction replaceLightNums( string, parameters ) {\n\n\t\treturn string\n\t\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );\n\n\t}\n\n\tfunction parseIncludes( string ) {\n\n\t\tvar pattern = /#include +<([\\w\\d.]+)>/g;\n\n\t\tfunction replace( match, include ) {\n\n\t\t\tvar replace = ShaderChunk[ include ];\n\n\t\t\tif ( replace === undefined ) {\n\n\t\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t\t}\n\n\t\t\treturn parseIncludes( replace );\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction unrollLoops( string ) {\n\n\t\tvar pattern = /for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\n\n\t\tfunction replace( match, start, end, snippet ) {\n\n\t\t\tvar unroll = '';\n\n\t\t\tfor ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\t\t\tunroll += snippet.replace( /\\[ i \\]/g, '[ ' + i + ' ]' );\n\n\t\t\t}\n\n\t\t\treturn unroll;\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction WebGLProgram( renderer, code, material, parameters ) {\n\n\t\tvar gl = renderer.context;\n\n\t\tvar extensions = material.extensions;\n\t\tvar defines = material.defines;\n\n\t\tvar vertexShader = material.__webglShader.vertexShader;\n\t\tvar fragmentShader = material.__webglShader.fragmentShader;\n\n\t\tvar shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\t\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t\t}\n\n\t\tvar envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\tvar envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\t\tvar envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\n\t\tif ( parameters.envMap ) {\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeReflectionMapping:\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EquirectangularReflectionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SphericalReflectionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_SPHERE';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.combine ) {\n\n\t\t\t\tcase MultiplyOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MixOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AddOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;\n\n\t\t// console.log( 'building new program ' );\n\n\t\t//\n\n\t\tvar customExtensions = generateExtensions( extensions, parameters, renderer.extensions );\n\n\t\tvar customDefines = generateDefines( defines );\n\n\t\t//\n\n\t\tvar program = gl.createProgram();\n\n\t\tvar prefixVertex, prefixFragment;\n\n\t\tif ( material.isRawShaderMaterial ) {\n\n\t\t\tprefixVertex = [\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t} else {\n\n\t\t\tprefixVertex = [\n\n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t'attribute vec3 position;',\n\t\t\t\t'attribute vec3 normal;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'#ifdef USE_COLOR',\n\n\t\t\t\t'\tattribute vec3 color;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_MORPHTARGETS',\n\n\t\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t\t'\t#else',\n\n\t\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t\t'\t#endif',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\t\t\t\t'#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection),\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.premultipliedAlpha ? \"#define PREMULTIPLIED_ALPHA\" : '',\n\n\t\t\t\tparameters.physicallyCorrectLights ? \"#define PHYSICALLY_CORRECT_LIGHTS\" : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\tparameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? \"#define TONE_MAPPING\" : '',\n\t\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\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( \"toneMapping\", parameters.toneMapping ) : '',\n\n\t\t\t\t( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\t\tparameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',\n\t\t\t\tparameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',\n\t\t\t\tparameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',\n\t\t\t\tparameters.outputEncoding ? getTexelEncodingFunction( \"linearToOutputTexel\", parameters.outputEncoding ) : '',\n\n\t\t\t\tparameters.depthPacking ? \"#define DEPTH_PACKING \" + material.depthPacking : '',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t}\n\n\t\tvertexShader = parseIncludes( vertexShader, parameters );\n\t\tvertexShader = replaceLightNums( vertexShader, parameters );\n\n\t\tfragmentShader = parseIncludes( fragmentShader, parameters );\n\t\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\n\t\tif ( ! material.isShaderMaterial ) {\n\n\t\t\tvertexShader = unrollLoops( vertexShader );\n\t\t\tfragmentShader = unrollLoops( fragmentShader );\n\n\t\t}\n\n\t\tvar vertexGlsl = prefixVertex + vertexShader;\n\t\tvar fragmentGlsl = prefixFragment + fragmentShader;\n\n\t\t// console.log( '*VERTEX*', vertexGlsl );\n\t\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\t\tvar glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\t\tvar glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\t\tgl.attachShader( program, glVertexShader );\n\t\tgl.attachShader( program, glFragmentShader );\n\n\t\t// Force a particular attribute to index 0.\n\n\t\tif ( material.index0AttributeName !== undefined ) {\n\n\t\t\tgl.bindAttribLocation( program, 0, material.index0AttributeName );\n\n\t\t} else if ( parameters.morphTargets === true ) {\n\n\t\t\t// programs with morphTargets displace position out of attribute 0\n\t\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t\t}\n\n\t\tgl.linkProgram( program );\n\n\t\tvar programLog = gl.getProgramInfoLog( program );\n\t\tvar vertexLog = gl.getShaderInfoLog( glVertexShader );\n\t\tvar fragmentLog = gl.getShaderInfoLog( glFragmentShader );\n\n\t\tvar runnable = true;\n\t\tvar haveDiagnostics = true;\n\n\t\t// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );\n\t\t// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );\n\n\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\trunnable = false;\n\n\t\t\tconsole.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog );\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\t\t\t\tmaterial: material,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t// clean up\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\t// set up caching for uniform locations\n\n\t\tvar cachedUniforms;\n\n\t\tthis.getUniforms = function() {\n\n\t\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t\tcachedUniforms =\n\t\t\t\t\t\tnew WebGLUniforms( gl, program, renderer );\n\n\t\t\t}\n\n\t\t\treturn cachedUniforms;\n\n\t\t};\n\n\t\t// set up caching for attribute locations\n\n\t\tvar cachedAttributes;\n\n\t\tthis.getAttributes = function() {\n\n\t\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t\t}\n\n\t\t\treturn cachedAttributes;\n\n\t\t};\n\n\t\t// free resource\n\n\t\tthis.destroy = function() {\n\n\t\t\tgl.deleteProgram( program );\n\t\t\tthis.program = undefined;\n\n\t\t};\n\n\t\t// DEPRECATED\n\n\t\tObject.defineProperties( this, {\n\n\t\t\tuniforms: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );\n\t\t\t\t\treturn this.getUniforms();\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tattributes: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );\n\t\t\t\t\treturn this.getAttributes();\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t} );\n\n\n\t\t//\n\n\t\tthis.id = programIdCount ++;\n\t\tthis.code = code;\n\t\tthis.usedTimes = 1;\n\t\tthis.program = program;\n\t\tthis.vertexShader = glVertexShader;\n\t\tthis.fragmentShader = glFragmentShader;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLPrograms( renderer, capabilities ) {\n\n\t\tvar programs = [];\n\n\t\tvar shaderIDs = {\n\t\t\tMeshDepthMaterial: 'depth',\n\t\t\tMeshNormalMaterial: 'normal',\n\t\t\tMeshBasicMaterial: 'basic',\n\t\t\tMeshLambertMaterial: 'lambert',\n\t\t\tMeshPhongMaterial: 'phong',\n\t\t\tMeshStandardMaterial: 'physical',\n\t\t\tMeshPhysicalMaterial: 'physical',\n\t\t\tLineBasicMaterial: 'basic',\n\t\t\tLineDashedMaterial: 'dashed',\n\t\t\tPointsMaterial: 'points'\n\t\t};\n\n\t\tvar parameterNames = [\n\t\t\t\"precision\", \"supportsVertexTextures\", \"map\", \"mapEncoding\", \"envMap\", \"envMapMode\", \"envMapEncoding\",\n\t\t\t\"lightMap\", \"aoMap\", \"emissiveMap\", \"emissiveMapEncoding\", \"bumpMap\", \"normalMap\", \"displacementMap\", \"specularMap\",\n\t\t\t\"roughnessMap\", \"metalnessMap\",\n\t\t\t\"alphaMap\", \"combine\", \"vertexColors\", \"fog\", \"useFog\", \"fogExp\",\n\t\t\t\"flatShading\", \"sizeAttenuation\", \"logarithmicDepthBuffer\", \"skinning\",\n\t\t\t\"maxBones\", \"useVertexTexture\", \"morphTargets\", \"morphNormals\",\n\t\t\t\"maxMorphTargets\", \"maxMorphNormals\", \"premultipliedAlpha\",\n\t\t\t\"numDirLights\", \"numPointLights\", \"numSpotLights\", \"numHemiLights\",\n\t\t\t\"shadowMapEnabled\", \"shadowMapType\", \"toneMapping\", 'physicallyCorrectLights',\n\t\t\t\"alphaTest\", \"doubleSided\", \"flipSided\", \"numClippingPlanes\", \"numClipIntersection\", \"depthPacking\"\n\t\t];\n\n\n\t\tfunction allocateBones( object ) {\n\n\t\t\tif ( capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture ) {\n\n\t\t\t\treturn 1024;\n\n\t\t\t} else {\n\n\t\t\t\t// default for when object is not specified\n\t\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t\t//\n\t\t\t\t// - leave some extra space for other uniforms\n\t\t\t\t// - limit here is ANGLE's 254 max uniform vectors\n\t\t\t\t// (up to 54 should be safe)\n\n\t\t\t\tvar nVertexUniforms = capabilities.maxVertexUniforms;\n\t\t\t\tvar nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\t\tvar maxBones = nVertexMatrices;\n\n\t\t\t\tif ( object !== undefined && (object && object.isSkinnedMesh) ) {\n\n\t\t\t\t\tmaxBones = Math.min( object.skeleton.bones.length, maxBones );\n\n\t\t\t\t\tif ( maxBones < object.skeleton.bones.length ) {\n\n\t\t\t\t\t\tconsole.warn( 'WebGLRenderer: too many bones - ' + object.skeleton.bones.length + ', this GPU supports just ' + maxBones + ' (try OpenGL instead of ANGLE)' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn maxBones;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getTextureEncodingFromMap( map, gammaOverrideLinear ) {\n\n\t\t\tvar encoding;\n\n\t\t\tif ( ! map ) {\n\n\t\t\t\tencoding = LinearEncoding;\n\n\t\t\t} else if ( (map && map.isTexture) ) {\n\n\t\t\t\tencoding = map.encoding;\n\n\t\t\t} else if ( (map && map.isWebGLRenderTarget) ) {\n\n\t\t\t\tconsole.warn( \"THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\tencoding = map.texture.encoding;\n\n\t\t\t}\n\n\t\t\t// add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.\n\t\t\tif ( encoding === LinearEncoding && gammaOverrideLinear ) {\n\n\t\t\t\tencoding = GammaEncoding;\n\n\t\t\t}\n\n\t\t\treturn encoding;\n\n\t\t}\n\n\t\tthis.getParameters = function ( material, lights, fog, nClipPlanes, nClipIntersection, object ) {\n\n\t\t\tvar shaderID = shaderIDs[ material.type ];\n\n\t\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t\t// (not to blow over maxLights budget)\n\n\t\t\tvar maxBones = allocateBones( object );\n\t\t\tvar precision = renderer.getPrecision();\n\n\t\t\tif ( material.precision !== null ) {\n\n\t\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar currentRenderTarget = renderer.getCurrentRenderTarget();\n\n\t\t\tvar parameters = {\n\n\t\t\t\tshaderID: shaderID,\n\n\t\t\t\tprecision: precision,\n\t\t\t\tsupportsVertexTextures: capabilities.vertexTextures,\n\t\t\t\toutputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ),\n\t\t\t\tmap: !! material.map,\n\t\t\t\tmapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),\n\t\t\t\tenvMap: !! material.envMap,\n\t\t\t\tenvMapMode: material.envMap && material.envMap.mapping,\n\t\t\t\tenvMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),\n\t\t\t\tenvMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\t\tlightMap: !! material.lightMap,\n\t\t\t\taoMap: !! material.aoMap,\n\t\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\t\temissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),\n\t\t\t\tbumpMap: !! material.bumpMap,\n\t\t\t\tnormalMap: !! material.normalMap,\n\t\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\t\tspecularMap: !! material.specularMap,\n\t\t\t\talphaMap: !! material.alphaMap,\n\n\t\t\t\tcombine: material.combine,\n\n\t\t\t\tvertexColors: material.vertexColors,\n\n\t\t\t\tfog: !! fog,\n\t\t\t\tuseFog: material.fog,\n\t\t\t\tfogExp: (fog && fog.isFogExp2),\n\n\t\t\t\tflatShading: material.shading === FlatShading,\n\n\t\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\t\tlogarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,\n\n\t\t\t\tskinning: material.skinning,\n\t\t\t\tmaxBones: maxBones,\n\t\t\t\tuseVertexTexture: capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture,\n\n\t\t\t\tmorphTargets: material.morphTargets,\n\t\t\t\tmorphNormals: material.morphNormals,\n\t\t\t\tmaxMorphTargets: renderer.maxMorphTargets,\n\t\t\t\tmaxMorphNormals: renderer.maxMorphNormals,\n\n\t\t\t\tnumDirLights: lights.directional.length,\n\t\t\t\tnumPointLights: lights.point.length,\n\t\t\t\tnumSpotLights: lights.spot.length,\n\t\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\t\tnumClippingPlanes: nClipPlanes,\n\t\t\t\tnumClipIntersection: nClipIntersection,\n\n\t\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0,\n\t\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\t\ttoneMapping: renderer.toneMapping,\n\t\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\t\talphaTest: material.alphaTest,\n\t\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\t\tflipSided: material.side === BackSide,\n\n\t\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false\n\n\t\t\t};\n\n\t\t\treturn parameters;\n\n\t\t};\n\n\t\tthis.getProgramCode = function ( material, parameters ) {\n\n\t\t\tvar array = [];\n\n\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\tarray.push( parameters.shaderID );\n\n\t\t\t} else {\n\n\t\t\t\tarray.push( material.fragmentShader );\n\t\t\t\tarray.push( material.vertexShader );\n\n\t\t\t}\n\n\t\t\tif ( material.defines !== undefined ) {\n\n\t\t\t\tfor ( var name in material.defines ) {\n\n\t\t\t\t\tarray.push( name );\n\t\t\t\t\tarray.push( material.defines[ name ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < parameterNames.length; i ++ ) {\n\n\t\t\t\tarray.push( parameters[ parameterNames[ i ] ] );\n\n\t\t\t}\n\n\t\t\treturn array.join();\n\n\t\t};\n\n\t\tthis.acquireProgram = function ( material, parameters, code ) {\n\n\t\t\tvar program;\n\n\t\t\t// Check if code has been already compiled\n\t\t\tfor ( var p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\t\tvar programInfo = programs[ p ];\n\n\t\t\t\tif ( programInfo.code === code ) {\n\n\t\t\t\t\tprogram = programInfo;\n\t\t\t\t\t++ program.usedTimes;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tprogram = new WebGLProgram( renderer, code, material, parameters );\n\t\t\t\tprograms.push( program );\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t};\n\n\t\tthis.releaseProgram = function( program ) {\n\n\t\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t\t// Remove from unordered set\n\t\t\t\tvar i = programs.indexOf( program );\n\t\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\t\tprograms.pop();\n\n\t\t\t\t// Free WebGL resources\n\t\t\t\tprogram.destroy();\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tthis.programs = programs;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLGeometries( gl, properties, info ) {\n\n\t\tvar geometries = {};\n\n\t\tfunction onGeometryDispose( event ) {\n\n\t\t\tvar geometry = event.target;\n\t\t\tvar buffergeometry = geometries[ geometry.id ];\n\n\t\t\tif ( buffergeometry.index !== null ) {\n\n\t\t\t\tdeleteAttribute( buffergeometry.index );\n\n\t\t\t}\n\n\t\t\tdeleteAttributes( buffergeometry.attributes );\n\n\t\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\t\tdelete geometries[ geometry.id ];\n\n\t\t\t// TODO\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe ) {\n\n\t\t\t\tdeleteAttribute( property.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( geometry );\n\n\t\t\tvar bufferproperty = properties.get( buffergeometry );\n\n\t\t\tif ( bufferproperty.wireframe ) {\n\n\t\t\t\tdeleteAttribute( bufferproperty.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( buffergeometry );\n\n\t\t\t//\n\n\t\t\tinfo.memory.geometries --;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction deleteAttribute( attribute ) {\n\n\t\t\tvar buffer = getAttributeBuffer( attribute );\n\n\t\t\tif ( buffer !== undefined ) {\n\n\t\t\t\tgl.deleteBuffer( buffer );\n\t\t\t\tremoveAttributeBuffer( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction deleteAttributes( attributes ) {\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tdeleteAttribute( attributes[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction removeAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tproperties.delete( attribute.data );\n\n\t\t\t} else {\n\n\t\t\t\tproperties.delete( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometries[ geometry.id ] !== undefined ) {\n\n\t\t\t\t\treturn geometries[ geometry.id ];\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\t\t\tvar buffergeometry;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tbuffergeometry = geometry;\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tif ( geometry._bufferGeometry === undefined ) {\n\n\t\t\t\t\t\tgeometry._bufferGeometry = new BufferGeometry().setFromObject( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbuffergeometry = geometry._bufferGeometry;\n\n\t\t\t\t}\n\n\t\t\t\tgeometries[ geometry.id ] = buffergeometry;\n\n\t\t\t\tinfo.memory.geometries ++;\n\n\t\t\t\treturn buffergeometry;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLObjects( gl, properties, info ) {\n\n\t\tvar geometries = new WebGLGeometries( gl, properties, info );\n\n\t\t//\n\n\t\tfunction update( object ) {\n\n\t\t\t// TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter.\n\n\t\t\tvar geometry = geometries.get( object );\n\n\t\t\tif ( object.geometry.isGeometry ) {\n\n\t\t\t\tgeometry.updateFromObject( object );\n\n\t\t\t}\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tupdateAttribute( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tupdateAttribute( attributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\tfor ( var name in morphAttributes ) {\n\n\t\t\t\tvar array = morphAttributes[ name ];\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\t\tupdateAttribute( array[ i ], gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction updateAttribute( attribute, bufferType ) {\n\n\t\t\tvar data = ( attribute.isInterleavedBufferAttribute ) ? attribute.data : attribute;\n\n\t\t\tvar attributeProperties = properties.get( data );\n\n\t\t\tif ( attributeProperties.__webglBuffer === undefined ) {\n\n\t\t\t\tcreateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t} else if ( attributeProperties.version !== data.version ) {\n\n\t\t\t\tupdateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tattributeProperties.__webglBuffer = gl.createBuffer();\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tvar usage = data.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;\n\n\t\t\tgl.bufferData( bufferType, data.array, usage );\n\n\t\t\tattributeProperties.version = data.version;\n\n\t\t}\n\n\t\tfunction updateBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tif ( data.dynamic === false ) {\n\n\t\t\t\tgl.bufferData( bufferType, data.array, gl.STATIC_DRAW );\n\n\t\t\t} else if ( data.updateRange.count === - 1 ) {\n\n\t\t\t\t// Not using update ranges\n\n\t\t\t\tgl.bufferSubData( bufferType, 0, data.array );\n\n\t\t\t} else if ( data.updateRange.count === 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, data.updateRange.offset * data.array.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t data.array.subarray( data.updateRange.offset, data.updateRange.offset + data.updateRange.count ) );\n\n\t\t\t\tdata.updateRange.count = 0; // reset range\n\n\t\t\t}\n\n\t\t\tattributeProperties.version = data.version;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction getWireframeAttribute( geometry ) {\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe !== undefined ) {\n\n\t\t\t\treturn property.wireframe;\n\n\t\t\t}\n\n\t\t\tvar indices = [];\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\t\t\tvar position = attributes.position;\n\n\t\t\t// console.time( 'wireframe' );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar edges = {};\n\t\t\t\tvar array = index.array;\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = array[ i + 0 ];\n\t\t\t\t\tvar b = array[ i + 1 ];\n\t\t\t\t\tvar c = array[ i + 2 ];\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar array = attributes.position.array;\n\n\t\t\t\tfor ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = i + 0;\n\t\t\t\t\tvar b = i + 1;\n\t\t\t\t\tvar c = i + 2;\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// console.timeEnd( 'wireframe' );\n\n\t\t\tvar TypeArray = position.count > 65535 ? Uint32Array : Uint16Array;\n\t\t\tvar attribute = new BufferAttribute( new TypeArray( indices ), 1 );\n\n\t\t\tupdateAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\tproperty.wireframe = attribute;\n\n\t\t\treturn attribute;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tgetAttributeBuffer: getAttributeBuffer,\n\t\t\tgetWireframeAttribute: getWireframeAttribute,\n\n\t\t\tupdate: update\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, info ) {\n\n\t\tvar _infoMemory = info.memory;\n\t\tvar _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext );\n\n\t\t//\n\n\t\tfunction clampToMaxSize( image, maxSize ) {\n\n\t\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\t\t// Warning: Scaling through the canvas will only work with images that use\n\t\t\t\t// premultiplied alpha.\n\n\t\t\t\tvar scale = maxSize / Math.max( image.width, image.height );\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = Math.floor( image.width * scale );\n\t\t\t\tcanvas.height = Math.floor( image.height * scale );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction isPowerOfTwo( image ) {\n\n\t\t\treturn _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height );\n\n\t\t}\n\n\t\tfunction makePowerOfTwo( image ) {\n\n\t\t\tif ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) {\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = _Math.nearestPowerOfTwo( image.width );\n\t\t\t\tcanvas.height = _Math.nearestPowerOfTwo( image.height );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) return true;\n\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) return true;\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// Fallback filters for non-power-of-2 textures\n\n\t\tfunction filterFallback( f ) {\n\n\t\t\tif ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) {\n\n\t\t\t\treturn _gl.NEAREST;\n\n\t\t\t}\n\n\t\t\treturn _gl.LINEAR;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction onTextureDispose( event ) {\n\n\t\t\tvar texture = event.target;\n\n\t\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\t\tdeallocateTexture( texture );\n\n\t\t\t_infoMemory.textures --;\n\n\n\t\t}\n\n\t\tfunction onRenderTargetDispose( event ) {\n\n\t\t\tvar renderTarget = event.target;\n\n\t\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\tdeallocateRenderTarget( renderTarget );\n\n\t\t\t_infoMemory.textures --;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction deallocateTexture( texture ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image && textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__image__webglTextureCube );\n\n\t\t\t} else {\n\n\t\t\t\t// 2D texture\n\n\t\t\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\t// remove all webgl properties\n\t\t\tproperties.delete( texture );\n\n\t\t}\n\n\t\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\tif ( ! renderTarget ) return;\n\n\t\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\t}\n\n\t\t\tif ( (renderTarget && renderTarget.isWebGLRenderTargetCube) ) {\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\n\t\t\t}\n\n\t\t\tproperties.delete( renderTarget.texture );\n\t\t\tproperties.delete( renderTarget );\n\n\t\t}\n\n\t\t//\n\n\n\n\t\tfunction setTexture2D( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\tvar image = texture.image;\n\n\t\t\t\tif ( image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture );\n\n\t\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureCube( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image.length === 6 ) {\n\n\t\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\t\tif ( ! textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\ttextureProperties.__image__webglTextureCube = _gl.createTexture();\n\n\t\t\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\n\t\t\t\t\tvar isCompressed = (texture && texture.isCompressedTexture);\n\t\t\t\t\tvar isDataTexture = (texture.image[ 0 ] && texture.image[ 0 ].isDataTexture);\n\n\t\t\t\t\tvar cubeImage = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar image = cubeImage[ 0 ],\n\t\t\t\t\tisPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage );\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed ) {\n\n\t\t\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar mipmap, mipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\t\t\tfor ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\t\tmipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()\" );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\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\tif ( texture.generateMipmaps && isPowerOfTwoImage ) {\n\n\t\t\t\t\t\t_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setTextureCubeDynamic( texture, slot ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureParameters( textureType, texture, isPowerOfTwoImage ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( isPowerOfTwoImage ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) );\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\n\n\t\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );\n\n\t\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\textension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension ) {\n\n\t\t\t\tif ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;\n\t\t\t\tif ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return;\n\n\t\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\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\n\t\t\tvar image = clampToMaxSize( texture.image, capabilities.maxTextureSize );\n\n\t\t\tif ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) {\n\n\t\t\t\timage = makePowerOfTwo( image );\n\n\t\t\t}\n\n\t\t\tvar isPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage );\n\n\t\t\tvar mipmap, mipmaps = texture.mipmaps;\n\n\t\t\tif ( (texture && texture.isDepthTexture) ) {\n\n\t\t\t\t// populate depth texture with dummy data\n\n\t\t\t\tvar internalFormat = _gl.DEPTH_COMPONENT;\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tif ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0');\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t} else if ( _isWebGL2 ) {\n\n\t\t\t\t\t// WebGL 2.0 requires signed internalformat for glTexImage2D\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t\t}\n\n\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.format === DepthStencilFormat ) {\n\n\t\t\t\t\tinternalFormat = _gl.DEPTH_STENCIL;\n\n\t\t\t\t}\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t} else if ( (texture && 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 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( (texture && texture.isCompressedTexture) ) {\n\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\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}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\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 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );\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\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\n\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\t// Render targets\n\n\t\t// Setup storage for target texture and bind it to correct framebuffer\n\t\tfunction setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {\n\n\t\t\tvar glFormat = paramThreeToGL( renderTarget.texture.format );\n\t\t\tvar glType = paramThreeToGL( renderTarget.texture.type );\n\t\t\tstate.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\t\tfunction setupRenderBufferStorage( renderbuffer, renderTarget ) {\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else {\n\n\t\t\t\t// FIXME: We don't support !depth !stencil\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t}\n\n\t\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\t\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\t\tvar isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) );\n\t\t\tif ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!');\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( !( (renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture) ) ) {\n\n\t\t\t\tthrow new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture');\n\n\t\t\t}\n\n\t\t\t// upload an empty depth texture with framebuffer size\n\t\t\tif ( !properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\t\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\t\t\t}\n\n\t\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\t\tvar webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\n\t\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error('Unknown depthTexture format')\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup GL resources for a non-texture depth buffer\n\t\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\tvar isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) );\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\tif ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets');\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Set up GL resources for the render target\n\t\tfunction setupRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t_infoMemory.textures ++;\n\n\t\t\tvar isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) );\n\t\t\tvar isTargetPowerOfTwo = isPowerOfTwo( renderTarget );\n\n\t\t\t// Setup framebuffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _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\t// Setup color buffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, null );\n\n\t\t\t}\n\n\t\t\t// Setup depth and stencil buffers\n\n\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\t\tvar texture = renderTarget.texture;\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) &&\n\t\t\t\t\ttexture.minFilter !== NearestFilter &&\n\t\t\t\t\ttexture.minFilter !== LinearFilter ) {\n\n\t\t\t\tvar target = (renderTarget && renderTarget.isWebGLRenderTargetCube) ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\t\t\t\tvar webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\t_gl.generateMipmap( target );\n\t\t\t\tstate.bindTexture( target, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setTexture2D = setTexture2D;\n\t\tthis.setTextureCube = setTextureCube;\n\t\tthis.setTextureCubeDynamic = setTextureCubeDynamic;\n\t\tthis.setupRenderTarget = setupRenderTarget;\n\t\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\n\t}\n\n\t/**\n\t * @author fordacious / fordacious.github.io\n\t */\n\n\tfunction WebGLProperties() {\n\n\t\tvar properties = {};\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar uuid = object.uuid;\n\t\t\t\tvar map = properties[ uuid ];\n\n\t\t\t\tif ( map === undefined ) {\n\n\t\t\t\t\tmap = {};\n\t\t\t\t\tproperties[ uuid ] = map;\n\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\n\t\t\t},\n\n\t\t\tdelete: function ( object ) {\n\n\t\t\t\tdelete properties[ object.uuid ];\n\n\t\t\t},\n\n\t\t\tclear: function () {\n\n\t\t\t\tproperties = {};\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLState( gl, extensions, paramThreeToGL ) {\n\n\t\tfunction ColorBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar color = new Vector4();\n\t\t\tvar currentColorMask = null;\n\t\t\tvar currentColorClear = new Vector4();\n\n\t\t\treturn {\n\n\t\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( r, g, b, a ) {\n\n\t\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentColorMask = null;\n\t\t\t\t\tcurrentColorClear.set( 0, 0, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction DepthBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentDepthMask = null;\n\t\t\tvar currentDepthFunc = null;\n\t\t\tvar currentDepthClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\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\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentDepthMask = null;\n\t\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction StencilBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentStencilMask = null;\n\t\t\tvar currentStencilFunc = null;\n\t\t\tvar currentStencilRef = null;\n\t\t\tvar currentStencilFuncMask = null;\n\t\t\tvar currentStencilFail = null;\n\t\t\tvar currentStencilZFail = null;\n\t\t\tvar currentStencilZPass = null;\n\t\t\tvar currentStencilClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( stencilTest ) {\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\tsetMask: function ( stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t\t currentStencilRef \t!== stencilRef \t||\n\t\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\t\tif ( currentStencilFail\t !== stencilFail \t||\n\t\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentStencilMask = null;\n\t\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\t\tcurrentStencilRef = null;\n\t\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\t\tcurrentStencilFail = null;\n\t\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t//\n\n\t\tvar colorBuffer = new ColorBuffer();\n\t\tvar depthBuffer = new DepthBuffer();\n\t\tvar stencilBuffer = new StencilBuffer();\n\n\t\tvar maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar newAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar enabledAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar attributeDivisors = new Uint8Array( maxVertexAttributes );\n\n\t\tvar capabilities = {};\n\n\t\tvar compressedTextureFormats = null;\n\n\t\tvar currentBlending = null;\n\t\tvar currentBlendEquation = null;\n\t\tvar currentBlendSrc = null;\n\t\tvar currentBlendDst = null;\n\t\tvar currentBlendEquationAlpha = null;\n\t\tvar currentBlendSrcAlpha = null;\n\t\tvar currentBlendDstAlpha = null;\n\t\tvar currentPremultipledAlpha = false;\n\n\t\tvar currentFlipSided = null;\n\t\tvar currentCullFace = null;\n\n\t\tvar currentLineWidth = null;\n\n\t\tvar currentPolygonOffsetFactor = null;\n\t\tvar currentPolygonOffsetUnits = null;\n\n\t\tvar currentScissorTest = null;\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\n\t\tvar currentTextureSlot = null;\n\t\tvar currentBoundTextures = {};\n\n\t\tvar currentScissor = new Vector4();\n\t\tvar currentViewport = new Vector4();\n\n\t\tfunction createTexture( type, target, count ) {\n\n\t\t\tvar data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\t\tvar texture = gl.createTexture();\n\n\t\t\tgl.bindTexture( type, texture );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\t\tfor ( var i = 0; i < count; i ++ ) {\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\treturn texture;\n\n\t\t}\n\n\t\tvar emptyTextures = {};\n\t\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\t\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\n\t\t//\n\n\t\tfunction init() {\n\n\t\t\tclearColor( 0, 0, 0, 1 );\n\t\t\tclearDepth( 1 );\n\t\t\tclearStencil( 0 );\n\n\t\t\tenable( gl.DEPTH_TEST );\n\t\t\tsetDepthFunc( LessEqualDepth );\n\n\t\t\tsetFlipSided( false );\n\t\t\tsetCullFace( CullFaceBack );\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tenable( gl.BLEND );\n\t\t\tsetBlending( NormalBlending );\n\n\t\t}\n\n\t\tfunction initAttributes() {\n\n\t\t\tfor ( var i = 0, l = newAttributes.length; i < l; i ++ ) {\n\n\t\t\t\tnewAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttribute( attribute ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== 0 ) {\n\n\t\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, 0 );\n\t\t\t\tattributeDivisors[ attribute ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute, extension ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, meshPerAttribute );\n\t\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disableUnusedAttributes() {\n\n\t\t\tfor ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== true ) {\n\n\t\t\t\tgl.enable( id );\n\t\t\t\tcapabilities[ id ] = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== false ) {\n\n\t\t\t\tgl.disable( id );\n\t\t\t\tcapabilities[ id ] = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getCompressedTextureFormats() {\n\n\t\t\tif ( compressedTextureFormats === null ) {\n\n\t\t\t\tcompressedTextureFormats = [];\n\n\t\t\t\tif ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_s3tc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_etc1' ) ) {\n\n\t\t\t\t\tvar formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS );\n\n\t\t\t\t\tfor ( var i = 0; i < formats.length; i ++ ) {\n\n\t\t\t\t\t\tcompressedTextureFormats.push( formats[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn compressedTextureFormats;\n\n\t\t}\n\n\t\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\t\tif ( blending !== NoBlending ) {\n\n\t\t\t\tenable( gl.BLEND );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.BLEND );\n\n\t\t\t}\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( blending === AdditiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === SubtractiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === MultiplyBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\tif ( blending === CustomBlending ) {\n\n\t\t\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\t\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\t\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\t\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\t\t\tgl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) );\n\n\t\t\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t\t\t}\n\n\t\t\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\t\t\tgl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) );\n\n\t\t\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\t\t\tcurrentBlendDst = blendDst;\n\t\t\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tcurrentBlendEquation = null;\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendEquationAlpha = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Deprecate\n\n\t\tfunction setColorWrite( colorWrite ) {\n\n\t\t\tcolorBuffer.setMask( colorWrite );\n\n\t\t}\n\n\t\tfunction setDepthTest( depthTest ) {\n\n\t\t\tdepthBuffer.setTest( depthTest );\n\n\t\t}\n\n\t\tfunction setDepthWrite( depthWrite ) {\n\n\t\t\tdepthBuffer.setMask( depthWrite );\n\n\t\t}\n\n\t\tfunction setDepthFunc( depthFunc ) {\n\n\t\t\tdepthBuffer.setFunc( depthFunc );\n\n\t\t}\n\n\t\tfunction setStencilTest( stencilTest ) {\n\n\t\t\tstencilBuffer.setTest( stencilTest );\n\n\t\t}\n\n\t\tfunction setStencilWrite( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( stencilWrite );\n\n\t\t}\n\n\t\tfunction setStencilFunc( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\tstencilBuffer.setFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t}\n\n\t\tfunction setStencilOp( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\tstencilBuffer.setOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction setFlipSided( flipSided ) {\n\n\t\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\t\tif ( flipSided ) {\n\n\t\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t\t}\n\n\t\t\t\tcurrentFlipSided = flipSided;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setCullFace( cullFace ) {\n\n\t\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\t\tenable( gl.CULL_FACE );\n\n\t\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.CULL_FACE );\n\n\t\t\t}\n\n\t\t\tcurrentCullFace = cullFace;\n\n\t\t}\n\n\t\tfunction setLineWidth( width ) {\n\n\t\t\tif ( width !== currentLineWidth ) {\n\n\t\t\t\tgl.lineWidth( width );\n\n\t\t\t\tcurrentLineWidth = width;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\t\tif ( polygonOffset ) {\n\n\t\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getScissorTest() {\n\n\t\t\treturn currentScissorTest;\n\n\t\t}\n\n\t\tfunction setScissorTest( scissorTest ) {\n\n\t\t\tcurrentScissorTest = scissorTest;\n\n\t\t\tif ( scissorTest ) {\n\n\t\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// texture\n\n\t\tfunction activeTexture( webglSlot ) {\n\n\t\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\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}\n\n\t\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\tactiveTexture();\n\n\t\t\t}\n\n\t\t\tvar boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\t\tif ( boundTexture === undefined ) {\n\n\t\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t\t}\n\n\t\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\t\tboundTexture.type = webglType;\n\t\t\t\tboundTexture.texture = webglTexture;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction compressedTexImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction texImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Deprecate\n\n\t\tfunction clearColor( r, g, b, a ) {\n\n\t\t\tcolorBuffer.setClear( r, g, b, a );\n\n\t\t}\n\n\t\tfunction clearDepth( depth ) {\n\n\t\t\tdepthBuffer.setClear( depth );\n\n\t\t}\n\n\t\tfunction clearStencil( stencil ) {\n\n\t\t\tstencilBuffer.setClear( stencil );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction scissor( scissor ) {\n\n\t\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\t\tcurrentScissor.copy( scissor );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction viewport( viewport ) {\n\n\t\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\t\tcurrentViewport.copy( viewport );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction reset() {\n\n\t\t\tfor ( var i = 0; i < enabledAttributes.length; i ++ ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] === 1 ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcapabilities = {};\n\n\t\t\tcompressedTextureFormats = null;\n\n\t\t\tcurrentTextureSlot = null;\n\t\t\tcurrentBoundTextures = {};\n\n\t\t\tcurrentBlending = null;\n\n\t\t\tcurrentFlipSided = null;\n\t\t\tcurrentCullFace = null;\n\n\t\t\tcolorBuffer.reset();\n\t\t\tdepthBuffer.reset();\n\t\t\tstencilBuffer.reset();\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tbuffers: {\n\t\t\t\tcolor: colorBuffer,\n\t\t\t\tdepth: depthBuffer,\n\t\t\t\tstencil: stencilBuffer\n\t\t\t},\n\n\t\t\tinit: init,\n\t\t\tinitAttributes: initAttributes,\n\t\t\tenableAttribute: enableAttribute,\n\t\t\tenableAttributeAndDivisor: enableAttributeAndDivisor,\n\t\t\tdisableUnusedAttributes: disableUnusedAttributes,\n\t\t\tenable: enable,\n\t\t\tdisable: disable,\n\t\t\tgetCompressedTextureFormats: getCompressedTextureFormats,\n\n\t\t\tsetBlending: setBlending,\n\n\t\t\tsetColorWrite: setColorWrite,\n\t\t\tsetDepthTest: setDepthTest,\n\t\t\tsetDepthWrite: setDepthWrite,\n\t\t\tsetDepthFunc: setDepthFunc,\n\t\t\tsetStencilTest: setStencilTest,\n\t\t\tsetStencilWrite: setStencilWrite,\n\t\t\tsetStencilFunc: setStencilFunc,\n\t\t\tsetStencilOp: setStencilOp,\n\n\t\t\tsetFlipSided: setFlipSided,\n\t\t\tsetCullFace: setCullFace,\n\n\t\t\tsetLineWidth: setLineWidth,\n\t\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\t\tgetScissorTest: getScissorTest,\n\t\t\tsetScissorTest: setScissorTest,\n\n\t\t\tactiveTexture: activeTexture,\n\t\t\tbindTexture: bindTexture,\n\t\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\t\ttexImage2D: texImage2D,\n\n\t\t\tclearColor: clearColor,\n\t\t\tclearDepth: clearDepth,\n\t\t\tclearStencil: clearStencil,\n\n\t\t\tscissor: scissor,\n\t\t\tviewport: viewport,\n\n\t\t\treset: reset\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\t\tvar maxAnisotropy;\n\n\t\tfunction getMaxAnisotropy() {\n\n\t\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\t\tvar extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t\t} else {\n\n\t\t\t\tmaxAnisotropy = 0;\n\n\t\t\t}\n\n\t\t\treturn maxAnisotropy;\n\n\t\t}\n\n\t\tfunction getMaxPrecision( precision ) {\n\n\t\t\tif ( precision === 'highp' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'highp';\n\n\t\t\t\t}\n\n\t\t\t\tprecision = 'mediump';\n\n\t\t\t}\n\n\t\t\tif ( precision === 'mediump' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'mediump';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn 'lowp';\n\n\t\t}\n\n\t\tvar precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\t\tvar maxPrecision = getMaxPrecision( precision );\n\n\t\tif ( maxPrecision !== precision ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\t\tprecision = maxPrecision;\n\n\t\t}\n\n\t\tvar logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' );\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\t\tvar maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\t\tvar maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\t\tvar maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\t\tvar maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\t\tvar vertexTextures = maxVertexTextures > 0;\n\t\tvar floatFragmentTextures = !! extensions.get( 'OES_texture_float' );\n\t\tvar floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\t\treturn {\n\n\t\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\t\tprecision: precision,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tmaxTextures: maxTextures,\n\t\t\tmaxVertexTextures: maxVertexTextures,\n\t\t\tmaxTextureSize: maxTextureSize,\n\t\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\t\tmaxAttributes: maxAttributes,\n\t\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\t\tmaxVaryings: maxVaryings,\n\t\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\t\tvertexTextures: vertexTextures,\n\t\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\t\tfloatVertexTextures: floatVertexTextures\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLExtensions( gl ) {\n\n\t\tvar extensions = {};\n\n\t\treturn {\n\n\t\t\tget: function ( name ) {\n\n\t\t\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\t\t\treturn extensions[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tvar extension;\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_etc1':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_etc1' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\textension = gl.getExtension( name );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t\t}\n\n\t\t\t\textensions[ name ] = extension;\n\n\t\t\t\treturn extension;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction WebGLClipping() {\n\n\t\tvar scope = this,\n\n\t\t\tglobalState = null,\n\t\t\tnumGlobalPlanes = 0,\n\t\t\tlocalClippingEnabled = false,\n\t\t\trenderingShadows = false,\n\n\t\t\tplane = new Plane(),\n\t\t\tviewNormalMatrix = new Matrix3(),\n\n\t\t\tuniform = { value: null, needsUpdate: false };\n\n\t\tthis.uniform = uniform;\n\t\tthis.numPlanes = 0;\n\t\tthis.numIntersection = 0;\n\n\t\tthis.init = function( planes, enableLocalClipping, camera ) {\n\n\t\t\tvar enabled =\n\t\t\t\tplanes.length !== 0 ||\n\t\t\t\tenableLocalClipping ||\n\t\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t\t// run another frame in order to reset the state:\n\t\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\t\tlocalClippingEnabled;\n\n\t\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\t\tnumGlobalPlanes = planes.length;\n\n\t\t\treturn enabled;\n\n\t\t};\n\n\t\tthis.beginShadows = function() {\n\n\t\t\trenderingShadows = true;\n\t\t\tprojectPlanes( null );\n\n\t\t};\n\n\t\tthis.endShadows = function() {\n\n\t\t\trenderingShadows = false;\n\t\t\tresetGlobalState();\n\n\t\t};\n\n\t\tthis.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) {\n\n\t\t\tif ( ! localClippingEnabled ||\n\t\t\t\t\tplanes === null || planes.length === 0 ||\n\t\t\t\t\trenderingShadows && ! clipShadows ) {\n\t\t\t\t// there's no local clipping\n\n\t\t\t\tif ( renderingShadows ) {\n\t\t\t\t\t// there's no global clipping\n\n\t\t\t\t\tprojectPlanes( null );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tresetGlobalState();\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\t\tlGlobal = nGlobal * 4,\n\n\t\t\t\t\tdstArray = cache.clippingState || null;\n\n\t\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, fromCache );\n\n\t\t\t\tfor ( var i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcache.clippingState = dstArray;\n\t\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\t\tthis.numPlanes += nGlobal;\n\n\t\t\t}\n\n\n\t\t};\n\n\t\tfunction resetGlobalState() {\n\n\t\t\tif ( uniform.value !== globalState ) {\n\n\t\t\t\tuniform.value = globalState;\n\t\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = numGlobalPlanes;\n\t\t\tscope.numIntersection = 0;\n\n\t\t}\n\n\t\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\t\tvar nPlanes = planes !== null ? planes.length : 0,\n\t\t\t\tdstArray = null;\n\n\t\t\tif ( nPlanes !== 0 ) {\n\n\t\t\t\tdstArray = uniform.value;\n\n\t\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\t\tvar flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0, i4 = dstOffset;\n\t\t\t\t\t\t\t\t\t\ti !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\t\tplane.copy( planes[ i ] ).\n\t\t\t\t\t\t\t\tapplyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tuniform.value = dstArray;\n\t\t\t\tuniform.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = nPlanes;\n\t\t\t\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t * @author tschw\n\t */\n\n\tfunction WebGLRenderer( parameters ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer', REVISION );\n\n\t\tparameters = parameters || {};\n\n\t\tvar _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),\n\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;\n\n\t\tvar lights = [];\n\n\t\tvar opaqueObjects = [];\n\t\tvar opaqueObjectsLastIndex = - 1;\n\t\tvar transparentObjects = [];\n\t\tvar transparentObjectsLastIndex = - 1;\n\n\t\tvar morphInfluences = new Float32Array( 8 );\n\n\t\tvar sprites = [];\n\t\tvar lensFlares = [];\n\n\t\t// public properties\n\n\t\tthis.domElement = _canvas;\n\t\tthis.context = null;\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.gammaFactor = 2.0;\t// for backwards compatibility\n\t\tthis.gammaInput = false;\n\t\tthis.gammaOutput = false;\n\n\t\t// physical lights\n\n\t\tthis.physicallyCorrectLights = false;\n\n\t\t// tone mapping\n\n\t\tthis.toneMapping = LinearToneMapping;\n\t\tthis.toneMappingExposure = 1.0;\n\t\tthis.toneMappingWhitePoint = 1.0;\n\n\t\t// morphs\n\n\t\tthis.maxMorphTargets = 8;\n\t\tthis.maxMorphNormals = 4;\n\n\t\t// internal properties\n\n\t\tvar _this = this,\n\n\t\t// internal state cache\n\n\t\t_currentProgram = null,\n\t\t_currentRenderTarget = null,\n\t\t_currentFramebuffer = null,\n\t\t_currentMaterialId = - 1,\n\t\t_currentGeometryProgram = '',\n\t\t_currentCamera = null,\n\n\t\t_currentScissor = new Vector4(),\n\t\t_currentScissorTest = null,\n\n\t\t_currentViewport = new Vector4(),\n\n\t\t//\n\n\t\t_usedTextureUnits = 0,\n\n\t\t//\n\n\t\t_clearColor = new Color( 0x000000 ),\n\t\t_clearAlpha = 0,\n\n\t\t_width = _canvas.width,\n\t\t_height = _canvas.height,\n\n\t\t_pixelRatio = 1,\n\n\t\t_scissor = new Vector4( 0, 0, _width, _height ),\n\t\t_scissorTest = false,\n\n\t\t_viewport = new Vector4( 0, 0, _width, _height ),\n\n\t\t// frustum\n\n\t\t_frustum = new Frustum(),\n\n\t\t// clipping\n\n\t\t_clipping = new WebGLClipping(),\n\t\t_clippingEnabled = false,\n\t\t_localClippingEnabled = false,\n\n\t\t_sphere = new Sphere(),\n\n\t\t// camera matrices cache\n\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_vector3 = new Vector3(),\n\n\t\t// light arrays cache\n\n\t\t_lights = {\n\n\t\t\thash: '',\n\n\t\t\tambient: [ 0, 0, 0 ],\n\t\t\tdirectional: [],\n\t\t\tdirectionalShadowMap: [],\n\t\t\tdirectionalShadowMatrix: [],\n\t\t\tspot: [],\n\t\t\tspotShadowMap: [],\n\t\t\tspotShadowMatrix: [],\n\t\t\tpoint: [],\n\t\t\tpointShadowMap: [],\n\t\t\tpointShadowMatrix: [],\n\t\t\themi: [],\n\n\t\t\tshadows: []\n\n\t\t},\n\n\t\t// info\n\n\t\t_infoRender = {\n\n\t\t\tcalls: 0,\n\t\t\tvertices: 0,\n\t\t\tfaces: 0,\n\t\t\tpoints: 0\n\n\t\t};\n\n\t\tthis.info = {\n\n\t\t\trender: _infoRender,\n\t\t\tmemory: {\n\n\t\t\t\tgeometries: 0,\n\t\t\t\ttextures: 0\n\n\t\t\t},\n\t\t\tprograms: null\n\n\t\t};\n\n\n\t\t// initialize\n\n\t\tvar _gl;\n\n\t\ttry {\n\n\t\t\tvar attributes = {\n\t\t\t\talpha: _alpha,\n\t\t\t\tdepth: _depth,\n\t\t\t\tstencil: _stencil,\n\t\t\t\tantialias: _antialias,\n\t\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer\n\t\t\t};\n\n\t\t\t_gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( _canvas.getContext( 'webgl' ) !== null ) {\n\n\t\t\t\t\tthrow 'Error creating WebGL context with your selected attributes.';\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow 'Error creating WebGL context.';\n\n\t\t\t\t}\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\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: ' + error );\n\n\t\t}\n\n\t\tvar extensions = new WebGLExtensions( _gl );\n\n\t\textensions.get( 'WEBGL_depth_texture' );\n\t\textensions.get( 'OES_texture_float' );\n\t\textensions.get( 'OES_texture_float_linear' );\n\t\textensions.get( 'OES_texture_half_float' );\n\t\textensions.get( 'OES_texture_half_float_linear' );\n\t\textensions.get( 'OES_standard_derivatives' );\n\t\textensions.get( 'ANGLE_instanced_arrays' );\n\n\t\tif ( extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\tBufferGeometry.MaxIndex = 4294967296;\n\n\t\t}\n\n\t\tvar capabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\tvar state = new WebGLState( _gl, extensions, paramThreeToGL );\n\t\tvar properties = new WebGLProperties();\n\t\tvar textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, this.info );\n\t\tvar objects = new WebGLObjects( _gl, properties, this.info );\n\t\tvar programCache = new WebGLPrograms( this, capabilities );\n\t\tvar lightCache = new WebGLLights();\n\n\t\tthis.info.programs = programCache.programs;\n\n\t\tvar bufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender );\n\t\tvar indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );\n\n\t\t//\n\n\t\tvar backgroundCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\t\tvar backgroundCamera2 = new PerspectiveCamera();\n\t\tvar backgroundPlaneMesh = new Mesh(\n\t\t\tnew PlaneBufferGeometry( 2, 2 ),\n\t\t\tnew MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } )\n\t\t);\n\t\tvar backgroundBoxShader = ShaderLib[ 'cube' ];\n\t\tvar backgroundBoxMesh = new Mesh(\n\t\t\tnew BoxBufferGeometry( 5, 5, 5 ),\n\t\t\tnew ShaderMaterial( {\n\t\t\t\tuniforms: backgroundBoxShader.uniforms,\n\t\t\t\tvertexShader: backgroundBoxShader.vertexShader,\n\t\t\t\tfragmentShader: backgroundBoxShader.fragmentShader,\n\t\t\t\tside: BackSide,\n\t\t\t\tdepthTest: false,\n\t\t\t\tdepthWrite: false,\n\t\t\t\tfog: false\n\t\t\t} )\n\t\t);\n\n\t\t//\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\tfunction glClearColor( r, g, b, a ) {\n\n\t\t\tif ( _premultipliedAlpha === true ) {\n\n\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t}\n\n\t\t\tstate.clearColor( r, g, b, a );\n\n\t\t}\n\n\t\tfunction setDefaultGLState() {\n\n\t\t\tstate.init();\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );\n\n\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t}\n\n\t\tfunction resetGLState() {\n\n\t\t\t_currentProgram = null;\n\t\t\t_currentCamera = null;\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\n\t\t\tstate.reset();\n\n\t\t}\n\n\t\tsetDefaultGLState();\n\n\t\tthis.context = _gl;\n\t\tthis.capabilities = capabilities;\n\t\tthis.extensions = extensions;\n\t\tthis.properties = properties;\n\t\tthis.state = state;\n\n\t\t// shadow map\n\n\t\tvar shadowMap = new WebGLShadowMap( this, _lights, objects, capabilities );\n\n\t\tthis.shadowMap = shadowMap;\n\n\n\t\t// Plugins\n\n\t\tvar spritePlugin = new SpritePlugin( this, sprites );\n\t\tvar lensFlarePlugin = new LensFlarePlugin( this, lensFlares );\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\textensions.get( 'WEBGL_lose_context' ).loseContext();\n\n\t\t};\n\n\t\tthis.getMaxAnisotropy = function () {\n\n\t\t\treturn capabilities.getMaxAnisotropy();\n\n\t\t};\n\n\t\tthis.getPrecision = function () {\n\n\t\t\treturn capabilities.precision;\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( _viewport.z, _viewport.w, false );\n\n\t\t};\n\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_canvas.width = width * _pixelRatio;\n\t\t\t_canvas.height = height * _pixelRatio;\n\n\t\t\tif ( updateStyle !== false ) {\n\n\t\t\t\t_canvas.style.width = width + 'px';\n\t\t\t\t_canvas.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.setViewport = function ( x, y, width, height ) {\n\n\t\t\tstate.viewport( _viewport.set( x, y, width, height ) );\n\n\t\t};\n\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tstate.scissor( _scissor.set( x, y, width, height ) );\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\t// Clearing\n\n\t\tthis.getClearColor = function () {\n\n\t\t\treturn _clearColor;\n\n\t\t};\n\n\t\tthis.setClearColor = function ( color, alpha ) {\n\n\t\t\t_clearColor.set( color );\n\n\t\t\t_clearAlpha = alpha !== undefined ? alpha : 1;\n\n\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t};\n\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn _clearAlpha;\n\n\t\t};\n\n\t\tthis.setClearAlpha = function ( alpha ) {\n\n\t\t\t_clearAlpha = alpha;\n\n\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t};\n\n\t\tthis.clear = function ( color, depth, stencil ) {\n\n\t\t\tvar bits = 0;\n\n\t\t\tif ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;\n\t\t\tif ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\t\tif ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;\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\tthis.clearTarget = function ( renderTarget, color, depth, stencil ) {\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\t\t\tthis.clear( color, depth, stencil );\n\n\t\t};\n\n\t\t// Reset\n\n\t\tthis.resetGLState = resetGLState;\n\n\t\tthis.dispose = function() {\n\n\t\t\ttransparentObjects = [];\n\t\t\ttransparentObjectsLastIndex = -1;\n\t\t\topaqueObjects = [];\n\t\t\topaqueObjectsLastIndex = -1;\n\n\t\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\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\tresetGLState();\n\t\t\tsetDefaultGLState();\n\n\t\t\tproperties.clear();\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tvar 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\treleaseMaterialProgramReference( material );\n\n\t\t\tproperties.delete( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReference( material ) {\n\n\t\t\tvar programInfo = properties.get( material ).program;\n\n\t\t\tmaterial.program = undefined;\n\n\t\t\tif ( programInfo !== undefined ) {\n\n\t\t\t\tprogramCache.releaseProgram( programInfo );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferImmediate = function ( object, program, material ) {\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar buffers = properties.get( object );\n\n\t\t\tif ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();\n\t\t\tif ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();\n\t\t\tif ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();\n\t\t\tif ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( object.hasPositions ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.position );\n\t\t\t\t_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasNormals ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal );\n\n\t\t\t\tif ( ! material.isMeshPhongMaterial &&\n\t\t\t\t ! material.isMeshStandardMaterial &&\n\t\t\t\t material.shading === FlatShading ) {\n\n\t\t\t\t\tfor ( var i = 0, l = object.count * 3; i < l; i += 9 ) {\n\n\t\t\t\t\t\tvar array = object.normalArray;\n\n\t\t\t\t\t\tvar nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3;\n\t\t\t\t\t\tvar ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3;\n\t\t\t\t\t\tvar nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3;\n\n\t\t\t\t\t\tarray[ i + 0 ] = nx;\n\t\t\t\t\t\tarray[ i + 1 ] = ny;\n\t\t\t\t\t\tarray[ i + 2 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 3 ] = nx;\n\t\t\t\t\t\tarray[ i + 4 ] = ny;\n\t\t\t\t\t\tarray[ i + 5 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 6 ] = nx;\n\t\t\t\t\t\tarray[ i + 7 ] = ny;\n\t\t\t\t\t\tarray[ i + 8 ] = nz;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.normal );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasUvs && material.map ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.uv );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasColors && material.vertexColors !== NoColors ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.color );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t_gl.drawArrays( _gl.TRIANGLES, 0, object.count );\n\n\t\t\tobject.count = 0;\n\n\t\t};\n\n\t\tthis.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {\n\n\t\t\tsetMaterial( material );\n\n\t\t\tvar program = setProgram( camera, fog, material, object );\n\n\t\t\tvar updateBuffers = false;\n\t\t\tvar geometryProgram = geometry.id + '_' + program.id + '_' + material.wireframe;\n\n\t\t\tif ( geometryProgram !== _currentGeometryProgram ) {\n\n\t\t\t\t_currentGeometryProgram = geometryProgram;\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphTargetInfluences = object.morphTargetInfluences;\n\n\t\t\tif ( morphTargetInfluences !== undefined ) {\n\n\t\t\t\tvar activeInfluences = [];\n\n\t\t\t\tfor ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = morphTargetInfluences[ i ];\n\t\t\t\t\tactiveInfluences.push( [ influence, i ] );\n\n\t\t\t\t}\n\n\t\t\t\tactiveInfluences.sort( absNumericalSort );\n\n\t\t\t\tif ( activeInfluences.length > 8 ) {\n\n\t\t\t\t\tactiveInfluences.length = 8;\n\n\t\t\t\t}\n\n\t\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\t\tfor ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = activeInfluences[ i ];\n\t\t\t\t\tmorphInfluences[ i ] = influence[ 0 ];\n\n\t\t\t\t\tif ( influence[ 0 ] !== 0 ) {\n\n\t\t\t\t\t\tvar index = influence[ 1 ];\n\n\t\t\t\t\t\tif ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] );\n\t\t\t\t\t\tif ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i );\n\t\t\t\t\t\tif ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) {\n\n\t\t\t\t\tmorphInfluences[ i ] = 0.0;\n\n\t\t\t\t}\n\n\t\t\t\tprogram.getUniforms().setValue(\n\t\t\t\t\t\t_gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar position = geometry.attributes.position;\n\t\t\tvar rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = objects.getWireframeAttribute( geometry );\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\tvar renderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( index );\n\n\t\t\t} else {\n\n\t\t\t\trenderer = bufferRenderer;\n\n\t\t\t}\n\n\t\t\tif ( updateBuffers ) {\n\n\t\t\t\tsetupVertexAttributes( material, program, geometry );\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, objects.getAttributeBuffer( index ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar dataCount = 0;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdataCount = index.count;\n\n\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\tdataCount = position.count;\n\n\t\t\t}\n\n\t\t\tvar rangeStart = geometry.drawRange.start * rangeFactor;\n\t\t\tvar rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\t\tvar groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\t\tvar groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\t\tvar drawStart = Math.max( rangeStart, groupStart );\n\t\t\tvar drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\t\tvar drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\t\tif ( drawCount === 0 ) return;\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\tswitch ( object.drawMode ) {\n\n\t\t\t\t\t\tcase TrianglesDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleStripDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_STRIP );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleFanDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_FAN );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tvar 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 {\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}\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tif ( geometry.maxInstancedCount > 0 ) {\n\n\t\t\t\t\trenderer.renderInstances( geometry, drawStart, drawCount );\n\n\t\t\t\t}\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\tfunction setupVertexAttributes( material, program, geometry, startIndex ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( startIndex === undefined ) startIndex = 0;\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar geometryAttributes = geometry.attributes;\n\n\t\t\tvar programAttributes = program.getAttributes();\n\n\t\t\tvar materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\t\tfor ( var name in programAttributes ) {\n\n\t\t\t\tvar programAttribute = programAttributes[ name ];\n\n\t\t\t\tif ( programAttribute >= 0 ) {\n\n\t\t\t\t\tvar geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\t\tvar type = _gl.FLOAT;\n\t\t\t\t\t\tvar array = geometryAttribute.array;\n\t\t\t\t\t\tvar normalized = geometryAttribute.normalized;\n\n\t\t\t\t\t\tif ( array instanceof Float32Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.FLOAT;\n\n\t\t\t\t\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\t\t\t\t\tconsole.warn( \"Unsupported data buffer format: Float64Array\" );\n\n\t\t\t\t\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.UNSIGNED_SHORT;\n\n\t\t\t\t\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.SHORT;\n\n\t\t\t\t\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.UNSIGNED_INT;\n\n\t\t\t\t\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.INT;\n\n\t\t\t\t\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.BYTE;\n\n\t\t\t\t\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.UNSIGNED_BYTE;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar size = geometryAttribute.itemSize;\n\t\t\t\t\t\tvar buffer = objects.getAttributeBuffer( geometryAttribute );\n\n\t\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\t\tvar data = geometryAttribute.data;\n\t\t\t\t\t\t\tvar stride = data.stride;\n\t\t\t\t\t\t\tvar offset = geometryAttribute.offset;\n\n\t\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * data.array.BYTES_PER_ELEMENT, ( startIndex * stride + offset ) * data.array.BYTES_PER_ELEMENT );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * geometryAttribute.array.BYTES_PER_ELEMENT );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\t\tvar value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib2fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib3fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib4fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib1fv( programAttribute, value );\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\tstate.disableUnusedAttributes();\n\n\t\t}\n\n\t\t// Sorting\n\n\t\tfunction absNumericalSort( a, b ) {\n\n\t\t\treturn Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] );\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} else if ( a.material.program && b.material.program && a.material.program !== b.material.program ) {\n\n\t\t\t\treturn a.material.program.id - b.material.program.id;\n\n\t\t\t} else if ( a.material.id !== b.material.id ) {\n\n\t\t\t\treturn a.material.id - b.material.id;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn a.z - b.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction reversePainterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Rendering\n\n\t\tthis.render = function ( scene, camera, renderTarget, forceClear ) {\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\t// reset caching for this frame\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\t\t\t_currentCamera = null;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\tlights.length = 0;\n\n\t\t\topaqueObjectsLastIndex = - 1;\n\t\t\ttransparentObjectsLastIndex = - 1;\n\n\t\t\tsprites.length = 0;\n\t\t\tlensFlares.length = 0;\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\t\tprojectObject( scene, camera );\n\n\t\t\topaqueObjects.length = opaqueObjectsLastIndex + 1;\n\t\t\ttransparentObjects.length = transparentObjectsLastIndex + 1;\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\topaqueObjects.sort( painterSortStable );\n\t\t\t\ttransparentObjects.sort( reversePainterSortStable );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _clippingEnabled ) _clipping.beginShadows();\n\n\t\t\tsetupShadows( lights );\n\n\t\t\tshadowMap.render( scene, camera );\n\n\t\t\tsetupLights( lights, camera );\n\n\t\t\tif ( _clippingEnabled ) _clipping.endShadows();\n\n\t\t\t//\n\n\t\t\t_infoRender.calls = 0;\n\t\t\t_infoRender.vertices = 0;\n\t\t\t_infoRender.faces = 0;\n\t\t\t_infoRender.points = 0;\n\n\t\t\tif ( renderTarget === undefined ) {\n\n\t\t\t\trenderTarget = null;\n\n\t\t\t}\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\n\t\t\t//\n\n\t\t\tvar background = scene.background;\n\n\t\t\tif ( background === null ) {\n\n\t\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t\t} else if ( background && background.isColor ) {\n\n\t\t\t\tglClearColor( background.r, background.g, background.b, 1 );\n\t\t\t\tforceClear = true;\n\n\t\t\t}\n\n\t\t\tif ( this.autoClear || forceClear ) {\n\n\t\t\t\tthis.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil );\n\n\t\t\t}\n\n\t\t\tif ( background && background.isCubeTexture ) {\n\n\t\t\t\tbackgroundCamera2.projectionMatrix.copy( camera.projectionMatrix );\n\n\t\t\t\tbackgroundCamera2.matrixWorld.extractRotation( camera.matrixWorld );\n\t\t\t\tbackgroundCamera2.matrixWorldInverse.getInverse( backgroundCamera2.matrixWorld );\n\n\t\t\t\tbackgroundBoxMesh.material.uniforms[ \"tCube\" ].value = background;\n\t\t\t\tbackgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundCamera2.matrixWorldInverse, backgroundBoxMesh.matrixWorld );\n\n\t\t\t\tobjects.update( backgroundBoxMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundCamera2, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null );\n\n\t\t\t} else if ( background && background.isTexture ) {\n\n\t\t\t\tbackgroundPlaneMesh.material.map = background;\n\n\t\t\t\tobjects.update( backgroundPlaneMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.overrideMaterial ) {\n\n\t\t\t\tvar overrideMaterial = scene.overrideMaterial;\n\n\t\t\t\trenderObjects( opaqueObjects, scene, camera, overrideMaterial );\n\t\t\t\trenderObjects( transparentObjects, scene, camera, overrideMaterial );\n\n\t\t\t} else {\n\n\t\t\t\t// opaque pass (front-to-back order)\n\n\t\t\t\tstate.setBlending( NoBlending );\n\t\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\t\t// transparent pass (back-to-front order)\n\n\t\t\t\trenderObjects( transparentObjects, scene, camera );\n\n\t\t\t}\n\n\t\t\t// custom render plugins (post pass)\n\n\t\t\tspritePlugin.render( scene, camera );\n\t\t\tlensFlarePlugin.render( scene, camera, _currentViewport );\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\ttextures.updateRenderTargetMipmap( renderTarget );\n\n\t\t\t}\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.setDepthTest( true );\n\t\t\tstate.setDepthWrite( true );\n\t\t\tstate.setColorWrite( true );\n\n\t\t\t// _gl.finish();\n\n\t\t};\n\n\t\tfunction pushRenderItem( object, geometry, material, z, group ) {\n\n\t\t\tvar array, index;\n\n\t\t\t// allocate the next position in the appropriate array\n\n\t\t\tif ( material.transparent ) {\n\n\t\t\t\tarray = transparentObjects;\n\t\t\t\tindex = ++ transparentObjectsLastIndex;\n\n\t\t\t} else {\n\n\t\t\t\tarray = opaqueObjects;\n\t\t\t\tindex = ++ opaqueObjectsLastIndex;\n\n\t\t\t}\n\n\t\t\t// recycle existing render item or grow the array\n\n\t\t\tvar renderItem = array[ index ];\n\n\t\t\tif ( renderItem !== undefined ) {\n\n\t\t\t\trenderItem.id = object.id;\n\t\t\t\trenderItem.object = object;\n\t\t\t\trenderItem.geometry = geometry;\n\t\t\t\trenderItem.material = material;\n\t\t\t\trenderItem.z = _vector3.z;\n\t\t\t\trenderItem.group = group;\n\n\t\t\t} else {\n\n\t\t\t\trenderItem = {\n\t\t\t\t\tid: object.id,\n\t\t\t\t\tobject: object,\n\t\t\t\t\tgeometry: geometry,\n\t\t\t\t\tmaterial: material,\n\t\t\t\t\tz: _vector3.z,\n\t\t\t\t\tgroup: group\n\t\t\t\t};\n\n\t\t\t\t// assert( index === array.length );\n\t\t\t\tarray.push( renderItem );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Duplicated code (Frustum)\n\n\t\tfunction isObjectViewable( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t_sphere.copy( geometry.boundingSphere ).\n\t\t\t\tapplyMatrix4( object.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSpriteViewable( sprite ) {\n\n\t\t\t_sphere.center.set( 0, 0, 0 );\n\t\t\t_sphere.radius = 0.7071067811865476;\n\t\t\t_sphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSphereViewable( sphere ) {\n\n\t\t\tif ( ! _frustum.intersectsSphere( sphere ) ) return false;\n\n\t\t\tvar numPlanes = _clipping.numPlanes;\n\n\t\t\tif ( numPlanes === 0 ) return true;\n\n\t\t\tvar planes = _this.clippingPlanes,\n\n\t\t\t\tcenter = sphere.center,\n\t\t\t\tnegRad = - sphere.radius,\n\t\t\t\ti = 0;\n\n\t\t\tdo {\n\n\t\t\t\t// out when deeper than radius in the negative halfspace\n\t\t\t\tif ( planes[ i ].distanceToPoint( center ) < negRad ) return false;\n\n\t\t\t} while ( ++ i !== numPlanes );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isLight ) {\n\n\t\t\t\t\tlights.push( object );\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( object.frustumCulled === false || isSpriteViewable( object ) === true ) {\n\n\t\t\t\t\t\tsprites.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isLensFlare ) {\n\n\t\t\t\t\tlensFlares.push( object );\n\n\t\t\t\t} else if ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t_vector3.applyProjection( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpushRenderItem( object, null, object.material, _vector3.z, null );\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( object.frustumCulled === false || isObjectViewable( object ) === true ) {\n\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t\t\t_vector3.applyProjection( _projScreenMatrix );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar geometry = objects.update( object );\n\n\t\t\t\t\t\t\tif ( material.isMultiMaterial ) {\n\n\t\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tvar group = groups[ i ];\n\t\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, groupMaterial, _vector3.z, group );\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} else {\n\n\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, material, _vector3.z, null );\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\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera, overrideMaterial ) {\n\n\t\t\tfor ( var i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tvar renderItem = renderList[ i ];\n\n\t\t\t\tvar object = renderItem.object;\n\t\t\t\tvar geometry = renderItem.geometry;\n\t\t\t\tvar material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;\n\t\t\t\tvar group = renderItem.group;\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\t\tif ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tsetMaterial( material );\n\n\t\t\t\t\tvar program = setProgram( camera, scene.fog, material, object );\n\n\t\t\t\t\t_currentGeometryProgram = '';\n\n\t\t\t\t\tobject.render( function ( object ) {\n\n\t\t\t\t\t\t_this.renderBufferImmediate( object, program, material );\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );\n\n\t\t\t\t}\n\n\t\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction initMaterial( material, fog, object ) {\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tvar parameters = programCache.getParameters(\n\t\t\t\t\tmaterial, _lights, fog, _clipping.numPlanes, _clipping.numIntersection, object );\n\n\t\t\tvar code = programCache.getProgramCode( material, parameters );\n\n\t\t\tvar program = materialProperties.program;\n\t\t\tvar programChange = true;\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\t// new material\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t} else if ( program.code !== code ) {\n\n\t\t\t\t// changed glsl or parameters\n\t\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\t} else if ( parameters.shaderID !== undefined ) {\n\n\t\t\t\t// same glsl and uniform list\n\t\t\t\treturn;\n\n\t\t\t} else {\n\n\t\t\t\t// only rebuild uniform list\n\t\t\t\tprogramChange = false;\n\n\t\t\t}\n\n\t\t\tif ( programChange ) {\n\n\t\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\t\tvar shader = ShaderLib[ parameters.shaderID ];\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\t\t\tfragmentShader: shader.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: material.uniforms,\n\t\t\t\t\t\tvertexShader: material.vertexShader,\n\t\t\t\t\t\tfragmentShader: material.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.__webglShader = materialProperties.__webglShader;\n\n\t\t\t\tprogram = programCache.acquireProgram( material, parameters, code );\n\n\t\t\t\tmaterialProperties.program = program;\n\t\t\t\tmaterial.program = program;\n\n\t\t\t}\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\tmaterial.numSupportedMorphTargets = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphTargets; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphTarget' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphTargets ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.morphNormals ) {\n\n\t\t\t\tmaterial.numSupportedMorphNormals = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphNormals; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphNormal' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphNormals ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( ! material.isShaderMaterial &&\n\t\t\t ! material.isRawShaderMaterial ||\n\t\t\t material.clipping === true ) {\n\n\t\t\t\tmaterialProperties.numClippingPlanes = _clipping.numPlanes;\n\t\t\t\tmaterialProperties.numIntersection = _clipping.numIntersection;\n\t\t\t\tuniforms.clippingPlanes = _clipping.uniform;\n\n\t\t\t}\n\n\t\t\tmaterialProperties.fog = fog;\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.lightsHash = _lights.hash;\n\n\t\t\tif ( material.lights ) {\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.ambient;\n\t\t\t\tuniforms.directionalLights.value = _lights.directional;\n\t\t\t\tuniforms.spotLights.value = _lights.spot;\n\t\t\t\tuniforms.pointLights.value = _lights.point;\n\t\t\t\tuniforms.hemisphereLights.value = _lights.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = _lights.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = _lights.spotShadowMap;\n\t\t\t\tuniforms.spotShadowMatrix.value = _lights.spotShadowMatrix;\n\t\t\t\tuniforms.pointShadowMap.value = _lights.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = _lights.pointShadowMatrix;\n\n\t\t\t}\n\n\t\t\tvar progUniforms = materialProperties.program.getUniforms(),\n\t\t\t\tuniformsList =\n\t\t\t\t\t\tWebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t\t}\n\n\t\tfunction setMaterial( material ) {\n\n\t\t\tmaterial.side === DoubleSide\n\t\t\t\t? state.disable( _gl.CULL_FACE )\n\t\t\t\t: state.enable( _gl.CULL_FACE );\n\n\t\t\tstate.setFlipSided( material.side === BackSide );\n\n\t\t\tmaterial.transparent === true\n\t\t\t\t? state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )\n\t\t\t\t: state.setBlending( NoBlending );\n\n\t\t\tstate.setDepthFunc( material.depthFunc );\n\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\tstate.setDepthWrite( material.depthWrite );\n\t\t\tstate.setColorWrite( material.colorWrite );\n\t\t\tstate.setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\t}\n\n\t\tfunction setProgram( camera, fog, material, object ) {\n\n\t\t\t_usedTextureUnits = 0;\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tif ( _clippingEnabled ) {\n\n\t\t\t\tif ( _localClippingEnabled || camera !== _currentCamera ) {\n\n\t\t\t\t\tvar useCache =\n\t\t\t\t\t\t\tcamera === _currentCamera &&\n\t\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\t_clipping.setState(\n\t\t\t\t\t\t\tmaterial.clippingPlanes, material.clipIntersection, material.clipShadows,\n\t\t\t\t\t\t\tcamera, materialProperties, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate === false ) {\n\n\t\t\t\tif ( materialProperties.program === undefined ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.lights && materialProperties.lightsHash !== _lights.hash ) {\n\n\t\t\t\t\tmaterial.needsUpdate = 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\t materialProperties.numIntersection !== _clipping.numIntersection ) ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate ) {\n\n\t\t\t\tinitMaterial( material, fog, object );\n\t\t\t\tmaterial.needsUpdate = false;\n\n\t\t\t}\n\n\t\t\tvar refreshProgram = false;\n\t\t\tvar refreshMaterial = false;\n\t\t\tvar refreshLights = false;\n\n\t\t\tvar program = materialProperties.program,\n\t\t\t\tp_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( program.id !== _currentProgram ) {\n\n\t\t\t\t_gl.useProgram( program.program );\n\t\t\t\t_currentProgram = program.id;\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 || camera !== _currentCamera ) {\n\n\t\t\t\tp_uniforms.set( _gl, camera, 'projectionMatrix' );\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\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( camera !== _currentCamera ) {\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\t// load material specific uniforms\n\t\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\t material.isMeshPhongMaterial ||\n\t\t\t\t material.isMeshStandardMaterial ||\n\t\t\t\t material.envMap ) {\n\n\t\t\t\t\tvar uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t material.isMeshLambertMaterial ||\n\t\t\t\t material.isMeshBasicMaterial ||\n\t\t\t\t material.isMeshStandardMaterial ||\n\t\t\t\t material.isShaderMaterial ||\n\t\t\t\t material.skinning ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingExposure' );\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingWhitePoint' );\n\n\t\t\t}\n\n\t\t\t// skinning uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone texture must go before other textures\n\t\t\t// not sure why, but otherwise weird things happen\n\n\t\t\tif ( material.skinning ) {\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\tvar skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( capabilities.floatVertexTextures && skeleton.useVertexTexture ) {\n\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTexture' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureWidth' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureHeight' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tif ( material.lights ) {\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 ) {\n\n\t\t\t\t\trefreshUniformsFog( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshBasicMaterial ||\n\t\t\t\t material.isMeshLambertMaterial ||\n\t\t\t\t material.isMeshPhongMaterial ||\n\t\t\t\t material.isMeshStandardMaterial ||\n\t\t\t\t material.isMeshDepthMaterial ) {\n\n\t\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh single material specific uniforms\n\n\t\t\t\tif ( material.isLineBasicMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isLineDashedMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\t\t\t\t\trefreshUniformsDash( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\t\t\trefreshUniformsPoints( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\t\t\trefreshUniformsLambert( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhong( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhysical( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\t\t\trefreshUniformsStandard( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\t\t\tm_uniforms.displacementMap.value = material.displacementMap;\n\t\t\t\t\t\tm_uniforms.displacementScale.value = material.displacementScale;\n\t\t\t\t\t\tm_uniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\t\t\tm_uniforms.opacity.value = material.opacity;\n\n\t\t\t\t}\n\n\t\t\t\tWebGLUniforms.upload(\n\t\t\t\t\t\t_gl, materialProperties.uniformsList, m_uniforms, _this );\n\n\t\t\t}\n\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.set( _gl, object, 'modelViewMatrix' );\n\t\t\tp_uniforms.set( _gl, object, 'normalMatrix' );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// Uniforms (refresh uniforms objects)\n\n\t\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t\tuniforms.diffuse.value = material.color;\n\n\t\t\tif ( material.emissive ) {\n\n\t\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t\t}\n\n\t\t\tuniforms.map.value = material.map;\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\tif ( material.aoMap ) {\n\n\t\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\t}\n\n\t\t\t// uv repeat and offset setting priorities\n\t\t\t// 1. color map\n\t\t\t// 2. specular map\n\t\t\t// 3. normal map\n\t\t\t// 4. bump map\n\t\t\t// 5. alpha map\n\t\t\t// 6. emissive map\n\n\t\t\tvar uvScaleMap;\n\n\t\t\tif ( material.map ) {\n\n\t\t\t\tuvScaleMap = material.map;\n\n\t\t\t} else if ( material.specularMap ) {\n\n\t\t\t\tuvScaleMap = material.specularMap;\n\n\t\t\t} else if ( material.displacementMap ) {\n\n\t\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t\t} else if ( material.normalMap ) {\n\n\t\t\t\tuvScaleMap = material.normalMap;\n\n\t\t\t} else if ( material.bumpMap ) {\n\n\t\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t\t} else if ( material.roughnessMap ) {\n\n\t\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t\t} else if ( material.metalnessMap ) {\n\n\t\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t\t} else if ( material.alphaMap ) {\n\n\t\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t\t} else if ( material.emissiveMap ) {\n\n\t\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t\t// backwards compatibility\n\t\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t\t}\n\n\t\t\t\tvar offset = uvScaleMap.offset;\n\t\t\t\tvar repeat = uvScaleMap.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t\tuniforms.envMap.value = material.envMap;\n\n\t\t\t// don't flip CubeTexture envMaps, flip everything else:\n\t\t\t// WebGLRenderTargetCube will be flipped for backwards compatibility\n\t\t\t// WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture\n\t\t\t// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future\n\t\t\tuniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t}\n\n\t\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\t\tuniforms.dashSize.value = material.dashSize;\n\t\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\t\tuniforms.scale.value = material.scale;\n\n\t\t}\n\n\t\tfunction refreshUniformsPoints( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\t\t\tuniforms.size.value = material.size * _pixelRatio;\n\t\t\tuniforms.scale.value = _height * 0.5;\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\tif ( material.map !== null ) {\n\n\t\t\t\tvar offset = material.map.offset;\n\t\t\t\tvar repeat = material.map.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsFog( uniforms, fog ) {\n\n\t\t\tuniforms.fogColor.value = fog.color;\n\n\t\t\tif ( fog.isFog ) {\n\n\t\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\t\tuniforms.specular.value = material.specular;\n\t\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\t\tuniforms.roughness.value = material.roughness;\n\t\t\tuniforms.metalness.value = material.metalness;\n\n\t\t\tif ( material.roughnessMap ) {\n\n\t\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.metalnessMap ) {\n\n\t\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t\tif ( material.envMap ) {\n\n\t\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhysical( uniforms, material ) {\n\n\t\t\tuniforms.clearCoat.value = material.clearCoat;\n\t\t\tuniforms.clearCoatRoughness.value = material.clearCoatRoughness;\n\n\t\t\trefreshUniformsStandard( uniforms, material );\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\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\t// Lighting\n\n\t\tfunction setupShadows( lights ) {\n\n\t\t\tvar lightShadowsLength = 0;\n\n\t\t\tfor ( var i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\t\tvar light = lights[ i ];\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t_lights.shadows[ lightShadowsLength ++ ] = light;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.shadows.length = lightShadowsLength;\n\n\t\t}\n\n\t\tfunction setupLights( lights, camera ) {\n\n\t\t\tvar l, ll, light,\n\t\t\tr = 0, g = 0, b = 0,\n\t\t\tcolor,\n\t\t\tintensity,\n\t\t\tdistance,\n\t\t\tshadowMap,\n\n\t\t\tviewMatrix = camera.matrixWorldInverse,\n\n\t\t\tdirectionalLength = 0,\n\t\t\tpointLength = 0,\n\t\t\tspotLength = 0,\n\t\t\themiLength = 0;\n\n\t\t\tfor ( l = 0, ll = lights.length; l < ll; l ++ ) {\n\n\t\t\t\tlight = lights[ l ];\n\n\t\t\t\tcolor = light.color;\n\t\t\t\tintensity = light.intensity;\n\t\t\t\tdistance = light.distance;\n\n\t\t\t\tshadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\t\tr += color.r * intensity;\n\t\t\t\t\tg += color.g * intensity;\n\t\t\t\t\tb += color.b * intensity;\n\n\t\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\t_lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.directional[ directionalLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\t_lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.spot[ spotLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.pointShadowMap[ pointLength ] = shadowMap;\n\n\t\t\t\t\tif ( _lights.pointShadowMatrix[ pointLength ] === undefined ) {\n\n\t\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ] = new Matrix4();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// for point lights we set the shadow matrix to be a translation-only matrix\n\t\t\t\t\t// equal to inverse of the light's position\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.matrixWorld ).negate();\n\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ].identity().setPosition( _vector3 );\n\n\t\t\t\t\t_lights.point[ pointLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\t\t_lights.hemi[ hemiLength ++ ] = uniforms;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.ambient[ 0 ] = r;\n\t\t\t_lights.ambient[ 1 ] = g;\n\t\t\t_lights.ambient[ 2 ] = b;\n\n\t\t\t_lights.directional.length = directionalLength;\n\t\t\t_lights.spot.length = spotLength;\n\t\t\t_lights.point.length = pointLength;\n\t\t\t_lights.hemi.length = hemiLength;\n\n\t\t\t_lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + hemiLength + ',' + _lights.shadows.length;\n\n\t\t}\n\n\t\t// GL state setting\n\n\t\tthis.setFaceCulling = function ( cullFace, frontFaceDirection ) {\n\n\t\t\tstate.setCullFace( cullFace );\n\t\t\tstate.setFlipSided( frontFaceDirection === FrontFaceDirectionCW );\n\n\t\t};\n\n\t\t// Textures\n\n\t\tfunction allocTextureUnit() {\n\n\t\t\tvar textureUnit = _usedTextureUnits;\n\n\t\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\t\tconsole.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t\t}\n\n\t\t\t_usedTextureUnits += 1;\n\n\t\t\treturn textureUnit;\n\n\t\t}\n\n\t\tthis.allocTextureUnit = allocTextureUnit;\n\n\t\t// this.setTexture2D = setTexture2D;\n\t\tthis.setTexture2D = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\t// backwards compatibility: peel texture.texture\n\t\t\treturn function setTexture2D( texture, slot ) {\n\n\t\t\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTexture = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTexture( texture, slot ) {\n\n\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.\" );\n\t\t\t\t\twarned = true;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTextureCube = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTextureCube( texture, slot ) {\n\n\t\t\t\t// backwards compatibility: peel texture.texture\n\t\t\t\tif ( texture && texture.isWebGLRenderTargetCube ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\t// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture\n\t\t\t\t// TODO: unify these code paths\n\t\t\t\tif ( ( texture && texture.isCubeTexture ) ||\n\t\t\t\t\t ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {\n\n\t\t\t\t\t// CompressedTexture can have Array in image :/\n\n\t\t\t\t\t// this function alone should take care of cube textures\n\t\t\t\t\ttextures.setTextureCube( texture, slot );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assumed: texture property of THREE.WebGLRenderTargetCube\n\n\t\t\t\t\ttextures.setTextureCubeDynamic( texture, slot );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.getCurrentRenderTarget = function() {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTarget = function ( renderTarget ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\n\t\t\tif ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t}\n\n\t\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\t\tvar framebuffer;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer;\n\n\t\t\t\t}\n\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = null;\n\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );\n\n\t\t\t}\n\n\t\t\tif ( _currentFramebuffer !== framebuffer ) {\n\n\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t\t_currentFramebuffer = framebuffer;\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tstate.viewport( _currentViewport );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) {\n\n\t\t\tif ( ( renderTarget && renderTarget.isWebGLRenderTarget ) === false ) {\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\tvar framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tvar restore = false;\n\n\t\t\t\tif ( framebuffer !== _currentFramebuffer ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\trestore = true;\n\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar texture = renderTarget.texture;\n\t\t\t\t\tvar textureFormat = texture.format;\n\t\t\t\t\tvar textureType = texture.type;\n\n\t\t\t\t\tif ( textureFormat !== RGBAFormat && paramThreeToGL( 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\tif ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t ! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t ! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) {\n\n\t\t\t\t\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\tif ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {\n\n\t\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\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t\t_gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\tif ( restore ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );\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// Map three.js constants to WebGL constants\n\n\t\tfunction paramThreeToGL( p ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( p === RepeatWrapping ) return _gl.REPEAT;\n\t\t\tif ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE;\n\t\t\tif ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT;\n\n\t\t\tif ( p === NearestFilter ) return _gl.NEAREST;\n\t\t\tif ( p === NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST;\n\t\t\tif ( p === NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR;\n\n\t\t\tif ( p === LinearFilter ) return _gl.LINEAR;\n\t\t\tif ( p === LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST;\n\t\t\tif ( p === LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR;\n\n\t\t\tif ( p === UnsignedByteType ) return _gl.UNSIGNED_BYTE;\n\t\t\tif ( p === UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4;\n\t\t\tif ( p === UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1;\n\t\t\tif ( p === UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5;\n\n\t\t\tif ( p === ByteType ) return _gl.BYTE;\n\t\t\tif ( p === ShortType ) return _gl.SHORT;\n\t\t\tif ( p === UnsignedShortType ) return _gl.UNSIGNED_SHORT;\n\t\t\tif ( p === IntType ) return _gl.INT;\n\t\t\tif ( p === UnsignedIntType ) return _gl.UNSIGNED_INT;\n\t\t\tif ( p === FloatType ) return _gl.FLOAT;\n\n\t\t\tif ( p === HalfFloatType ) {\n\n\t\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\t\tif ( extension !== null ) return extension.HALF_FLOAT_OES;\n\n\t\t\t}\n\n\t\t\tif ( p === AlphaFormat ) return _gl.ALPHA;\n\t\t\tif ( p === RGBFormat ) return _gl.RGB;\n\t\t\tif ( p === RGBAFormat ) return _gl.RGBA;\n\t\t\tif ( p === LuminanceFormat ) return _gl.LUMINANCE;\n\t\t\tif ( p === LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA;\n\t\t\tif ( p === DepthFormat ) return _gl.DEPTH_COMPONENT;\n\t\t\tif ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL;\n\n\t\t\tif ( p === AddEquation ) return _gl.FUNC_ADD;\n\t\t\tif ( p === SubtractEquation ) return _gl.FUNC_SUBTRACT;\n\t\t\tif ( p === ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT;\n\n\t\t\tif ( p === ZeroFactor ) return _gl.ZERO;\n\t\t\tif ( p === OneFactor ) return _gl.ONE;\n\t\t\tif ( p === SrcColorFactor ) return _gl.SRC_COLOR;\n\t\t\tif ( p === OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR;\n\t\t\tif ( p === SrcAlphaFactor ) return _gl.SRC_ALPHA;\n\t\t\tif ( p === OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA;\n\t\t\tif ( p === DstAlphaFactor ) return _gl.DST_ALPHA;\n\t\t\tif ( p === OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA;\n\n\t\t\tif ( p === DstColorFactor ) return _gl.DST_COLOR;\n\t\t\tif ( p === OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR;\n\t\t\tif ( p === SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE;\n\n\t\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||\n\t\t\t\tp === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\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}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||\n\t\t\t\t p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\t\tif ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t}\n\n\t\t\tif ( p === MinEquation || p === MaxEquation ) {\n\n\t\t\t\textension = extensions.get( 'EXT_blend_minmax' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === MinEquation ) return extension.MIN_EXT;\n\t\t\t\t\tif ( p === MaxEquation ) return extension.MAX_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\t\tif ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t}\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction FogExp2 ( color, density ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = ( density !== undefined ) ? density : 0.00025;\n\n\t}\n\n\tFogExp2.prototype.isFogExp2 = true;\n\n\tFogExp2.prototype.clone = function () {\n\n\t\treturn new FogExp2( this.color.getHex(), this.density );\n\n\t};\n\n\tFogExp2.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Fog ( color, near, far ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = ( near !== undefined ) ? near : 1;\n\t\tthis.far = ( far !== undefined ) ? far : 1000;\n\n\t}\n\n\tFog.prototype.isFog = true;\n\n\tFog.prototype.clone = function () {\n\n\t\treturn new Fog( this.color.getHex(), this.near, this.far );\n\n\t};\n\n\tFog.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\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\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Scene () {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.fog = null;\n\t\tthis.overrideMaterial = null;\n\n\t\tthis.autoUpdate = true; // checked by the renderer\n\n\t}\n\n\tScene.prototype = Object.create( Object3D.prototype );\n\n\tScene.prototype.constructor = Scene;\n\n\tScene.prototype.copy = function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t};\n\n\tScene.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tif ( this.background !== null ) data.object.background = this.background.toJSON( meta );\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlare( texture, size, distance, blending, color ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.lensFlares = [];\n\n\t\tthis.positionScreen = new Vector3();\n\t\tthis.customUpdateCallback = undefined;\n\n\t\tif ( texture !== undefined ) {\n\n\t\t\tthis.add( texture, size, distance, blending, color );\n\n\t\t}\n\n\t}\n\n\tLensFlare.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LensFlare,\n\n\t\tisLensFlare: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.positionScreen.copy( source.positionScreen );\n\t\t\tthis.customUpdateCallback = source.customUpdateCallback;\n\n\t\t\tfor ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lensFlares.push( source.lensFlares[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( texture, size, distance, blending, color, opacity ) {\n\n\t\t\tif ( size === undefined ) size = - 1;\n\t\t\tif ( distance === undefined ) distance = 0;\n\t\t\tif ( opacity === undefined ) opacity = 1;\n\t\t\tif ( color === undefined ) color = new Color( 0xffffff );\n\t\t\tif ( blending === undefined ) blending = NormalBlending;\n\n\t\t\tdistance = Math.min( distance, Math.max( 0, distance ) );\n\n\t\t\tthis.lensFlares.push( {\n\t\t\t\ttexture: texture,\t// THREE.Texture\n\t\t\t\tsize: size, \t\t// size in pixels (-1 = use texture.width)\n\t\t\t\tdistance: distance, \t// distance (0-1) from light source (0=at light source)\n\t\t\t\tx: 0, y: 0, z: 0,\t// screen position (-1 => 1) z = 0 is in front z = 1 is back\n\t\t\t\tscale: 1, \t\t// scale\n\t\t\t\trotation: 0, \t\t// rotation\n\t\t\t\topacity: opacity,\t// opacity\n\t\t\t\tcolor: color,\t\t// color\n\t\t\t\tblending: blending\t// blending\n\t\t\t} );\n\n\t\t},\n\n\t\t/*\n\t\t * Update lens flares update positions on all flares based on the screen position\n\t\t * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way.\n\t\t */\n\n\t\tupdateLensFlares: function () {\n\n\t\t\tvar f, fl = this.lensFlares.length;\n\t\t\tvar flare;\n\t\t\tvar vecX = - this.positionScreen.x * 2;\n\t\t\tvar vecY = - this.positionScreen.y * 2;\n\n\t\t\tfor ( f = 0; f < fl; f ++ ) {\n\n\t\t\t\tflare = this.lensFlares[ f ];\n\n\t\t\t\tflare.x = this.positionScreen.x + vecX * flare.distance;\n\t\t\t\tflare.y = this.positionScreen.y + vecY * flare.distance;\n\n\t\t\t\tflare.wantedRotation = flare.x * Math.PI * 0.25;\n\t\t\t\tflare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t *\tuvOffset: new THREE.Vector2(),\n\t *\tuvScale: new THREE.Vector2()\n\t * }\n\t */\n\n\tfunction SpriteMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\t\tthis.map = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tSpriteMaterial.prototype = Object.create( Material.prototype );\n\tSpriteMaterial.prototype.constructor = SpriteMaterial;\n\n\tSpriteMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.map = source.map;\n\n\t\tthis.rotation = source.rotation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Sprite( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Sprite';\n\n\t\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\t}\n\n\tSprite.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Sprite,\n\n\t\tisSprite: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distanceSq = raycaster.ray.distanceSqToPoint( matrixPosition );\n\t\t\t\tvar guessSizeSq = this.scale.x * this.scale.y / 4;\n\n\t\t\t\tif ( distanceSq > guessSizeSq ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: Math.sqrt( distanceSq ),\n\t\t\t\t\tpoint: this.position,\n\t\t\t\t\tface: 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\tclone: function () {\n\n\t\t\treturn new this.constructor( this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LOD() {\n\n\t\tObject3D.call( this );\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} );\n\n\t}\n\n\n\tLOD.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LOD,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source, false );\n\n\t\t\tvar levels = source.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddLevel: function ( object, distance ) {\n\n\t\t\tif ( distance === undefined ) distance = 0;\n\n\t\t\tdistance = Math.abs( distance );\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\t\tthis.add( object );\n\n\t\t},\n\n\t\tgetObjectForDistance: function ( distance ) {\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance < levels[ i ].distance ) {\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\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( matrixPosition );\n\n\t\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tupdate: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar levels = this.levels;\n\n\t\t\t\tif ( levels.length > 1 ) {\n\n\t\t\t\t\tv1.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\t\tv2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\t\tvar distance = v1.distanceTo( v2 );\n\n\t\t\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t\t\t} else {\n\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\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\t\t\tlevels[ i ].object.visible = 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\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.levels = [];\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tdata.object.levels.push( {\n\t\t\t\t\tobject: level.object.uuid,\n\t\t\t\t\tdistance: level.distance\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { data: data, 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.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n\tDataTexture.prototype = Object.create( Texture.prototype );\n\tDataTexture.prototype.constructor = DataTexture;\n\n\tDataTexture.prototype.isDataTexture = true;\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author michael guerrero / http://realitymeltdown.com\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Skeleton( bones, boneInverses, useVertexTexture ) {\n\n\t\tthis.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true;\n\n\t\tthis.identityMatrix = new Matrix4();\n\n\t\t// copy the bone array\n\n\t\tbones = bones || [];\n\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t// create a bone texture or an array of floats\n\n\t\tif ( this.useVertexTexture ) {\n\n\t\t\t// layout (1 matrix = 4 pixels)\n\t\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\n\t\t\tvar size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\t\tsize = _Math.nextPowerOfTwo( Math.ceil( size ) );\n\t\t\tsize = Math.max( size, 4 );\n\n\t\t\tthis.boneTextureWidth = size;\n\t\t\tthis.boneTextureHeight = size;\n\n\t\t\tthis.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel\n\t\t\tthis.boneTexture = new DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, RGBAFormat, FloatType );\n\n\t\t} else {\n\n\t\t\tthis.boneMatrices = new Float32Array( 16 * this.bones.length );\n\n\t\t}\n\n\t\t// use the supplied bone inverses or calculate the inverses\n\n\t\tif ( boneInverses === undefined ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\tif ( this.bones.length === boneInverses.length ) {\n\n\t\t\t\tthis.boneInverses = boneInverses.slice( 0 );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton bonInverses is the wrong length.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\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\tObject.assign( Skeleton.prototype, {\n\n\t\tcalculateInverses: function () {\n\n\t\t\tthis.boneInverses = [];\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tvar inverse = new Matrix4();\n\n\t\t\t\tif ( this.bones[ b ] ) {\n\n\t\t\t\t\tinverse.getInverse( this.bones[ b ].matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tthis.boneInverses.push( inverse );\n\n\t\t\t}\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tvar bone;\n\n\t\t\t// recover the bind-time world matrices\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tbone.matrixWorld.getInverse( this.boneInverses[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// compute the local matrices, positions, rotations and scales\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tif ( (bone.parent && bone.parent.isBone) ) {\n\n\t\t\t\t\t\tbone.matrix.getInverse( bone.parent.matrixWorld );\n\t\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdate: ( function () {\n\n\t\t\tvar offsetMatrix = new Matrix4();\n\n\t\t\treturn function update() {\n\n\t\t\t\t// flatten bone matrices to array\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\t\t// compute the offset between the current and the original transform\n\n\t\t\t\t\tvar matrix = this.bones[ b ] ? this.bones[ b ].matrixWorld : this.identityMatrix;\n\n\t\t\t\t\toffsetMatrix.multiplyMatrices( matrix, this.boneInverses[ b ] );\n\t\t\t\t\toffsetMatrix.toArray( this.boneMatrices, b * 16 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.useVertexTexture ) {\n\n\t\t\t\t\tthis.boneTexture.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tclone: function () {\n\n\t\t\treturn new Skeleton( this.bones, this.boneInverses, this.useVertexTexture );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Bone( skin ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Bone';\n\n\t\tthis.skin = skin;\n\n\t}\n\n\tBone.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Bone,\n\n\t\tisBone: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.skin = source.skin;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction SkinnedMesh( geometry, material, useVertexTexture ) {\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\tthis.bindMode = \"attached\";\n\t\tthis.bindMatrix = new Matrix4();\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t// init bones\n\n\t\t// TODO: remove bone creation as there is no reason (other than\n\t\t// convenience) for THREE.SkinnedMesh to do this.\n\n\t\tvar bones = [];\n\n\t\tif ( this.geometry && this.geometry.bones !== undefined ) {\n\n\t\t\tvar bone, gbone;\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tbone = new Bone( this );\n\t\t\t\tbones.push( bone );\n\n\t\t\t\tbone.name = gbone.name;\n\t\t\t\tbone.position.fromArray( gbone.pos );\n\t\t\t\tbone.quaternion.fromArray( gbone.rotq );\n\t\t\t\tif ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );\n\n\t\t\t}\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tif ( gbone.parent !== - 1 && gbone.parent !== null &&\n\t\t\t\t\t\tbones[ gbone.parent ] !== undefined ) {\n\n\t\t\t\t\tbones[ gbone.parent ].add( bones[ b ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.add( bones[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.normalizeSkinWeights();\n\n\t\tthis.updateMatrixWorld( true );\n\t\tthis.bind( new Skeleton( bones, undefined, useVertexTexture ), this.matrixWorld );\n\n\t}\n\n\n\tSkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\t\tconstructor: SkinnedMesh,\n\n\t\tisSkinnedMesh: true,\n\n\t\tbind: function( skeleton, bindMatrix ) {\n\n\t\t\tthis.skeleton = skeleton;\n\n\t\t\tif ( bindMatrix === undefined ) {\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t\t}\n\n\t\t\tthis.bindMatrix.copy( bindMatrix );\n\t\t\tthis.bindMatrixInverse.getInverse( bindMatrix );\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tthis.skeleton.pose();\n\n\t\t},\n\n\t\tnormalizeSkinWeights: function () {\n\n\t\t\tif ( (this.geometry && this.geometry.isGeometry) ) {\n\n\t\t\t\tfor ( var i = 0; i < this.geometry.skinWeights.length; i ++ ) {\n\n\t\t\t\t\tvar sw = this.geometry.skinWeights[ i ];\n\n\t\t\t\t\tvar scale = 1.0 / sw.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tsw.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tsw.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( (this.geometry && this.geometry.isBufferGeometry) ) {\n\n\t\t\t\tvar vec = new Vector4();\n\n\t\t\t\tvar skinWeight = this.geometry.attributes.skinWeight;\n\n\t\t\t\tfor ( var i = 0; i < skinWeight.count; i ++ ) {\n\n\t\t\t\t\tvec.x = skinWeight.getX( i );\n\t\t\t\t\tvec.y = skinWeight.getY( i );\n\t\t\t\t\tvec.z = skinWeight.getZ( i );\n\t\t\t\t\tvec.w = skinWeight.getW( i );\n\n\t\t\t\t\tvar scale = 1.0 / vec.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tvec.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvec.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t\tskinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrixWorld: function( force ) {\n\n\t\t\tMesh.prototype.updateMatrixWorld.call( this, true );\n\n\t\t\tif ( this.bindMode === \"attached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.matrixWorld );\n\n\t\t\t} else if ( this.bindMode === \"detached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.bindMatrix );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.SkinnedMesh unrecognized bindMode: ' + this.bindMode );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function() {\n\n\t\t\treturn new this.constructor( this.geometry, this.material, this.skeleton.useVertexTexture ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t * linecap: \"round\",\n\t * linejoin: \"round\"\n\t * }\n\t */\n\n\tfunction LineBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\t\tthis.linecap = 'round';\n\t\tthis.linejoin = 'round';\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineBasicMaterial.prototype = Object.create( Material.prototype );\n\tLineBasicMaterial.prototype.constructor = LineBasicMaterial;\n\n\tLineBasicMaterial.prototype.isLineBasicMaterial = true;\n\n\tLineBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Line( geometry, material, mode ) {\n\n\t\tif ( mode === 1 ) {\n\n\t\t\tconsole.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' );\n\t\t\treturn new LineSegments( geometry, material );\n\n\t\t}\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tLine.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Line,\n\n\t\tisLine: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar precision = raycaster.linePrecision;\n\t\t\t\tvar precisionSq = precision * precision;\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar vStart = new Vector3();\n\t\t\t\tvar vEnd = new Vector3();\n\t\t\t\tvar interSegment = new Vector3();\n\t\t\t\tvar interRay = new Vector3();\n\t\t\t\tvar step = (this && this.isLineSegments) ? 2 : 1;\n\n\t\t\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, l = indices.length - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\t\t\t\t\t\t\tvar b = indices[ i + 1 ];\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, a * 3 );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, b * 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\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\tfor ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, 3 * i );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, 3 * i + 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\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 if ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar nbVertices = vertices.length;\n\n\t\t\t\t\tfor ( var i = 0; i < nbVertices - 1; i += step ) {\n\n\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );\n\n\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LineSegments( geometry, material ) {\n\n\t\tLine.call( this, geometry, material );\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tLineSegments.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\t\tconstructor: LineSegments,\n\n\t\tisLineSegments: true\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * size: ,\n\t * sizeAttenuation: \n\t * }\n\t */\n\n\tfunction PointsMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tPointsMaterial.prototype = Object.create( Material.prototype );\n\tPointsMaterial.prototype.constructor = PointsMaterial;\n\n\tPointsMaterial.prototype.isPointsMaterial = true;\n\n\tPointsMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Points( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tPoints.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Points,\n\n\t\tisPoints: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar object = this;\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\t\t\t\tvar threshold = raycaster.params.Points.threshold;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\t\t\tvar localThresholdSq = localThreshold * localThreshold;\n\t\t\t\tvar position = new Vector3();\n\n\t\t\t\tfunction testPoint( point, index ) {\n\n\t\t\t\t\tvar rayPointDistanceSq = ray.distanceSqToPoint( point );\n\n\t\t\t\t\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\t\t\t\t\tvar intersectPoint = ray.closestPointToPoint( point );\n\t\t\t\t\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\t\t\t\t\tpoint: intersectPoint.clone(),\n\t\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tobject: 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\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, il = indices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\n\t\t\t\t\t\t\tposition.fromArray( positions, a * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, a );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tposition.fromArray( positions, i * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, i );\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\tvar vertices = geometry.vertices;\n\n\t\t\t\t\tfor ( var i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\ttestPoint( vertices[ i ], i );\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\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Group() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Group';\n\n\t}\n\n\tGroup.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Group\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.generateMipmaps = false;\n\n\t\tvar scope = this;\n\n\t\tfunction update() {\n\n\t\t\trequestAnimationFrame( update );\n\n\t\t\tif ( video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\t\tscope.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tupdate();\n\n\t}\n\n\tVideoTexture.prototype = Object.create( Texture.prototype );\n\tVideoTexture.prototype.constructor = VideoTexture;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\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\tCompressedTexture.prototype = Object.create( Texture.prototype );\n\tCompressedTexture.prototype.constructor = CompressedTexture;\n\n\tCompressedTexture.prototype.isCompressedTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tCanvasTexture.prototype = Object.create( Texture.prototype );\n\tCanvasTexture.prototype.constructor = CanvasTexture;\n\n\t/**\n\t * @author Matt DesLauriers / @mattdesl\n\t * @author atix / arthursilber.de\n\t */\n\n\tfunction DepthTexture( 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\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.type = type !== undefined ? type : UnsignedShortType;\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\t= false;\n\n\t}\n\n\tDepthTexture.prototype = Object.create( Texture.prototype );\n\tDepthTexture.prototype.constructor = DepthTexture;\n\tDepthTexture.prototype.isDepthTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WireframeGeometry( geometry ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tvar edge = [ 0, 0 ], hash = {};\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\tif ( (geometry && geometry.isGeometry) ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\t\t\tvar faces = geometry.faces;\n\t\t\tvar numEdges = 0;\n\n\t\t\t// allocate maximal size\n\t\t\tvar edges = new Uint32Array( 6 * faces.length );\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\t\tvar key = edge.toString();\n\n\t\t\t\t\tif ( hash[ key ] === undefined ) {\n\n\t\t\t\t\t\tedges[ 2 * numEdges ] = edge[ 0 ];\n\t\t\t\t\t\tedges[ 2 * numEdges + 1 ] = edge[ 1 ];\n\t\t\t\t\t\thash[ key ] = true;\n\t\t\t\t\t\tnumEdges ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar coords = new Float32Array( numEdges * 2 * 3 );\n\n\t\t\tfor ( var i = 0, l = numEdges; i < l; i ++ ) {\n\n\t\t\t\tfor ( var j = 0; j < 2; j ++ ) {\n\n\t\t\t\t\tvar vertex = vertices[ edges [ 2 * i + j ] ];\n\n\t\t\t\t\tvar index = 6 * i + 3 * j;\n\t\t\t\t\tcoords[ index + 0 ] = vertex.x;\n\t\t\t\t\tcoords[ index + 1 ] = vertex.y;\n\t\t\t\t\tcoords[ index + 2 ] = vertex.z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.addAttribute( 'position', new BufferAttribute( coords, 3 ) );\n\n\t\t} else if ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// Indexed BufferGeometry\n\n\t\t\t\tvar indices = geometry.index.array;\n\t\t\t\tvar vertices = geometry.attributes.position;\n\t\t\t\tvar groups = geometry.groups;\n\t\t\t\tvar numEdges = 0;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgeometry.addGroup( 0, indices.length );\n\n\t\t\t\t}\n\n\t\t\t\t// allocate maximal size\n\t\t\t\tvar edges = new Uint32Array( 2 * indices.length );\n\n\t\t\t\tfor ( var o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tvar group = groups[ o ];\n\n\t\t\t\t\tvar start = group.start;\n\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tedge[ 0 ] = indices[ i + j ];\n\t\t\t\t\t\t\tedge[ 1 ] = indices[ i + ( j + 1 ) % 3 ];\n\t\t\t\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\t\t\t\tvar key = edge.toString();\n\n\t\t\t\t\t\t\tif ( hash[ key ] === undefined ) {\n\n\t\t\t\t\t\t\t\tedges[ 2 * numEdges ] = edge[ 0 ];\n\t\t\t\t\t\t\t\tedges[ 2 * numEdges + 1 ] = edge[ 1 ];\n\t\t\t\t\t\t\t\thash[ key ] = true;\n\t\t\t\t\t\t\t\tnumEdges ++;\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\tvar coords = new Float32Array( numEdges * 2 * 3 );\n\n\t\t\t\tfor ( var i = 0, l = numEdges; i < l; i ++ ) {\n\n\t\t\t\t\tfor ( var j = 0; j < 2; j ++ ) {\n\n\t\t\t\t\t\tvar index = 6 * i + 3 * j;\n\t\t\t\t\t\tvar index2 = edges[ 2 * i + j ];\n\n\t\t\t\t\t\tcoords[ index + 0 ] = vertices.getX( index2 );\n\t\t\t\t\t\tcoords[ index + 1 ] = vertices.getY( index2 );\n\t\t\t\t\t\tcoords[ index + 2 ] = vertices.getZ( index2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.addAttribute( 'position', new BufferAttribute( coords, 3 ) );\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tvar vertices = geometry.attributes.position.array;\n\t\t\t\tvar numEdges = vertices.length / 3;\n\t\t\t\tvar numTris = numEdges / 3;\n\n\t\t\t\tvar coords = new Float32Array( numEdges * 2 * 3 );\n\n\t\t\t\tfor ( var i = 0, l = numTris; i < l; i ++ ) {\n\n\t\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\tvar index = 18 * i + 6 * j;\n\n\t\t\t\t\t\tvar index1 = 9 * i + 3 * j;\n\t\t\t\t\t\tcoords[ index + 0 ] = vertices[ index1 ];\n\t\t\t\t\t\tcoords[ index + 1 ] = vertices[ index1 + 1 ];\n\t\t\t\t\t\tcoords[ index + 2 ] = vertices[ index1 + 2 ];\n\n\t\t\t\t\t\tvar index2 = 9 * i + 3 * ( ( j + 1 ) % 3 );\n\t\t\t\t\t\tcoords[ index + 3 ] = vertices[ index2 ];\n\t\t\t\t\t\tcoords[ index + 4 ] = vertices[ index2 + 1 ];\n\t\t\t\t\t\tcoords[ index + 5 ] = vertices[ index2 + 2 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.addAttribute( 'position', new BufferAttribute( coords, 3 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tWireframeGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tWireframeGeometry.prototype.constructor = WireframeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricBufferGeometry( func, slices, stacks ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ParametricBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\t// generate vertices and uvs\n\n\t\tvar vertices = [];\n\t\tvar uvs = [];\n\n\t\tvar i, j, p;\n\t\tvar u, v;\n\n\t\tvar sliceCount = slices + 1;\n\n\t\tfor ( i = 0; i <= stacks; i ++ ) {\n\n\t\t\tv = i / stacks;\n\n\t\t\tfor ( j = 0; j <= slices; j ++ ) {\n\n\t\t\t\tu = j / slices;\n\n\t\t\t\tp = func( u, v );\n\t\t\t\tvertices.push( p.x, p.y, p.z );\n\n\t\t\t\tuvs.push( u, v );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tvar indices = [];\n\t\tvar a, b, c, d;\n\n\t\tfor ( i = 0; i < stacks; i ++ ) {\n\n\t\t\tfor ( j = 0; j < slices; j ++ ) {\n\n\t\t\t\ta = i * sliceCount + j;\n\t\t\t\tb = i * sliceCount + j + 1;\n\t\t\t\tc = ( i + 1 ) * sliceCount + j + 1;\n\t\t\t\td = ( i + 1 ) * sliceCount + j;\n\n\t\t\t\t// faces one and two\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.length > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) );\n\t\tthis.addAttribute( 'position', Float32Attribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'uv', Float32Attribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t}\n\n\tParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;\n\n\t/**\n\t * @author zz85 / https://github.com/zz85\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricGeometry( func, slices, stacks ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ParametricGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tParametricGeometry.prototype = Object.create( Geometry.prototype );\n\tParametricGeometry.prototype.constructor = ParametricGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction PolyhedronBufferGeometry( vertices, indices, radius, detail ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronBufferGeometry';\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\tradius = radius || 1;\n\t\tdetail = detail || 0;\n\n\t\t// default buffer data\n\n\t\tvar vertexBuffer = [];\n\t\tvar 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\tappplyRadius( 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.addAttribute( 'position', Float32Attribute( vertexBuffer, 3 ) );\n\t\tthis.addAttribute( 'normal', Float32Attribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.addAttribute( 'uv', Float32Attribute( uvBuffer, 2 ) );\n\t\tthis.normalizeNormals();\n\n\t\tthis.boundingSphere = new Sphere( new Vector3(), radius );\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\t\tfor ( var 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\tvar cols = Math.pow( 2, detail );\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tvar v = [];\n\n\t\t\tvar i, j;\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( i = 0 ; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tvar aj = a.clone().lerp( c, i / cols );\n\t\t\t\tvar bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tvar rows = cols - i;\n\n\t\t\t\tfor ( 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 ( i = 0; i < cols ; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tvar 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 appplyRadius( radius ) {\n\n\t\t\tvar 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 ( var 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\tvar vertex = new Vector3();\n\n\t\t\tfor ( var 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\tvar u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tvar 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 ( var i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tvar x0 = uvBuffer[ i + 0 ];\n\t\t\t\tvar x1 = uvBuffer[ i + 2 ];\n\t\t\t\tvar x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tvar max = Math.max( x0, x1, x2 );\n\t\t\t\tvar 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\tvar 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\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\tvar centroid = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tfor ( var 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\tvar 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\tPolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TetrahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tTetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tTetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction TetrahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTetrahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tTetrahedronGeometry.prototype.constructor = TetrahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction OctahedronBufferGeometry( radius,detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tOctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tOctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction OctahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tOctahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tOctahedronGeometry.prototype.constructor = OctahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction IcosahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tvar vertices = [\n\t\t\t- 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0,\n\t\t\t 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t,\n\t\t\t t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11,\n\t\t\t 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8,\n\t\t\t 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9,\n\t\t\t 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tIcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tIcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction IcosahedronGeometry( radius, detail ) {\n\n\t \tGeometry.call( this );\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\tthis.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tIcosahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tIcosahedronGeometry.prototype.constructor = IcosahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction DodecahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tvar r = 1 / t;\n\n\t\tvar vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1, - 1, - 1, 1,\n\t\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t\t 1, - 1, - 1, 1, - 1, 1,\n\t\t\t 1, 1, - 1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t 0, - r, - t, 0, - r, t,\n\t\t\t 0, 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\t r, - 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\tvar indices = [\n\t\t\t 3, 11, 7, 3, 7, 15, 3, 15, 13,\n\t\t\t 7, 19, 17, 7, 17, 6, 7, 6, 15,\n\t\t\t17, 4, 8, 17, 8, 10, 17, 10, 6,\n\t\t\t 8, 0, 16, 8, 16, 2, 8, 2, 10,\n\t\t\t 0, 12, 1, 0, 1, 18, 0, 18, 16,\n\t\t\t 6, 10, 2, 6, 2, 13, 6, 13, 15,\n\t\t\t 2, 16, 18, 2, 18, 3, 2, 3, 13,\n\t\t\t18, 1, 9, 18, 9, 11, 18, 11, 3,\n\t\t\t 4, 14, 12, 4, 12, 0, 4, 0, 8,\n\t\t\t11, 9, 5, 11, 5, 19, 11, 19, 7,\n\t\t\t19, 5, 14, 19, 14, 4, 19, 4, 17,\n\t\t\t 1, 12, 14, 1, 14, 5, 1, 5, 9\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tDodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tDodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;\n\n\t/**\n\t * @author Abe Pazos / https://hamoid.com\n\t */\n\n\tfunction DodecahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tDodecahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tDodecahedronGeometry.prototype.constructor = DodecahedronGeometry;\n\n\t/**\n\t * @author clockworkgeek / https://github.com/clockworkgeek\n\t * @author timothypratley / https://github.com/timothypratley\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction PolyhedronGeometry( vertices, indices, radius, detail ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tPolyhedronGeometry.prototype = Object.create( Geometry.prototype );\n\tPolyhedronGeometry.prototype.constructor = PolyhedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Creates a tube which extrudes along a 3d spline.\n\t *\n\t */\n\n\tfunction TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TubeBufferGeometry';\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\ttubularSegments = tubularSegments || 64;\n\t\tradius = radius || 1;\n\t\tradialSegments = radialSegments || 8;\n\t\tclosed = closed || false;\n\n\t\tvar 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\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar i, j;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\t\tvar indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( ( indices.length > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) );\n\t\tthis.addAttribute( 'position', Float32Attribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', Float32Attribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', Float32Attribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( 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\tvar P = path.getPointAt( i / tubularSegments );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tvar N = frames.normals[ i ];\n\t\t\tvar B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tvar sin = Math.sin( v );\n\t\t\t\tvar 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 ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tvar 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 ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( 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\tTubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTubeBufferGeometry.prototype.constructor = TubeBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode / https://github.com/oosmoxiecode\n\t * @author WestLangley / https://github.com/WestLangley\n\t * @author zz85 / https://github.com/zz85\n\t * @author miningold / https://github.com/miningold\n\t * @author jonobr1 / https://github.com/jonobr1\n\t *\n\t * Creates a tube which extrudes along a 3d spline.\n\t */\n\n\tfunction TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) {\n\n\t\tGeometry.call( this );\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\tif ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );\n\n\t\tvar bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = bufferGeometry.tangents;\n\t\tthis.normals = bufferGeometry.normals;\n\t\tthis.binormals = bufferGeometry.binormals;\n\n\t\t// create geometry\n\n\t\tthis.fromBufferGeometry( bufferGeometry );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTubeGeometry.prototype = Object.create( Geometry.prototype );\n\tTubeGeometry.prototype.constructor = TubeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * see: http://www.blackpawn.com/texts/pqtorus/\n\t */\n\tfunction TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotBufferGeometry';\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\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 64;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\tp = p || 2;\n\t\tq = q || 3;\n\n\t\t// used to calculate buffer length\n\t\tvar vertexCount = ( ( radialSegments + 1 ) * ( tubularSegments + 1 ) );\n\t\tvar indexCount = radialSegments * tubularSegments * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// helper variables\n\t\tvar i, j, index = 0, indexOffset = 0;\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar P1 = new Vector3();\n\t\tvar P2 = new Vector3();\n\n\t\tvar B = new Vector3();\n\t\tvar T = new Vector3();\n\t\tvar N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( 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 segement\n\n\t\t\tvar 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 ( 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\tvar v = j / radialSegments * Math.PI * 2;\n\t\t\t\tvar cx = - tube * Math.cos( v );\n\t\t\t\tvar 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 vectos, 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\t// vertex\n\t\t\t\tvertices.setXYZ( index, 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\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\t\t\t\tnormals.setXYZ( index, normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\tuv.y = j / radialSegments;\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// face one\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t\t// face two\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\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\tvar cu = Math.cos( u );\n\t\t\tvar su = Math.sin( u );\n\t\t\tvar quOverP = q / p * u;\n\t\t\tvar 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\tTorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t */\n\n\tfunction TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {\n\n\t\tGeometry.call( this );\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\tif( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );\n\n\t\tthis.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTorusKnotGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusKnotGeometry.prototype.constructor = TorusKnotGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusBufferGeometry';\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\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 6;\n\t\tarc = arc || Math.PI * 2;\n\n\t\t// used to calculate buffer length\n\t\tvar vertexCount = ( ( radialSegments + 1 ) * ( tubularSegments + 1 ) );\n\t\tvar indexCount = radialSegments * tubularSegments * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount );\n\t\tvar vertices = new Float32Array( vertexCount * 3 );\n\t\tvar normals = new Float32Array( vertexCount * 3 );\n\t\tvar uvs = new Float32Array( vertexCount * 2 );\n\n\t\t// offset variables\n\t\tvar vertexBufferOffset = 0;\n\t\tvar uvBufferOffset = 0;\n\t\tvar indexBufferOffset = 0;\n\n\t\t// helper variables\n\t\tvar center = new Vector3();\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tvar u = i / tubularSegments * arc;\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\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[ vertexBufferOffset ] = vertex.x;\n\t\t\t\tvertices[ vertexBufferOffset + 1 ] = vertex.y;\n\t\t\t\tvertices[ vertexBufferOffset + 2 ] = vertex.z;\n\n\t\t\t\t// this vector is used to calculate the normal\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\n\t\t\t\t// normal\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals[ vertexBufferOffset ] = normal.x;\n\t\t\t\tnormals[ vertexBufferOffset + 1 ] = normal.y;\n\t\t\t\tnormals[ vertexBufferOffset + 2 ] = normal.z;\n\n\t\t\t\t// uv\n\t\t\t\tuvs[ uvBufferOffset ] = i / tubularSegments;\n\t\t\t\tuvs[ uvBufferOffset + 1 ] = j / radialSegments;\n\n\t\t\t\t// update offsets\n\t\t\t\tvertexBufferOffset += 3;\n\t\t\t\tuvBufferOffset += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\t\t\t\tvar a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tvar b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tvar c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tvar d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// face one\n\t\t\t\tindices[ indexBufferOffset ] = a;\n\t\t\t\tindices[ indexBufferOffset + 1 ] = b;\n\t\t\t\tindices[ indexBufferOffset + 2 ] = d;\n\n\t\t\t\t// face two\n\t\t\t\tindices[ indexBufferOffset + 3 ] = b;\n\t\t\t\tindices[ indexBufferOffset + 4 ] = c;\n\t\t\t\tindices[ indexBufferOffset + 5 ] = d;\n\n\t\t\t\t// update offset\n\t\t\t\tindexBufferOffset += 6;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\t\tthis.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tTorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusBufferGeometry.prototype.constructor = TorusBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888\n\t */\n\n\tfunction TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );\n\n\t}\n\n\tTorusGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusGeometry.prototype.constructor = TorusGeometry;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tvar ShapeUtils = {\n\n\t\t// calculate area of the contour polygon\n\n\t\tarea: function ( contour ) {\n\n\t\t\tvar n = contour.length;\n\t\t\tvar a = 0.0;\n\n\t\t\tfor ( var p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t\t}\n\n\t\t\treturn a * 0.5;\n\n\t\t},\n\n\t\ttriangulate: ( function () {\n\n\t\t\t/**\n\t\t\t * This code is a quick port of code written in C++ which was submitted to\n\t\t\t * flipcode.com by John W. Ratcliff // July 22, 2000\n\t\t\t * See original code and more information here:\n\t\t\t * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml\n\t\t\t *\n\t\t\t * ported to actionscript by Zevan Rosser\n\t\t\t * www.actionsnippet.com\n\t\t\t *\n\t\t\t * ported to javascript by Joshua Koo\n\t\t\t * http://www.lab4games.net/zz85/blog\n\t\t\t *\n\t\t\t */\n\n\t\t\tfunction snip( contour, u, v, w, n, verts ) {\n\n\t\t\t\tvar p;\n\t\t\t\tvar ax, ay, bx, by;\n\t\t\t\tvar cx, cy, px, py;\n\n\t\t\t\tax = contour[ verts[ u ] ].x;\n\t\t\t\tay = contour[ verts[ u ] ].y;\n\n\t\t\t\tbx = contour[ verts[ v ] ].x;\n\t\t\t\tby = contour[ verts[ v ] ].y;\n\n\t\t\t\tcx = contour[ verts[ w ] ].x;\n\t\t\t\tcy = contour[ verts[ w ] ].y;\n\n\t\t\t\tif ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false;\n\n\t\t\t\tvar aX, aY, bX, bY, cX, cY;\n\t\t\t\tvar apx, apy, bpx, bpy, cpx, cpy;\n\t\t\t\tvar cCROSSap, bCROSScp, aCROSSbp;\n\n\t\t\t\taX = cx - bx; aY = cy - by;\n\t\t\t\tbX = ax - cx; bY = ay - cy;\n\t\t\t\tcX = bx - ax; cY = by - ay;\n\n\t\t\t\tfor ( p = 0; p < n; p ++ ) {\n\n\t\t\t\t\tpx = contour[ verts[ p ] ].x;\n\t\t\t\t\tpy = contour[ verts[ p ] ].y;\n\n\t\t\t\t\tif ( ( ( px === ax ) && ( py === ay ) ) ||\n\t\t\t\t\t\t ( ( px === bx ) && ( py === by ) ) ||\n\t\t\t\t\t\t ( ( px === cx ) && ( py === cy ) ) )\tcontinue;\n\n\t\t\t\t\tapx = px - ax; apy = py - ay;\n\t\t\t\t\tbpx = px - bx; bpy = py - by;\n\t\t\t\t\tcpx = px - cx; cpy = py - cy;\n\n\t\t\t\t\t// see if p is inside triangle abc\n\n\t\t\t\t\taCROSSbp = aX * bpy - aY * bpx;\n\t\t\t\t\tcCROSSap = cX * apy - cY * apx;\n\t\t\t\t\tbCROSScp = bX * cpy - bY * cpx;\n\n\t\t\t\t\tif ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false;\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// takes in an contour array and returns\n\n\t\t\treturn function triangulate( contour, indices ) {\n\n\t\t\t\tvar n = contour.length;\n\n\t\t\t\tif ( n < 3 ) return null;\n\n\t\t\t\tvar result = [],\n\t\t\t\t\tverts = [],\n\t\t\t\t\tvertIndices = [];\n\n\t\t\t\t/* we want a counter-clockwise polygon in verts */\n\n\t\t\t\tvar u, v, w;\n\n\t\t\t\tif ( ShapeUtils.area( contour ) > 0.0 ) {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = v;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v;\n\n\t\t\t\t}\n\n\t\t\t\tvar nv = n;\n\n\t\t\t\t/* remove nv - 2 vertices, creating 1 triangle every time */\n\n\t\t\t\tvar count = 2 * nv; /* error detection */\n\n\t\t\t\tfor ( v = nv - 1; nv > 2; ) {\n\n\t\t\t\t\t/* if we loop, it is probably a non-simple polygon */\n\n\t\t\t\t\tif ( ( count -- ) <= 0 ) {\n\n\t\t\t\t\t\t//** Triangulate: ERROR - probable bad polygon!\n\n\t\t\t\t\t\t//throw ( \"Warning, unable to triangulate polygon!\" );\n\t\t\t\t\t\t//return null;\n\t\t\t\t\t\t// Sometimes warning is fine, especially polygons are triangulated in reverse.\n\t\t\t\t\t\tconsole.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' );\n\n\t\t\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t/* three consecutive vertices in current polygon, */\n\n\t\t\t\t\tu = v; \t \tif ( nv <= u ) u = 0; /* previous */\n\t\t\t\t\tv = u + 1; if ( nv <= v ) v = 0; /* new v */\n\t\t\t\t\tw = v + 1; if ( nv <= w ) w = 0; /* next */\n\n\t\t\t\t\tif ( snip( contour, u, v, w, nv, verts ) ) {\n\n\t\t\t\t\t\tvar a, b, c, s, t;\n\n\t\t\t\t\t\t/* true names of the vertices */\n\n\t\t\t\t\t\ta = verts[ u ];\n\t\t\t\t\t\tb = verts[ v ];\n\t\t\t\t\t\tc = verts[ w ];\n\n\t\t\t\t\t\t/* output Triangle */\n\n\t\t\t\t\t\tresult.push( [ contour[ a ],\n\t\t\t\t\t\t\tcontour[ b ],\n\t\t\t\t\t\t\tcontour[ c ] ] );\n\n\n\t\t\t\t\t\tvertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] );\n\n\t\t\t\t\t\t/* remove v from the remaining polygon */\n\n\t\t\t\t\t\tfor ( s = v, t = v + 1; t < nv; s ++, t ++ ) {\n\n\t\t\t\t\t\t\tverts[ s ] = verts[ t ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnv --;\n\n\t\t\t\t\t\t/* reset error detection counter */\n\n\t\t\t\t\t\tcount = 2 * nv;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\treturn result;\n\n\t\t\t}\n\n\t\t} )(),\n\n\t\ttriangulateShape: function ( contour, holes ) {\n\n\t\t\tfunction removeDupEndPts(points) {\n\n\t\t\t\tvar l = points.length;\n\n\t\t\t\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\t\tpoints.pop();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tremoveDupEndPts( contour );\n\t\t\tholes.forEach( removeDupEndPts );\n\n\t\t\tfunction point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) {\n\n\t\t\t\t// inOtherPt needs to be collinear to the inSegment\n\t\t\t\tif ( inSegPt1.x !== inSegPt2.x ) {\n\n\t\t\t\t\tif ( inSegPt1.x < inSegPt2.x ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( inSegPt1.y < inSegPt2.y ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) {\n\n\t\t\t\tvar seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y;\n\t\t\t\tvar seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y;\n\n\t\t\t\tvar seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x;\n\t\t\t\tvar seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y;\n\n\t\t\t\tvar limit\t\t= seg1dy * seg2dx - seg1dx * seg2dy;\n\t\t\t\tvar perpSeg1\t= seg1dy * seg1seg2dx - seg1dx * seg1seg2dy;\n\n\t\t\t\tif ( Math.abs( limit ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\n\t\t\t\t\tvar perpSeg2;\n\t\t\t\t\tif ( limit > 0 ) {\n\n\t\t\t\t\t\tif ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) \t\treturn [];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) \t\treturn [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// i.e. to reduce rounding errors\n\t\t\t\t\t// intersection at endpoint of segment#1?\n\t\t\t\t\tif ( perpSeg2 === 0 ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( perpSeg2 === limit ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt2 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// intersection at endpoint of segment#2?\n\t\t\t\t\tif ( perpSeg1 === 0 )\t\treturn [ inSeg2Pt1 ];\n\t\t\t\t\tif ( perpSeg1 === limit )\treturn [ inSeg2Pt2 ];\n\n\t\t\t\t\t// return real intersection point\n\t\t\t\t\tvar factorSeg1 = perpSeg2 / limit;\n\t\t\t\t\treturn\t[ { x: inSeg1Pt1.x + factorSeg1 * seg1dx,\n\t\t\t\t\t\t\t\ty: inSeg1Pt1.y + factorSeg1 * seg1dy } ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( ( perpSeg1 !== 0 ) ||\n\t\t\t\t\t\t ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) \t\t\treturn [];\n\n\t\t\t\t\t// they are collinear or degenerate\n\t\t\t\t\tvar seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) );\t// segment1 is just a point?\n\t\t\t\t\tvar seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) );\t// segment2 is just a point?\n\t\t\t\t\t// both segments are points\n\t\t\t\t\tif ( seg1Pt && seg2Pt ) {\n\n\t\t\t\t\t\tif ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) ||\n\t\t\t\t\t\t\t ( inSeg1Pt1.y !== inSeg2Pt1.y ) )\t\treturn [];\t// they are distinct points\n\t\t\t\t\t\treturn [ inSeg1Pt1 ]; \t\t\t\t\t\t// they are the same point\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#1 is a single point\n\t\t\t\t\tif ( seg1Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) )\t\treturn [];\t\t// but not in segment#2\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#2 is a single point\n\t\t\t\t\tif ( seg2Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) )\t\treturn [];\t\t// but not in segment#1\n\t\t\t\t\t\treturn [ inSeg2Pt1 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// they are collinear segments, which might overlap\n\t\t\t\t\tvar seg1min, seg1max, seg1minVal, seg1maxVal;\n\t\t\t\t\tvar seg2min, seg2max, seg2minVal, seg2maxVal;\n\t\t\t\t\tif ( seg1dx !== 0 ) {\n\n\t\t\t\t\t\t// the segments are NOT on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.x < inSeg1Pt2.x ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.x < inSeg2Pt2.x ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// the segments are on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.y < inSeg1Pt2.y ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.y < inSeg2Pt2.y ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( seg1minVal <= seg2minVal ) {\n\n\t\t\t\t\t\tif ( seg1maxVal < seg2minVal )\treturn [];\n\t\t\t\t\t\tif ( seg1maxVal === seg2minVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg2min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg2min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg2min, seg2max ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( seg1minVal > seg2maxVal )\treturn [];\n\t\t\t\t\t\tif ( seg1minVal === seg2maxVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg1min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg1min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg1min, seg2max ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) {\n\n\t\t\t\t// The order of legs is important\n\n\t\t\t\t// translation of all points, so that Vertex is at (0,0)\n\t\t\t\tvar legFromPtX\t= inLegFromPt.x - inVertex.x, legFromPtY\t= inLegFromPt.y - inVertex.y;\n\t\t\t\tvar legToPtX\t= inLegToPt.x\t- inVertex.x, legToPtY\t\t= inLegToPt.y\t- inVertex.y;\n\t\t\t\tvar otherPtX\t= inOtherPt.x\t- inVertex.x, otherPtY\t\t= inOtherPt.y\t- inVertex.y;\n\n\t\t\t\t// main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg.\n\t\t\t\tvar from2toAngle\t= legFromPtX * legToPtY - legFromPtY * legToPtX;\n\t\t\t\tvar from2otherAngle\t= legFromPtX * otherPtY - legFromPtY * otherPtX;\n\n\t\t\t\tif ( Math.abs( from2toAngle ) > Number.EPSILON ) {\n\n\t\t\t\t\t// angle != 180 deg.\n\n\t\t\t\t\tvar other2toAngle\t\t= otherPtX * legToPtY - otherPtY * legToPtX;\n\t\t\t\t\t// console.log( \"from2to: \" + from2toAngle + \", from2other: \" + from2otherAngle + \", other2to: \" + other2toAngle );\n\n\t\t\t\t\tif ( from2toAngle > 0 ) {\n\n\t\t\t\t\t\t// main angle < 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// main angle > 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// angle == 180 deg.\n\t\t\t\t\t// console.log( \"from2to: 180 deg., from2other: \" + from2otherAngle );\n\t\t\t\t\treturn\t( from2otherAngle > 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tfunction removeHoles( contour, holes ) {\n\n\t\t\t\tvar shape = contour.concat(); // work on this shape\n\t\t\t\tvar hole;\n\n\t\t\t\tfunction isCutLineInsideAngles( inShapeIdx, inHoleIdx ) {\n\n\t\t\t\t\t// Check if hole point lies within angle around shape point\n\t\t\t\t\tvar lastShapeIdx = shape.length - 1;\n\n\t\t\t\t\tvar prevShapeIdx = inShapeIdx - 1;\n\t\t\t\t\tif ( prevShapeIdx < 0 )\t\t\tprevShapeIdx = lastShapeIdx;\n\n\t\t\t\t\tvar nextShapeIdx = inShapeIdx + 1;\n\t\t\t\t\tif ( nextShapeIdx > lastShapeIdx )\tnextShapeIdx = 0;\n\n\t\t\t\t\tvar insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Shape): \" + inShapeIdx + \", Point: \" + hole[inHoleIdx].x + \"/\" + hole[inHoleIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check if shape point lies within angle around hole point\n\t\t\t\t\tvar lastHoleIdx = hole.length - 1;\n\n\t\t\t\t\tvar prevHoleIdx = inHoleIdx - 1;\n\t\t\t\t\tif ( prevHoleIdx < 0 )\t\t\tprevHoleIdx = lastHoleIdx;\n\n\t\t\t\t\tvar nextHoleIdx = inHoleIdx + 1;\n\t\t\t\t\tif ( nextHoleIdx > lastHoleIdx )\tnextHoleIdx = 0;\n\n\t\t\t\t\tinsideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Hole): \" + inHoleIdx + \", Point: \" + shape[inShapeIdx].x + \"/\" + shape[inShapeIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\ttrue;\n\n\t\t\t\t}\n\n\t\t\t\tfunction intersectsShapeEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with shape edges\n\t\t\t\t\tvar sIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( sIdx = 0; sIdx < shape.length; sIdx ++ ) {\n\n\t\t\t\t\t\tnextIdx = sIdx + 1; nextIdx %= shape.length;\n\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true );\n\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar indepHoles = [];\n\n\t\t\t\tfunction intersectsHoleEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with hole edges\n\t\t\t\t\tvar ihIdx, chkHole,\n\t\t\t\t\t\thIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) {\n\n\t\t\t\t\t\tchkHole = holes[ indepHoles[ ihIdx ]];\n\t\t\t\t\t\tfor ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) {\n\n\t\t\t\t\t\t\tnextIdx = hIdx + 1; nextIdx %= chkHole.length;\n\t\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true );\n\t\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar holeIndex, shapeIndex,\n\t\t\t\t\tshapePt, holePt,\n\t\t\t\t\tholeIdx, cutKey, failedCuts = [],\n\t\t\t\t\ttmpShape1, tmpShape2,\n\t\t\t\t\ttmpHole1, tmpHole2;\n\n\t\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tindepHoles.push( h );\n\n\t\t\t\t}\n\n\t\t\t\tvar minShapeIndex = 0;\n\t\t\t\tvar counter = indepHoles.length * 2;\n\t\t\t\twhile ( indepHoles.length > 0 ) {\n\n\t\t\t\t\tcounter --;\n\t\t\t\t\tif ( counter < 0 ) {\n\n\t\t\t\t\t\tconsole.log( \"Infinite Loop! Holes left:\" + indepHoles.length + \", Probably Hole outside Shape!\" );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// search for shape-vertex and hole-vertex,\n\t\t\t\t\t// which can be connected without intersections\n\t\t\t\t\tfor ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) {\n\n\t\t\t\t\t\tshapePt = shape[ shapeIndex ];\n\t\t\t\t\t\tholeIndex\t= - 1;\n\n\t\t\t\t\t\t// search for hole which can be reached without intersections\n\t\t\t\t\t\tfor ( var h = 0; h < indepHoles.length; h ++ ) {\n\n\t\t\t\t\t\t\tholeIdx = indepHoles[ h ];\n\n\t\t\t\t\t\t\t// prevent multiple checks\n\t\t\t\t\t\t\tcutKey = shapePt.x + \":\" + shapePt.y + \":\" + holeIdx;\n\t\t\t\t\t\t\tif ( failedCuts[ cutKey ] !== undefined )\t\t\tcontinue;\n\n\t\t\t\t\t\t\thole = holes[ holeIdx ];\n\t\t\t\t\t\t\tfor ( var h2 = 0; h2 < hole.length; h2 ++ ) {\n\n\t\t\t\t\t\t\t\tholePt = hole[ h2 ];\n\t\t\t\t\t\t\t\tif ( ! isCutLineInsideAngles( shapeIndex, h2 ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsShapeEdge( shapePt, holePt ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsHoleEdge( shapePt, holePt ) )\t\tcontinue;\n\n\t\t\t\t\t\t\t\tholeIndex = h2;\n\t\t\t\t\t\t\t\tindepHoles.splice( h, 1 );\n\n\t\t\t\t\t\t\t\ttmpShape1 = shape.slice( 0, shapeIndex + 1 );\n\t\t\t\t\t\t\t\ttmpShape2 = shape.slice( shapeIndex );\n\t\t\t\t\t\t\t\ttmpHole1 = hole.slice( holeIndex );\n\t\t\t\t\t\t\t\ttmpHole2 = hole.slice( 0, holeIndex + 1 );\n\n\t\t\t\t\t\t\t\tshape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 );\n\n\t\t\t\t\t\t\t\tminShapeIndex = shapeIndex;\n\n\t\t\t\t\t\t\t\t// Debug only, to show the selected cuts\n\t\t\t\t\t\t\t\t// glob_CutLines.push( [ shapePt, holePt ] );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t\t\tfailedCuts[ cutKey ] = true;\t\t\t// remember failure\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn shape; \t\t\t/* shape with no holes */\n\n\t\t\t}\n\n\n\t\t\tvar i, il, f, face,\n\t\t\t\tkey, index,\n\t\t\t\tallPointsMap = {};\n\n\t\t\t// To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first.\n\n\t\t\tvar allpoints = contour.concat();\n\n\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( allpoints, holes[ h ] );\n\n\t\t\t}\n\n\t\t\t//console.log( \"allpoints\",allpoints, allpoints.length );\n\n\t\t\t// prepare all points map\n\n\t\t\tfor ( i = 0, il = allpoints.length; i < il; i ++ ) {\n\n\t\t\t\tkey = allpoints[ i ].x + \":\" + allpoints[ i ].y;\n\n\t\t\t\tif ( allPointsMap[ key ] !== undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.ShapeUtils: Duplicate point\", key, i );\n\n\t\t\t\t}\n\n\t\t\t\tallPointsMap[ key ] = i;\n\n\t\t\t}\n\n\t\t\t// remove holes by cutting paths to holes and adding them to the shape\n\t\t\tvar shapeWithoutHoles = removeHoles( contour, holes );\n\n\t\t\tvar triangles = ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape\n\t\t\t//console.log( \"triangles\",triangles, triangles.length );\n\n\t\t\t// check all face vertices against all points map\n\n\t\t\tfor ( i = 0, il = triangles.length; i < il; i ++ ) {\n\n\t\t\t\tface = triangles[ i ];\n\n\t\t\t\tfor ( f = 0; f < 3; f ++ ) {\n\n\t\t\t\t\tkey = face[ f ].x + \":\" + face[ f ].y;\n\n\t\t\t\t\tindex = allPointsMap[ key ];\n\n\t\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\t\tface[ f ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn triangles.concat();\n\n\t\t},\n\n\t\tisClockWise: function ( pts ) {\n\n\t\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t\t},\n\n\t\t// Bezier Curves formulas obtained from\n\t\t// http://en.wikipedia.org/wiki/B%C3%A9zier_curve\n\n\t\t// Quad Bezier Functions\n\n\t\tb2: ( function () {\n\n\t\t\tfunction b2p0( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn k * k * p;\n\n\t\t\t}\n\n\t\t\tfunction b2p1( t, p ) {\n\n\t\t\t\treturn 2 * ( 1 - t ) * t * p;\n\n\t\t\t}\n\n\t\t\tfunction b2p2( t, p ) {\n\n\t\t\t\treturn t * t * p;\n\n\t\t\t}\n\n\t\t\treturn function b2( t, p0, p1, p2 ) {\n\n\t\t\t\treturn b2p0( t, p0 ) + b2p1( t, p1 ) + b2p2( t, p2 );\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\t// Cubic Bezier Functions\n\n\t\tb3: ( function () {\n\n\t\t\tfunction b3p0( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn k * k * k * p;\n\n\t\t\t}\n\n\t\t\tfunction b3p1( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn 3 * k * k * t * p;\n\n\t\t\t}\n\n\t\t\tfunction b3p2( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn 3 * k * t * t * p;\n\n\t\t\t}\n\n\t\t\tfunction b3p3( t, p ) {\n\n\t\t\t\treturn t * t * t * p;\n\n\t\t\t}\n\n\t\t\treturn function b3( t, p0, p1, p2, p3 ) {\n\n\t\t\t\treturn b3p0( t, p0 ) + b3p1( t, p1 ) + b3p2( t, p2 ) + b3p3( t, p3 );\n\n\t\t\t};\n\n\t\t} )()\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Creates extruded geometry from a path shape.\n\t *\n\t * parameters = {\n\t *\n\t * curveSegments: , // number of points on the curves\n\t * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n\t * amount: , // Depth to extrude the shape\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into the original shape bevel goes\n\t * bevelSize: , // how far from shape outline is bevel\n\t * bevelSegments: , // number of bevel layers\n\t *\n\t * extrudePath: // 3d spline path to extrude shape along. (creates Frames if .frames aren't defined)\n\t * frames: // containing arrays of tangents, normals, binormals\n\t *\n\t * uvGenerator: // object that provides UV generator functions\n\t *\n\t * }\n\t **/\n\n\tfunction ExtrudeGeometry( shapes, options ) {\n\n\t\tif ( typeof( shapes ) === \"undefined\" ) {\n\n\t\t\tshapes = [];\n\t\t\treturn;\n\n\t\t}\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tthis.addShapeList( shapes, options );\n\n\t\tthis.computeFaceNormals();\n\n\t\t// can't really use automatic vertex normals\n\t\t// as then front and back sides get smoothed too\n\t\t// should do separate smoothing just for sides\n\n\t\t//this.computeVertexNormals();\n\n\t\t//console.log( \"took\", ( Date.now() - startTime ) );\n\n\t}\n\n\tExtrudeGeometry.prototype = Object.create( Geometry.prototype );\n\tExtrudeGeometry.prototype.constructor = ExtrudeGeometry;\n\n\tExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) {\n\n\t\tvar sl = shapes.length;\n\n\t\tfor ( var s = 0; s < sl; s ++ ) {\n\n\t\t\tvar shape = shapes[ s ];\n\t\t\tthis.addShape( shape, options );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.prototype.addShape = function ( shape, options ) {\n\n\t\tvar amount = options.amount !== undefined ? options.amount : 100;\n\n\t\tvar bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10\n\t\tvar bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8\n\t\tvar bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\tvar bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false\n\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\n\t\tvar steps = options.steps !== undefined ? options.steps : 1;\n\n\t\tvar extrudePath = options.extrudePath;\n\t\tvar extrudePts, extrudeByPath = false;\n\n\t\t// Use default WorldUVGenerator if no UV generators are specified.\n\t\tvar uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator;\n\n\t\tvar splineTube, binormal, normal, position2;\n\t\tif ( extrudePath ) {\n\n\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\textrudeByPath = true;\n\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t// SETUP TNB variables\n\n\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\tsplineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\tbinormal = new Vector3();\n\t\t\tnormal = new Vector3();\n\t\t\tposition2 = new Vector3();\n\n\t\t}\n\n\t\t// Safeguards if bevels are not enabled\n\n\t\tif ( ! bevelEnabled ) {\n\n\t\t\tbevelSegments = 0;\n\t\t\tbevelThickness = 0;\n\t\t\tbevelSize = 0;\n\n\t\t}\n\n\t\t// Variables initialization\n\n\t\tvar ahole, h, hl; // looping of holes\n\t\tvar scope = this;\n\n\t\tvar shapesOffset = this.vertices.length;\n\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)!\n\n\t\t}\n\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t/* Vertices */\n\n\t\tvar contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\tvertices = vertices.concat( ahole );\n\n\t\t}\n\n\n\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\tif ( ! vec ) console.error( \"THREE.ExtrudeGeometry: vec does not exist\" );\n\n\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t}\n\n\t\tvar b, bs, t, z,\n\t\t\tvert, vlen = vertices.length,\n\t\t\tface, flen = faces.length;\n\n\n\t\t// Find directions for point movement\n\n\n\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t//\n\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\tvar v_trans_x, v_trans_y, shrink_by = 1;\t\t// resulting translation vector for inPt\n\n\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\tvar v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y;\n\t\t\tvar v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y;\n\n\t\t\tvar v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t// check for collinear edges\n\t\t\tvar collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t// not collinear\n\n\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\tvar v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\tvar v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\tvar ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\tvar ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\tvar ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\tvar ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\tvar sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\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// vector from inPt to intersection point\n\n\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t// but prevent crazy spikes\n\t\t\t\tvar v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\treturn\tnew Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\tvar direction_eq = false;\t\t// assumes: opposite\n\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tnew Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t}\n\n\n\t\tvar contourMovements = [];\n\n\t\tfor ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\tif ( j === il ) j = 0;\n\t\t\tif ( k === il ) k = 0;\n\n\t\t\t// (j)---(i)---(k)\n\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t}\n\n\t\tvar holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\toneHoleMovements = [];\n\n\t\t\tfor ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t}\n\n\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t}\n\n\n\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\tfor ( b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tbs = bevelSize;\n\n\t\t// Back facing vertices\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t} else {\n\n\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add stepped vertices...\n\t\t// Including front facing vertices\n\n\t\tvar s;\n\n\t\tfor ( s = 1; s <= steps; s ++ ) {\n\n\t\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, amount / steps * s );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// Add bevel segments planes\n\n\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\tfor ( b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos ( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/* Faces */\n\n\t\t// Top and bottom faces\n\n\t\tbuildLidFaces();\n\n\t\t// Sides faces\n\n\t\tbuildSideFaces();\n\n\n\t\t///// Internal functions\n\n\t\tfunction buildLidFaces() {\n\n\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\tvar layer = 0; // steps + 1\n\t\t\t\tvar offset = vlen * layer;\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Create faces for the z-sides of the shape\n\n\t\tfunction buildSideFaces() {\n\n\t\t\tvar layeroffset = 0;\n\t\t\tsidewalls( contour, layeroffset );\n\t\t\tlayeroffset += contour.length;\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t//, true\n\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\tvar j, k;\n\t\t\ti = contour.length;\n\n\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\tj = i;\n\t\t\t\tk = i - 1;\n\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\tvar s = 0, sl = steps + bevelSegments * 2;\n\n\t\t\t\tfor ( s = 0; s < sl; s ++ ) {\n\n\t\t\t\t\tvar slen1 = vlen * s;\n\t\t\t\t\tvar slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\tvar a = layeroffset + j + slen1,\n\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\tf4( a, b, c, d, contour, s, sl, j, k );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tfunction v( x, y, z ) {\n\n\t\t\tscope.vertices.push( new Vector3( x, y, z ) );\n\n\t\t}\n\n\t\tfunction f3( a, b, c ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, c, null, null, 0 ) );\n\n\t\t\tvar uvs = uvgen.generateTopUV( scope, a, b, c );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( uvs );\n\n\t\t}\n\n\t\tfunction f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\t\t\td += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, d, null, null, 1 ) );\n\t\t\tscope.faces.push( new Face3( b, c, d, null, null, 1 ) );\n\n\t\t\tvar uvs = uvgen.generateSideWallUV( scope, a, b, c, d );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ] );\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ] );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.WorldUVGenerator = {\n\n\t\tgenerateTopUV: function ( geometry, indexA, indexB, indexC ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a.x, a.y ),\n\t\t\t\tnew Vector2( b.x, b.y ),\n\t\t\t\tnew Vector2( c.x, c.y )\n\t\t\t];\n\n\t\t},\n\n\t\tgenerateSideWallUV: function ( geometry, indexA, indexB, indexC, indexD ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\t\t\tvar d = vertices[ indexD ];\n\n\t\t\tif ( Math.abs( a.y - b.y ) < 0.01 ) {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.x, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.x, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.x, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.x, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t} else {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.y, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.y, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.y, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.y, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t}\n\n\t\t}\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * Text = 3D Text\n\t *\n\t * parameters = {\n\t * font: , // font\n\t *\n\t * size: , // size of the text\n\t * height: , // thickness to extrude text\n\t * curveSegments: , // number of points on the curves\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into text bevel goes\n\t * bevelSize: // how far from text outline is bevel\n\t * }\n\t */\n\n\tfunction TextGeometry( text, parameters ) {\n\n\t\tparameters = parameters || {};\n\n\t\tvar font = parameters.font;\n\n\t\tif ( (font && font.isFont) === false ) {\n\n\t\t\tconsole.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );\n\t\t\treturn new Geometry();\n\n\t\t}\n\n\t\tvar shapes = font.generateShapes( text, parameters.size, parameters.curveSegments );\n\n\t\t// translate parameters to ExtrudeGeometry API\n\n\t\tparameters.amount = parameters.height !== undefined ? parameters.height : 50;\n\n\t\t// defaults\n\n\t\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\n\t\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\n\t\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\n\n\t\tExtrudeGeometry.call( this, shapes, parameters );\n\n\t\tthis.type = 'TextGeometry';\n\n\t}\n\n\tTextGeometry.prototype = Object.create( ExtrudeGeometry.prototype );\n\tTextGeometry.prototype.constructor = TextGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * based on THREE.SphereGeometry\n\t */\n\n\tfunction SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'SphereBufferGeometry';\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\tradius = radius || 50;\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );\n\n\t\tphiStart = phiStart !== undefined ? phiStart : 0;\n\t\tphiLength = phiLength !== undefined ? phiLength : Math.PI * 2;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI;\n\n\t\tvar thetaEnd = thetaStart + thetaLength;\n\n\t\tvar vertexCount = ( ( widthSegments + 1 ) * ( heightSegments + 1 ) );\n\n\t\tvar positions = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\tvar index = 0, vertices = [], normal = new Vector3();\n\n\t\tfor ( var y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\tvar verticesRow = [];\n\n\t\t\tvar v = y / heightSegments;\n\n\t\t\tfor ( var x = 0; x <= widthSegments; x ++ ) {\n\n\t\t\t\tvar u = x / widthSegments;\n\n\t\t\t\tvar px = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvar py = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvar pz = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tnormal.set( px, py, pz ).normalize();\n\n\t\t\t\tpositions.setXYZ( index, px, py, pz );\n\t\t\t\tnormals.setXYZ( index, normal.x, normal.y, normal.z );\n\t\t\t\tuvs.setXY( index, u, 1 - v );\n\n\t\t\t\tverticesRow.push( index );\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\tvertices.push( verticesRow );\n\n\t\t}\n\n\t\tvar indices = [];\n\n\t\tfor ( var y = 0; y < heightSegments; y ++ ) {\n\n\t\t\tfor ( var x = 0; x < widthSegments; x ++ ) {\n\n\t\t\t\tvar v1 = vertices[ y ][ x + 1 ];\n\t\t\t\tvar v2 = vertices[ y ][ x ];\n\t\t\t\tvar v3 = vertices[ y + 1 ][ x ];\n\t\t\t\tvar v4 = vertices[ y + 1 ][ x + 1 ];\n\n\t\t\t\tif ( y !== 0 || thetaStart > 0 ) indices.push( v1, v2, v4 );\n\t\t\t\tif ( y !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( v2, v3, v4 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( new ( positions.count > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) );\n\t\tthis.addAttribute( 'position', positions );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t\tthis.boundingSphere = new Sphere( new Vector3(), radius );\n\n\t}\n\n\tSphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tSphereBufferGeometry.prototype.constructor = SphereBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );\n\n\t}\n\n\tSphereGeometry.prototype = Object.create( Geometry.prototype );\n\tSphereGeometry.prototype.constructor = SphereGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'RingBufferGeometry';\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\tinnerRadius = innerRadius || 20;\n\t\touterRadius = outerRadius || 50;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\tthetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;\n\t\tphiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;\n\n\t\t// these are used to calculate buffer length\n\t\tvar vertexCount = ( thetaSegments + 1 ) * ( phiSegments + 1 );\n\t\tvar indexCount = thetaSegments * phiSegments * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// some helper variables\n\t\tvar index = 0, indexOffset = 0, segment;\n\t\tvar radius = innerRadius;\n\t\tvar radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\t// values are generate from the inside of the ring to the outside\n\n\t\tfor ( j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\tsegment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\t\t\t\tvertices.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\t\t\t\tnormals.setXYZ( index, 0, 0, 1 );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex++;\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tvar thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tsegment = i + thetaSegmentLevel;\n\n\t\t\t\t// indices\n\t\t\t\tvar a = segment;\n\t\t\t\tvar b = segment + thetaSegments + 1;\n\t\t\t\tvar c = segment + thetaSegments + 2;\n\t\t\t\tvar d = segment + 1;\n\n\t\t\t\t// face one\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\n\t\t\t\t// face two\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t}\n\n\tRingBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tRingBufferGeometry.prototype.constructor = RingBufferGeometry;\n\n\t/**\n\t * @author Kaleb Murphy\n\t */\n\n\tfunction RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );\n\n\t}\n\n\tRingGeometry.prototype = Object.create( Geometry.prototype );\n\tRingGeometry.prototype.constructor = RingGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );\n\n\t}\n\n\tPlaneGeometry.prototype = Object.create( Geometry.prototype );\n\tPlaneGeometry.prototype.constructor = PlaneGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\t // points - to create a closed torus, one must use a set of points\n\t // like so: [ a, b, c, d, a ], see first is the same as last.\n\t // segments - the number of circumference segments to create\n\t // phiStart - the starting radian\n\t // phiLength - the radian (0 to 2PI) range of the lathed section\n\t // 2PI is a closed lathe, less than 2PI is a portion.\n\n\tfunction LatheBufferGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'LatheBufferGeometry';\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 ) || 12;\n\t\tphiStart = phiStart || 0;\n\t\tphiLength = phiLength || Math.PI * 2;\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\t\tphiLength = _Math.clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// these are used to calculate buffer length\n\t\tvar vertexCount = ( segments + 1 ) * points.length;\n\t\tvar indexCount = segments * points.length * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// helper variables\n\t\tvar index = 0, indexOffset = 0, base;\n\t\tvar inverseSegments = 1.0 / segments;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar i, j;\n\n\t\t// generate vertices and uvs\n\n\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\tvar phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tvar sin = Math.sin( phi );\n\t\t\tvar cos = Math.cos( phi );\n\n\t\t\tfor ( j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\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\t\t\t\tvertices.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tbase = j + i * points.length;\n\n\t\t\t\t// indices\n\t\t\t\tvar a = base;\n\t\t\t\tvar b = base + points.length;\n\t\t\t\tvar c = base + points.length + 1;\n\t\t\t\tvar d = base + 1;\n\n\t\t\t\t// face one\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t\t// face two\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t\t// if the geometry is closed, we need to average the normals along the seam.\n\t\t// because the corresponding vertices are identical (but still have different UVs).\n\n\t\tif( phiLength === Math.PI * 2 ) {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\t\t\tvar n1 = new Vector3();\n\t\t\tvar n2 = new Vector3();\n\t\t\tvar n = new Vector3();\n\n\t\t\t// this is the buffer offset for the last line of vertices\n\t\t\tbase = segments * points.length * 3;\n\n\t\t\tfor( i = 0, j = 0; i < points.length; i ++, j += 3 ) {\n\n\t\t\t\t// select the normal of the vertex in the first line\n\t\t\t\tn1.x = normals[ j + 0 ];\n\t\t\t\tn1.y = normals[ j + 1 ];\n\t\t\t\tn1.z = normals[ j + 2 ];\n\n\t\t\t\t// select the normal of the vertex in the last line\n\t\t\t\tn2.x = normals[ base + j + 0 ];\n\t\t\t\tn2.y = normals[ base + j + 1 ];\n\t\t\t\tn2.z = normals[ base + j + 2 ];\n\n\t\t\t\t// average normals\n\t\t\t\tn.addVectors( n1, n2 ).normalize();\n\n\t\t\t\t// assign the new values to both normals\n\t\t\t\tnormals[ j + 0 ] = normals[ base + j + 0 ] = n.x;\n\t\t\t\tnormals[ j + 1 ] = normals[ base + j + 1 ] = n.y;\n\t\t\t\tnormals[ j + 2 ] = normals[ base + j + 2 ] = n.z;\n\n\t\t\t} // next row\n\n\t\t}\n\n\t}\n\n\tLatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tLatheBufferGeometry.prototype.constructor = LatheBufferGeometry;\n\n\t/**\n\t * @author astrodud / http://astrodud.isgreat.org/\n\t * @author zz85 / https://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t */\n\n\t// points - to create a closed torus, one must use a set of points\n\t// like so: [ a, b, c, d, a ], see first is the same as last.\n\t// segments - the number of circumference segments to create\n\t// phiStart - the starting radian\n\t// phiLength - the radian (0 to 2PI) range of the lathed section\n\t// 2PI is a closed lathe, less than 2PI is a portion.\n\n\tfunction LatheGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tLatheGeometry.prototype = Object.create( Geometry.prototype );\n\tLatheGeometry.prototype.constructor = LatheGeometry;\n\n\t/**\n\t * @author jonobr1 / http://jonobr1.com\n\t *\n\t * Creates a one-sided polygonal geometry from a path shape. Similar to\n\t * ExtrudeGeometry.\n\t *\n\t * parameters = {\n\t *\n\t *\tcurveSegments: , // number of points on the curves. NOT USED AT THE MOMENT.\n\t *\n\t *\tmaterial: // material index for front and back faces\n\t *\tuvGenerator: // object that provides UV generator functions\n\t *\n\t * }\n\t **/\n\n\tfunction ShapeGeometry( shapes, options ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tif ( Array.isArray( shapes ) === false ) shapes = [ shapes ];\n\n\t\tthis.addShapeList( shapes, options );\n\n\t\tthis.computeFaceNormals();\n\n\t}\n\n\tShapeGeometry.prototype = Object.create( Geometry.prototype );\n\tShapeGeometry.prototype.constructor = ShapeGeometry;\n\n\t/**\n\t * Add an array of shapes to THREE.ShapeGeometry.\n\t */\n\tShapeGeometry.prototype.addShapeList = function ( shapes, options ) {\n\n\t\tfor ( var i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tthis.addShape( shapes[ i ], options );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * Adds a shape to THREE.ShapeGeometry, based on THREE.ExtrudeGeometry.\n\t */\n\tShapeGeometry.prototype.addShape = function ( shape, options ) {\n\n\t\tif ( options === undefined ) options = {};\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\n\t\tvar material = options.material;\n\t\tvar uvgen = options.UVGenerator === undefined ? ExtrudeGeometry.WorldUVGenerator : options.UVGenerator;\n\n\t\t//\n\n\t\tvar i, l, hole;\n\n\t\tvar shapesOffset = this.vertices.length;\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe...\n\n\t\t\tfor ( i = 0, l = holes.length; i < l; i ++ ) {\n\n\t\t\t\thole = holes[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( hole ) ) {\n\n\t\t\t\t\tholes[ i ] = hole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treverse = false;\n\n\t\t}\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t// Vertices\n\n\t\tfor ( i = 0, l = holes.length; i < l; i ++ ) {\n\n\t\t\thole = holes[ i ];\n\t\t\tvertices = vertices.concat( hole );\n\n\t\t}\n\n\t\t//\n\n\t\tvar vert, vlen = vertices.length;\n\t\tvar face, flen = faces.length;\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = vertices[ i ];\n\n\t\t\tthis.vertices.push( new Vector3( vert.x, vert.y, 0 ) );\n\n\t\t}\n\n\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\tface = faces[ i ];\n\n\t\t\tvar a = face[ 0 ] + shapesOffset;\n\t\t\tvar b = face[ 1 ] + shapesOffset;\n\t\t\tvar c = face[ 2 ] + shapesOffset;\n\n\t\t\tthis.faces.push( new Face3( a, b, c, null, null, material ) );\n\t\t\tthis.faceVertexUvs[ 0 ].push( uvgen.generateTopUV( this, a, b, c ) );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction EdgesGeometry( geometry, thresholdAngle ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;\n\n\t\tvar thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle );\n\n\t\tvar edge = [ 0, 0 ], hash = {};\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\tvar geometry2;\n\n\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\tgeometry2 = new Geometry();\n\t\t\tgeometry2.fromBufferGeometry( geometry );\n\n\t\t} else {\n\n\t\t\tgeometry2 = geometry.clone();\n\n\t\t}\n\n\t\tgeometry2.mergeVertices();\n\t\tgeometry2.computeFaceNormals();\n\n\t\tvar vertices = geometry2.vertices;\n\t\tvar faces = geometry2.faces;\n\n\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\tvar key = edge.toString();\n\n\t\t\t\tif ( hash[ key ] === undefined ) {\n\n\t\t\t\t\thash[ key ] = { vert1: edge[ 0 ], vert2: edge[ 1 ], face1: i, face2: undefined };\n\n\t\t\t\t} else {\n\n\t\t\t\t\thash[ key ].face2 = i;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar coords = [];\n\n\t\tfor ( var key in hash ) {\n\n\t\t\tvar h = hash[ key ];\n\n\t\t\tif ( h.face2 === undefined || faces[ h.face1 ].normal.dot( faces[ h.face2 ].normal ) <= thresholdDot ) {\n\n\t\t\t\tvar vertex = vertices[ h.vert1 ];\n\t\t\t\tcoords.push( vertex.x );\n\t\t\t\tcoords.push( vertex.y );\n\t\t\t\tcoords.push( vertex.z );\n\n\t\t\t\tvertex = vertices[ h.vert2 ];\n\t\t\t\tcoords.push( vertex.x );\n\t\t\t\tcoords.push( vertex.y );\n\t\t\t\tcoords.push( vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.addAttribute( 'position', new BufferAttribute( new Float32Array( coords ), 3 ) );\n\n\t}\n\n\tEdgesGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tEdgesGeometry.prototype.constructor = EdgesGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CylinderBufferGeometry';\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\tvar scope = this;\n\n\t\tradiusTop = radiusTop !== undefined ? radiusTop : 20;\n\t\tradiusBottom = radiusBottom !== undefined ? radiusBottom : 20;\n\t\theight = height !== undefined ? height : 100;\n\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\n\t\topenEnded = openEnded !== undefined ? openEnded : false;\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0.0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI;\n\n\t\t// used to calculate buffer length\n\n\t\tvar nbCap = 0;\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) nbCap ++;\n\t\t\tif ( radiusBottom > 0 ) nbCap ++;\n\n\t\t}\n\n\t\tvar vertexCount = calculateVertexCount();\n\t\tvar indexCount = calculateIndexCount();\n\n\t\t// buffers\n\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ), 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// helper variables\n\n\t\tvar index = 0,\n\t\t indexOffset = 0,\n\t\t indexArray = [],\n\t\t halfHeight = height / 2;\n\n\t\t// group variables\n\t\tvar 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.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t\t// helper functions\n\n\t\tfunction calculateVertexCount() {\n\n\t\t\tvar count = ( radialSegments + 1 ) * ( heightSegments + 1 );\n\n\t\t\tif ( openEnded === false ) {\n\n\t\t\t\tcount += ( ( radialSegments + 1 ) * nbCap ) + ( radialSegments * nbCap );\n\n\t\t\t}\n\n\t\t\treturn count;\n\n\t\t}\n\n\t\tfunction calculateIndexCount() {\n\n\t\t\tvar count = radialSegments * heightSegments * 2 * 3;\n\n\t\t\tif ( openEnded === false ) {\n\n\t\t\t\tcount += radialSegments * nbCap * 3;\n\n\t\t\t}\n\n\t\t\treturn count;\n\n\t\t}\n\n\t\tfunction generateTorso() {\n\n\t\t\tvar x, y;\n\t\t\tvar normal = new Vector3();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tvar slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tvar indexRow = [];\n\n\t\t\t\tvar v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\t\t\t\tvar radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tvar u = x / radialSegments;\n\n\t\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tvar sinTheta = Math.sin( theta );\n\t\t\t\t\tvar cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\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.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.setXYZ( index, normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\t\t\t\t\tuvs.setXY( index, u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\t\t\t\t\tindexRow.push( index );\n\n\t\t\t\t\t// increase index\n\t\t\t\t\tindex ++;\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\t\t\t\t\tvar i1 = indexArray[ y ][ x ];\n\t\t\t\t\tvar i2 = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tvar i3 = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tvar i4 = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// face one\n\t\t\t\t\tindices.setX( indexOffset, i1 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i2 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i4 ); indexOffset ++;\n\n\t\t\t\t\t// face two\n\t\t\t\t\tindices.setX( indexOffset, i2 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i3 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i4 ); indexOffset ++;\n\n\t\t\t\t\t// update counters\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\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\tvar x, centerIndexStart, centerIndexEnd;\n\n\t\t\tvar uv = new Vector2();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tvar sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// save the index of the first center vertex\n\t\t\tcenterIndexStart = index;\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 ( x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\t\t\t\tvertices.setXYZ( index, 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\t\t\t\tnormals.setXYZ( index, 0, sign, 0 );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = 0.5;\n\t\t\t\tuv.y = 0.5;\n\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\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\tcenterIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tvar u = x / radialSegments;\n\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\tvar cosTheta = Math.cos( theta );\n\t\t\t\tvar sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\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.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\t\t\t\tnormals.setXYZ( index, 0, sign, 0 );\n\n\t\t\t\t// uv\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.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tvar c = centerIndexStart + x;\n\t\t\t\tvar i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\t\t\t\t\tindices.setX( indexOffset, i ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i + 1 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, c ); indexOffset ++;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\t\t\t\t\tindices.setX( indexOffset, i + 1 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, c ); indexOffset ++;\n\n\t\t\t\t}\n\n\t\t\t\t// update counters\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\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tCylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tCylinderGeometry.prototype = Object.create( Geometry.prototype );\n\tCylinderGeometry.prototype.constructor = CylinderGeometry;\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderGeometry.call( this, 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\tConeGeometry.prototype = Object.create( CylinderGeometry.prototype );\n\tConeGeometry.prototype.constructor = ConeGeometry;\n\n\t/**\n\t * @author: abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeBufferGeometry';\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\tConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype );\n\tConeBufferGeometry.prototype.constructor = ConeBufferGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CircleBufferGeometry';\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\tradius = radius || 50;\n\t\tsegments = segments !== undefined ? Math.max( 3, segments ) : 8;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\tvar vertices = segments + 2;\n\n\t\tvar positions = new Float32Array( vertices * 3 );\n\t\tvar normals = new Float32Array( vertices * 3 );\n\t\tvar uvs = new Float32Array( vertices * 2 );\n\n\t\t// center data is already zero, but need to set a few extras\n\t\tnormals[ 2 ] = 1.0;\n\t\tuvs[ 0 ] = 0.5;\n\t\tuvs[ 1 ] = 0.5;\n\n\t\tfor ( var s = 0, i = 3, ii = 2 ; s <= segments; s ++, i += 3, ii += 2 ) {\n\n\t\t\tvar segment = thetaStart + s / segments * thetaLength;\n\n\t\t\tpositions[ i ] = radius * Math.cos( segment );\n\t\t\tpositions[ i + 1 ] = radius * Math.sin( segment );\n\n\t\t\tnormals[ i + 2 ] = 1; // normal z\n\n\t\t\tuvs[ ii ] = ( positions[ i ] / radius + 1 ) / 2;\n\t\t\tuvs[ ii + 1 ] = ( positions[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t}\n\n\t\tvar indices = [];\n\n\t\tfor ( var i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\tthis.setIndex( new BufferAttribute( new Uint16Array( indices ), 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t\tthis.boundingSphere = new Sphere( new Vector3(), radius );\n\n\t}\n\n\tCircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCircleBufferGeometry.prototype.constructor = CircleBufferGeometry;\n\n\t/**\n\t * @author hughes\n\t */\n\n\tfunction CircleGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );\n\n\t}\n\n\tCircleGeometry.prototype = Object.create( Geometry.prototype );\n\tCircleGeometry.prototype.constructor = CircleGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as\n\t */\n\n\tfunction BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tBoxGeometry.prototype = Object.create( Geometry.prototype );\n\tBoxGeometry.prototype.constructor = BoxGeometry;\n\n\n\n\tvar Geometries = Object.freeze({\n\t\tWireframeGeometry: WireframeGeometry,\n\t\tParametricGeometry: ParametricGeometry,\n\t\tParametricBufferGeometry: ParametricBufferGeometry,\n\t\tTetrahedronGeometry: TetrahedronGeometry,\n\t\tTetrahedronBufferGeometry: TetrahedronBufferGeometry,\n\t\tOctahedronGeometry: OctahedronGeometry,\n\t\tOctahedronBufferGeometry: OctahedronBufferGeometry,\n\t\tIcosahedronGeometry: IcosahedronGeometry,\n\t\tIcosahedronBufferGeometry: IcosahedronBufferGeometry,\n\t\tDodecahedronGeometry: DodecahedronGeometry,\n\t\tDodecahedronBufferGeometry: DodecahedronBufferGeometry,\n\t\tPolyhedronGeometry: PolyhedronGeometry,\n\t\tPolyhedronBufferGeometry: PolyhedronBufferGeometry,\n\t\tTubeGeometry: TubeGeometry,\n\t\tTubeBufferGeometry: TubeBufferGeometry,\n\t\tTorusKnotGeometry: TorusKnotGeometry,\n\t\tTorusKnotBufferGeometry: TorusKnotBufferGeometry,\n\t\tTorusGeometry: TorusGeometry,\n\t\tTorusBufferGeometry: TorusBufferGeometry,\n\t\tTextGeometry: TextGeometry,\n\t\tSphereBufferGeometry: SphereBufferGeometry,\n\t\tSphereGeometry: SphereGeometry,\n\t\tRingGeometry: RingGeometry,\n\t\tRingBufferGeometry: RingBufferGeometry,\n\t\tPlaneBufferGeometry: PlaneBufferGeometry,\n\t\tPlaneGeometry: PlaneGeometry,\n\t\tLatheGeometry: LatheGeometry,\n\t\tLatheBufferGeometry: LatheBufferGeometry,\n\t\tShapeGeometry: ShapeGeometry,\n\t\tExtrudeGeometry: ExtrudeGeometry,\n\t\tEdgesGeometry: EdgesGeometry,\n\t\tConeGeometry: ConeGeometry,\n\t\tConeBufferGeometry: ConeBufferGeometry,\n\t\tCylinderGeometry: CylinderGeometry,\n\t\tCylinderBufferGeometry: CylinderBufferGeometry,\n\t\tCircleBufferGeometry: CircleBufferGeometry,\n\t\tCircleGeometry: CircleGeometry,\n\t\tBoxBufferGeometry: BoxBufferGeometry,\n\t\tBoxGeometry: BoxGeometry\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ShadowMaterial() {\n\n\t\tShaderMaterial.call( this, {\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib[ \"lights\" ],\n\t\t\t\t{\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t}\n\t\t\t] ),\n\t\t\tvertexShader: ShaderChunk[ 'shadow_vert' ],\n\t\t\tfragmentShader: ShaderChunk[ 'shadow_frag' ]\n\t\t} );\n\n\t\tthis.lights = true;\n\t\tthis.transparent = true;\n\n\t\tObject.defineProperties( this, {\n\t\t\topacity: {\n\t\t\t\tenumerable: true,\n\t\t\t\tget: function () {\n\t\t\t\t\treturn this.uniforms.opacity.value;\n\t\t\t\t},\n\t\t\t\tset: function ( value ) {\n\t\t\t\t\tthis.uniforms.opacity.value = value;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tShadowMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tShadowMaterial.prototype.constructor = ShadowMaterial;\n\n\tShadowMaterial.prototype.isShadowMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction RawShaderMaterial( parameters ) {\n\n\t\tShaderMaterial.call( this, parameters );\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n\tRawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tRawShaderMaterial.prototype.constructor = RawShaderMaterial;\n\n\tRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MultiMaterial( materials ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.type = 'MultiMaterial';\n\n\t\tthis.materials = materials instanceof Array ? materials : [];\n\n\t\tthis.visible = true;\n\n\t}\n\n\tMultiMaterial.prototype = {\n\n\t\tconstructor: MultiMaterial,\n\n\t\tisMultiMaterial: true,\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.2,\n\t\t\t\t\ttype: 'material',\n\t\t\t\t\tgenerator: 'MaterialExporter'\n\t\t\t\t},\n\t\t\t\tuuid: this.uuid,\n\t\t\t\ttype: this.type,\n\t\t\t\tmaterials: []\n\t\t\t};\n\n\t\t\tvar materials = this.materials;\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tvar material = materials[ i ].toJSON( meta );\n\t\t\t\tdelete material.metadata;\n\n\t\t\t\toutput.materials.push( material );\n\n\t\t\t}\n\n\t\t\toutput.visible = this.visible;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\tvar material = new this.constructor();\n\n\t\t\tfor ( var i = 0; i < this.materials.length; i ++ ) {\n\n\t\t\t\tmaterial.materials.push( this.materials[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tmaterial.visible = this.visible;\n\n\t\t\treturn material;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * color: ,\n\t * roughness: ,\n\t * metalness: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * roughnessMap: new THREE.Texture( ),\n\t *\n\t * metalnessMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n\t * envMapIntensity: \n\t *\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshStandardMaterial( parameters ) {\n\n\t\tMaterial.call( this );\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 = 0.5;\n\t\tthis.metalness = 0.5;\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.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.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.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshStandardMaterial.prototype = Object.create( Material.prototype );\n\tMeshStandardMaterial.prototype.constructor = MeshStandardMaterial;\n\n\tMeshStandardMaterial.prototype.isMeshStandardMaterial = true;\n\n\tMeshStandardMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, 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.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.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.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * reflectivity: \n\t * }\n\t */\n\n\tfunction MeshPhysicalMaterial( parameters ) {\n\n\t\tMeshStandardMaterial.call( this );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.reflectivity = 0.5; // maps to F0 = 0.04\n\n\t\tthis.clearCoat = 0.0;\n\t\tthis.clearCoatRoughness = 0.0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );\n\tMeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;\n\n\tMeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;\n\n\tMeshPhysicalMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshStandardMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.reflectivity = source.reflectivity;\n\n\t\tthis.clearCoat = source.clearCoat;\n\t\tthis.clearCoatRoughness = source.clearCoatRoughness;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * specular: ,\n\t * shininess: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshPhongMaterial( parameters ) {\n\n\t\tMaterial.call( this );\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.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.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhongMaterial.prototype = Object.create( Material.prototype );\n\tMeshPhongMaterial.prototype.constructor = MeshPhongMaterial;\n\n\tMeshPhongMaterial.prototype.isMeshPhongMaterial = true;\n\n\tMeshPhongMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, 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.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.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t *\n\t * parameters = {\n\t * opacity: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t * }\n\t */\n\n\tfunction MeshNormalMaterial( parameters ) {\n\n\t\tMaterial.call( this, parameters );\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshNormalMaterial.prototype = Object.create( Material.prototype );\n\tMeshNormalMaterial.prototype.constructor = MeshNormalMaterial;\n\n\tMeshNormalMaterial.prototype.isMeshNormalMaterial = true;\n\n\tMeshNormalMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshLambertMaterial( parameters ) {\n\n\t\tMaterial.call( this );\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.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.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshLambertMaterial.prototype = Object.create( Material.prototype );\n\tMeshLambertMaterial.prototype.constructor = MeshLambertMaterial;\n\n\tMeshLambertMaterial.prototype.isMeshLambertMaterial = true;\n\n\tMeshLambertMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, 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.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.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t *\n\t * scale: ,\n\t * dashSize: ,\n\t * gapSize: \n\t * }\n\t */\n\n\tfunction LineDashedMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineDashedMaterial.prototype = Object.create( Material.prototype );\n\tLineDashedMaterial.prototype.constructor = LineDashedMaterial;\n\n\tLineDashedMaterial.prototype.isLineDashedMaterial = true;\n\n\tLineDashedMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\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\tvar Materials = Object.freeze({\n\t\tShadowMaterial: ShadowMaterial,\n\t\tSpriteMaterial: SpriteMaterial,\n\t\tRawShaderMaterial: RawShaderMaterial,\n\t\tShaderMaterial: ShaderMaterial,\n\t\tPointsMaterial: PointsMaterial,\n\t\tMultiMaterial: MultiMaterial,\n\t\tMeshPhysicalMaterial: MeshPhysicalMaterial,\n\t\tMeshStandardMaterial: MeshStandardMaterial,\n\t\tMeshPhongMaterial: MeshPhongMaterial,\n\t\tMeshNormalMaterial: MeshNormalMaterial,\n\t\tMeshLambertMaterial: MeshLambertMaterial,\n\t\tMeshDepthMaterial: MeshDepthMaterial,\n\t\tMeshBasicMaterial: MeshBasicMaterial,\n\t\tLineDashedMaterial: LineDashedMaterial,\n\t\tLineBasicMaterial: LineBasicMaterial,\n\t\tMaterial: Material\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar Cache = {\n\n\t\tenabled: false,\n\n\t\tfiles: {},\n\n\t\tadd: function ( key, file ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\t\tthis.files[ key ] = file;\n\n\t\t},\n\n\t\tget: function ( key ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\t\treturn this.files[ key ];\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete this.files[ key ];\n\n\t\t},\n\n\t\tclear: function () {\n\n\t\t\tthis.files = {};\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LoadingManager( onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar isLoading = false, itemsLoaded = 0, itemsTotal = 0;\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}\n\n\tvar DefaultLoadingManager = new LoadingManager();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction XHRLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( XHRLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\t// Check for data: URI\n\t\t\tvar dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\t\t\tvar dataUriRegexResult = url.match( dataUriRegex );\n\n\t\t\t// Safari can not handle Data URIs through XMLHttpRequest so process manually\n\t\t\tif ( dataUriRegexResult ) {\n\n\t\t\t\tvar mimeType = dataUriRegexResult[1];\n\t\t\t\tvar isBase64 = !!dataUriRegexResult[2];\n\t\t\t\tvar data = dataUriRegexResult[3];\n\n\t\t\t\tdata = window.decodeURIComponent(data);\n\n\t\t\t\tif( isBase64 ) {\n\t\t\t\t\tdata = window.atob(data);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar response;\n\t\t\t\t\tvar responseType = ( this.responseType || '' ).toLowerCase();\n\n\t\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\t \tresponse = new ArrayBuffer( data.length );\n\t\t\t\t\t\t\tvar view = new Uint8Array( response );\n\t\t\t\t\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tview[ i ] = data.charCodeAt( i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( responseType === 'blob' ) {\n\n\t\t\t\t\t\t\t\tresponse = new Blob( [ response ], { \"type\" : mimeType } );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\t\tvar parser = new DOMParser();\n\t\t\t\t\t\t\tresponse = parser.parseFromString( data, mimeType );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\t\tresponse = JSON.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault: // 'text' or other\n\n\t\t\t\t\t\t\tresponse = data;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function() {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t}, 0);\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function() {\n\n\t\t\t\t\t\tif ( onError ) onError( error );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}, 0);\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar request = new XMLHttpRequest();\n\t\t\t\trequest.open( 'GET', url, true );\n\n\t\t\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\t\t\tvar response = event.target.response;\n\n\t\t\t\t\tCache.add( url, response );\n\n\t\t\t\t\tif ( this.status === 200 ) {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else if ( this.status === 0 ) {\n\n\t\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\t\tconsole.warn( 'THREE.XHRLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( onProgress !== undefined ) {\n\n\t\t\t\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\t\t\tonProgress( event );\n\n\t\t\t\t\t}, false );\n\n\t\t\t\t}\n\n\t\t\t\trequest.addEventListener( 'error', function ( event ) {\n\n\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( this.responseType !== undefined ) request.responseType = this.responseType;\n\t\t\t\tif ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;\n\n\t\t\t\tif ( request.overrideMimeType ) request.overrideMimeType( 'text/plain' );\n\n\t\t\t\trequest.send( null );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn request;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetResponseType: function ( value ) {\n\n\t\t\tthis.responseType = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t *\n\t * Abstract Base class to block based textures loader (dds, pvr, ...)\n\t */\n\n\tfunction CompressedTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( CompressedTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar images = [];\n\n\t\t\tvar texture = new CompressedTexture();\n\t\t\ttexture.image = images;\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\timages[ i ] = {\n\t\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t\t};\n\n\t\t\t\t\tloaded += 1;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\tif ( texDatas.mipmapCount === 1 )\n\t\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\tvar loaded = 0;\n\n\t\t\t\tfor ( var i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\t\tloadTexture( i );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\t\tvar faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\t\tfor ( var f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\t\timages[ f ] = { mipmaps : [] };\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\t\timages[ f ].height = texDatas.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} else {\n\n\t\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author Nikos M. / https://github.com/foo123/\n\t *\n\t * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n\t */\n\n\tvar DataTextureLoader = BinaryTextureLoader;\n\tfunction BinaryTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( BinaryTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texture = new DataTexture();\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar texData = scope._parser( buffer );\n\n\t\t\t\tif ( ! texData ) return;\n\n\t\t\t\tif ( undefined !== texData.image ) {\n\n\t\t\t\t\ttexture.image = texData.image;\n\n\t\t\t\t} else if ( undefined !== texData.data ) {\n\n\t\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\t\ttexture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\t\ttexture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter;\n\t\t\t\ttexture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter;\n\n\t\t\t\ttexture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;\n\n\t\t\t\tif ( undefined !== texData.format ) {\n\n\t\t\t\t\ttexture.format = texData.format;\n\n\t\t\t\t}\n\t\t\t\tif ( undefined !== texData.type ) {\n\n\t\t\t\t\ttexture.type = texData.type;\n\n\t\t\t\t}\n\n\t\t\t\tif ( undefined !== texData.mipmaps ) {\n\n\t\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( 1 === texData.mipmapCount ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t\t}, onProgress, onError );\n\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ImageLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( ImageLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );\n\t\t\timage.onload = function () {\n\n\t\t\t\timage.onload = null;\n\n\t\t\t\tURL.revokeObjectURL( image.src );\n\n\t\t\t\tif ( onLoad ) onLoad( image );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t};\n\t\t\timage.onerror = onError;\n\n\t\t\tif ( url.indexOf( 'data:' ) === 0 ) {\n\n\t\t\t\timage.src = url;\n\n\t\t\t} else {\n\n\t\t\t\tvar loader = new XHRLoader();\n\t\t\t\tloader.setPath( this.path );\n\t\t\t\tloader.setResponseType( 'blob' );\n\t\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\t\tloader.load( url, function ( blob ) {\n\n\t\t\t\t\timage.src = URL.createObjectURL( blob );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn image;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( CubeTextureLoader.prototype, {\n\n\t\tload: function ( urls, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new CubeTexture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\n\t\t\tvar loaded = 0;\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\t\tloaded ++;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, undefined, onError );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < urls.length; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction TextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( TextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new Texture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.load( url, function ( image ) {\n\n\t\t\t\t// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.\n\t\t\t\tvar isJPEG = url.search( /\\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\\:image\\/jpeg/ ) === 0;\n\n\t\t\t\ttexture.format = isJPEG ? RGBFormat : RGBAFormat;\n\t\t\t\ttexture.image = image;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\t\tonLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Light( color, intensity ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Light';\n\n\t\tthis.color = new Color( color );\n\t\tthis.intensity = intensity !== undefined ? intensity : 1;\n\n\t\tthis.receiveShadow = undefined;\n\n\t}\n\n\tLight.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Light,\n\n\t\tisLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.color.copy( source.color );\n\t\t\tthis.intensity = source.intensity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.color = this.color.getHex();\n\t\t\tdata.object.intensity = this.intensity;\n\n\t\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction HemisphereLight( skyColor, groundColor, intensity ) {\n\n\t\tLight.call( this, skyColor, intensity );\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.castShadow = undefined;\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tHemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: HemisphereLight,\n\n\t\tisHemisphereLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.groundColor.copy( source.groundColor );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LightShadow( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.bias = 0;\n\t\tthis.radius = 1;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.matrix = new Matrix4();\n\n\t}\n\n\tObject.assign( LightShadow.prototype, {\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.camera = source.camera.clone();\n\n\t\t\tthis.bias = source.bias;\n\t\t\tthis.radius = source.radius;\n\n\t\t\tthis.mapSize.copy( source.mapSize );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar object = {};\n\n\t\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\t\tdelete object.camera.matrix;\n\n\t\t\treturn object;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SpotLightShadow() {\n\n\t\tLightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t}\n\n\tSpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: SpotLightShadow,\n\n\t\tisSpotLightShadow: true,\n\n\t\tupdate: function ( light ) {\n\n\t\t\tvar fov = _Math.RAD2DEG * 2 * light.angle;\n\t\t\tvar aspect = this.mapSize.width / this.mapSize.height;\n\t\t\tvar far = light.distance || 500;\n\n\t\t\tvar camera = this.camera;\n\n\t\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\t\tcamera.fov = fov;\n\t\t\t\tcamera.aspect = aspect;\n\t\t\t\tcamera.far = far;\n\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpotLight( color, intensity, distance, angle, penumbra, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * Math.PI;\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / Math.PI;\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.angle = ( angle !== undefined ) ? angle : Math.PI / 3;\n\t\tthis.penumbra = ( penumbra !== undefined ) ? penumbra : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\tSpotLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: SpotLight,\n\n\t\tisSpotLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.angle = source.angle;\n\t\t\tthis.penumbra = source.penumbra;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\n\tfunction PointLight( color, intensity, distance, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'PointLight';\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * 4 * Math.PI;\n\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / ( 4 * Math.PI );\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t}\n\n\tPointLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: PointLight,\n\n\t\tisPointLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectionalLightShadow( light ) {\n\n\t\tLightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n\t}\n\n\tDirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: DirectionalLightShadow\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DirectionalLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tDirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: DirectionalLight,\n\n\t\tisDirectionalLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AmbientLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'AmbientLight';\n\n\t\tthis.castShadow = undefined;\n\n\t}\n\n\tAmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: AmbientLight,\n\n\t\tisAmbientLight: true,\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tvar AnimationUtils = {\n\n\t\t// same as Array.prototype.slice, but also works on typed arrays\n\t\tarraySlice: function( array, from, to ) {\n\n\t\t\tif ( AnimationUtils.isTypedArray( array ) ) {\n\n\t\t\t\treturn new array.constructor( array.subarray( from, to ) );\n\n\t\t\t}\n\n\t\t\treturn array.slice( from, to );\n\n\t\t},\n\n\t\t// converts an array to a specific type\n\t\tconvertArray: function( array, type, forceClone ) {\n\n\t\t\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t\t\t\t! forceClone && array.constructor === type ) return array;\n\n\t\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\t\t\treturn new type( array ); // create typed array\n\n\t\t\t}\n\n\t\t\treturn Array.prototype.slice.call( array ); // create Array\n\n\t\t},\n\n\t\tisTypedArray: function( object ) {\n\n\t\t\treturn ArrayBuffer.isView( object ) &&\n\t\t\t\t\t! ( object instanceof DataView );\n\n\t\t},\n\n\t\t// returns an array by which times and values can be sorted\n\t\tgetKeyframeOrder: function( times ) {\n\n\t\t\tfunction compareTime( i, j ) {\n\n\t\t\t\treturn times[ i ] - times[ j ];\n\n\t\t\t}\n\n\t\t\tvar n = times.length;\n\t\t\tvar result = new Array( n );\n\t\t\tfor ( var i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\t\t\tresult.sort( compareTime );\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// uses the array previously returned by 'getKeyframeOrder' to sort data\n\t\tsortedArray: function( values, stride, order ) {\n\n\t\t\tvar nValues = values.length;\n\t\t\tvar result = new values.constructor( nValues );\n\n\t\t\tfor ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\t\t\tvar srcOffset = order[ i ] * stride;\n\n\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// function for parsing AOS keyframe formats\n\t\tflattenJSON: function( jsonKeys, times, values, valuePropertyName ) {\n\n\t\t\tvar i = 1, key = jsonKeys[ 0 ];\n\n\t\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t}\n\n\t\t\tif ( key === undefined ) return; // no data\n\n\t\t\tvar value = key[ valuePropertyName ];\n\t\t\tif ( value === undefined ) return; // no data\n\n\t\t\tif ( Array.isArray( value ) ) {\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else if ( value.toArray !== undefined ) {\n\t\t\t\t// ...assume THREE.Math-ish\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else {\n\t\t\t\t// otherwise push as-is\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push( value );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Abstract base class of interpolants over parametric samples.\n\t *\n\t * The parameter domain is one dimensional, typically the time or a path\n\t * along a curve defined by the data.\n\t *\n\t * The sample values can have any dimensionality and derived classes may\n\t * apply special interpretations to the data.\n\t *\n\t * This class provides the interval seek in a Template Method, deferring\n\t * the actual interpolation to derived classes.\n\t *\n\t * Time complexity is O(1) for linear access crossing at most two points\n\t * and O(log N) for random access, where N is the number of positions.\n\t *\n\t * References:\n\t *\n\t * \t\thttp://www.oodesign.com/template-method-pattern.html\n\t *\n\t * @author tschw\n\t */\n\n\tfunction Interpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tthis.parameterPositions = parameterPositions;\n\t\tthis._cachedIndex = 0;\n\n\t\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\t\tthis.sampleValues = sampleValues;\n\t\tthis.valueSize = sampleSize;\n\n\t}\n\n\tInterpolant.prototype = {\n\n\t\tconstructor: Interpolant,\n\n\t\tevaluate: function( t ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\ti1 = this._cachedIndex,\n\n\t\t\t\tt1 = pp[ i1 ],\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\tvalidate_interval: {\n\n\t\t\t\tseek: {\n\n\t\t\t\t\tvar right;\n\n\t\t\t\t\tlinear_scan: {\n\t//- See http://jsperf.com/comparison-to-undefined/3\n\t//- slower code:\n\t//-\n\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 + 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\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\t// prepare binary search on the right side of the index\n\t\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t//- slower code:\n\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\t\tvar t1global = pp[ 1 ];\n\n\t\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 - 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\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\t// prepare binary search on the left side of the index\n\t\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t\t} // linear scan\n\n\t\t\t\t\t// binary search\n\n\t\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\t\tvar mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t\t// check boundary cases, again\n\n\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\n\n\t\t\t\t\t}\n\n\t\t\t\t} // seek\n\n\t\t\t\tthis._cachedIndex = i1;\n\n\t\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t\t} // validate_interval\n\n\t\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t\t},\n\n\t\tsettings: null, // optional, subclass-specific settings structure\n\t\t// Note: The indirection allows central control of many interpolants.\n\n\t\t// --- Protected interface\n\n\t\tDefaultSettings_: {},\n\n\t\tgetSettings_: function() {\n\n\t\t\treturn this.settings || this.DefaultSettings_;\n\n\t\t},\n\n\t\tcopySampleValue_: function( index ) {\n\n\t\t\t// copies a sample value to the result buffer\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = index * stride;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// Template methods for derived classes:\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tthrow new Error( \"call to abstract method\" );\n\t\t\t// implementations shall return this.resultBuffer\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\t// empty\n\n\t\t}\n\n\t};\n\n\tObject.assign( Interpolant.prototype, {\n\n\t\tbeforeStart_: //( 0, t, t0 ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_,\n\n\t\tafterEnd_: //( N-1, tN-1, t ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_\n\n\t} );\n\n\t/**\n\t * Fast and simple cubic spline interpolant.\n\t *\n\t * It was derived from a Hermitian construction setting the first derivative\n\t * at each sample position to the linear slope between neighboring positions\n\t * over their parameter interval.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction CubicInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, 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}\n\n\tCubicInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: CubicInterpolant,\n\n\t\tDefaultSettings_: {\n\n\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\tiPrev = i1 - 2,\n\t\t\t\tiNext = i1 + 1,\n\n\t\t\t\ttPrev = pp[ iPrev ],\n\t\t\t\ttNext = pp[ iNext ];\n\n\t\t\tif ( tPrev === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = t1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tNext === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\t\tiNext = i1;\n\t\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiNext = 1;\n\t\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\t\ttNext = t0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar halfDt = ( t1 - t0 ) * 0.5,\n\t\t\t\tstride = this.valueSize;\n\n\t\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\t\tthis._offsetPrev = iPrev * stride;\n\t\t\tthis._offsetNext = iNext * stride;\n\n\t\t},\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tpp = p * p,\n\t\t\t\tppp = pp * p;\n\n\t\t\t// evaluate polynomials\n\n\t\t\tvar sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\t\tvar s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\t\tvar s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\t\tvar sN = wN * ppp - wN * pp;\n\n\t\t\t// combine data linearly\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction LinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: LinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset1 = i1 * stride,\n\t\t\t\toffset0 = offset1 - stride,\n\n\t\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tweight0 = 1 - weight1;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Interpolant that evaluates to the sample value at the position preceeding\n\t * the parameter.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction DiscreteInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tDiscreteInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: DiscreteInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t}\n\n\t} );\n\n\tvar KeyframeTrackPrototype;\n\n\tKeyframeTrackPrototype = {\n\n\t\tTimeBufferType: Float32Array,\n\t\tValueBufferType: Float32Array,\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodDiscrete: function( result ) {\n\n\t\t\treturn new DiscreteInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodLinear: function( result ) {\n\n\t\t\treturn new LinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: function( result ) {\n\n\t\t\treturn new CubicInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tsetInterpolation: function( interpolation ) {\n\n\t\t\tvar factoryMethod;\n\n\t\t\tswitch ( interpolation ) {\n\n\t\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateLinear:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateSmooth:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( factoryMethod === undefined ) {\n\n\t\t\t\tvar message = \"unsupported interpolation for \" +\n\t\t\t\t\t\tthis.ValueTypeName + \" keyframe track named \" + this.name;\n\n\t\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( message );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.createInterpolant = factoryMethod;\n\n\t\t},\n\n\t\tgetInterpolation: function() {\n\n\t\t\tswitch ( this.createInterpolant ) {\n\n\t\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\t\treturn InterpolateLinear;\n\n\t\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\t\treturn InterpolateSmooth;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetValueSize: function() {\n\n\t\t\treturn this.values.length / this.times.length;\n\n\t\t},\n\n\t\t// move all keyframes either forwards or backwards in time\n\t\tshift: function( timeOffset ) {\n\n\t\t\tif( timeOffset !== 0.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\t\tscale: function( timeScale ) {\n\n\t\t\tif( timeScale !== 1.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t\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\t\ttrim: function( startTime, endTime ) {\n\n\t\t\tvar times = this.times,\n\t\t\t\tnKeys = times.length,\n\t\t\t\tfrom = 0,\n\t\t\t\tto = nKeys - 1;\n\n\t\t\twhile ( from !== nKeys && times[ from ] < startTime ) ++ from;\n\t\t\twhile ( to !== -1 && times[ to ] > endTime ) -- to;\n\n\t\t\t++ to; // inclusive -> exclusive bound\n\n\t\t\tif( from !== 0 || to !== nKeys ) {\n\n\t\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\t\tif ( from >= to ) to = Math.max( to , 1 ), from = to - 1;\n\n\t\t\t\tvar stride = this.getValueSize();\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, from, to );\n\t\t\t\tthis.values = AnimationUtils.\n\t\t\t\t\t\tarraySlice( this.values, from * stride, to * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\t\tvalidate: function() {\n\n\t\t\tvar valid = true;\n\n\t\t\tvar valueSize = this.getValueSize();\n\t\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\t\tconsole.error( \"invalid value size in track\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\n\t\t\t\tnKeys = times.length;\n\n\t\t\tif( nKeys === 0 ) {\n\n\t\t\t\tconsole.error( \"track is empty\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar prevTime = null;\n\n\t\t\tfor( var i = 0; i !== nKeys; i ++ ) {\n\n\t\t\t\tvar currTime = times[ i ];\n\n\t\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\t\tconsole.error( \"time is not a valid number\", this, i, currTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\t\tconsole.error( \"out of order keys\", this, i, currTime, prevTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tprevTime = currTime;\n\n\t\t\t}\n\n\t\t\tif ( values !== undefined ) {\n\n\t\t\t\tif ( AnimationUtils.isTypedArray( values ) ) {\n\n\t\t\t\t\tfor ( var i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tvar value = values[ i ];\n\n\t\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\t\tconsole.error( \"value is not a valid number\", this, i, value );\n\t\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn valid;\n\n\t\t},\n\n\t\t// removes equivalent sequential keys as common in morph target sequences\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\t\toptimize: function() {\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\t\t\t\tstride = this.getValueSize(),\n\n\t\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\t\twriteIndex = 1,\n\t\t\t\tlastIndex = times.length - 1;\n\n\t\t\tfor( var i = 1; i < lastIndex; ++ i ) {\n\n\t\t\t\tvar keep = false;\n\n\t\t\t\tvar time = times[ i ];\n\t\t\t\tvar timeNext = times[ i + 1 ];\n\n\t\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\t\tif ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {\n\n\t\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\t\tvar offset = i * stride,\n\t\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\t\tvar value = values[ offset + j ];\n\n\t\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\t\tbreak;\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 keep = true;\n\n\t\t\t\t}\n\n\t\t\t\t// in-place compaction\n\n\t\t\t\tif ( keep ) {\n\n\t\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\t\tvar readOffset = i * stride,\n\t\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j )\n\n\t\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t++ writeIndex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// flush last keyframe (compaction looks ahead)\n\n\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\t\tfor ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j )\n\n\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t\tif ( writeIndex !== times.length ) {\n\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, 0, writeIndex );\n\t\t\t\tthis.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\tfunction KeyframeTrackConstructor( name, times, values, interpolation ) {\n\n\t\tif( name === undefined ) throw new Error( \"track name is undefined\" );\n\n\t\tif( times === undefined || times.length === 0 ) {\n\n\t\t\tthrow new Error( \"no keyframes in track named \" + name );\n\n\t\t}\n\n\t\tthis.name = name;\n\n\t\tthis.times = AnimationUtils.convertArray( times, this.TimeBufferType );\n\t\tthis.values = AnimationUtils.convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t\tthis.validate();\n\t\tthis.optimize();\n\n\t}\n\n\t/**\n\t *\n\t * A Track of vectored keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction VectorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tVectorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: VectorKeyframeTrack,\n\n\t\tValueTypeName: 'vector'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t * Spherical linear unit quaternion interpolant.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction QuaternionLinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tQuaternionLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: QuaternionLinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset = i1 * stride,\n\n\t\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\t\tfor ( var end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\t\tQuaternion.slerpFlat( result, 0,\n\t\t\t\t\t\tvalues, offset - stride, values, offset, alpha );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of quaternion keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction QuaternionKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tQuaternionKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: QuaternionKeyframeTrack,\n\n\t\tValueTypeName: 'quaternion',\n\n\t\t// ValueBufferType is inherited\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodLinear: function( result ) {\n\n\t\t\treturn new QuaternionLinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: undefined // not yet implemented\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of numeric keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction NumberKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tNumberKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: NumberKeyframeTrack,\n\n\t\tValueTypeName: 'number',\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t *\n\t * A Track that interpolates Strings\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction StringKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tStringKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: StringKeyframeTrack,\n\n\t\tValueTypeName: 'string',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of Boolean keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction BooleanKeyframeTrack( name, times, values ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values );\n\n\t}\n\n\tBooleanKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: BooleanKeyframeTrack,\n\n\t\tValueTypeName: 'bool',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t\t// Note: Actually this track could have a optimized / compressed\n\t\t// representation of a single value and a custom interpolant that\n\t\t// computes \"firstValue ^ isOdd( index )\".\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of keyframe values that represent color.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction ColorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tColorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: ColorKeyframeTrack,\n\n\t\tValueTypeName: 'color'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\n\t\t// Note: Very basic implementation and nothing special yet.\n\t\t// However, this is the place for color space parameterization.\n\n\t} );\n\n\t/**\n\t *\n\t * A timed sequence of keyframes for a specific property.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction KeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.apply( this, arguments );\n\n\t}\n\n\tKeyframeTrack.prototype = KeyframeTrackPrototype;\n\tKeyframeTrackPrototype.constructor = KeyframeTrack;\n\n\t// Static methods:\n\n\tObject.assign( KeyframeTrack, {\n\n\t\t// Serialization (in static context, because of constructor invocation\n\t\t// and automatic invocation of .toJSON):\n\n\t\tparse: function( json ) {\n\n\t\t\tif( json.type === undefined ) {\n\n\t\t\t\tthrow new Error( \"track type undefined, can not parse\" );\n\n\t\t\t}\n\n\t\t\tvar trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type );\n\n\t\t\tif ( json.times === undefined ) {\n\n\t\t\t\tvar times = [], values = [];\n\n\t\t\t\tAnimationUtils.flattenJSON( json.keys, times, values, 'value' );\n\n\t\t\t\tjson.times = times;\n\t\t\t\tjson.values = values;\n\n\t\t\t}\n\n\t\t\t// derived classes can define a static parse method\n\t\t\tif ( trackType.parse !== undefined ) {\n\n\t\t\t\treturn trackType.parse( json );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we asssume a constructor compatible with the base\n\t\t\t\treturn new trackType(\n\t\t\t\t\t\tjson.name, json.times, json.values, json.interpolation );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function( track ) {\n\n\t\t\tvar trackType = track.constructor;\n\n\t\t\tvar json;\n\n\t\t\t// derived classes can define a static toJSON method\n\t\t\tif ( trackType.toJSON !== undefined ) {\n\n\t\t\t\tjson = trackType.toJSON( track );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\t\tjson = {\n\n\t\t\t\t\t'name': track.name,\n\t\t\t\t\t'times': AnimationUtils.convertArray( track.times, Array ),\n\t\t\t\t\t'values': AnimationUtils.convertArray( track.values, Array )\n\n\t\t\t\t};\n\n\t\t\t\tvar interpolation = track.getInterpolation();\n\n\t\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\t\treturn json;\n\n\t\t},\n\n\t\t_getTrackTypeForValueTypeName: function( typeName ) {\n\n\t\t\tswitch( typeName.toLowerCase() ) {\n\n\t\t\t\tcase \"scalar\":\n\t\t\t\tcase \"double\":\n\t\t\t\tcase \"float\":\n\t\t\t\tcase \"number\":\n\t\t\t\tcase \"integer\":\n\n\t\t\t\t\treturn NumberKeyframeTrack;\n\n\t\t\t\tcase \"vector\":\n\t\t\t\tcase \"vector2\":\n\t\t\t\tcase \"vector3\":\n\t\t\t\tcase \"vector4\":\n\n\t\t\t\t\treturn VectorKeyframeTrack;\n\n\t\t\t\tcase \"color\":\n\n\t\t\t\t\treturn ColorKeyframeTrack;\n\n\t\t\t\tcase \"quaternion\":\n\n\t\t\t\t\treturn QuaternionKeyframeTrack;\n\n\t\t\t\tcase \"bool\":\n\t\t\t\tcase \"boolean\":\n\n\t\t\t\t\treturn BooleanKeyframeTrack;\n\n\t\t\t\tcase \"string\":\n\n\t\t\t\t\treturn StringKeyframeTrack;\n\n\t\t\t}\n\n\t\t\tthrow new Error( \"Unsupported typeName: \" + typeName );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Reusable set of Tracks that represent an animation.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tfunction AnimationClip( name, duration, tracks ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = ( duration !== undefined ) ? duration : -1;\n\n\t\tthis.uuid = _Math.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\tthis.optimize();\n\n\t}\n\n\tAnimationClip.prototype = {\n\n\t\tconstructor: AnimationClip,\n\n\t\tresetDuration: function() {\n\n\t\t\tvar tracks = this.tracks,\n\t\t\t\tduration = 0;\n\n\t\t\tfor ( var i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\t\tvar track = this.tracks[ i ];\n\n\t\t\t\tduration = Math.max(\n\t\t\t\t\t\tduration, track.times[ track.times.length - 1 ] );\n\n\t\t\t}\n\n\t\t\tthis.duration = duration;\n\n\t\t},\n\n\t\ttrim: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\toptimize: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].optimize();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t// Static methods:\n\n\tObject.assign( AnimationClip, {\n\n\t\tparse: function( json ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tjsonTracks = json.tracks,\n\t\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\t\tfor ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( json.name, json.duration, tracks );\n\n\t\t},\n\n\n\t\ttoJSON: function( clip ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tclipTracks = clip.tracks;\n\n\t\t\tvar json = {\n\n\t\t\t\t'name': clip.name,\n\t\t\t\t'duration': clip.duration,\n\t\t\t\t'tracks': tracks\n\n\t\t\t};\n\n\t\t\tfor ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn json;\n\n\t\t},\n\n\n\t\tCreateFromMorphTargetSequence: function( name, morphTargetSequence, fps, noLoop ) {\n\n\t\t\tvar numMorphTargets = morphTargetSequence.length;\n\t\t\tvar tracks = [];\n\n\t\t\tfor ( var i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\t\tvar times = [];\n\t\t\t\tvar values = [];\n\n\t\t\t\ttimes.push(\n\t\t\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\t\t\ti,\n\t\t\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\t\tvar order = AnimationUtils.getKeyframeOrder( times );\n\t\t\t\ttimes = AnimationUtils.sortedArray( times, 1, order );\n\t\t\t\tvalues = AnimationUtils.sortedArray( values, 1, order );\n\n\t\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t\t// last frame as well for perfect loop.\n\t\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\ttracks.push(\n\t\t\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\t\t\ttimes, values\n\t\t\t\t\t\t).scale( 1.0 / fps ) );\n\t\t\t}\n\n\t\t\treturn new AnimationClip( name, -1, tracks );\n\n\t\t},\n\n\t\tfindByName: function( objectOrClipArray, name ) {\n\n\t\t\tvar clipArray = objectOrClipArray;\n\n\t\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\t\tvar o = objectOrClipArray;\n\t\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\t\treturn clipArray[ i ];\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\tCreateClipsFromMorphTargetSequences: function( morphTargets, fps, noLoop ) {\n\n\t\t\tvar animationToMorphTargets = {};\n\n\t\t\t// tested with https://regex101.com/ on trick sequences\n\t\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\t\tvar pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t\t// sort morph target names into animation groups based\n\t\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\t\tfor ( var i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = morphTargets[ i ];\n\t\t\t\tvar parts = morphTarget.name.match( pattern );\n\n\t\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\t\tvar name = parts[ 1 ];\n\n\t\t\t\t\tvar animationMorphTargets = animationToMorphTargets[ name ];\n\t\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar clips = [];\n\n\t\t\tfor ( var name in animationToMorphTargets ) {\n\n\t\t\t\tclips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t\t}\n\n\t\t\treturn clips;\n\n\t\t},\n\n\t\t// parse the animation.hierarchy format\n\t\tparseAnimation: function( animation, bones ) {\n\n\t\t\tif ( ! animation ) {\n\n\t\t\t\tconsole.error( \" no animation in JSONLoader data\" );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar addNonemptyTrack = function(\n\t\t\t\t\ttrackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t\t// only return track if there are actually keys.\n\t\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\t\tvar times = [];\n\t\t\t\t\tvar values = [];\n\n\t\t\t\t\tAnimationUtils.flattenJSON(\n\t\t\t\t\t\t\tanimationKeys, times, values, propertyName );\n\n\t\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tvar tracks = [];\n\n\t\t\tvar clipName = animation.name || 'default';\n\t\t\t// automatic length determination in AnimationClip.\n\t\t\tvar duration = animation.length || -1;\n\t\t\tvar fps = animation.fps || 30;\n\n\t\t\tvar hierarchyTracks = animation.hierarchy || [];\n\n\t\t\tfor ( var h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\t\tvar animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t\t// skip empty tracks\n\t\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t\t// process morph targets in a way exactly compatible\n\t\t\t\t// with AnimationHandler.init( animation )\n\t\t\t\tif ( animationKeys[0].morphTargets ) {\n\n\t\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\t\tvar morphTargetNames = {};\n\t\t\t\t\tfor ( var k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\t\tif ( animationKeys[k].morphTargets ) {\n\n\t\t\t\t\t\t\tfor ( var m = 0; m < animationKeys[k].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[k].morphTargets[m] ] = -1;\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\t// create a track for each morph target with all zero\n\t\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t\t// the morphTarget is named.\n\t\t\t\t\tfor ( var morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\t\tvar times = [];\n\t\t\t\t\t\tvar values = [];\n\n\t\t\t\t\t\tfor ( var m = 0;\n\t\t\t\t\t\t\t\tm !== animationKeys[k].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\t\tvar animationKey = animationKeys[k];\n\n\t\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttracks.push( new NumberKeyframeTrack(\n\t\t\t\t\t\t\t\t'.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tduration = morphTargetNames.length * ( fps || 1.0 );\n\n\t\t\t\t} else {\n\t\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\t\tvar boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tracks.length === 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar clip = new AnimationClip( clipName, duration, tracks );\n\n\t\t\treturn clip;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MaterialLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.textures = {};\n\n\t}\n\n\tObject.assign( MaterialLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTextures: function ( value ) {\n\n\t\t\tthis.textures = value;\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar textures = this.textures;\n\n\t\t\tfunction getTexture( name ) {\n\n\t\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t\t}\n\n\t\t\t\treturn textures[ name ];\n\n\t\t\t}\n\n\t\t\tvar material = new Materials[ json.type ]();\n\n\t\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\t\tif ( json.color !== undefined ) material.color.setHex( json.color );\n\t\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\t\tif ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\t\tif ( json.specular !== undefined ) material.specular.setHex( json.specular );\n\t\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\t\tif ( json.uniforms !== undefined ) material.uniforms = json.uniforms;\n\t\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\t\tif ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;\n\t\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\t\tif ( json.shading !== undefined ) material.shading = json.shading;\n\t\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\t\t\tif ( json.skinning !== undefined ) material.skinning = json.skinning;\n\t\t\tif ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;\n\n\t\t\t// for PointsMaterial\n\n\t\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t\t// maps\n\n\t\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\n\t\t\tif ( json.alphaMap !== undefined ) {\n\n\t\t\t\tmaterial.alphaMap = getTexture( json.alphaMap );\n\t\t\t\tmaterial.transparent = true;\n\n\t\t\t}\n\n\t\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\t\tvar normalScale = json.normalScale;\n\n\t\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t\t}\n\n\t\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\n\t\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\n\t\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\n\t\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\t\t// MultiMaterial\n\n\t\t\tif ( json.materials !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.materials.length; i < l; i ++ ) {\n\n\t\t\t\t\tmaterial.materials.push( this.parse( json.materials[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn material;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometryLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( BufferGeometryLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar geometry = new BufferGeometry();\n\n\t\t\tvar index = json.data.index;\n\n\t\t\tvar TYPED_ARRAYS = {\n\t\t\t\t'Int8Array': Int8Array,\n\t\t\t\t'Uint8Array': Uint8Array,\n\t\t\t\t'Uint8ClampedArray': Uint8ClampedArray,\n\t\t\t\t'Int16Array': Int16Array,\n\t\t\t\t'Uint16Array': Uint16Array,\n\t\t\t\t'Int32Array': Int32Array,\n\t\t\t\t'Uint32Array': Uint32Array,\n\t\t\t\t'Float32Array': Float32Array,\n\t\t\t\t'Float64Array': Float64Array\n\t\t\t};\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ index.type ]( index.array );\n\t\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tvar attributes = json.data.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );\n\n\t\t\t\tgeometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) );\n\n\t\t\t}\n\n\t\t\tvar groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\t\tif ( groups !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = json.data.boundingSphere;\n\n\t\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\t\tvar center = new Vector3();\n\n\t\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Loader() {\n\n\t\tthis.onLoadStart = function () {};\n\t\tthis.onLoadProgress = function () {};\n\t\tthis.onLoadComplete = function () {};\n\n\t}\n\n\tLoader.prototype = {\n\n\t\tconstructor: Loader,\n\n\t\tcrossOrigin: undefined,\n\n\t\textractUrlBase: function ( url ) {\n\n\t\t\tvar parts = url.split( '/' );\n\n\t\t\tif ( parts.length === 1 ) return './';\n\n\t\t\tparts.pop();\n\n\t\t\treturn parts.join( '/' ) + '/';\n\n\t\t},\n\n\t\tinitMaterials: function ( materials, texturePath, crossOrigin ) {\n\n\t\t\tvar array = [];\n\n\t\t\tfor ( var i = 0; i < materials.length; ++ i ) {\n\n\t\t\t\tarray[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tcreateMaterial: ( function () {\n\n\t\t\tvar color, textureLoader, materialLoader;\n\n\t\t\treturn function createMaterial( m, texturePath, crossOrigin ) {\n\n\t\t\t\tif ( color === undefined ) color = new Color();\n\t\t\t\tif ( textureLoader === undefined ) textureLoader = new TextureLoader();\n\t\t\t\tif ( materialLoader === undefined ) materialLoader = new MaterialLoader();\n\n\t\t\t\t// convert from old material format\n\n\t\t\t\tvar textures = {};\n\n\t\t\t\tfunction loadTexture( path, repeat, offset, wrap, anisotropy ) {\n\n\t\t\t\t\tvar fullPath = texturePath + path;\n\t\t\t\t\tvar loader = Loader.Handlers.get( fullPath );\n\n\t\t\t\t\tvar texture;\n\n\t\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\t\ttexture = loader.load( fullPath );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttextureLoader.setCrossOrigin( crossOrigin );\n\t\t\t\t\t\ttexture = textureLoader.load( fullPath );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( repeat !== undefined ) {\n\n\t\t\t\t\t\ttexture.repeat.fromArray( repeat );\n\n\t\t\t\t\t\tif ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\t\t\ttexture.offset.fromArray( offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( wrap !== undefined ) {\n\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;\n\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( anisotropy !== undefined ) {\n\n\t\t\t\t\t\ttexture.anisotropy = anisotropy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar uuid = _Math.generateUUID();\n\n\t\t\t\t\ttextures[ uuid ] = texture;\n\n\t\t\t\t\treturn uuid;\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tvar json = {\n\t\t\t\t\tuuid: _Math.generateUUID(),\n\t\t\t\t\ttype: 'MeshLambertMaterial'\n\t\t\t\t};\n\n\t\t\t\tfor ( var name in m ) {\n\n\t\t\t\t\tvar value = m[ name ];\n\n\t\t\t\t\tswitch ( name ) {\n\t\t\t\t\t\tcase 'DbgColor':\n\t\t\t\t\t\tcase 'DbgIndex':\n\t\t\t\t\t\tcase 'opticalDensity':\n\t\t\t\t\t\tcase 'illumination':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'DbgName':\n\t\t\t\t\t\t\tjson.name = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'blending':\n\t\t\t\t\t\t\tjson.blending = BlendingMode[ value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorAmbient':\n\t\t\t\t\t\tcase 'mapAmbient':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorDiffuse':\n\t\t\t\t\t\t\tjson.color = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorSpecular':\n\t\t\t\t\t\t\tjson.specular = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorEmissive':\n\t\t\t\t\t\t\tjson.emissive = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'specularCoef':\n\t\t\t\t\t\t\tjson.shininess = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'shading':\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuse':\n\t\t\t\t\t\t\tjson.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuseRepeat':\n\t\t\t\t\t\tcase 'mapDiffuseOffset':\n\t\t\t\t\t\tcase 'mapDiffuseWrap':\n\t\t\t\t\t\tcase 'mapDiffuseAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissive':\n\t\t\t\t\t\t\tjson.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissiveRepeat':\n\t\t\t\t\t\tcase 'mapEmissiveOffset':\n\t\t\t\t\t\tcase 'mapEmissiveWrap':\n\t\t\t\t\t\tcase 'mapEmissiveAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLight':\n\t\t\t\t\t\t\tjson.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLightRepeat':\n\t\t\t\t\t\tcase 'mapLightOffset':\n\t\t\t\t\t\tcase 'mapLightWrap':\n\t\t\t\t\t\tcase 'mapLightAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAO':\n\t\t\t\t\t\t\tjson.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAORepeat':\n\t\t\t\t\t\tcase 'mapAOOffset':\n\t\t\t\t\t\tcase 'mapAOWrap':\n\t\t\t\t\t\tcase 'mapAOAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBump':\n\t\t\t\t\t\t\tjson.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpScale':\n\t\t\t\t\t\t\tjson.bumpScale = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpRepeat':\n\t\t\t\t\t\tcase 'mapBumpOffset':\n\t\t\t\t\t\tcase 'mapBumpWrap':\n\t\t\t\t\t\tcase 'mapBumpAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormal':\n\t\t\t\t\t\t\tjson.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalFactor':\n\t\t\t\t\t\t\tjson.normalScale = [ value, value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalRepeat':\n\t\t\t\t\t\tcase 'mapNormalOffset':\n\t\t\t\t\t\tcase 'mapNormalWrap':\n\t\t\t\t\t\tcase 'mapNormalAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecular':\n\t\t\t\t\t\t\tjson.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecularRepeat':\n\t\t\t\t\t\tcase 'mapSpecularOffset':\n\t\t\t\t\t\tcase 'mapSpecularWrap':\n\t\t\t\t\t\tcase 'mapSpecularAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalness':\n\t\t\t\t\t\t\tjson.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalnessRepeat':\n\t\t\t\t\t\tcase 'mapMetalnessOffset':\n\t\t\t\t\t\tcase 'mapMetalnessWrap':\n\t\t\t\t\t\tcase 'mapMetalnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughness':\n\t\t\t\t\t\t\tjson.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughnessRepeat':\n\t\t\t\t\t\tcase 'mapRoughnessOffset':\n\t\t\t\t\t\tcase 'mapRoughnessWrap':\n\t\t\t\t\t\tcase 'mapRoughnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlpha':\n\t\t\t\t\t\t\tjson.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlphaRepeat':\n\t\t\t\t\t\tcase 'mapAlphaOffset':\n\t\t\t\t\t\tcase 'mapAlphaWrap':\n\t\t\t\t\t\tcase 'mapAlphaAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'flipSided':\n\t\t\t\t\t\t\tjson.side = BackSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'doubleSided':\n\t\t\t\t\t\t\tjson.side = DoubleSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );\n\t\t\t\t\t\t\tjson.opacity = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'depthTest':\n\t\t\t\t\t\tcase 'depthWrite':\n\t\t\t\t\t\tcase 'colorWrite':\n\t\t\t\t\t\tcase 'opacity':\n\t\t\t\t\t\tcase 'reflectivity':\n\t\t\t\t\t\tcase 'transparent':\n\t\t\t\t\t\tcase 'visible':\n\t\t\t\t\t\tcase 'wireframe':\n\t\t\t\t\t\t\tjson[ name ] = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'vertexColors':\n\t\t\t\t\t\t\tif ( value === true ) json.vertexColors = VertexColors;\n\t\t\t\t\t\t\tif ( value === 'face' ) json.vertexColors = FaceColors;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.Loader.createMaterial: Unsupported', name, value );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.type === 'MeshBasicMaterial' ) delete json.emissive;\n\t\t\t\tif ( json.type !== 'MeshPhongMaterial' ) delete json.specular;\n\n\t\t\t\tif ( json.opacity < 1 ) json.transparent = true;\n\n\t\t\t\tmaterialLoader.setTextures( textures );\n\n\t\t\t\treturn materialLoader.parse( json );\n\n\t\t\t};\n\n\t\t} )()\n\n\t};\n\n\tLoader.Handlers = {\n\n\t\thandlers: [],\n\n\t\tadd: function ( regex, loader ) {\n\n\t\t\tthis.handlers.push( regex, loader );\n\n\t\t},\n\n\t\tget: function ( file ) {\n\n\t\t\tvar handlers = this.handlers;\n\n\t\t\tfor ( var i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tvar regex = handlers[ i ];\n\t\t\t\tvar loader = handlers[ i + 1 ];\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\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction JSONLoader( manager ) {\n\n\t\tif ( typeof manager === 'boolean' ) {\n\n\t\t\tconsole.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );\n\t\t\tmanager = undefined;\n\n\t\t}\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\tthis.withCredentials = false;\n\n\t}\n\n\tObject.assign( JSONLoader.prototype, {\n\n\t\tload: function( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texturePath = this.texturePath && ( typeof this.texturePath === \"string\" ) ? this.texturePath : Loader.prototype.extractUrlBase( url );\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = JSON.parse( text );\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata !== undefined ) {\n\n\t\t\t\t\tvar type = metadata.type;\n\n\t\t\t\t\tif ( type !== undefined ) {\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'object' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'scene' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' );\n\t\t\t\t\t\t\treturn;\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\tvar object = scope.parse( json, texturePath );\n\t\t\t\tonLoad( object.geometry, object.materials );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tparse: function ( json, texturePath ) {\n\n\t\t\tvar geometry = new Geometry(),\n\t\t\tscale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0;\n\n\t\t\tparseModel( scale );\n\n\t\t\tparseSkin();\n\t\t\tparseMorphing( scale );\n\t\t\tparseAnimations();\n\n\t\t\tgeometry.computeFaceNormals();\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\tfunction parseModel( scale ) {\n\n\t\t\t\tfunction isBitSet( value, position ) {\n\n\t\t\t\t\treturn value & ( 1 << position );\n\n\t\t\t\t}\n\n\t\t\t\tvar i, j, fi,\n\n\t\t\t\toffset, zLength,\n\n\t\t\tcolorIndex, normalIndex, uvIndex, materialIndex,\n\n\t\t\t\ttype,\n\t\t\t\tisQuad,\n\t\t\t\thasMaterial,\n\t\t\t\thasFaceVertexUv,\n\t\t\t\thasFaceNormal, hasFaceVertexNormal,\n\t\t\t\thasFaceColor, hasFaceVertexColor,\n\n\t\t\tvertex, face, faceA, faceB, hex, normal,\n\n\t\t\t\tuvLayer, uv, u, v,\n\n\t\t\t\tfaces = json.faces,\n\t\t\t\tvertices = json.vertices,\n\t\t\t\tnormals = json.normals,\n\t\t\t\tcolors = json.colors,\n\n\t\t\t\tnUvLayers = 0;\n\n\t\t\t\tif ( json.uvs !== undefined ) {\n\n\t\t\t\t\t// disregard empty arrays\n\n\t\t\t\t\tfor ( i = 0; i < json.uvs.length; i ++ ) {\n\n\t\t\t\t\t\tif ( json.uvs[ i ].length ) nUvLayers ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\tgeometry.faceVertexUvs[ i ] = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = vertices.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\tvertex = new Vector3();\n\n\t\t\t\t\tvertex.x = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.y = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.z = vertices[ offset ++ ] * scale;\n\n\t\t\t\t\tgeometry.vertices.push( vertex );\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = faces.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\ttype = faces[ offset ++ ];\n\n\n\t\t\t\t\tisQuad = isBitSet( type, 0 );\n\t\t\t\t\thasMaterial = isBitSet( type, 1 );\n\t\t\t\t\thasFaceVertexUv = isBitSet( type, 3 );\n\t\t\t\t\thasFaceNormal = isBitSet( type, 4 );\n\t\t\t\t\thasFaceVertexNormal = isBitSet( type, 5 );\n\t\t\t\t\thasFaceColor\t = isBitSet( type, 6 );\n\t\t\t\t\thasFaceVertexColor = isBitSet( type, 7 );\n\n\t\t\t\t\t// console.log(\"type\", type, \"bits\", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);\n\n\t\t\t\t\tif ( isQuad ) {\n\n\t\t\t\t\t\tfaceA = new Face3();\n\t\t\t\t\t\tfaceA.a = faces[ offset ];\n\t\t\t\t\t\tfaceA.b = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceA.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\tfaceB = new Face3();\n\t\t\t\t\t\tfaceB.a = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceB.b = faces[ offset + 2 ];\n\t\t\t\t\t\tfaceB.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tfaceA.materialIndex = materialIndex;\n\t\t\t\t\t\t\tfaceB.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi + 1 ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tif ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );\n\t\t\t\t\t\t\t\t\tif ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );\n\n\t\t\t\t\t\t\t\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\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tfaceA.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tfaceB.normal.copy( faceA.normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexNormals.push( normal );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\tfaceA.color.setHex( hex );\n\t\t\t\t\t\t\tfaceB.color.setHex( hex );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( faceA );\n\t\t\t\t\t\tgeometry.faces.push( faceB );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface = new Face3();\n\t\t\t\t\t\tface.a = faces[ offset ++ ];\n\t\t\t\t\t\tface.b = faces[ offset ++ ];\n\t\t\t\t\t\tface.c = faces[ offset ++ ];\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ].push( uv );\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\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tface.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tface.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.color.setHex( colors[ colorIndex ] );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\tface.vertexColors.push( new Color( colors[ colorIndex ] ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( face );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseSkin() {\n\n\t\t\t\tvar influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;\n\n\t\t\t\tif ( json.skinWeights ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar x = json.skinWeights[ i ];\n\t\t\t\t\t\tvar y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;\n\t\t\t\t\t\tvar z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;\n\t\t\t\t\t\tvar w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinWeights.push( new Vector4( x, y, z, w ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.skinIndices ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar a = json.skinIndices[ i ];\n\t\t\t\t\t\tvar b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;\n\t\t\t\t\t\tvar c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;\n\t\t\t\t\t\tvar d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinIndices.push( new Vector4( a, b, c, d ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.bones = json.bones;\n\n\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {\n\n\t\t\t\t\tconsole.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +\n\t\t\t\t\t\tgeometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseMorphing( scale ) {\n\n\t\t\t\tif ( json.morphTargets !== undefined ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tgeometry.morphTargets[ i ] = {};\n\t\t\t\t\t\tgeometry.morphTargets[ i ].name = json.morphTargets[ i ].name;\n\t\t\t\t\t\tgeometry.morphTargets[ i ].vertices = [];\n\n\t\t\t\t\t\tvar dstVertices = geometry.morphTargets[ i ].vertices;\n\t\t\t\t\t\tvar srcVertices = json.morphTargets[ i ].vertices;\n\n\t\t\t\t\t\tfor ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {\n\n\t\t\t\t\t\t\tvar vertex = new Vector3();\n\t\t\t\t\t\t\tvertex.x = srcVertices[ v ] * scale;\n\t\t\t\t\t\t\tvertex.y = srcVertices[ v + 1 ] * scale;\n\t\t\t\t\t\t\tvertex.z = srcVertices[ v + 2 ] * scale;\n\n\t\t\t\t\t\t\tdstVertices.push( vertex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.morphColors !== undefined && json.morphColors.length > 0 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.JSONLoader: \"morphColors\" no longer supported. Using them as face colors.' );\n\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar morphColors = json.morphColors[ 0 ].colors;\n\n\t\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tfaces[ i ].color.fromArray( morphColors, i * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseAnimations() {\n\n\t\t\t\tvar outputAnimations = [];\n\n\t\t\t\t// parse old style Bone/Hierarchy animations\n\t\t\t\tvar animations = [];\n\n\t\t\t\tif ( json.animation !== undefined ) {\n\n\t\t\t\t\tanimations.push( json.animation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.animations !== undefined ) {\n\n\t\t\t\t\tif ( json.animations.length ) {\n\n\t\t\t\t\t\tanimations = animations.concat( json.animations );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tanimations.push( json.animations );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0; i < animations.length; i ++ ) {\n\n\t\t\t\t\tvar clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones );\n\t\t\t\t\tif ( clip ) outputAnimations.push( clip );\n\n\t\t\t\t}\n\n\t\t\t\t// parse implicit morph animations\n\t\t\t\tif ( geometry.morphTargets ) {\n\n\t\t\t\t\t// TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary.\n\t\t\t\t\tvar morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );\n\t\t\t\t\toutputAnimations = outputAnimations.concat( morphAnimationClips );\n\n\t\t\t\t}\n\n\t\t\t\tif ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;\n\n\t\t\t}\n\n\t\t\tif ( json.materials === undefined || json.materials.length === 0 ) {\n\n\t\t\t\treturn { geometry: geometry };\n\n\t\t\t} else {\n\n\t\t\t\tvar materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin );\n\n\t\t\t\treturn { geometry: geometry, materials: materials };\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ObjectLoader ( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.texturePath = '';\n\n\t}\n\n\tObject.assign( ObjectLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( this.texturePath === '' ) {\n\n\t\t\t\tthis.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );\n\n\t\t\t}\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tscope.parse( JSON.parse( text ), onLoad );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\n\t\t},\n\n\t\tparse: function ( json, onLoad ) {\n\n\t\t\tvar geometries = this.parseGeometries( json.geometries );\n\n\t\t\tvar images = this.parseImages( json.images, function () {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t} );\n\n\t\t\tvar textures = this.parseTextures( json.textures, images );\n\t\t\tvar materials = this.parseMaterials( json.materials, textures );\n\n\t\t\tvar object = this.parseObject( json.object, geometries, materials );\n\n\t\t\tif ( json.animations ) {\n\n\t\t\t\tobject.animations = this.parseAnimations( json.animations );\n\n\t\t\t}\n\n\t\t\tif ( json.images === undefined || json.images.length === 0 ) {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t}\n\n\t\t\treturn object;\n\n\t\t},\n\n\t\tparseGeometries: function ( json ) {\n\n\t\t\tvar geometries = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar geometryLoader = new JSONLoader();\n\t\t\t\tvar bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar geometry;\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\t\tcase 'PlaneGeometry':\n\t\t\t\t\t\tcase 'PlaneBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BoxGeometry':\n\t\t\t\t\t\tcase 'BoxBufferGeometry':\n\t\t\t\t\t\tcase 'CubeGeometry': // backwards compatible\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.depth,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.depthSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CircleGeometry':\n\t\t\t\t\t\tcase 'CircleBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CylinderGeometry':\n\t\t\t\t\t\tcase 'CylinderBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radiusTop,\n\t\t\t\t\t\t\t\tdata.radiusBottom,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'ConeGeometry':\n\t\t\t\t\t\tcase 'ConeBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'SphereGeometry':\n\t\t\t\t\t\tcase 'SphereBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'DodecahedronGeometry':\n\t\t\t\t\t\tcase 'IcosahedronGeometry':\n\t\t\t\t\t\tcase 'OctahedronGeometry':\n\t\t\t\t\t\tcase 'TetrahedronGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.detail\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'RingGeometry':\n\t\t\t\t\t\tcase 'RingBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.innerRadius,\n\t\t\t\t\t\t\t\tdata.outerRadius,\n\t\t\t\t\t\t\t\tdata.thetaSegments,\n\t\t\t\t\t\t\t\tdata.phiSegments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusGeometry':\n\t\t\t\t\t\tcase 'TorusBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.arc\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusKnotGeometry':\n\t\t\t\t\t\tcase 'TorusKnotBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.p,\n\t\t\t\t\t\t\t\tdata.q\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'LatheGeometry':\n\t\t\t\t\t\tcase 'LatheBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.points,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\t\tgeometry = geometryLoader.parse( data.data, this.texturePath ).geometry;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\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\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\n\t\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometries;\n\n\t\t},\n\n\t\tparseMaterials: function ( json, textures ) {\n\n\t\t\tvar materials = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar loader = new MaterialLoader();\n\t\t\t\tloader.setTextures( textures );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar material = loader.parse( json[ i ] );\n\t\t\t\t\tmaterials[ material.uuid ] = material;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn materials;\n\n\t\t},\n\n\t\tparseAnimations: function ( json ) {\n\n\t\t\tvar animations = [];\n\n\t\t\tfor ( var i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tvar clip = AnimationClip.parse( json[ i ] );\n\n\t\t\t\tanimations.push( clip );\n\n\t\t\t}\n\n\t\t\treturn animations;\n\n\t\t},\n\n\t\tparseImages: function ( json, onLoad ) {\n\n\t\t\tvar scope = this;\n\t\t\tvar images = {};\n\n\t\t\tfunction loadImage( url ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\treturn loader.load( url, function () {\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, undefined, function () {\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\t\tvar manager = new LoadingManager( onLoad );\n\n\t\t\t\tvar loader = new ImageLoader( manager );\n\t\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar image = json[ i ];\n\t\t\t\t\tvar path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url;\n\n\t\t\t\t\timages[ image.uuid ] = loadImage( path );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn images;\n\n\t\t},\n\n\t\tparseTextures: function ( json, images ) {\n\n\t\t\tfunction parseConstant( value, type ) {\n\n\t\t\t\tif ( typeof( value ) === 'number' ) return value;\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\t\treturn type[ value ];\n\n\t\t\t}\n\n\t\t\tvar textures = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar texture = new Texture( images[ data.image ] );\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TextureMapping );\n\n\t\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TextureWrapping );\n\t\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TextureWrapping );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TextureFilter );\n\t\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TextureFilter );\n\t\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn textures;\n\n\t\t},\n\n\t\tparseObject: function () {\n\n\t\t\tvar matrix = new Matrix4();\n\n\t\t\treturn function parseObject( data, geometries, materials ) {\n\n\t\t\t\tvar object;\n\n\t\t\t\tfunction getGeometry( name ) {\n\n\t\t\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn geometries[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tfunction getMaterial( name ) {\n\n\t\t\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn materials[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'Scene':\n\n\t\t\t\t\t\tobject = new Scene();\n\n\t\t\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\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\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'AmbientLight':\n\n\t\t\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'DirectionalLight':\n\n\t\t\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\n\t\t\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\n\t\t\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\n\t\t\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Mesh':\n\n\t\t\t\t\t\tvar geometry = getGeometry( data.geometry );\n\t\t\t\t\t\tvar material = getMaterial( data.material );\n\n\t\t\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 ) {\n\n\t\t\t\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LOD':\n\n\t\t\t\t\t\tobject = new LOD();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Line':\n\n\t\t\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LineSegments':\n\n\t\t\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointCloud':\n\t\t\t\t\tcase 'Points':\n\n\t\t\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Sprite':\n\n\t\t\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Group':\n\n\t\t\t\t\t\tobject = new Group();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tobject = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t\tobject.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) object.name = data.name;\n\t\t\t\tif ( data.matrix !== undefined ) {\n\n\t\t\t\t\tmatrix.fromArray( data.matrix );\n\t\t\t\t\tmatrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\t\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\t\t\tif ( data.shadow ) {\n\n\t\t\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\t\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\n\t\t\t\tif ( data.children !== undefined ) {\n\n\t\t\t\t\tfor ( var child in data.children ) {\n\n\t\t\t\t\t\tobject.add( this.parseObject( data.children[ child ], geometries, materials ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.type === 'LOD' ) {\n\n\t\t\t\t\tvar levels = data.levels;\n\n\t\t\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\t\t\tvar level = levels[ l ];\n\t\t\t\t\t\tvar child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn object;\n\n\t\t\t};\n\n\t\t}()\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Extensible curve object\n\t *\n\t * Some common of Curve methods\n\t * .getPoint(t), getTangent(t)\n\t * .getPointAt(u), getTangentAt(u)\n\t * .getPoints(), .getSpacedPoints()\n\t * .getLength()\n\t * .updateArcLengths()\n\t *\n\t * This following classes subclasses THREE.Curve:\n\t *\n\t * -- 2d classes --\n\t * THREE.LineCurve\n\t * THREE.QuadraticBezierCurve\n\t * THREE.CubicBezierCurve\n\t * THREE.SplineCurve\n\t * THREE.ArcCurve\n\t * THREE.EllipseCurve\n\t *\n\t * -- 3d classes --\n\t * THREE.LineCurve3\n\t * THREE.QuadraticBezierCurve3\n\t * THREE.CubicBezierCurve3\n\t * THREE.SplineCurve3\n\t *\n\t * A series of curves can be represented as a THREE.CurvePath\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tAbstract Curve base class\n\t **************************************************************/\n\n\tfunction Curve() {}\n\n\tCurve.prototype = {\n\n\t\tconstructor: Curve,\n\n\t\t// Virtual base class method to overwrite and implement in subclasses\n\t\t//\t- t [0 .. 1]\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tconsole.warn( \"THREE.Curve: Warning, getPoint() not implemented!\" );\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// Get point at relative position in curve according to arc length\n\t\t// - u [0 .. 1]\n\n\t\tgetPointAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getPoint( t );\n\n\t\t},\n\n\t\t// Get sequence of points using getPoint( t )\n\n\t\tgetPoints: function ( divisions ) {\n\n\t\t\tif ( ! divisions ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get sequence of points using getPointAt( u )\n\n\t\tgetSpacedPoints: function ( divisions ) {\n\n\t\t\tif ( ! divisions ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get total curve arc length\n\n\t\tgetLength: function () {\n\n\t\t\tvar lengths = this.getLengths();\n\t\t\treturn lengths[ lengths.length - 1 ];\n\n\t\t},\n\n\t\t// Get list of cumulative segment lengths\n\n\t\tgetLengths: function ( divisions ) {\n\n\t\t\tif ( ! divisions ) divisions = ( this.__arcLengthDivisions ) ? ( this.__arcLengthDivisions ) : 200;\n\n\t\t\tif ( this.cacheArcLengths\n\t\t\t\t&& ( this.cacheArcLengths.length === divisions + 1 )\n\t\t\t\t&& ! this.needsUpdate ) {\n\n\t\t\t\t//console.log( \"cached\", this.cacheArcLengths );\n\t\t\t\treturn this.cacheArcLengths;\n\n\t\t\t}\n\n\t\t\tthis.needsUpdate = false;\n\n\t\t\tvar cache = [];\n\t\t\tvar current, last = this.getPoint( 0 );\n\t\t\tvar p, sum = 0;\n\n\t\t\tcache.push( 0 );\n\n\t\t\tfor ( p = 1; p <= divisions; p ++ ) {\n\n\t\t\t\tcurrent = this.getPoint ( p / divisions );\n\t\t\t\tsum += current.distanceTo( last );\n\t\t\t\tcache.push( sum );\n\t\t\t\tlast = current;\n\n\t\t\t}\n\n\t\t\tthis.cacheArcLengths = cache;\n\n\t\t\treturn cache; // { sums: cache, sum:sum }; Sum is in the last element.\n\n\t\t},\n\n\t\tupdateArcLengths: function() {\n\n\t\t\tthis.needsUpdate = true;\n\t\t\tthis.getLengths();\n\n\t\t},\n\n\t\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\t\tgetUtoTmapping: function ( u, distance ) {\n\n\t\t\tvar arcLengths = this.getLengths();\n\n\t\t\tvar i = 0, il = arcLengths.length;\n\n\t\t\tvar targetArcLength; // The targeted u distance value to get\n\n\t\t\tif ( distance ) {\n\n\t\t\t\ttargetArcLength = distance;\n\n\t\t\t} else {\n\n\t\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t\t}\n\n\t\t\t//var time = Date.now();\n\n\t\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\t\tvar low = 0, high = il - 1, comparison;\n\n\t\t\twhile ( low <= high ) {\n\n\t\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\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\t\tlow = i + 1;\n\n\t\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\t\thigh = i - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thigh = i;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// DONE\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ti = high;\n\n\t\t\t//console.log('b' , i, low, high, Date.now()- time);\n\n\t\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\t\tvar t = i / ( il - 1 );\n\t\t\t\treturn t;\n\n\t\t\t}\n\n\t\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\t\tvar lengthBefore = arcLengths[ i ];\n\t\t\tvar lengthAfter = arcLengths[ i + 1 ];\n\n\t\t\tvar segmentLength = lengthAfter - lengthBefore;\n\n\t\t\t// determine where we are between the 'before' and 'after' points\n\n\t\t\tvar segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t\t// add that fractional amount to t\n\n\t\t\tvar t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\t\treturn t;\n\n\t\t},\n\n\t\t// Returns a unit vector tangent at t\n\t\t// In case any sub curve does not implement its tangent derivation,\n\t\t// 2 points a small delta apart will be used to find its gradient\n\t\t// which seems to give a reasonable approximation\n\n\t\tgetTangent: function( t ) {\n\n\t\t\tvar delta = 0.0001;\n\t\t\tvar t1 = t - delta;\n\t\t\tvar t2 = t + delta;\n\n\t\t\t// Capping in case of danger\n\n\t\t\tif ( t1 < 0 ) t1 = 0;\n\t\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\t\tvar pt1 = this.getPoint( t1 );\n\t\t\tvar pt2 = this.getPoint( t2 );\n\n\t\t\tvar vec = pt2.clone().sub( pt1 );\n\t\t\treturn vec.normalize();\n\n\t\t},\n\n\t\tgetTangentAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getTangent( t );\n\n\t\t},\n\n\t\tcomputeFrenetFrames: function ( segments, closed ) {\n\n\t\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\t\tvar normal = new Vector3();\n\n\t\t\tvar tangents = [];\n\t\t\tvar normals = [];\n\t\t\tvar binormals = [];\n\n\t\t\tvar vec = new Vector3();\n\t\t\tvar mat = new Matrix4();\n\n\t\t\tvar i, u, theta;\n\n\t\t\t// compute the tangent vectors for each segment on the curve\n\n\t\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\t\tu = i / segments;\n\n\t\t\t\ttangents[ i ] = this.getTangentAt( u );\n\t\t\t\ttangents[ i ].normalize();\n\n\t\t\t}\n\n\t\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t\t// and in the direction of the minimum tangent xyz component\n\n\t\t\tnormals[ 0 ] = new Vector3();\n\t\t\tbinormals[ 0 ] = new Vector3();\n\t\t\tvar min = Number.MAX_VALUE;\n\t\t\tvar tx = Math.abs( tangents[ 0 ].x );\n\t\t\tvar ty = Math.abs( tangents[ 0 ].y );\n\t\t\tvar tz = Math.abs( tangents[ 0 ].z );\n\n\t\t\tif ( tx <= min ) {\n\n\t\t\t\tmin = tx;\n\t\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( ty <= min ) {\n\n\t\t\t\tmin = ty;\n\t\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t\t}\n\n\t\t\tif ( tz <= min ) {\n\n\t\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t\t}\n\n\t\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\t\tvec.normalize();\n\n\t\t\t\t\ttheta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t\t}\n\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\t\tif ( closed === true ) {\n\n\t\t\t\ttheta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\t\ttheta /= segments;\n\n\t\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\t\ttheta = - theta;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t\t// twist a little...\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttangents: tangents,\n\t\t\t\tnormals: normals,\n\t\t\t\tbinormals: binormals\n\t\t\t};\n\n\t\t}\n\n\t};\n\n\t// TODO: Transformation for Curves?\n\n\t/**************************************************************\n\t *\t3D Curves\n\t **************************************************************/\n\n\t// A Factory method for creating new curve subclasses\n\n\tCurve.create = function ( constructor, getPointFunc ) {\n\n\t\tconstructor.prototype = Object.create( Curve.prototype );\n\t\tconstructor.prototype.constructor = constructor;\n\t\tconstructor.prototype.getPoint = getPointFunc;\n\n\t\treturn constructor;\n\n\t};\n\n\t/**************************************************************\n\t *\tLine\n\t **************************************************************/\n\n\tfunction LineCurve( v1, v2 ) {\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve.prototype = Object.create( Curve.prototype );\n\tLineCurve.prototype.constructor = LineCurve;\n\n\tLineCurve.prototype.isLineCurve = true;\n\n\tLineCurve.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar point = this.v2.clone().sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\treturn point;\n\n\t};\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\n\tLineCurve.prototype.getPointAt = function ( u ) {\n\n\t\treturn this.getPoint( u );\n\n\t};\n\n\tLineCurve.prototype.getTangent = function( t ) {\n\n\t\tvar tangent = this.v2.clone().sub( this.v1 );\n\n\t\treturn tangent.normalize();\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tCurved Path - a curve path is simply a array of connected\n\t * curves, but retains the api of a curve\n\t **************************************************************/\n\n\tfunction CurvePath() {\n\n\t\tthis.curves = [];\n\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tCurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {\n\n\t\tconstructor: CurvePath,\n\n\t\tadd: function ( curve ) {\n\n\t\t\tthis.curves.push( curve );\n\n\t\t},\n\n\t\tclosePath: function () {\n\n\t\t\t// Add a line curve if start and end of lines are not connected\n\t\t\tvar startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\t\tvar endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tvar d = t * this.getLength();\n\t\t\tvar curveLengths = this.getCurveLengths();\n\t\t\tvar i = 0;\n\n\t\t\t// To think about boundaries points.\n\n\t\t\twhile ( i < curveLengths.length ) {\n\n\t\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\t\tvar diff = curveLengths[ i ] - d;\n\t\t\t\t\tvar curve = this.curves[ i ];\n\n\t\t\t\t\tvar segmentLength = curve.getLength();\n\t\t\t\t\tvar u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\t\treturn curve.getPointAt( u );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t\t// loop where sum != 0, sum > d , sum+1 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\tpoints.push( points[ 0 ] );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t/**************************************************************\n\t\t *\tCreate Geometries Helpers\n\t\t **************************************************************/\n\n\t\t/// Generate geometry from path points (for Line or Points objects)\n\n\t\tcreatePointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\t// Generate geometry from equidistant sampling along the path\n\n\t\tcreateSpacedPointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getSpacedPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\tcreateGeometry: function ( points ) {\n\n\t\t\tvar geometry = new Geometry();\n\n\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tvar point = points[ i ];\n\t\t\t\tgeometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\t/**************************************************************\n\t *\tEllipse curve\n\t **************************************************************/\n\n\tfunction EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\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 || 0;\n\n\t}\n\n\tEllipseCurve.prototype = Object.create( Curve.prototype );\n\tEllipseCurve.prototype.constructor = EllipseCurve;\n\n\tEllipseCurve.prototype.isEllipseCurve = true;\n\n\tEllipseCurve.prototype.getPoint = function( t ) {\n\n\t\tvar twoPi = Math.PI * 2;\n\t\tvar deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tvar 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\tvar angle = this.aStartAngle + t * deltaAngle;\n\t\tvar x = this.aX + this.xRadius * Math.cos( angle );\n\t\tvar y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tvar cos = Math.cos( this.aRotation );\n\t\t\tvar sin = Math.sin( this.aRotation );\n\n\t\t\tvar tx = x - this.aX;\n\t\t\tvar 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 new Vector2( x, y );\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tvar CurveUtils = {\n\n\t\ttangentQuadraticBezier: function ( t, p0, p1, p2 ) {\n\n\t\t\treturn 2 * ( 1 - t ) * ( p1 - p0 ) + 2 * t * ( p2 - p1 );\n\n\t\t},\n\n\t\t// Puay Bing, thanks for helping with this derivative!\n\n\t\ttangentCubicBezier: function ( t, p0, p1, p2, p3 ) {\n\n\t\t\treturn - 3 * p0 * ( 1 - t ) * ( 1 - t ) +\n\t\t\t\t3 * p1 * ( 1 - t ) * ( 1 - t ) - 6 * t * p1 * ( 1 - t ) +\n\t\t\t\t6 * t * p2 * ( 1 - t ) - 3 * t * t * p2 +\n\t\t\t\t3 * t * t * p3;\n\n\t\t},\n\n\t\ttangentSpline: function ( t, p0, p1, p2, p3 ) {\n\n\t\t\t// To check if my formulas are correct\n\n\t\t\tvar h00 = 6 * t * t - 6 * t; \t// derived from 2t^3 − 3t^2 + 1\n\t\t\tvar h10 = 3 * t * t - 4 * t + 1; // t^3 − 2t^2 + t\n\t\t\tvar h01 = - 6 * t * t + 6 * t; \t// − 2t3 + 3t2\n\t\t\tvar h11 = 3 * t * t - 2 * t;\t// t3 − t2\n\n\t\t\treturn h00 + h10 + h01 + h11;\n\n\t\t},\n\n\t\t// Catmull-Rom\n\n\t\tinterpolate: function( p0, p1, p2, p3, t ) {\n\n\t\t\tvar v0 = ( p2 - p0 ) * 0.5;\n\t\t\tvar v1 = ( p3 - p1 ) * 0.5;\n\t\t\tvar t2 = t * t;\n\t\t\tvar t3 = t * t2;\n\t\t\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t\t}\n\n\t};\n\n\t/**************************************************************\n\t *\tSpline curve\n\t **************************************************************/\n\n\tfunction SplineCurve( points /* array of Vector2 */ ) {\n\n\t\tthis.points = ( points === undefined ) ? [] : points;\n\n\t}\n\n\tSplineCurve.prototype = Object.create( Curve.prototype );\n\tSplineCurve.prototype.constructor = SplineCurve;\n\n\tSplineCurve.prototype.isSplineCurve = true;\n\n\tSplineCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar point = ( points.length - 1 ) * t;\n\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tvar point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tvar point1 = points[ intPoint ];\n\t\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tvar interpolate = CurveUtils.interpolate;\n\n\t\treturn new Vector2(\n\t\t\tinterpolate( point0.x, point1.x, point2.x, point3.x, weight ),\n\t\t\tinterpolate( point0.y, point1.y, point2.y, point3.y, weight )\n\t\t);\n\n\t};\n\n\t/**************************************************************\n\t *\tCubic Bezier curve\n\t **************************************************************/\n\n\tfunction CubicBezierCurve( v0, v1, v2, v3 ) {\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\tCubicBezierCurve.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve.prototype.constructor = CubicBezierCurve;\n\n\tCubicBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar b3 = ShapeUtils.b3;\n\n\t\treturn new Vector2(\n\t\t\tb3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ),\n\t\t\tb3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y )\n\t\t);\n\n\t};\n\n\tCubicBezierCurve.prototype.getTangent = function( t ) {\n\n\t\tvar tangentCubicBezier = CurveUtils.tangentCubicBezier;\n\n\t\treturn new Vector2(\n\t\t\ttangentCubicBezier( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ),\n\t\t\ttangentCubicBezier( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y )\n\t\t).normalize();\n\n\t};\n\n\t/**************************************************************\n\t *\tQuadratic Bezier curve\n\t **************************************************************/\n\n\n\tfunction QuadraticBezierCurve( v0, v1, v2 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;\n\n\n\tQuadraticBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar b2 = ShapeUtils.b2;\n\n\t\treturn new Vector2(\n\t\t\tb2( t, this.v0.x, this.v1.x, this.v2.x ),\n\t\t\tb2( t, this.v0.y, this.v1.y, this.v2.y )\n\t\t);\n\n\t};\n\n\n\tQuadraticBezierCurve.prototype.getTangent = function( t ) {\n\n\t\tvar tangentQuadraticBezier = CurveUtils.tangentQuadraticBezier;\n\n\t\treturn new Vector2(\n\t\t\ttangentQuadraticBezier( t, this.v0.x, this.v1.x, this.v2.x ),\n\t\t\ttangentQuadraticBezier( t, this.v0.y, this.v1.y, this.v2.y )\n\t\t).normalize();\n\n\t};\n\n\tvar PathPrototype = Object.assign( Object.create( CurvePath.prototype ), {\n\n\t\tfromPoints: function ( vectors ) {\n\n\t\t\tthis.moveTo( vectors[ 0 ].x, vectors[ 0 ].y );\n\n\t\t\tfor ( var i = 1, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lineTo( vectors[ i ].x, vectors[ i ].y );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tvar curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tvar curve = new QuadraticBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tvar curve = new CubicBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts /*Array of Vector*/ ) {\n\n\t\t\tvar npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\t\tvar curve = new SplineCurve( npts );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\t},\n\n\t\tarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tabsarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t},\n\n\t\tabsellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t\t// if a previous curve is present, attempt to join\n\t\t\t\tvar firstPoint = curve.getPoint( 0 );\n\n\t\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tvar lastPoint = curve.getPoint( 1 );\n\t\t\tthis.currentPoint.copy( lastPoint );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Defines a 2d shape plane using paths.\n\t **/\n\n\t// STEP 1 Create a path.\n\t// STEP 2 Turn path into shape.\n\t// STEP 3 ExtrudeGeometry takes in Shape/Shapes\n\t// STEP 3a - Extract points from each shape, turn to vertices\n\t// STEP 3b - Triangulate each shape, add faces.\n\n\tfunction Shape() {\n\n\t\tPath.apply( this, arguments );\n\n\t\tthis.holes = [];\n\n\t}\n\n\tShape.prototype = Object.assign( Object.create( PathPrototype ), {\n\n\t\tconstructor: Shape,\n\n\t\tgetPointsHoles: function ( divisions ) {\n\n\t\t\tvar holesPts = [];\n\n\t\t\tfor ( var i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t\t}\n\n\t\t\treturn holesPts;\n\n\t\t},\n\n\t\t// Get points of shape and holes (keypoints based on segments parameter)\n\n\t\textractAllPoints: function ( divisions ) {\n\n\t\t\treturn {\n\n\t\t\t\tshape: this.getPoints( divisions ),\n\t\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t\t};\n\n\t\t},\n\n\t\textractPoints: function ( divisions ) {\n\n\t\t\treturn this.extractAllPoints( divisions );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Creates free form 2d path using series of points, lines or curves.\n\t *\n\t **/\n\n\tfunction Path( points ) {\n\n\t\tCurvePath.call( this );\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.fromPoints( points );\n\n\t\t}\n\n\t}\n\n\tPath.prototype = PathPrototype;\n\tPathPrototype.constructor = Path;\n\n\n\t// minimal class for proxing functions to Path. Replaces old \"extractSubpaths()\"\n\tfunction ShapePath() {\n\t\tthis.subPaths = [];\n\t\tthis.currentPath = null;\n\t}\n\n\tShapePath.prototype = {\n\t\tmoveTo: function ( x, y ) {\n\t\t\tthis.currentPath = new Path();\n\t\t\tthis.subPaths.push(this.currentPath);\n\t\t\tthis.currentPath.moveTo( x, y );\n\t\t},\n\t\tlineTo: function ( x, y ) {\n\t\t\tthis.currentPath.lineTo( x, y );\n\t\t},\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\t\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\t\t},\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\t\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\t\t},\n\t\tsplineThru: function ( pts ) {\n\t\t\tthis.currentPath.splineThru( pts );\n\t\t},\n\n\t\ttoShapes: function ( isCCW, noHoles ) {\n\n\t\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\t\tvar shapes = [];\n\n\t\t\t\tfor ( var i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar tmpPath = inSubpaths[ i ];\n\n\t\t\t\t\tvar tmpShape = new Shape();\n\t\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t\t}\n\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\t\tvar polyLen = inPolygon.length;\n\n\t\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\t\tvar inside = false;\n\t\t\t\tfor ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\t\tvar edgeLowPt = inPolygon[ p ];\n\t\t\t\t\tvar edgeHighPt = inPolygon[ q ];\n\n\t\t\t\t\tvar edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\t\tvar edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t\t// not parallel\n\t\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\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\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\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\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// parallel or collinear\n\t\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\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\t// continue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn\tinside;\n\n\t\t\t}\n\n\t\t\tvar isClockWise = ShapeUtils.isClockWise;\n\n\t\t\tvar subPaths = this.subPaths;\n\t\t\tif ( subPaths.length === 0 ) return [];\n\n\t\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tvar solid, tmpPath, tmpShape, shapes = [];\n\n\t\t\tif ( subPaths.length === 1 ) {\n\n\t\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\t\ttmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tvar holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\t\tvar betterShapeHoles = [];\n\t\t\tvar newShapes = [];\n\t\t\tvar newShapeHoles = [];\n\t\t\tvar mainIdx = 0;\n\t\t\tvar tmpPoints;\n\n\t\t\tnewShapes[ mainIdx ] = undefined;\n\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\tfor ( var i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\t\ttmpPath = subPaths[ i ];\n\t\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\t\tif ( solid ) {\n\n\t\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t\t//console.log('cw', i);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t\t//console.log('ccw', i);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tif ( newShapes.length > 1 ) {\n\n\t\t\t\tvar ambiguous = false;\n\t\t\t\tvar toChange = [];\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tvar sho = newShapeHoles[ sIdx ];\n\n\t\t\t\t\tfor ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\t\tvar ho = sho[ hIdx ];\n\t\t\t\t\t\tvar hole_unassigned = true;\n\n\t\t\t\t\t\tfor ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );\n\t\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\t// console.log(\"ambiguous: \", ambiguous);\n\t\t\t\tif ( toChange.length > 0 ) {\n\n\t\t\t\t\t// console.log(\"to change: \", toChange);\n\t\t\t\t\tif ( ! ambiguous )\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar tmpHoles;\n\n\t\t\tfor ( var i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\t\tfor ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//console.log(\"shape\", shapes);\n\n\t\t\treturn shapes;\n\n\t\t}\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Font( data ) {\n\n\t\tthis.data = data;\n\n\t}\n\n\tObject.assign( Font.prototype, {\n\n\t\tisFont: true,\n\n\t\tgenerateShapes: function ( text, size, divisions ) {\n\n\t\t\tfunction createPaths( text ) {\n\n\t\t\t\tvar chars = String( text ).split( '' );\n\t\t\t\tvar scale = size / data.resolution;\n\t\t\t\tvar offset = 0;\n\n\t\t\t\tvar paths = [];\n\n\t\t\t\tfor ( var i = 0; i < chars.length; i ++ ) {\n\n\t\t\t\t\tvar ret = createPath( chars[ i ], scale, offset );\n\t\t\t\t\toffset += ret.offset;\n\n\t\t\t\t\tpaths.push( ret.path );\n\n\t\t\t\t}\n\n\t\t\t\treturn paths;\n\n\t\t\t}\n\n\t\t\tfunction createPath( c, scale, offset ) {\n\n\t\t\t\tvar glyph = data.glyphs[ c ] || data.glyphs[ '?' ];\n\n\t\t\t\tif ( ! glyph ) return;\n\n\t\t\t\tvar path = new ShapePath();\n\n\t\t\t\tvar pts = [], b2 = ShapeUtils.b2, b3 = ShapeUtils.b3;\n\t\t\t\tvar x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste;\n\n\t\t\t\tif ( glyph.o ) {\n\n\t\t\t\t\tvar outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\t\t\t\tfor ( var i = 0, l = outline.length; i < l; ) {\n\n\t\t\t\t\t\tvar action = outline[ i ++ ];\n\n\t\t\t\t\t\tswitch ( action ) {\n\n\t\t\t\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tb2( t, cpx0, cpx1, cpx );\n\t\t\t\t\t\t\t\t\t\tb2( t, cpy0, cpy1, cpy );\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\tbreak;\n\n\t\t\t\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale;\n\t\t\t\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy2 = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tb3( t, cpx0, cpx1, cpx2, cpx );\n\t\t\t\t\t\t\t\t\t\tb3( t, cpy0, cpy1, cpy2, cpy );\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\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn { offset: glyph.ha * scale, path: path };\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( size === undefined ) size = 100;\n\t\t\tif ( divisions === undefined ) divisions = 4;\n\n\t\t\tvar data = this.data;\n\n\t\t\tvar paths = createPaths( text );\n\t\t\tvar shapes = [];\n\n\t\t\tfor ( var p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FontLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FontLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\t\t\t\tjson = JSON.parse( text.substring( 65, text.length - 2 ) );\n\n\t\t\t\t}\n\n\t\t\t\tvar font = scope.parse( json );\n\n\t\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\treturn new Font( json );\n\n\t\t}\n\n\t} );\n\n\tvar context;\n\n\tfunction getAudioContext() {\n\n\t\tif ( context === undefined ) {\n\n\t\t\tcontext = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn context;\n\n\t}\n\n\t/**\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction AudioLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( AudioLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar context = getAudioContext();\n\n\t\t\t\tcontext.decodeAudioData( buffer, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction StereoCamera() {\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}\n\n\tObject.assign( StereoCamera.prototype, {\n\n\t\tupdate: ( function () {\n\n\t\t\tvar instance, focus, fov, aspect, near, far, zoom;\n\n\t\t\tvar eyeRight = new Matrix4();\n\t\t\tvar eyeLeft = new Matrix4();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov ||\n\t\t\t\t\t\t\t\t\t\t\t\t\taspect !== camera.aspect * this.aspect || near !== camera.near ||\n\t\t\t\t\t\t\t\t\t\t\t\t\tfar !== camera.far || zoom !== camera.zoom;\n\n\t\t\t\tif ( needsUpdate ) {\n\n\t\t\t\t\tinstance = this;\n\t\t\t\t\tfocus = camera.focus;\n\t\t\t\t\tfov = camera.fov;\n\t\t\t\t\taspect = camera.aspect * this.aspect;\n\t\t\t\t\tnear = camera.near;\n\t\t\t\t\tfar = camera.far;\n\t\t\t\t\tzoom = camera.zoom;\n\n\t\t\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t\t\tvar projectionMatrix = camera.projectionMatrix.clone();\n\t\t\t\t\tvar eyeSep = this.eyeSep / 2;\n\t\t\t\t\tvar eyeSepOnProjection = eyeSep * near / focus;\n\t\t\t\t\tvar ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom;\n\t\t\t\t\tvar xmin, xmax;\n\n\t\t\t\t\t// translate xOffset\n\n\t\t\t\t\teyeLeft.elements[ 12 ] = - eyeSep;\n\t\t\t\t\teyeRight.elements[ 12 ] = eyeSep;\n\n\t\t\t\t\t// for left eye\n\n\t\t\t\t\txmin = - ymax * aspect + eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect + eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t\t// for right eye\n\n\t\t\t\t\txmin = - ymax * aspect - eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect - eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\n\t\t\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * Camera for rendering cube maps\n\t *\t- renders scene into axis-aligned cube\n\t *\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CubeCamera( near, far, cubeResolution ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tvar fov = 90, aspect = 1;\n\n\t\tvar cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.up.set( 0, - 1, 0 );\n\t\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\t\tthis.add( cameraPX );\n\n\t\tvar cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.up.set( 0, - 1, 0 );\n\t\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\t\tthis.add( cameraNX );\n\n\t\tvar cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.up.set( 0, 0, 1 );\n\t\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\t\tthis.add( cameraPY );\n\n\t\tvar cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.up.set( 0, 0, - 1 );\n\t\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\t\tthis.add( cameraNY );\n\n\t\tvar cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.up.set( 0, - 1, 0 );\n\t\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\t\tthis.add( cameraPZ );\n\n\t\tvar cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.up.set( 0, - 1, 0 );\n\t\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\t\tthis.add( cameraNZ );\n\n\t\tvar options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };\n\n\t\tthis.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );\n\n\t\tthis.updateCubeMap = function ( renderer, scene ) {\n\n\t\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\t\tvar renderTarget = this.renderTarget;\n\t\t\tvar generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\t\trenderTarget.activeCubeFace = 0;\n\t\t\trenderer.render( scene, cameraPX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 1;\n\t\t\trenderer.render( scene, cameraNX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 2;\n\t\t\trenderer.render( scene, cameraPY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 3;\n\t\t\trenderer.render( scene, cameraNY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 4;\n\t\t\trenderer.render( scene, cameraPZ, renderTarget );\n\n\t\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\t\trenderTarget.activeCubeFace = 5;\n\t\t\trenderer.render( scene, cameraNZ, renderTarget );\n\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t};\n\n\t}\n\n\tCubeCamera.prototype = Object.create( Object3D.prototype );\n\tCubeCamera.prototype.constructor = CubeCamera;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioListener() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = getAudioContext();\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}\n\n\tAudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: AudioListener,\n\n\t\tgetInput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tremoveFilter: function ( ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\t\tthis.gain.connect( this.context.destination );\n\t\t\t\tthis.filter = null;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.filter;\n\n\t\t},\n\n\t\tsetFilter: function ( value ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t\t} else {\n\n\t\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t\t}\n\n\t\t\tthis.filter = value;\n\t\t\tthis.gain.connect( this.filter );\n\t\t\tthis.filter.connect( this.context.destination );\n\n\t\t},\n\n\t\tgetMasterVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\t\tsetMasterVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\t\t\tvar scale = new Vector3();\n\n\t\t\tvar orientation = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tvar listener = this.context.listener;\n\t\t\t\tvar up = this.up;\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, scale );\n\n\t\t\t\torientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t\t\tlistener.setPosition( position.x, position.y, position.z );\n\t\t\t\tlistener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z );\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction Audio( listener ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.context = listener.context;\n\t\tthis.source = this.context.createBufferSource();\n\t\tthis.source.onended = this.onEnded.bind( this );\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.startTime = 0;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis.filters = [];\n\n\t}\n\n\tAudio.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Audio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tsetNodeSource: function ( audioNode ) {\n\n\t\t\tthis.hasPlaybackControl = false;\n\t\t\tthis.sourceType = 'audioNode';\n\t\t\tthis.source = audioNode;\n\t\t\tthis.connect();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetBuffer: function ( audioBuffer ) {\n\n\t\t\tthis.source.buffer = audioBuffer;\n\t\t\tthis.sourceType = 'buffer';\n\n\t\t\tif ( this.autoplay ) this.play();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tplay: function () {\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar source = this.context.createBufferSource();\n\n\t\t\tsource.buffer = this.source.buffer;\n\t\t\tsource.loop = this.source.loop;\n\t\t\tsource.onended = this.source.onended;\n\t\t\tsource.start( 0, this.startTime );\n\t\t\tsource.playbackRate.value = this.playbackRate;\n\n\t\t\tthis.isPlaying = true;\n\n\t\t\tthis.source = source;\n\n\t\t\treturn this.connect();\n\n\t\t},\n\n\t\tpause: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = this.context.currentTime;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = 0;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdisconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilters: function () {\n\n\t\t\treturn this.filters;\n\n\t\t},\n\n\t\tsetFilters: function ( value ) {\n\n\t\t\tif ( ! value ) value = [];\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.disconnect();\n\t\t\t\tthis.filters = value;\n\t\t\t\tthis.connect();\n\n\t\t\t} else {\n\n\t\t\t\tthis.filters = value;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.getFilters()[ 0 ];\n\n\t\t},\n\n\t\tsetFilter: function ( filter ) {\n\n\t\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t\t},\n\n\t\tsetPlaybackRate: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.playbackRate = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.playbackRate.value = this.playbackRate;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetPlaybackRate: function () {\n\n\t\t\treturn this.playbackRate;\n\n\t\t},\n\n\t\tonEnded: function () {\n\n\t\t\tthis.isPlaying = false;\n\n\t\t},\n\n\t\tgetLoop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn this.source.loop;\n\n\t\t},\n\n\t\tsetLoop: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.loop = value;\n\n\t\t},\n\n\t\tgetVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\n\t\tsetVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PositionalAudio( listener ) {\n\n\t\tAudio.call( this, listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tPositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {\n\n\t\tconstructor: PositionalAudio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.panner;\n\n\t\t},\n\n\t\tgetRefDistance: function () {\n\n\t\t\treturn this.panner.refDistance;\n\n\t\t},\n\n\t\tsetRefDistance: function ( value ) {\n\n\t\t\tthis.panner.refDistance = value;\n\n\t\t},\n\n\t\tgetRolloffFactor: function () {\n\n\t\t\treturn this.panner.rolloffFactor;\n\n\t\t},\n\n\t\tsetRolloffFactor: function ( value ) {\n\n\t\t\tthis.panner.rolloffFactor = value;\n\n\t\t},\n\n\t\tgetDistanceModel: function () {\n\n\t\t\treturn this.panner.distanceModel;\n\n\t\t},\n\n\t\tsetDistanceModel: function ( value ) {\n\n\t\t\tthis.panner.distanceModel = value;\n\n\t\t},\n\n\t\tgetMaxDistance: function () {\n\n\t\t\treturn this.panner.maxDistance;\n\n\t\t},\n\n\t\tsetMaxDistance: function ( value ) {\n\n\t\t\tthis.panner.maxDistance = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tposition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tthis.panner.setPosition( position.x, position.y, position.z );\n\n\t\t\t};\n\n\t\t} )()\n\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioAnalyser( audio, fftSize ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\tObject.assign( AudioAnalyser.prototype, {\n\n\t\tgetFrequencyData: function () {\n\n\t\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\t\treturn this.data;\n\n\t\t},\n\n\t\tgetAverageFrequency: function () {\n\n\t\t\tvar value = 0, data = this.getFrequencyData();\n\n\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tvalue += data[ i ];\n\n\t\t\t}\n\n\t\t\treturn value / data.length;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Buffered scene graph property that allows weighted accumulation.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyMixer( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tvar bufferType = Float64Array,\n\t\t\tmixFunction;\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\t\t\tmixFunction = this._slerp;\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\n\t\t\t\tbufferType = Array,\t\tmixFunction = this._select;\t\tbreak;\n\n\t\t\tdefault:\t\t\t\t\tmixFunction = this._lerp;\n\n\t\t}\n\n\t\tthis.buffer = new bufferType( valueSize * 4 );\n\t\t// layout: [ incoming | accu0 | accu1 | orig ]\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\n\t\tthis._mixBufferRegion = mixFunction;\n\n\t\tthis.cumulativeWeight = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\tPropertyMixer.prototype = {\n\n\t\tconstructor: PropertyMixer,\n\n\t\t// accumulate data in the 'incoming' region into 'accu'\n\t\taccumulate: function( accuIndex, weight ) {\n\n\t\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t\t// the weight and shouldn't have made the call in the first place\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tcurrentWeight = this.cumulativeWeight;\n\n\t\t\tif ( currentWeight === 0 ) {\n\n\t\t\t\t// accuN := incoming * weight\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcurrentWeight = weight;\n\n\t\t\t} else {\n\n\t\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\t\tcurrentWeight += weight;\n\t\t\t\tvar mix = weight / currentWeight;\n\t\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = currentWeight;\n\n\t\t},\n\n\t\t// apply the state of 'accu' to the binding when accus differ\n\t\tapply: function( accuIndex ) {\n\n\t\t\tvar stride = this.valueSize,\n\t\t\t\tbuffer = this.buffer,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tweight = this.cumulativeWeight,\n\n\t\t\t\tbinding = this.binding;\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t\tif ( weight < 1 ) {\n\n\t\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\t\tvar originalValueOffset = stride * 3;\n\n\t\t\t\tthis._mixBufferRegion(\n\t\t\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t\t}\n\n\t\t\tfor ( var i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remember the state of the bound property and copy it to both accus\n\t\tsaveOriginalState: function() {\n\n\t\t\tvar binding = this.binding;\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toriginalValueOffset = stride * 3;\n\n\t\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\t\tfor ( var i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t},\n\n\t\t// apply the state previously taken via 'saveOriginalState' to the binding\n\t\trestoreOriginalState: function() {\n\n\t\t\tvar originalValueOffset = this.valueSize * 3;\n\t\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t\t},\n\n\n\t\t// mix functions\n\n\t\t_select: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tif ( t >= 0.5 ) {\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_slerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tQuaternion.slerpFlat( buffer, dstOffset,\n\t\t\t\t\tbuffer, dstOffset, buffer, srcOffset, t );\n\n\t\t},\n\n\t\t_lerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tvar s = 1 - t;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tvar j = dstOffset + i;\n\n\t\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * A reference to a real property in the scene graph.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyBinding( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode(\n\t\t\t\trootNode, this.parsedPath.nodeName ) || rootNode;\n\n\t\tthis.rootNode = rootNode;\n\n\t}\n\n\tPropertyBinding.prototype = {\n\n\t\tconstructor: PropertyBinding,\n\n\t\tgetValue: function getValue_unbound( targetArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.getValue( targetArray, offset );\n\n\t\t\t// Note: This class uses a State pattern on a per-method basis:\n\t\t\t// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n\t\t\t// prototype version of these methods with one that represents\n\t\t\t// the bound state. When the property is not found, the methods\n\t\t\t// become no-ops.\n\n\t\t},\n\n\t\tsetValue: function getValue_unbound( sourceArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.setValue( sourceArray, offset );\n\n\t\t},\n\n\t\t// create getter / setter pair for a property in the scene graph\n\t\tbind: function() {\n\n\t\t\tvar targetObject = this.node,\n\t\t\t\tparsedPath = this.parsedPath,\n\n\t\t\t\tobjectName = parsedPath.objectName,\n\t\t\t\tpropertyName = parsedPath.propertyName,\n\t\t\t\tpropertyIndex = parsedPath.propertyIndex;\n\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\ttargetObject = PropertyBinding.findNode(\n\t\t\t\t\t\tthis.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\t\tthis.node = targetObject;\n\n\t\t\t}\n\n\t\t\t// set fail state so we can just 'return' on error\n\t\t\tthis.getValue = this._getValue_unavailable;\n\t\t\tthis.setValue = this._setValue_unavailable;\n\n\t \t\t// ensure there is a value node\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\tconsole.error( \" trying to update node for track: \" + this.path + \" but it wasn't found.\" );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( objectName ) {\n\n\t\t\t\tvar objectIndex = parsedPath.objectIndex;\n\n\t\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\t\tswitch ( objectName ) {\n\n\t\t\t\t\tcase 'materials':\n\n\t\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material as node does not have a material', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material.materials as node.material does not have a materials array', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bones':\n\n\t\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to bones as node does not have a skeleton', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\t\tfor ( var i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to objectName of node, undefined', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( \" trying to bind to objectIndex of objectName, but is undefined:\", this, targetObject );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// resolve property\n\t\t\tvar nodeProperty = targetObject[ propertyName ];\n\n\t\t\tif ( nodeProperty === undefined ) {\n\n\t\t\t\tvar nodeName = parsedPath.nodeName;\n\n\t\t\t\tconsole.error( \" trying to update property for track: \" + nodeName +\n\t\t\t\t\t\t'.' + propertyName + \" but it wasn't found.\", targetObject );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// determine versioning scheme\n\t\t\tvar versioning = this.Versioning.None;\n\n\t\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\t\tversioning = this.Versioning.NeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t}\n\n\t\t\t// determine how the property gets bound\n\t\t\tvar bindingType = this.BindingType.Direct;\n\n\t\t\tif ( propertyIndex !== undefined ) {\n\t\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\t\tif ( propertyName === \"morphTargetInfluences\" ) {\n\t\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\t// support resolving morphTarget names into indices.\n\t\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphTargets ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) {\n\n\t\t\t\t\t\t\tpropertyIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\t\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else if ( nodeProperty.length !== undefined ) {\n\n\t\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else {\n\n\t\t\t\tthis.propertyName = propertyName;\n\n\t\t\t}\n\n\t\t\t// select getter / setter\n\t\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tthis.node = null;\n\n\t\t\t// back to the prototype version of getValue / setValue\n\t\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\t\tthis.getValue = this._getValue_unbound;\n\t\t\tthis.setValue = this._setValue_unbound;\n\n\t\t}\n\n\t};\n\n\tObject.assign( PropertyBinding.prototype, { // prototype, continued\n\n\t\t// these are used to \"bind\" a nonexistent property\n\t\t_getValue_unavailable: function() {},\n\t\t_setValue_unavailable: function() {},\n\n\t\t// initial state of these methods that calls 'bind'\n\t\t_getValue_unbound: PropertyBinding.prototype.getValue,\n\t\t_setValue_unbound: PropertyBinding.prototype.setValue,\n\n\t\tBindingType: {\n\t\t\tDirect: 0,\n\t\t\tEntireArray: 1,\n\t\t\tArrayElement: 2,\n\t\t\tHasFromToArray: 3\n\t\t},\n\n\t\tVersioning: {\n\t\t\tNone: 0,\n\t\t\tNeedsUpdate: 1,\n\t\t\tMatrixWorldNeedsUpdate: 2\n\t\t},\n\n\t\tGetterByBindingType: [\n\n\t\t\tfunction getValue_direct( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.node[ this.propertyName ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_array( buffer, offset ) {\n\n\t\t\t\tvar source = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tfunction getValue_arrayElement( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_toArray( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t\t\t}\n\n\t\t],\n\n\t\tSetterByBindingTypeAndVersioning: [\n\n\t\t\t[\n\t\t\t\t// Direct\n\n\t\t\t\tfunction setValue_direct( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// EntireArray\n\n\t\t\t\tfunction setValue_array( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// ArrayElement\n\n\t\t\t\tfunction setValue_arrayElement( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// HasToFromArray\n\n\t\t\t\tfunction setValue_fromArray( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t]\n\n\t\t]\n\n\t} );\n\n\tPropertyBinding.Composite =\n\t\t\tfunction( targetGroup, path, optionalParsedPath ) {\n\n\t\tvar parsedPath = optionalParsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t};\n\n\tPropertyBinding.Composite.prototype = {\n\n\t\tconstructor: PropertyBinding.Composite,\n\n\t\tgetValue: function( array, offset ) {\n\n\t\t\tthis.bind(); // bind all binding\n\n\t\t\tvar firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t\t// and only call .getValue on the first\n\t\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t\t},\n\n\t\tsetValue: function( array, offset ) {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t\t}\n\n\t\t},\n\n\t\tbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].bind();\n\n\t\t\t}\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].unbind();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.create = function( root, path, parsedPath ) {\n\n\t\tif ( ! ( (root && root.isAnimationObjectGroup) ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.parseTrackName = function( trackName ) {\n\n\t\t// matches strings in the form of:\n\t\t// nodeName.property\n\t\t// nodeName.property[accessor]\n\t\t// nodeName.material.property[accessor]\n\t\t// uuid.property[accessor]\n\t\t// uuid.objectName[objectIndex].propertyName[propertyIndex]\n\t\t// parentName/nodeName.property\n\t\t// parentName/parentName/nodeName.property[index]\n\t\t// .bone[Armature.DEF_cog].position\n\t\t// scene:helium_balloon_model:helium_balloon_model.position\n\t\t// created and tested via https://regex101.com/#javascript\n\n\t\tvar re = /^((?:\\w+[\\/:])*)(\\w+)?(?:\\.(\\w+)(?:\\[(.+)\\])?)?\\.(\\w+)(?:\\[(.+)\\])?$/;\n\t\tvar matches = re.exec( trackName );\n\n\t\tif ( ! matches ) {\n\n\t\t\tthrow new Error( \"cannot parse trackName at all: \" + trackName );\n\n\t\t}\n\n\t\tvar results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ], \t// allowed to be null, specified root node.\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ],\n\t\t\tpropertyIndex: matches[ 6 ]\t// allowed to be null, specifies that the whole property is set.\n\t\t};\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( \"can not parse propertyName from trackName: \" + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t};\n\n\tPropertyBinding.findNode = function( root, nodeName ) {\n\n\t\tif ( ! nodeName || nodeName === \"\" || nodeName === \"root\" || nodeName === \".\" || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tvar searchSkeleton = function( skeleton ) {\n\n\t\t\t\tfor( var i = 0; i < skeleton.bones.length; i ++ ) {\n\n\t\t\t\t\tvar bone = skeleton.bones[ i ];\n\n\t\t\t\t\tif ( bone.name === nodeName ) {\n\n\t\t\t\t\t\treturn bone;\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar bone = searchSkeleton( root.skeleton );\n\n\t\t\tif ( bone ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tvar searchNodeSubtree = function( children ) {\n\n\t\t\t\tfor( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tvar childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\t/**\n\t *\n\t * A group of objects that receives a shared animation state.\n\t *\n\t * Usage:\n\t *\n\t * \t-\tAdd objects you would otherwise pass as 'root' to the\n\t * \t\tconstructor or the .clipAction method of AnimationMixer.\n\t *\n\t * \t-\tInstead pass this object as 'root'.\n\t *\n\t * \t-\tYou can also add and remove objects later when the mixer\n\t * \t\tis running.\n\t *\n\t * Note:\n\t *\n\t * \tObjects of this class appear as one object to the mixer,\n\t * \tso cache control of the individual objects must be done\n\t * \ton the group.\n\t *\n\t * Limitation:\n\t *\n\t * \t- \tThe animated properties must be compatible among the\n\t * \t\tall objects in the group.\n\t *\n\t * -\tA single property can either be controlled through a\n\t * \ttarget group or directly, but not both.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction AnimationObjectGroup( var_args ) {\n\n\t\tthis.uuid = _Math.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;\t\t\t// threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tvar indices = {};\n\t\tthis._indicesByUUID = indices;\t\t// for bookkeeping\n\n\t\tfor ( var 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 = [];\t\t\t\t\t// inside: string\n\t\tthis._parsedPaths = [];\t\t\t\t// inside: { we don't care, here }\n\t\tthis._bindings = []; \t\t\t\t// inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; \t// inside: indices in these arrays\n\n\t\tvar scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() { return scope._objects.length; },\n\t\t\t\tget inUse() { return this.total - scope.nCachedObjects_; }\n\t\t\t},\n\n\t\t\tget bindingsPerObject() { return scope._bindings.length; }\n\n\t\t};\n\n\t}\n\n\tAnimationObjectGroup.prototype = {\n\n\t\tconstructor: AnimationObjectGroup,\n\n\t\tisAnimationObjectGroup: true,\n\n\t\tadd: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tpaths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index === undefined ) {\n\n\t\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\t\tindex = nObjects ++;\n\t\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\t\tobjects.push( object );\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tbindings[ j ].push(\n\t\t\t\t\t\t\t\tnew PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\t\tvar knownObject = objects[ index ];\n\n\t\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\t\tbinding = new PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( objects[ index ] !== knownObject) {\n\n\t\t\t\t\tconsole.error( \"Different objects with the same UUID \" +\n\t\t\t\t\t\t\t\"detected. Clean the caches or recreate your \" +\n\t\t\t\t\t\t\t\"infrastructure when reloading scenes...\" );\n\n\t\t\t\t} // else the object is already where we want it to be\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\tremove: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\t\tvar lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// remove & forget\n\t\tuncache: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\t\tvar lastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} // cached or active\n\n\t\t\t\t} // if object is known\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\t\tsubscribe_: function( path, parsedPath ) {\n\t\t\t// returns an array of bindings for the given path that is changed\n\t\t\t// according to the contained objects in the group\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ],\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\t\tvar paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tobjects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\t\tindex = bindings.length;\n\n\t\t\tindicesByPath[ path ] = index;\n\n\t\t\tpaths.push( path );\n\t\t\tparsedPaths.push( parsedPath );\n\t\t\tbindings.push( bindingsForPath );\n\n\t\t\tfor ( var i = nCachedObjects,\n\t\t\t\t\tn = objects.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = objects[ i ];\n\n\t\t\t\tbindingsForPath[ i ] =\n\t\t\t\t\t\tnew PropertyBinding( object, path, parsedPath );\n\n\t\t\t}\n\n\t\t\treturn bindingsForPath;\n\n\t\t},\n\n\t\tunsubscribe_: function( path ) {\n\t\t\t// tells the group to forget about a property path and no longer\n\t\t\t// update the array previously obtained with 'subscribe_'\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar paths = this._paths,\n\t\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\t\tbindings = this._bindings,\n\t\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\t\tbindings[ index ] = lastBindings;\n\t\t\t\tbindings.pop();\n\n\t\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\t\tparsedPaths.pop();\n\n\t\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\t\tpaths.pop();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Action provided by AnimationMixer for scheduling clip playback on specific\n\t * objects.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t *\n\t */\n\n\tfunction AnimationAction( mixer, clip, localRoot ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot || null;\n\n\t\tvar tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tvar interpolantSettings = {\n\t\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tvar 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;\t// 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;\t\t\t// for the memory manager\n\t\tthis._byClipCacheIndex = null;\t\t// 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; \t\t// no. of repetitions when looping\n\n\t\tthis.paused = false;\t\t\t\t// false -> zero effective time scale\n\t\tthis.enabled = true;\t\t\t\t// true -> zero effective weight\n\n\t\tthis.clampWhenFinished \t= false;\t// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart \t= true;\t\t// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd\t\t= true;\t\t// clips for start, loop and end\n\n\t}\n\n\tAnimationAction.prototype = {\n\n\t\tconstructor: AnimationAction,\n\n\t\t// State & Scheduling\n\n\t\tplay: function() {\n\n\t\t\tthis._mixer._activateAction( this );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function() {\n\n\t\t\tthis._mixer._deactivateAction( this );\n\n\t\t\treturn this.reset();\n\n\t\t},\n\n\t\treset: function() {\n\n\t\t\tthis.paused = false;\n\t\t\tthis.enabled = true;\n\n\t\t\tthis.time = 0;\t\t\t// restart clip\n\t\t\tthis._loopCount = -1;\t// forget previous loops\n\t\t\tthis._startTime = null;\t// forget scheduling\n\n\t\t\treturn this.stopFading().stopWarping();\n\n\t\t},\n\n\t\tisRunning: function() {\n\n\t\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\t// return true when play has been called\n\t\tisScheduled: function() {\n\n\t\t\treturn this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\tstartAt: function( time ) {\n\n\t\t\tthis._startTime = time;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetLoop: function( mode, repetitions ) {\n\n\t\t\tthis.loop = mode;\n\t\t\tthis.repetitions = repetitions;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Weight\n\n\t\t// set the weight stopping any scheduled fading\n\t\t// although .enabled = false yields an effective weight of zero, this\n\t\t// method does *not* change .enabled, because it would be confusing\n\t\tsetEffectiveWeight: function( weight ) {\n\n\t\t\tthis.weight = weight;\n\n\t\t\t// note: same logic as when updated at runtime\n\t\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\t\treturn this.stopFading();\n\n\t\t},\n\n\t\t// return the weight considering fading and .enabled\n\t\tgetEffectiveWeight: function() {\n\n\t\t\treturn this._effectiveWeight;\n\n\t\t},\n\n\t\tfadeIn: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t\t},\n\n\t\tfadeOut: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t\t},\n\n\t\tcrossFadeFrom: function( fadeOutAction, duration, warp ) {\n\n\t\t\tfadeOutAction.fadeOut( duration );\n\t\t\tthis.fadeIn( duration );\n\n\t\t\tif( warp ) {\n\n\t\t\t\tvar fadeInDuration = this._clip.duration,\n\t\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossFadeTo: function( fadeInAction, duration, warp ) {\n\n\t\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t\t},\n\n\t\tstopFading: function() {\n\n\t\t\tvar weightInterpolant = this._weightInterpolant;\n\n\t\t\tif ( weightInterpolant !== null ) {\n\n\t\t\t\tthis._weightInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Time Scale Control\n\n\t\t// set the weight stopping any scheduled warping\n\t\t// although .paused = true yields an effective time scale of zero, this\n\t\t// method does *not* change .paused, because it would be confusing\n\t\tsetEffectiveTimeScale: function( timeScale ) {\n\n\t\t\tthis.timeScale = timeScale;\n\t\t\tthis._effectiveTimeScale = this.paused ? 0 :timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\t// return the time scale considering warping and .paused\n\t\tgetEffectiveTimeScale: function() {\n\n\t\t\treturn this._effectiveTimeScale;\n\n\t\t},\n\n\t\tsetDuration: function( duration ) {\n\n\t\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\tsyncWith: function( action ) {\n\n\t\t\tthis.time = action.time;\n\t\t\tthis.timeScale = action.timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\thalt: function( duration ) {\n\n\t\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t\t},\n\n\t\twarp: function( startTimeScale, endTimeScale, duration ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._timeScaleInterpolant,\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant(),\n\t\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now;\n\t\t\ttimes[ 1 ] = now + duration;\n\n\t\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstopWarping: function() {\n\n\t\t\tvar timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\t\tthis._timeScaleInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Object Accessors\n\n\t\tgetMixer: function() {\n\n\t\t\treturn this._mixer;\n\n\t\t},\n\n\t\tgetClip: function() {\n\n\t\t\treturn this._clip;\n\n\t\t},\n\n\t\tgetRoot: function() {\n\n\t\t\treturn this._localRoot || this._mixer._root;\n\n\t\t},\n\n\t\t// Interna\n\n\t\t_update: function( time, deltaTime, timeDirection, accuIndex ) {\n\t\t\t// called by the mixer\n\n\t\t\tvar startTime = this._startTime;\n\n\t\t\tif ( startTime !== null ) {\n\n\t\t\t\t// check for scheduled start of action\n\n\t\t\t\tvar timeRunning = ( time - startTime ) * timeDirection;\n\t\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t\t}\n\n\t\t\t\t// start\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\t// apply time scale and advance time\n\n\t\t\tdeltaTime *= this._updateTimeScale( time );\n\t\t\tvar clipTime = this._updateTime( deltaTime );\n\n\t\t\t// note: _updateTime may disable the action resulting in\n\t\t\t// an effective weight of 0\n\n\t\t\tvar weight = this._updateWeight( time );\n\n\t\t\tif ( weight > 0 ) {\n\n\t\t\t\tvar interpolants = this._interpolants;\n\t\t\t\tvar propertyMixers = this._propertyBindings;\n\n\t\t\t\tfor ( var j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_updateWeight: function( time ) {\n\n\t\t\tvar weight = 0;\n\n\t\t\tif ( this.enabled ) {\n\n\t\t\t\tweight = this.weight;\n\t\t\t\tvar interpolant = this._weightInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\t\tthis.enabled = 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\tthis._effectiveWeight = weight;\n\t\t\treturn weight;\n\n\t\t},\n\n\t\t_updateTimeScale: function( time ) {\n\n\t\t\tvar timeScale = 0;\n\n\t\t\tif ( ! this.paused ) {\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\t\tvar interpolant = this._timeScaleInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\t\tthis.timeScale = timeScale;\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\tthis._effectiveTimeScale = timeScale;\n\t\t\treturn timeScale;\n\n\t\t},\n\n\t\t_updateTime: function( deltaTime ) {\n\n\t\t\tvar time = this.time + deltaTime;\n\n\t\t\tif ( deltaTime === 0 ) return time;\n\n\t\t\tvar duration = this._clip.duration,\n\n\t\t\t\tloop = this.loop,\n\t\t\t\tloopCount = this._loopCount;\n\n\t\t\tif ( loop === LoopOnce ) {\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tthis.loopCount = 0;\n\t\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t\t}\n\n\t\t\t\thandle_stop: {\n\n\t\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\t\ttime = duration;\n\n\t\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\t\ttime = 0;\n\n\t\t\t\t\t} else break handle_stop;\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\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}\n\n\t\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\t\tvar pingPong = ( loop === LoopPingPong );\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\ttrue, this.repetitions === 0, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\tthis.repetitions === 0, true, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( time >= duration || time < 0 ) {\n\t\t\t\t\t// wrap around\n\n\t\t\t\t\tvar loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\t\tvar pending = this.repetitions - loopCount;\n\n\t\t\t\t\tif ( pending < 0 ) {\n\t\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// keep running\n\n\t\t\t\t\t\tif ( pending === 0 ) {\n\t\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\t\tvar atStart = deltaTime < 0;\n\t\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\t\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\t\tthis.time = time;\n\t\t\t\t\treturn duration - time;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.time = time;\n\t\t\treturn time;\n\n\t\t},\n\n\t\t_setEndings: function( atStart, atEnd, pingPong ) {\n\n\t\t\tvar settings = this._interpolantSettings;\n\n\t\t\tif ( pingPong ) {\n\n\t\t\t\tsettings.endingStart \t= ZeroSlopeEnding;\n\t\t\t\tsettings.endingEnd\t\t= ZeroSlopeEnding;\n\n\t\t\t} else {\n\n\t\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\t\tif ( atStart ) {\n\n\t\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t\tif ( atEnd ) {\n\n\t\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_scheduleFading: function( duration, weightNow, weightThen ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant(),\n\t\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now; \t\t\t\tvalues[ 0 ] = weightNow;\n\t\t\ttimes[ 1 ] = now + duration;\tvalues[ 1 ] = weightThen;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Player for AnimationClips.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction AnimationMixer( root ) {\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\tObject.assign( AnimationMixer.prototype, EventDispatcher.prototype, {\n\n\t\t// return an action for a clip optionally using a custom root target\n\t\t// object (this method allocates a lot of dynamic memory in case a\n\t\t// previously unknown clip/root combination is specified)\n\t\tclipAction: function( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject !== null ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ],\n\t\t\t\tprototypeAction = null;\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\tvar existingAction =\n\t\t\t\t\t\tactionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( existingAction !== undefined ) {\n\n\t\t\t\t\treturn existingAction;\n\n\t\t\t\t}\n\n\t\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t\t// the bindings again but can just copy\n\t\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t\t// also, take the clip from the prototype action\n\t\t\t\tif ( clipObject === null )\n\t\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t\t}\n\n\t\t\t// clip must be known when specified via string\n\t\t\tif ( clipObject === null ) return null;\n\n\t\t\t// allocate all resources required to run it\n\t\t\tvar newAction = new AnimationAction( this, clipObject, optionalRoot );\n\n\t\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t\t// and make the action known to the memory manager\n\t\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\t\treturn newAction;\n\n\t\t},\n\n\t\t// get an existing action\n\t\texistingAction: function( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// deactivates all previously scheduled actions\n\t\tstopAllAction: function() {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tthis._nActiveActions = 0;\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tactions[ i ].reset();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].useCount = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// advance the time and update apply the animation\n\t\tupdate: function( deltaTime ) {\n\n\t\t\tdeltaTime *= this.timeScale;\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\n\t\t\t\ttime = this.time += deltaTime,\n\t\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t\t// run active actions\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tvar action = actions[ i ];\n\n\t\t\t\tif ( action.enabled ) {\n\n\t\t\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// update scene graph\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// return this mixer's root target object\n\t\tgetRoot: function() {\n\n\t\t\treturn this._root;\n\n\t\t},\n\n\t\t// free all resources specific to a particular clip\n\t\tuncacheClip: function( clip ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tclipUuid = clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t\t// iteration state and also require updating the state we can\n\t\t\t\t// just throw away\n\n\t\t\t\tvar actionsToRemove = actionsForClip.knownActions;\n\n\t\t\t\tfor ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar action = actionsToRemove[ i ];\n\n\t\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\t\tvar cacheIndex = action._cacheIndex,\n\t\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\t\taction._cacheIndex = null;\n\t\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\t\tactions.pop();\n\n\t\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t\t}\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t// free all resources specific to a particular root target object\n\t\tuncacheRoot: function( root ) {\n\n\t\t\tvar rootUuid = root.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip;\n\n\t\t\tfor ( var clipUuid in actionsByClip ) {\n\n\t\t\t\tvar actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( action !== undefined ) {\n\n\t\t\t\t\tthis._deactivateAction( action );\n\t\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingByName !== undefined ) {\n\n\t\t\t\tfor ( var trackName in bindingByName ) {\n\n\t\t\t\t\tvar binding = bindingByName[ trackName ];\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remove a targeted clip from the cache\n\t\tuncacheAction: function( clip, optionalRoot ) {\n\n\t\t\tvar action = this.existingAction( clip, optionalRoot );\n\n\t\t\tif ( action !== null ) {\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} );\n\n\t// Implementation details:\n\n\tObject.assign( AnimationMixer.prototype, {\n\n\t\t_bindAction: function( action, prototypeAction ) {\n\n\t\t\tvar root = action._localRoot || this._root,\n\t\t\t\ttracks = action._clip.tracks,\n\t\t\t\tnTracks = tracks.length,\n\t\t\t\tbindings = action._propertyBindings,\n\t\t\t\tinterpolants = action._interpolants,\n\t\t\t\trootUuid = root.uuid,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingsByName === undefined ) {\n\n\t\t\t\tbindingsByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\t\tvar track = tracks[ i ],\n\t\t\t\t\ttrackName = track.name,\n\t\t\t\t\tbinding = bindingsByName[ trackName ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar path = prototypeAction && prototypeAction.\n\t\t\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t}\n\n\t\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t\t}\n\n\t\t},\n\n\t\t_activateAction: function( action ) {\n\n\t\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\t\tvar rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\t\tthis._bindAction( action,\n\t\t\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t\t}\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// increment reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._lendAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t_deactivateAction: function( action ) {\n\n\t\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// decrement reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._takeBackAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// Memory manager\n\n\t\t_initMemoryManager: function() {\n\n\t\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\t\tthis._nActiveActions = 0;\n\n\t\t\tthis._actionsByClip = {};\n\t\t\t// inside:\n\t\t\t// {\n\t\t\t// \t\tknownActions: Array< AnimationAction >\t- used as prototypes\n\t\t\t// \t\tactionByRoot: AnimationAction\t\t\t- lookup\n\t\t\t// }\n\n\n\t\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\t\tthis._controlInterpolants = []; // same game as above\n\t\t\tthis._nActiveControlInterpolants = 0;\n\n\t\t\tvar scope = this;\n\n\t\t\tthis.stats = {\n\n\t\t\t\tactions: {\n\t\t\t\t\tget total() { return scope._actions.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveActions; }\n\t\t\t\t},\n\t\t\t\tbindings: {\n\t\t\t\t\tget total() { return scope._bindings.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveBindings; }\n\t\t\t\t},\n\t\t\t\tcontrolInterpolants: {\n\t\t\t\t\tget total() { return scope._controlInterpolants.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveControlInterpolants; }\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t},\n\n\t\t// Memory management for AnimationAction objects\n\n\t\t_isActiveAction: function( action ) {\n\n\t\t\tvar index = action._cacheIndex;\n\t\t\treturn index !== null && index < this._nActiveActions;\n\n\t\t},\n\n\t\t_addInactiveAction: function( action, clipUuid, rootUuid ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip === undefined ) {\n\n\t\t\t\tactionsForClip = {\n\n\t\t\t\t\tknownActions: [ action ],\n\t\t\t\t\tactionByRoot: {}\n\n\t\t\t\t};\n\n\t\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t\t} else {\n\n\t\t\t\tvar knownActions = actionsForClip.knownActions;\n\n\t\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\t\tknownActions.push( action );\n\n\t\t\t}\n\n\t\t\taction._cacheIndex = actions.length;\n\t\t\tactions.push( action );\n\n\t\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t\t},\n\n\t\t_removeInactiveAction: function( action ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\t\tcacheIndex = action._cacheIndex;\n\n\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\tactions.pop();\n\n\t\t\taction._cacheIndex = null;\n\n\n\t\t\tvar clipUuid = action._clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\t\tlastKnownAction =\n\t\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\t\tknownActionsForClip.pop();\n\n\t\t\taction._byClipCacheIndex = null;\n\n\n\t\t\tvar actionByRoot = actionsForClip.actionByRoot,\n\t\t\t\trootUuid = ( actions._localRoot || this._root ).uuid;\n\n\t\t\tdelete actionByRoot[ rootUuid ];\n\n\t\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t},\n\n\t\t_removeInactiveBindingsForAction: function( action ) {\n\n\t\t\tvar bindings = action._propertyBindings;\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendAction: function( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions >| inactive actions ]\n\t\t\t// s a\n\t\t\t// <-swap->\n\t\t\t// a s\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\t\taction._cacheIndex = lastActiveIndex;\n\t\t\tactions[ lastActiveIndex ] = action;\n\n\t\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t\t},\n\n\t\t_takeBackAction: function( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions |< inactive actions ]\n\t\t\t// a s\n\t\t\t// <-swap->\n\t\t\t// s a\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\t\taction._cacheIndex = firstInactiveIndex;\n\t\t\tactions[ firstInactiveIndex ] = action;\n\n\t\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t\t},\n\n\t\t// Memory management for PropertyMixer objects\n\n\t\t_addInactiveBinding: function( binding, rootUuid, trackName ) {\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( bindingByName === undefined ) {\n\n\t\t\t\tbindingByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t\t}\n\n\t\t\tbindingByName[ trackName ] = binding;\n\n\t\t\tbinding._cacheIndex = bindings.length;\n\t\t\tbindings.push( binding );\n\n\t\t},\n\n\t\t_removeInactiveBinding: function( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tpropBinding = binding.binding,\n\t\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\t\ttrackName = propBinding.path,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\t\tbindings.pop();\n\n\t\t\tdelete bindingByName[ trackName ];\n\n\t\t\tremove_empty_map: {\n\n\t\t\t\tfor ( var _ in bindingByName ) break remove_empty_map;\n\n\t\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendBinding: function( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\t\tbinding._cacheIndex = lastActiveIndex;\n\t\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t\t},\n\n\t\t_takeBackBinding: function( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t\t},\n\n\n\t\t// Memory management of Interpolants for weight and time scale\n\n\t\t_lendControlInterpolant: function() {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++,\n\t\t\t\tinterpolant = interpolants[ lastActiveIndex ];\n\n\t\t\tif ( interpolant === undefined ) {\n\n\t\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t\t\t\t1, this._controlInterpolantsResultBuffer );\n\n\t\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t\t}\n\n\t\t\treturn interpolant;\n\n\t\t},\n\n\t\t_takeBackControlInterpolant: function( interpolant ) {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t\t},\n\n\t\t_controlInterpolantsResultBuffer: new Float32Array( 1 )\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Uniform( value ) {\n\n\t\tif ( typeof value === 'string' ) {\n\n\t\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\n\t\t\tvalue = arguments[ 1 ];\n\n\t\t}\n\n\t\tthis.value = value;\n\n\t}\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferGeometry() {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.maxInstancedCount = undefined;\n\n\t}\n\n\tInstancedBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tInstancedBufferGeometry.prototype.constructor = InstancedBufferGeometry;\n\n\tInstancedBufferGeometry.prototype.isInstancedBufferGeometry = true;\n\n\tInstancedBufferGeometry.prototype.addGroup = function ( start, count, materialIndex ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t};\n\n\tInstancedBufferGeometry.prototype.copy = function ( source ) {\n\n\t\tvar index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\tvar attributes = source.attributes;\n\n\t\tfor ( var name in attributes ) {\n\n\t\t\tvar attribute = attributes[ name ];\n\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t}\n\n\t\tvar groups = source.groups;\n\n\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tvar group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.data = interleavedBuffer;\n\t\tthis.itemSize = itemSize;\n\t\tthis.offset = offset;\n\n\t\tthis.normalized = normalized === true;\n\n\t}\n\n\n\tInterleavedBufferAttribute.prototype = {\n\n\t\tconstructor: InterleavedBufferAttribute,\n\n\t\tisInterleavedBufferAttribute: true,\n\n\t\tget count() {\n\n\t\t\treturn this.data.count;\n\n\t\t},\n\n\t\tget array() {\n\n\t\t\treturn this.data.array;\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\t\t\tthis.data.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBuffer( array, stride ) {\n\n\t\tthis.uuid = _Math.generateUUID();\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.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t}\n\n\tInterleavedBuffer.prototype = {\n\n\t\tconstructor: InterleavedBuffer,\n\n\t\tisInterleavedBuffer: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.stride : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.count = source.count;\n\t\t\tthis.stride = source.stride;\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.stride;\n\t\t\tindex2 *= attribute.stride;\n\n\t\t\tfor ( var i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {\n\n\t\tInterleavedBuffer.call( this, array, stride );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedInterleavedBuffer.prototype = Object.create( InterleavedBuffer.prototype );\n\tInstancedInterleavedBuffer.prototype.constructor = InstancedInterleavedBuffer;\n\n\tInstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true;\n\n\tInstancedInterleavedBuffer.prototype.copy = function ( source ) {\n\n\t\tInterleavedBuffer.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferAttribute( array, itemSize, meshPerAttribute ) {\n\n\t\tBufferAttribute.call( this, array, itemSize );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInstancedBufferAttribute.prototype.constructor = InstancedBufferAttribute;\n\n\tInstancedBufferAttribute.prototype.isInstancedBufferAttribute = true;\n\n\tInstancedBufferAttribute.prototype.copy = function ( source ) {\n\n\t\tBufferAttribute.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author bhouston / http://clara.io/\n\t * @author stephomi / http://stephaneginier.com/\n\t */\n\n\tfunction Raycaster( origin, direction, near, far ) {\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 || 0;\n\t\tthis.far = far || Infinity;\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: {},\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t\tObject.defineProperties( this.params, {\n\t\t\tPointCloud: {\n\t\t\t\tget: function () {\n\t\t\t\t\tconsole.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );\n\t\t\t\t\treturn this.Points;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tfunction ascSort( a, b ) {\n\n\t\treturn a.distance - b.distance;\n\n\t}\n\n\tfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t//\n\n\tRaycaster.prototype = {\n\n\t\tconstructor: Raycaster,\n\n\t\tlinePrecision: 1,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\t\tthis.ray.set( origin, direction );\n\n\t\t},\n\n\t\tsetFromCamera: function ( coords, camera ) {\n\n\t\t\tif ( (camera && camera.isPerspectiveCamera) ) {\n\n\t\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\n\t\t\t} else if ( (camera && camera.isOrthographicCamera) ) {\n\n\t\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\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type.' );\n\n\t\t\t}\n\n\t\t},\n\n\t\tintersectObject: function ( object, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tintersectObject( object, this, intersects, recursive );\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t},\n\n\t\tintersectObjects: function ( objects, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tif ( Array.isArray( objects ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );\n\t\t\t\treturn intersects;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t\t}\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Clock( autoStart ) {\n\n\t\tthis.autoStart = ( autoStart !== undefined ) ? autoStart : true;\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\tClock.prototype = {\n\n\t\tconstructor: Clock,\n\n\t\tstart: function () {\n\n\t\t\tthis.startTime = ( performance || Date ).now();\n\n\t\t\tthis.oldTime = this.startTime;\n\t\t\tthis.elapsedTime = 0;\n\t\t\tthis.running = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tthis.getElapsedTime();\n\t\t\tthis.running = false;\n\n\t\t},\n\n\t\tgetElapsedTime: function () {\n\n\t\t\tthis.getDelta();\n\t\t\treturn this.elapsedTime;\n\n\t\t},\n\n\t\tgetDelta: function () {\n\n\t\t\tvar diff = 0;\n\n\t\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\t\tthis.start();\n\n\t\t\t}\n\n\t\t\tif ( this.running ) {\n\n\t\t\t\tvar newTime = ( performance || Date ).now();\n\n\t\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\t\tthis.oldTime = newTime;\n\n\t\t\t\tthis.elapsedTime += diff;\n\n\t\t\t}\n\n\t\t\treturn diff;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Spline from Tween.js, slightly optimized (and trashed)\n\t * http://sole.github.com/tween.js/examples/05_spline.html\n\t *\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Spline( points ) {\n\n\t\tthis.points = points;\n\n\t\tvar c = [], v3 = { x: 0, y: 0, z: 0 },\n\t\tpoint, intPoint, weight, w2, w3,\n\t\tpa, pb, pc, pd;\n\n\t\tthis.initFromArray = function ( a ) {\n\n\t\t\tthis.points = [];\n\n\t\t\tfor ( var i = 0; i < a.length; i ++ ) {\n\n\t\t\t\tthis.points[ i ] = { x: a[ i ][ 0 ], y: a[ i ][ 1 ], z: a[ i ][ 2 ] };\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getPoint = function ( k ) {\n\n\t\t\tpoint = ( this.points.length - 1 ) * k;\n\t\t\tintPoint = Math.floor( point );\n\t\t\tweight = point - intPoint;\n\n\t\t\tc[ 0 ] = intPoint === 0 ? intPoint : intPoint - 1;\n\t\t\tc[ 1 ] = intPoint;\n\t\t\tc[ 2 ] = intPoint > this.points.length - 2 ? this.points.length - 1 : intPoint + 1;\n\t\t\tc[ 3 ] = intPoint > this.points.length - 3 ? this.points.length - 1 : intPoint + 2;\n\n\t\t\tpa = this.points[ c[ 0 ] ];\n\t\t\tpb = this.points[ c[ 1 ] ];\n\t\t\tpc = this.points[ c[ 2 ] ];\n\t\t\tpd = this.points[ c[ 3 ] ];\n\n\t\t\tw2 = weight * weight;\n\t\t\tw3 = weight * w2;\n\n\t\t\tv3.x = interpolate( pa.x, pb.x, pc.x, pd.x, weight, w2, w3 );\n\t\t\tv3.y = interpolate( pa.y, pb.y, pc.y, pd.y, weight, w2, w3 );\n\t\t\tv3.z = interpolate( pa.z, pb.z, pc.z, pd.z, weight, w2, w3 );\n\n\t\t\treturn v3;\n\n\t\t};\n\n\t\tthis.getControlPointsArray = function () {\n\n\t\t\tvar i, p, l = this.points.length,\n\t\t\t\tcoords = [];\n\n\t\t\tfor ( i = 0; i < l; i ++ ) {\n\n\t\t\t\tp = this.points[ i ];\n\t\t\t\tcoords[ i ] = [ p.x, p.y, p.z ];\n\n\t\t\t}\n\n\t\t\treturn coords;\n\n\t\t};\n\n\t\t// approximate length by summing linear segments\n\n\t\tthis.getLength = function ( nSubDivisions ) {\n\n\t\t\tvar i, index, nSamples, position,\n\t\t\t\tpoint = 0, intPoint = 0, oldIntPoint = 0,\n\t\t\t\toldPosition = new Vector3(),\n\t\t\t\ttmpVec = new Vector3(),\n\t\t\t\tchunkLengths = [],\n\t\t\t\ttotalLength = 0;\n\n\t\t\t// first point has 0 length\n\n\t\t\tchunkLengths[ 0 ] = 0;\n\n\t\t\tif ( ! nSubDivisions ) nSubDivisions = 100;\n\n\t\t\tnSamples = this.points.length * nSubDivisions;\n\n\t\t\toldPosition.copy( this.points[ 0 ] );\n\n\t\t\tfor ( i = 1; i < nSamples; i ++ ) {\n\n\t\t\t\tindex = i / nSamples;\n\n\t\t\t\tposition = this.getPoint( index );\n\t\t\t\ttmpVec.copy( position );\n\n\t\t\t\ttotalLength += tmpVec.distanceTo( oldPosition );\n\n\t\t\t\toldPosition.copy( position );\n\n\t\t\t\tpoint = ( this.points.length - 1 ) * index;\n\t\t\t\tintPoint = Math.floor( point );\n\n\t\t\t\tif ( intPoint !== oldIntPoint ) {\n\n\t\t\t\t\tchunkLengths[ intPoint ] = totalLength;\n\t\t\t\t\toldIntPoint = intPoint;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// last point ends with total length\n\n\t\t\tchunkLengths[ chunkLengths.length ] = totalLength;\n\n\t\t\treturn { chunks: chunkLengths, total: totalLength };\n\n\t\t};\n\n\t\tthis.reparametrizeByArcLength = function ( samplingCoef ) {\n\n\t\t\tvar i, j,\n\t\t\t\tindex, indexCurrent, indexNext,\n\t\t\t\trealDistance,\n\t\t\t\tsampling, position,\n\t\t\t\tnewpoints = [],\n\t\t\t\ttmpVec = new Vector3(),\n\t\t\t\tsl = this.getLength();\n\n\t\t\tnewpoints.push( tmpVec.copy( this.points[ 0 ] ).clone() );\n\n\t\t\tfor ( i = 1; i < this.points.length; i ++ ) {\n\n\t\t\t\t//tmpVec.copy( this.points[ i - 1 ] );\n\t\t\t\t//linearDistance = tmpVec.distanceTo( this.points[ i ] );\n\n\t\t\t\trealDistance = sl.chunks[ i ] - sl.chunks[ i - 1 ];\n\n\t\t\t\tsampling = Math.ceil( samplingCoef * realDistance / sl.total );\n\n\t\t\t\tindexCurrent = ( i - 1 ) / ( this.points.length - 1 );\n\t\t\t\tindexNext = i / ( this.points.length - 1 );\n\n\t\t\t\tfor ( j = 1; j < sampling - 1; j ++ ) {\n\n\t\t\t\t\tindex = indexCurrent + j * ( 1 / sampling ) * ( indexNext - indexCurrent );\n\n\t\t\t\t\tposition = this.getPoint( index );\n\t\t\t\t\tnewpoints.push( tmpVec.copy( position ).clone() );\n\n\t\t\t\t}\n\n\t\t\t\tnewpoints.push( tmpVec.copy( this.points[ i ] ).clone() );\n\n\t\t\t}\n\n\t\t\tthis.points = newpoints;\n\n\t\t};\n\n\t\t// Catmull-Rom\n\n\t\tfunction interpolate( p0, p1, p2, p3, t, t2, t3 ) {\n\n\t\t\tvar v0 = ( p2 - p0 ) * 0.5,\n\t\t\t\tv1 = ( p3 - p1 ) * 0.5;\n\n\t\t\treturn ( 2 * ( p1 - p2 ) + v0 + v1 ) * t3 + ( - 3 * ( p1 - p2 ) - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n\t *\n\t * The poles (phi) are at the positive and negative y axis.\n\t * The equator starts at positive z.\n\t */\n\n\tfunction Spherical( radius, phi, theta ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0;\n\t\tthis.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere\n\n\t\treturn this;\n\n\t}\n\n\tSpherical.prototype = {\n\n\t\tconstructor: Spherical,\n\n\t\tset: function ( radius, phi, theta ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.phi = phi;\n\t\t\tthis.theta = theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.phi = other.phi;\n\t\t\tthis.theta = other.theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\tmakeSafe: function() {\n\n\t\t\tvar EPS = 0.000001;\n\t\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = vec3.length();\n\n\t\t\tif ( this.radius === 0 ) {\n\n\t\t\t\tthis.theta = 0;\n\t\t\t\tthis.phi = 0;\n\n\t\t\t} else {\n\n\t\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis\n\t\t\t\tthis.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t};\n\n\t/**\r\n\t * @author alteredq / http://alteredqualia.com/\r\n\t */\r\n\r\n\tfunction MorphBlendMesh( geometry, material ) {\n\r\n\t\tMesh.call( this, geometry, material );\r\n\r\n\t\tthis.animationsMap = {};\r\n\t\tthis.animationsList = [];\r\n\r\n\t\t// prepare default animation\r\n\t\t// (all frames played together in 1 second)\r\n\r\n\t\tvar numFrames = this.geometry.morphTargets.length;\r\n\r\n\t\tvar name = \"__default\";\r\n\r\n\t\tvar startFrame = 0;\r\n\t\tvar endFrame = numFrames - 1;\r\n\r\n\t\tvar fps = numFrames / 1;\r\n\r\n\t\tthis.createAnimation( name, startFrame, endFrame, fps );\r\n\t\tthis.setAnimationWeight( name, 1 );\r\n\r\n\t}\r\n\r\n\tMorphBlendMesh.prototype = Object.create( Mesh.prototype );\r\n\tMorphBlendMesh.prototype.constructor = MorphBlendMesh;\r\n\r\n\tMorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) {\r\n\r\n\t\tvar animation = {\r\n\r\n\t\t\tstart: start,\r\n\t\t\tend: end,\r\n\r\n\t\t\tlength: end - start + 1,\r\n\r\n\t\t\tfps: fps,\r\n\t\t\tduration: ( end - start ) / fps,\r\n\r\n\t\t\tlastFrame: 0,\r\n\t\t\tcurrentFrame: 0,\r\n\r\n\t\t\tactive: false,\r\n\r\n\t\t\ttime: 0,\r\n\t\t\tdirection: 1,\r\n\t\t\tweight: 1,\r\n\r\n\t\t\tdirectionBackwards: false,\r\n\t\t\tmirroredLoop: false\r\n\r\n\t\t};\r\n\r\n\t\tthis.animationsMap[ name ] = animation;\r\n\t\tthis.animationsList.push( animation );\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) {\r\n\r\n\t\tvar pattern = /([a-z]+)_?(\\d+)/i;\r\n\r\n\t\tvar firstAnimation, frameRanges = {};\r\n\r\n\t\tvar geometry = this.geometry;\r\n\r\n\t\tfor ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar morph = geometry.morphTargets[ i ];\r\n\t\t\tvar chunks = morph.name.match( pattern );\r\n\r\n\t\t\tif ( chunks && chunks.length > 1 ) {\r\n\r\n\t\t\t\tvar name = chunks[ 1 ];\r\n\r\n\t\t\t\tif ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity };\r\n\r\n\t\t\t\tvar range = frameRanges[ name ];\r\n\r\n\t\t\t\tif ( i < range.start ) range.start = i;\r\n\t\t\t\tif ( i > range.end ) range.end = i;\r\n\r\n\t\t\t\tif ( ! firstAnimation ) firstAnimation = name;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var name in frameRanges ) {\r\n\r\n\t\t\tvar range = frameRanges[ name ];\r\n\t\t\tthis.createAnimation( name, range.start, range.end, fps );\r\n\r\n\t\t}\r\n\r\n\t\tthis.firstAnimation = firstAnimation;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = 1;\r\n\t\t\tanimation.directionBackwards = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = - 1;\r\n\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.fps = fps;\r\n\t\t\tanimation.duration = ( animation.end - animation.start ) / animation.fps;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.duration = duration;\r\n\t\t\tanimation.fps = ( animation.end - animation.start ) / animation.duration;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.weight = weight;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationTime = function ( name, time ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = time;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationTime = function ( name ) {\r\n\r\n\t\tvar time = 0;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\ttime = animation.time;\r\n\r\n\t\t}\r\n\r\n\t\treturn time;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationDuration = function ( name ) {\r\n\r\n\t\tvar duration = - 1;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tduration = animation.duration;\r\n\r\n\t\t}\r\n\r\n\t\treturn duration;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.playAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = 0;\r\n\t\t\tanimation.active = true;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconsole.warn( \"THREE.MorphBlendMesh: animation[\" + name + \"] undefined in .playAnimation()\" );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.stopAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.active = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.update = function ( delta ) {\r\n\r\n\t\tfor ( var i = 0, il = this.animationsList.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar animation = this.animationsList[ i ];\r\n\r\n\t\t\tif ( ! animation.active ) continue;\r\n\r\n\t\t\tvar frameTime = animation.duration / animation.length;\r\n\r\n\t\t\tanimation.time += animation.direction * delta;\r\n\r\n\t\t\tif ( animation.mirroredLoop ) {\r\n\r\n\t\t\t\tif ( animation.time > animation.duration || animation.time < 0 ) {\r\n\r\n\t\t\t\t\tanimation.direction *= - 1;\r\n\r\n\t\t\t\t\tif ( animation.time > animation.duration ) {\r\n\r\n\t\t\t\t\t\tanimation.time = animation.duration;\r\n\t\t\t\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( animation.time < 0 ) {\r\n\r\n\t\t\t\t\t\tanimation.time = 0;\r\n\t\t\t\t\t\tanimation.directionBackwards = false;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tanimation.time = animation.time % animation.duration;\r\n\r\n\t\t\t\tif ( animation.time < 0 ) animation.time += animation.duration;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar keyframe = animation.start + _Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 );\r\n\t\t\tvar weight = animation.weight;\r\n\r\n\t\t\tif ( keyframe !== animation.currentFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = 0;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = 1 * weight;\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ keyframe ] = 0;\r\n\r\n\t\t\t\tanimation.lastFrame = animation.currentFrame;\r\n\t\t\t\tanimation.currentFrame = keyframe;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar mix = ( animation.time % frameTime ) / frameTime;\r\n\r\n\t\t\tif ( animation.directionBackwards ) mix = 1 - mix;\r\n\r\n\t\t\tif ( animation.currentFrame !== animation.lastFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = mix * weight;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = weight;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction ImmediateRenderObject( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.material = material;\n\t\tthis.render = function ( renderCallback ) {};\n\n\t}\n\n\tImmediateRenderObject.prototype = Object.create( Object3D.prototype );\n\tImmediateRenderObject.prototype.constructor = ImmediateRenderObject;\n\n\tImmediateRenderObject.prototype.isImmediateRenderObject = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction VertexNormalsHelper( object, size, hex, linewidth ) {\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xff0000;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( (objGeometry && objGeometry.isGeometry) ) {\n\n\t\t\tnNormals = objGeometry.faces.length * 3;\n\n\t\t} else if ( (objGeometry && objGeometry.isBufferGeometry) ) {\n\n\t\t\tnNormals = objGeometry.attributes.normal.count;\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32Attribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tVertexNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tVertexNormalsHelper.prototype.constructor = VertexNormalsHelper;\n\n\tVertexNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tif ( (objGeometry && objGeometry.isGeometry) ) {\n\n\t\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\t\tvar faces = objGeometry.faces;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar vertex = vertices[ face[ keys[ j ] ] ];\n\n\t\t\t\t\t\tvar normal = face.vertexNormals[ j ];\n\n\t\t\t\t\t\tv1.copy( vertex ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( (objGeometry && objGeometry.isBufferGeometry) ) {\n\n\t\t\t\tvar objPos = objGeometry.attributes.position;\n\n\t\t\t\tvar objNorm = objGeometry.attributes.normal;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\t// for simplicity, ignore index and drawcalls, and render every normal\n\n\t\t\t\tfor ( var j = 0, jl = objPos.count; j < jl; j ++ ) {\n\n\t\t\t\t\tv1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\tv2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) );\n\n\t\t\t\t\tv2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction SpotLightHelper( light ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = [\n\t\t\t0, 0, 0, 0, 0, 1,\n\t\t\t0, 0, 0, 1, 0, 1,\n\t\t\t0, 0, 0, - 1, 0, 1,\n\t\t\t0, 0, 0, 0, 1, 1,\n\t\t\t0, 0, 0, 0, - 1, 1\n\t\t];\n\n\t\tfor ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tvar p1 = ( i / l ) * Math.PI * 2;\n\t\t\tvar 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.addAttribute( 'position', new Float32Attribute( positions, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: 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\tSpotLightHelper.prototype = Object.create( Object3D.prototype );\n\tSpotLightHelper.prototype.constructor = SpotLightHelper;\n\n\tSpotLightHelper.prototype.dispose = function () {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t};\n\n\tSpotLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\t\tvar vector2 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tvar coneLength = this.light.distance ? this.light.distance : 1000;\n\t\t\tvar coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t\tvector.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\t\tthis.cone.lookAt( vector2.sub( vector ) );\n\n\t\t\tthis.cone.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author Sean Griffin / http://twitter.com/sgrif\n\t * @author Michael Guerrero / http://realitymeltdown.com\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction SkeletonHelper( object ) {\n\n\t\tthis.bones = this.getBoneList( object );\n\n\t\tvar geometry = new Geometry();\n\n\t\tfor ( var i = 0; i < this.bones.length; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( (bone.parent && bone.parent.isBone) ) {\n\n\t\t\t\tgeometry.vertices.push( new Vector3() );\n\t\t\t\tgeometry.vertices.push( new Vector3() );\n\t\t\t\tgeometry.colors.push( new Color( 0, 0, 1 ) );\n\t\t\t\tgeometry.colors.push( new Color( 0, 1, 0 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.dynamic = true;\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.root = object;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\n\tSkeletonHelper.prototype = Object.create( LineSegments.prototype );\n\tSkeletonHelper.prototype.constructor = SkeletonHelper;\n\n\tSkeletonHelper.prototype.getBoneList = function( object ) {\n\n\t\tvar boneList = [];\n\n\t\tif ( (object && object.isBone) ) {\n\n\t\t\tboneList.push( object );\n\n\t\t}\n\n\t\tfor ( var i = 0; i < object.children.length; i ++ ) {\n\n\t\t\tboneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) );\n\n\t\t}\n\n\t\treturn boneList;\n\n\t};\n\n\tSkeletonHelper.prototype.update = function () {\n\n\t\tvar geometry = this.geometry;\n\n\t\tvar matrixWorldInv = new Matrix4().getInverse( this.root.matrixWorld );\n\n\t\tvar boneMatrix = new Matrix4();\n\n\t\tvar j = 0;\n\n\t\tfor ( var i = 0; i < this.bones.length; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( (bone.parent && bone.parent.isBone) ) {\n\n\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );\n\t\t\t\tgeometry.vertices[ j ].setFromMatrixPosition( boneMatrix );\n\n\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\tgeometry.vertices[ j + 1 ].setFromMatrixPosition( boneMatrix );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.verticesNeedUpdate = true;\n\n\t\tgeometry.computeBoundingSphere();\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PointLightHelper( light, sphereSize ) {\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar geometry = new SphereBufferGeometry( sphereSize, 4, 2 );\n\t\tvar material = new MeshBasicMaterial( { wireframe: true, fog: false } );\n\t\tmaterial.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/*\n\t\tvar distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\t\tvar distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\t\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\t\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\t\tvar d = 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.scale.set( d, d, d );\n\n\t\t}\n\n\t\tthis.add( this.lightDistance );\n\t\t*/\n\n\t}\n\n\tPointLightHelper.prototype = Object.create( Mesh.prototype );\n\tPointLightHelper.prototype.constructor = PointLightHelper;\n\n\tPointLightHelper.prototype.dispose = function () {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t};\n\n\tPointLightHelper.prototype.update = function () {\n\n\t\tthis.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t/*\n\t\tvar 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\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction HemisphereLightHelper( light, sphereSize ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.colors = [ new Color(), new Color() ];\n\n\t\tvar geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tgeometry.rotateX( - Math.PI / 2 );\n\n\t\tfor ( var i = 0, il = 8; i < il; i ++ ) {\n\n\t\t\tgeometry.faces[ i ].color = this.colors[ i < 4 ? 0 : 1 ];\n\n\t\t}\n\n\t\tvar material = new MeshBasicMaterial( { vertexColors: FaceColors, wireframe: true } );\n\n\t\tthis.lightSphere = new Mesh( geometry, material );\n\t\tthis.add( this.lightSphere );\n\n\t\tthis.update();\n\n\t}\n\n\tHemisphereLightHelper.prototype = Object.create( Object3D.prototype );\n\tHemisphereLightHelper.prototype.constructor = HemisphereLightHelper;\n\n\tHemisphereLightHelper.prototype.dispose = function () {\n\n\t\tthis.lightSphere.geometry.dispose();\n\t\tthis.lightSphere.material.dispose();\n\n\t};\n\n\tHemisphereLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tthis.colors[ 0 ].copy( this.light.color ).multiplyScalar( this.light.intensity );\n\t\t\tthis.colors[ 1 ].copy( this.light.groundColor ).multiplyScalar( this.light.intensity );\n\n\t\t\tthis.lightSphere.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\t\t\tthis.lightSphere.geometry.colorsNeedUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction GridHelper( size, divisions, color1, color2 ) {\n\n\t\tdivisions = divisions || 1;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar center = divisions / 2;\n\t\tvar step = ( size * 2 ) / divisions;\n\t\tvar vertices = [], colors = [];\n\n\t\tfor ( var i = 0, j = 0, k = - size; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - size, 0, k, size, 0, k );\n\t\t\tvertices.push( k, 0, - size, k, 0, size );\n\n\t\t\tvar 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\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32Attribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32Attribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tGridHelper.prototype = Object.create( LineSegments.prototype );\n\tGridHelper.prototype.constructor = GridHelper;\n\n\tGridHelper.prototype.setColors = function () {\n\n\t\tconsole.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction FaceNormalsHelper( object, size, hex, linewidth ) {\n\n\t\t// FaceNormalsHelper only supports THREE.Geometry\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( (objGeometry && objGeometry.isGeometry) ) {\n\n\t\t\tnNormals = objGeometry.faces.length;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' );\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32Attribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\t\tthis.update();\n\n\t}\n\n\tFaceNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tFaceNormalsHelper.prototype.constructor = FaceNormalsHelper;\n\n\tFaceNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\tvar faces = objGeometry.faces;\n\n\t\t\tvar idx = 0;\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar normal = face.normal;\n\n\t\t\t\tv1.copy( vertices[ face.a ] )\n\t\t\t\t\t.add( vertices[ face.b ] )\n\t\t\t\t\t.add( vertices[ face.c ] )\n\t\t\t\t\t.divideScalar( 3 )\n\t\t\t\t\t.applyMatrix4( matrixWorld );\n\n\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction DirectionalLightHelper( light, size ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32Attribute( [\n\t\t\t- size, size, 0,\n\t\t\t size, size, 0,\n\t\t\t size, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.add( new Line( geometry, material ) );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32Attribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.add( new Line( geometry, material ));\n\n\t\tthis.update();\n\n\t}\n\n\tDirectionalLightHelper.prototype = Object.create( Object3D.prototype );\n\tDirectionalLightHelper.prototype.constructor = DirectionalLightHelper;\n\n\tDirectionalLightHelper.prototype.dispose = function () {\n\n\t\tvar lightPlane = this.children[ 0 ];\n\t\tvar targetLine = this.children[ 1 ];\n\n\t\tlightPlane.geometry.dispose();\n\t\tlightPlane.material.dispose();\n\t\ttargetLine.geometry.dispose();\n\t\ttargetLine.material.dispose();\n\n\t};\n\n\tDirectionalLightHelper.prototype.update = function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar v3 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tv1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tv2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t\tv3.subVectors( v2, v1 );\n\n\t\t\tvar lightPlane = this.children[ 0 ];\n\t\t\tvar targetLine = this.children[ 1 ];\n\n\t\t\tlightPlane.lookAt( v3 );\n\t\t\tlightPlane.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\ttargetLine.lookAt( v3 );\n\t\t\ttargetLine.scale.z = v3.length();\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t *\t- shows frustum, line of sight and up of the camera\n\t *\t- suitable for fast updates\n\t * \t- based on frustum visualization in lightgl.js shadowmap example\n\t *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\n\t */\n\n\tfunction CameraHelper( camera ) {\n\n\t\tvar geometry = new Geometry();\n\t\tvar material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } );\n\n\t\tvar pointMap = {};\n\n\t\t// colors\n\n\t\tvar hexFrustum = 0xffaa00;\n\t\tvar hexCone = 0xff0000;\n\t\tvar hexUp = 0x00aaff;\n\t\tvar hexTarget = 0xffffff;\n\t\tvar hexCross = 0x333333;\n\n\t\t// near\n\n\t\taddLine( \"n1\", \"n2\", hexFrustum );\n\t\taddLine( \"n2\", \"n4\", hexFrustum );\n\t\taddLine( \"n4\", \"n3\", hexFrustum );\n\t\taddLine( \"n3\", \"n1\", hexFrustum );\n\n\t\t// far\n\n\t\taddLine( \"f1\", \"f2\", hexFrustum );\n\t\taddLine( \"f2\", \"f4\", hexFrustum );\n\t\taddLine( \"f4\", \"f3\", hexFrustum );\n\t\taddLine( \"f3\", \"f1\", hexFrustum );\n\n\t\t// sides\n\n\t\taddLine( \"n1\", \"f1\", hexFrustum );\n\t\taddLine( \"n2\", \"f2\", hexFrustum );\n\t\taddLine( \"n3\", \"f3\", hexFrustum );\n\t\taddLine( \"n4\", \"f4\", hexFrustum );\n\n\t\t// cone\n\n\t\taddLine( \"p\", \"n1\", hexCone );\n\t\taddLine( \"p\", \"n2\", hexCone );\n\t\taddLine( \"p\", \"n3\", hexCone );\n\t\taddLine( \"p\", \"n4\", hexCone );\n\n\t\t// up\n\n\t\taddLine( \"u1\", \"u2\", hexUp );\n\t\taddLine( \"u2\", \"u3\", hexUp );\n\t\taddLine( \"u3\", \"u1\", hexUp );\n\n\t\t// target\n\n\t\taddLine( \"c\", \"t\", hexTarget );\n\t\taddLine( \"p\", \"c\", hexCross );\n\n\t\t// cross\n\n\t\taddLine( \"cn1\", \"cn2\", hexCross );\n\t\taddLine( \"cn3\", \"cn4\", hexCross );\n\n\t\taddLine( \"cf1\", \"cf2\", hexCross );\n\t\taddLine( \"cf3\", \"cf4\", hexCross );\n\n\t\tfunction addLine( a, b, hex ) {\n\n\t\t\taddPoint( a, hex );\n\t\t\taddPoint( b, hex );\n\n\t\t}\n\n\t\tfunction addPoint( id, hex ) {\n\n\t\t\tgeometry.vertices.push( new Vector3() );\n\t\t\tgeometry.colors.push( new Color( hex ) );\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( geometry.vertices.length - 1 );\n\n\t\t}\n\n\t\tLineSegments.call( this, geometry, material );\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}\n\n\tCameraHelper.prototype = Object.create( LineSegments.prototype );\n\tCameraHelper.prototype.constructor = CameraHelper;\n\n\tCameraHelper.prototype.update = function () {\n\n\t\tvar geometry, pointMap;\n\n\t\tvar vector = new Vector3();\n\t\tvar camera = new Camera();\n\n\t\tfunction setPoint( point, x, y, z ) {\n\n\t\t\tvector.set( x, y, z ).unproject( camera );\n\n\t\t\tvar points = pointMap[ point ];\n\n\t\t\tif ( points !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\t\tgeometry.vertices[ points[ i ] ].copy( vector );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn function update() {\n\n\t\t\tgeometry = this.geometry;\n\t\t\tpointMap = this.pointMap;\n\n\t\t\tvar w = 1, h = 1;\n\n\t\t\t// we need just camera projection matrix\n\t\t\t// world matrix must be identity\n\n\t\t\tcamera.projectionMatrix.copy( this.camera.projectionMatrix );\n\n\t\t\t// center / target\n\n\t\t\tsetPoint( \"c\", 0, 0, - 1 );\n\t\t\tsetPoint( \"t\", 0, 0, 1 );\n\n\t\t\t// near\n\n\t\t\tsetPoint( \"n1\", - w, - h, - 1 );\n\t\t\tsetPoint( \"n2\", w, - h, - 1 );\n\t\t\tsetPoint( \"n3\", - w, h, - 1 );\n\t\t\tsetPoint( \"n4\", w, h, - 1 );\n\n\t\t\t// far\n\n\t\t\tsetPoint( \"f1\", - w, - h, 1 );\n\t\t\tsetPoint( \"f2\", w, - h, 1 );\n\t\t\tsetPoint( \"f3\", - w, h, 1 );\n\t\t\tsetPoint( \"f4\", w, h, 1 );\n\n\t\t\t// up\n\n\t\t\tsetPoint( \"u1\", w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u2\", - w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u3\", 0, h * 2, - 1 );\n\n\t\t\t// cross\n\n\t\t\tsetPoint( \"cf1\", - w, 0, 1 );\n\t\t\tsetPoint( \"cf2\", w, 0, 1 );\n\t\t\tsetPoint( \"cf3\", 0, - h, 1 );\n\t\t\tsetPoint( \"cf4\", 0, h, 1 );\n\n\t\t\tsetPoint( \"cn1\", - w, 0, - 1 );\n\t\t\tsetPoint( \"cn2\", w, 0, - 1 );\n\t\t\tsetPoint( \"cn3\", 0, - h, - 1 );\n\t\t\tsetPoint( \"cn4\", 0, h, - 1 );\n\n\t\t\tgeometry.verticesNeedUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\t// a helper to show the world-axis-aligned bounding box for an object\n\n\tfunction BoundingBoxHelper( object, hex ) {\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0x888888;\n\n\t\tthis.object = object;\n\n\t\tthis.box = new Box3();\n\n\t\tMesh.call( this, new BoxGeometry( 1, 1, 1 ), new MeshBasicMaterial( { color: color, wireframe: true } ) );\n\n\t}\n\n\tBoundingBoxHelper.prototype = Object.create( Mesh.prototype );\n\tBoundingBoxHelper.prototype.constructor = BoundingBoxHelper;\n\n\tBoundingBoxHelper.prototype.update = function () {\n\n\t\tthis.box.setFromObject( this.object );\n\n\t\tthis.box.getSize( this.scale );\n\n\t\tthis.box.getCenter( this.position );\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BoxHelper( object, color ) {\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\n\t\tvar indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\t\tvar positions = new Float32Array( 8 * 3 );\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tthis.update( object );\n\n\t\t}\n\n\t}\n\n\tBoxHelper.prototype = Object.create( LineSegments.prototype );\n\tBoxHelper.prototype.constructor = BoxHelper;\n\n\tBoxHelper.prototype.update = ( function () {\n\n\t\tvar box = new Box3();\n\n\t\treturn function update( object ) {\n\n\t\t\tif ( (object && object.isBox3) ) {\n\n\t\t\t\tbox.copy( object );\n\n\t\t\t} else {\n\n\t\t\t\tbox.setFromObject( object );\n\n\t\t\t}\n\n\t\t\tif ( box.isEmpty() ) return;\n\n\t\t\tvar min = box.min;\n\t\t\tvar max = box.max;\n\n\t\t\t/*\n\t\t\t 5____4\n\t\t\t1/___0/|\n\t\t\t| 6__|_7\n\t\t\t2/___3/\n\n\t\t\t0: max.x, max.y, max.z\n\t\t\t1: min.x, max.y, max.z\n\t\t\t2: min.x, min.y, max.z\n\t\t\t3: max.x, min.y, max.z\n\t\t\t4: max.x, max.y, min.z\n\t\t\t5: min.x, max.y, min.z\n\t\t\t6: min.x, min.y, min.z\n\t\t\t7: max.x, min.y, min.z\n\t\t\t*/\n\n\t\t\tvar position = this.geometry.attributes.position;\n\t\t\tvar array = position.array;\n\n\t\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\tthis.geometry.computeBoundingSphere();\n\n\t\t};\n\n\t} )();\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author zz85 / http://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t *\n\t * Creates an arrow for visualizing directions\n\t *\n\t * Parameters:\n\t * dir - Vector3\n\t * origin - Vector3\n\t * length - Number\n\t * color - color in hex value\n\t * headLength - Number\n\t * headWidth - Number\n\t */\n\n\tvar lineGeometry = new BufferGeometry();\n\tlineGeometry.addAttribute( 'position', new Float32Attribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\tvar coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );\n\tconeGeometry.translate( 0, - 0.5, 0 );\n\n\tfunction ArrowHelper( dir, origin, length, color, headLength, headWidth ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tObject3D.call( this );\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\t\tif ( length === undefined ) length = 1;\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) );\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\tArrowHelper.prototype = Object.create( Object3D.prototype );\n\tArrowHelper.prototype.constructor = ArrowHelper;\n\n\tArrowHelper.prototype.setDirection = ( function () {\n\n\t\tvar axis = new Vector3();\n\t\tvar radians;\n\n\t\treturn function setDirection( dir ) {\n\n\t\t\t// dir is assumed to be normalized\n\n\t\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\taxis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\t\tradians = Math.acos( dir.y );\n\n\t\t\t\tthis.quaternion.setFromAxisAngle( axis, radians );\n\n\t\t\t}\n\n\t\t};\n\n\t}() );\n\n\tArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {\n\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tthis.line.scale.set( 1, Math.max( 0, length - headLength ), 1 );\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\tArrowHelper.prototype.setColor = function ( color ) {\n\n\t\tthis.line.material.color.copy( color );\n\t\tthis.cone.material.color.copy( color );\n\n\t};\n\n\t/**\n\t * @author sroucheray / http://sroucheray.org/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AxisHelper( size ) {\n\n\t\tsize = size || 1;\n\n\t\tvar vertices = new Float32Array( [\n\t\t\t0, 0, 0, size, 0, 0,\n\t\t\t0, 0, 0, 0, size, 0,\n\t\t\t0, 0, 0, 0, 0, size\n\t\t] );\n\n\t\tvar colors = new Float32Array( [\n\t\t\t1, 0, 0, 1, 0.6, 0,\n\t\t\t0, 1, 0, 0.6, 1, 0,\n\t\t\t0, 0, 1, 0, 0.6, 1\n\t\t] );\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tAxisHelper.prototype = Object.create( LineSegments.prototype );\n\tAxisHelper.prototype.constructor = AxisHelper;\n\n\t/**\n\t * @author zz85 https://github.com/zz85\n\t *\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t * cusps and self-intersections in non-uniform catmull rom curves.\n\t * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t *\n\t * curve.type accepts centripetal(default), chordal and catmullrom\n\t * curve.tension is used for catmullrom which defaults to 0.5\n\t */\n\n\tvar CatmullRomCurve3 = ( function() {\n\n\t\tvar\n\t\t\ttmp = new Vector3(),\n\t\t\tpx = new CubicPoly(),\n\t\t\tpy = new CubicPoly(),\n\t\t\tpz = new CubicPoly();\n\n\t\t/*\n\t\tBased on an optimized c++ solution in\n\t\t - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t\t - http://ideone.com/NoEbVM\n\n\t\tThis CubicPoly class could be used for reusing some variables and calculations,\n\t\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\t\twhich can be placed in CurveUtils.\n\t\t*/\n\n\t\tfunction CubicPoly() {}\n\n\t\t/*\n\t\t * Compute coefficients for a cubic polynomial\n\t\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t\t * such that\n\t\t * p(0) = x0, p(1) = x1\n\t\t * and\n\t\t * p'(0) = t0, p'(1) = t1.\n\t\t */\n\t\tCubicPoly.prototype.init = function( x0, x1, t0, t1 ) {\n\n\t\t\tthis.c0 = x0;\n\t\t\tthis.c1 = t0;\n\t\t\tthis.c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\t\tthis.c3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t\t};\n\n\t\tCubicPoly.prototype.initNonuniformCatmullRom = function( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tvar t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tvar t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\t// initCubicPoly\n\t\t\tthis.init( x1, x2, t1, t2 );\n\n\t\t};\n\n\t\t// standard Catmull-Rom spline: interpolate between x1 and x2 with previous/following points x1/x4\n\t\tCubicPoly.prototype.initCatmullRom = function( x0, x1, x2, x3, tension ) {\n\n\t\t\tthis.init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t};\n\n\t\tCubicPoly.prototype.calc = function( t ) {\n\n\t\t\tvar t2 = t * t;\n\t\t\tvar t3 = t2 * t;\n\t\t\treturn this.c0 + this.c1 * t + this.c2 * t2 + this.c3 * t3;\n\n\t\t};\n\n\t\t// Subclass Three.js curve\n\t\treturn Curve.create(\n\n\t\t\tfunction ( p /* array of Vector3 */ ) {\n\n\t\t\t\tthis.points = p || [];\n\t\t\t\tthis.closed = false;\n\n\t\t\t},\n\n\t\t\tfunction ( t ) {\n\n\t\t\t\tvar points = this.points,\n\t\t\t\t\tpoint, intPoint, weight, l;\n\n\t\t\t\tl = points.length;\n\n\t\t\t\tif ( l < 2 ) console.log( 'duh, you need at least 2 points' );\n\n\t\t\t\tpoint = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\t\t\tintPoint = Math.floor( point );\n\t\t\t\tweight = point - intPoint;\n\n\t\t\t\tif ( this.closed ) {\n\n\t\t\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length;\n\n\t\t\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\t\t\tintPoint = l - 2;\n\t\t\t\t\tweight = 1;\n\n\t\t\t\t}\n\n\t\t\t\tvar p0, p1, p2, p3; // 4 points\n\n\t\t\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// extrapolate first point\n\t\t\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\t\t\tp0 = tmp;\n\n\t\t\t\t}\n\n\t\t\t\tp1 = points[ intPoint % l ];\n\t\t\t\tp2 = points[ ( intPoint + 1 ) % l ];\n\n\t\t\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// extrapolate last point\n\t\t\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\t\t\tp3 = tmp;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) {\n\n\t\t\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\t\t\tvar pow = this.type === 'chordal' ? 0.5 : 0.25;\n\t\t\t\t\tvar dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\t\t\tvar dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\t\t\tvar dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t\t\t// safety check for repeated points\n\t\t\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t\t\t} else if ( this.type === 'catmullrom' ) {\n\n\t\t\t\t\tvar tension = this.tension !== undefined ? this.tension : 0.5;\n\t\t\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension );\n\t\t\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension );\n\t\t\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension );\n\n\t\t\t\t}\n\n\t\t\t\tvar v = new Vector3(\n\t\t\t\t\tpx.calc( weight ),\n\t\t\t\t\tpy.calc( weight ),\n\t\t\t\t\tpz.calc( weight )\n\t\t\t\t);\n\n\t\t\t\treturn v;\n\n\t\t\t}\n\n\t\t);\n\n\t} )();\n\n\t/**************************************************************\n\t *\tClosed Spline 3D curve\n\t **************************************************************/\n\n\n\tfunction ClosedSplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Please use THREE.CatmullRomCurve3.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\t\tthis.closed = true;\n\n\t}\n\n\tClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t/**************************************************************\n\t *\tSpline 3D curve\n\t **************************************************************/\n\n\n\tvar SplineCurve3 = Curve.create(\n\n\t\tfunction ( points /* array of Vector3 */ ) {\n\n\t\t\tconsole.warn( 'THREE.SplineCurve3 will be deprecated. Please use THREE.CatmullRomCurve3' );\n\t\t\tthis.points = ( points === undefined ) ? [] : points;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tvar points = this.points;\n\t\t\tvar point = ( points.length - 1 ) * t;\n\n\t\t\tvar intPoint = Math.floor( point );\n\t\t\tvar weight = point - intPoint;\n\n\t\t\tvar point0 = points[ intPoint == 0 ? intPoint : intPoint - 1 ];\n\t\t\tvar point1 = points[ intPoint ];\n\t\t\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\t\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\t\tvar interpolate = CurveUtils.interpolate;\n\n\t\t\treturn new Vector3(\n\t\t\t\tinterpolate( point0.x, point1.x, point2.x, point3.x, weight ),\n\t\t\t\tinterpolate( point0.y, point1.y, point2.y, point3.y, weight ),\n\t\t\t\tinterpolate( point0.z, point1.z, point2.z, point3.z, weight )\n\t\t\t);\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tCubic Bezier 3D curve\n\t **************************************************************/\n\n\tvar CubicBezierCurve3 = Curve.create(\n\n\t\tfunction ( v0, v1, v2, v3 ) {\n\n\t\t\tthis.v0 = v0;\n\t\t\tthis.v1 = v1;\n\t\t\tthis.v2 = v2;\n\t\t\tthis.v3 = v3;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tvar b3 = ShapeUtils.b3;\n\n\t\t\treturn new Vector3(\n\t\t\t\tb3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ),\n\t\t\t\tb3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ),\n\t\t\t\tb3( t, this.v0.z, this.v1.z, this.v2.z, this.v3.z )\n\t\t\t);\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tQuadratic Bezier 3D curve\n\t **************************************************************/\n\n\tvar QuadraticBezierCurve3 = Curve.create(\n\n\t\tfunction ( v0, v1, v2 ) {\n\n\t\t\tthis.v0 = v0;\n\t\t\tthis.v1 = v1;\n\t\t\tthis.v2 = v2;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tvar b2 = ShapeUtils.b2;\n\n\t\t\treturn new Vector3(\n\t\t\t\tb2( t, this.v0.x, this.v1.x, this.v2.x ),\n\t\t\t\tb2( t, this.v0.y, this.v1.y, this.v2.y ),\n\t\t\t\tb2( t, this.v0.z, this.v1.z, this.v2.z )\n\t\t\t);\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tLine3D\n\t **************************************************************/\n\n\tvar LineCurve3 = Curve.create(\n\n\t\tfunction ( v1, v2 ) {\n\n\t\t\tthis.v1 = v1;\n\t\t\tthis.v2 = v2;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tif ( t === 1 ) {\n\n\t\t\t\treturn this.v2.clone();\n\n\t\t\t}\n\n\t\t\tvar vector = new Vector3();\n\n\t\t\tvector.subVectors( this.v2, this.v1 ); // diff\n\t\t\tvector.multiplyScalar( t );\n\t\t\tvector.add( this.v1 );\n\n\t\t\treturn vector;\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tArc curve\n\t **************************************************************/\n\n\tfunction ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tEllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t}\n\n\tArcCurve.prototype = Object.create( EllipseCurve.prototype );\n\tArcCurve.prototype.constructor = ArcCurve;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar SceneUtils = {\n\n\t\tcreateMultiMaterialObject: function ( geometry, materials ) {\n\n\t\t\tvar group = new Group();\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tgroup.add( new Mesh( geometry, materials[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t},\n\n\t\tdetach: function ( child, parent, scene ) {\n\n\t\t\tchild.applyMatrix( parent.matrixWorld );\n\t\t\tparent.remove( child );\n\t\t\tscene.add( child );\n\n\t\t},\n\n\t\tattach: function ( child, scene, parent ) {\n\n\t\t\tvar matrixWorldInverse = new Matrix4();\n\t\t\tmatrixWorldInverse.getInverse( parent.matrixWorld );\n\t\t\tchild.applyMatrix( matrixWorldInverse );\n\n\t\t\tscene.remove( child );\n\t\t\tparent.add( child );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Face4 ( a, b, c, d, normal, color, materialIndex ) {\n\t\tconsole.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' );\n\t\treturn new Face3( a, b, c, normal, color, materialIndex );\n\t}\n\n\tvar LineStrip = 0;\n\n\tvar LinePieces = 1;\n\n\tfunction PointCloud ( geometry, material ) {\n\t\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\t}\n\n\tfunction ParticleSystem ( geometry, material ) {\n\t\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\t}\n\n\tfunction PointCloudMaterial ( parameters ) {\n\t\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\t}\n\n\tfunction ParticleBasicMaterial ( parameters ) {\n\t\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\t}\n\n\tfunction ParticleSystemMaterial ( parameters ) {\n\t\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\t}\n\n\tfunction Vertex ( x, y, z ) {\n\t\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\n\t\treturn new Vector3( x, y, z );\n\t}\n\n\t//\n\n\tfunction EdgesHelper( object, hex ) {\n\t\tconsole.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );\n\t\treturn new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\t}\n\n\tfunction WireframeHelper( object, hex ) {\n\t\tconsole.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );\n\t\treturn new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\t}\n\n\t//\n\n\tObject.assign( Box2.prototype, {\n\t\tcenter: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\t\t},\n\t\tempty: function () {\n\t\t\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\t\t\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\t\t}\n\t} );\n\n\tObject.assign( Box3.prototype, {\n\t\tcenter: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\t\t},\n\t\tempty: function () {\n\t\t\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\t\t}\n\t} );\n\n\tObject.assign( Line3.prototype, {\n\t\tcenter: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\t\t}\n\t} );\n\n\tObject.assign( Matrix3.prototype, {\n\t\tmultiplyVector3: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix3( this );\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\t\t}\n\t} );\n\n\tObject.assign( Matrix4.prototype, {\n\t\textractPosition: function ( m ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\n\t\t\treturn this.copyPosition( m );\n\t\t},\n\t\tsetRotationFromQuaternion: function ( q ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\n\t\t\treturn this.makeRotationFromQuaternion( q );\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.' );\n\t\t\treturn vector.applyProjection( this );\n\t\t},\n\t\tmultiplyVector4: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\t\t},\n\t\trotateAxis: function ( v ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\n\t\t\tv.transformDirection( this );\n\t\t},\n\t\tcrossVector: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\t\t},\n\t\ttranslate: function ( v ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\n\t\t},\n\t\trotateX: function ( angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\n\t\t},\n\t\trotateY: function ( angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\n\t\t},\n\t\trotateZ: function ( angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\n\t\t},\n\t\trotateByAxis: function ( axis, angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\n\t\t}\n\t} );\n\n\tObject.assign( Plane.prototype, {\n\t\tisIntersectionLine: function ( line ) {\n\t\t\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\n\t\t\treturn this.intersectsLine( line );\n\t\t}\n\t} );\n\n\tObject.assign( Quaternion.prototype, {\n\t\tmultiplyVector3: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\n\t\t\treturn vector.applyQuaternion( this );\n\t\t}\n\t} );\n\n\tObject.assign( Ray.prototype, {\n\t\tisIntersectionBox: function ( box ) {\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\t\t},\n\t\tisIntersectionPlane: function ( plane ) {\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\n\t\t\treturn this.intersectsPlane( plane );\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\t\t}\n\t} );\n\n\tObject.assign( Shape.prototype, {\n\t\textrude: function ( options ) {\n\t\t\tconsole.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );\n\t\t\treturn new ExtrudeGeometry( this, options );\n\t\t},\n\t\tmakeGeometry: function ( options ) {\n\t\t\tconsole.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );\n\t\t\treturn new ShapeGeometry( this, options );\n\t\t}\n\t} );\n\n\tObject.assign( Vector3.prototype, {\n\t\tsetEulerFromRotationMatrix: function () {\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\n\t\t},\n\t\tsetEulerFromQuaternion: function () {\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\n\t\t},\n\t\tgetPositionFromMatrix: function ( m ) {\n\t\t\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\n\t\t\treturn this.setFromMatrixPosition( m );\n\t\t},\n\t\tgetScaleFromMatrix: function ( m ) {\n\t\t\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\n\t\t\treturn this.setFromMatrixScale( m );\n\t\t},\n\t\tgetColumnFromMatrix: function ( index, matrix ) {\n\t\t\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\n\t\t\treturn this.setFromMatrixColumn( matrix, index );\n\t\t}\n\t} );\n\n\t//\n\n\tObject.assign( Object3D.prototype, {\n\t\tgetChildByName: function ( name ) {\n\t\t\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\n\t\t\treturn this.getObjectByName( name );\n\t\t},\n\t\trenderDepth: function ( value ) {\n\t\t\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\n\t\t},\n\t\ttranslate: function ( distance, axis ) {\n\t\t\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\n\t\t\treturn this.translateOnAxis( axis, distance );\n\t\t}\n\t} );\n\n\tObject.defineProperties( Object3D.prototype, {\n\t\teulerOrder: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\treturn this.rotation.order;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\tthis.rotation.order = value;\n\t\t\t}\n\t\t},\n\t\tuseQuaternion: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( LOD.prototype, {\n\t\tobjects: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.LOD: .objects has been renamed to .levels.' );\n\t\t\t\treturn this.levels;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tPerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {\n\n\t\tconsole.warn( \"THREE.PerspectiveCamera.setLens is deprecated. \" +\n\t\t\t\t\"Use .setFocalLength and .filmGauge for a photographic setup.\" );\n\n\t\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\n\t\tthis.setFocalLength( focalLength );\n\n\t};\n\n\t//\n\n\tObject.defineProperties( Light.prototype, {\n\t\tonlyShadow: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\n\t\t\t}\n\t\t},\n\t\tshadowCameraFov: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\n\t\t\t\tthis.shadow.camera.fov = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraLeft: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\n\t\t\t\tthis.shadow.camera.left = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraRight: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\n\t\t\t\tthis.shadow.camera.right = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraTop: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\n\t\t\t\tthis.shadow.camera.top = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraBottom: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\n\t\t\t\tthis.shadow.camera.bottom = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraNear: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\n\t\t\t\tthis.shadow.camera.near = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraFar: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\n\t\t\t\tthis.shadow.camera.far = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraVisible: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\n\t\t\t}\n\t\t},\n\t\tshadowBias: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\n\t\t\t\tthis.shadow.bias = value;\n\t\t\t}\n\t\t},\n\t\tshadowDarkness: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\n\t\t\t}\n\t\t},\n\t\tshadowMapWidth: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\n\t\t\t\tthis.shadow.mapSize.width = value;\n\t\t\t}\n\t\t},\n\t\tshadowMapHeight: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\n\t\t\t\tthis.shadow.mapSize.height = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( BufferAttribute.prototype, {\n\t\tlength: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Please use .count.' );\n\t\t\t\treturn this.array.length;\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.assign( BufferGeometry.prototype, {\n\t\taddIndex: function ( index ) {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\n\t\t\tthis.setIndex( index );\n\t\t},\n\t\taddDrawCall: function ( start, count, indexOffset ) {\n\t\t\tif ( indexOffset !== undefined ) {\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\n\t\t\t}\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\n\t\t\tthis.addGroup( start, count );\n\t\t},\n\t\tclearDrawCalls: function () {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\n\t\t\tthis.clearGroups();\n\t\t},\n\t\tcomputeTangents: function () {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );\n\t\t},\n\t\tcomputeOffsets: function () {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\n\t\t}\n\t} );\n\n\tObject.defineProperties( BufferGeometry.prototype, {\n\t\tdrawcalls: {\n\t\t\tget: function () {\n\t\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\t\t\t}\n\t\t},\n\t\toffsets: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( Material.prototype, {\n\t\twrapAround: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\t\t\t}\n\t\t},\n\t\twrapRGB: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapRGB has been removed.' );\n\t\t\t\treturn new Color();\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( MeshPhongMaterial.prototype, {\n\t\tmetal: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( ShaderMaterial.prototype, {\n\t\tderivatives: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\treturn this.extensions.derivatives;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\tthis.extensions.derivatives = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tEventDispatcher.prototype = Object.assign( Object.create( {\n\n\t\t// Note: Extra base ensures these properties are not 'assign'ed.\n\n\t\tconstructor: EventDispatcher,\n\n\t\tapply: function ( target ) {\n\n\t\t\tconsole.warn( \"THREE.EventDispatcher: .apply is deprecated, \" +\n\t\t\t\t\t\"just inherit or Object.assign the prototype to mix-in.\" );\n\n\t\t\tObject.assign( target, this );\n\n\t\t}\n\n\t} ), EventDispatcher.prototype );\n\n\t//\n\n\tObject.defineProperties( Uniform.prototype, {\n\t\tdynamic: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );\n\t\t\t}\n\t\t},\n\t\tonUpdate: {\n\t\t\tvalue: function () {\n\t\t\t\tconsole.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.assign( WebGLRenderer.prototype, {\n\t\tsupportsFloatTextures: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_float' );\n\t\t},\n\t\tsupportsHalfFloatTextures: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_half_float' );\n\t\t},\n\t\tsupportsStandardDerivatives: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_standard_derivatives' );\n\t\t},\n\t\tsupportsCompressedTextureS3TC: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\t\t},\n\t\tsupportsCompressedTexturePVRTC: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\t\t},\n\t\tsupportsBlendMinMax: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\n\t\t\treturn this.extensions.get( 'EXT_blend_minmax' );\n\t\t},\n\t\tsupportsVertexTextures: function () {\n\t\t\treturn this.capabilities.vertexTextures;\n\t\t},\n\t\tsupportsInstancedArrays: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\n\t\t\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\n\t\t},\n\t\tenableScissorTest: function ( boolean ) {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\n\t\t\tthis.setScissorTest( boolean );\n\t\t},\n\t\tinitMaterial: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\n\t\t},\n\t\taddPrePlugin: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\n\t\t},\n\t\taddPostPlugin: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\n\t\t},\n\t\tupdateShadowMap: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\n\t\t}\n\t} );\n\n\tObject.defineProperties( WebGLRenderer.prototype, {\n\t\tshadowMapEnabled: {\n\t\t\tget: function () {\n\t\t\t\treturn this.shadowMap.enabled;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\n\t\t\t\tthis.shadowMap.enabled = value;\n\t\t\t}\n\t\t},\n\t\tshadowMapType: {\n\t\t\tget: function () {\n\t\t\t\treturn this.shadowMap.type;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\n\t\t\t\tthis.shadowMap.type = value;\n\t\t\t}\n\t\t},\n\t\tshadowMapCullFace: {\n\t\t\tget: function () {\n\t\t\t\treturn this.shadowMap.cullFace;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' );\n\t\t\t\tthis.shadowMap.cullFace = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( WebGLShadowMap.prototype, {\n\t\tcullFace: {\n\t\t\tget: function () {\n\t\t\t\treturn this.renderReverseSided ? CullFaceFront : CullFaceBack;\n\t\t\t},\n\t\t\tset: function ( cullFace ) {\n\t\t\t\tvar value = ( cullFace !== CullFaceBack );\n\t\t\t\tconsole.warn( \"WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to \" + value + \".\" );\n\t\t\t\tthis.renderReverseSided = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( WebGLRenderTarget.prototype, {\n\t\twrapS: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\treturn this.texture.wrapS;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\tthis.texture.wrapS = value;\n\t\t\t}\n\t\t},\n\t\twrapT: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\treturn this.texture.wrapT;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\tthis.texture.wrapT = value;\n\t\t\t}\n\t\t},\n\t\tmagFilter: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\treturn this.texture.magFilter;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\tthis.texture.magFilter = value;\n\t\t\t}\n\t\t},\n\t\tminFilter: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\treturn this.texture.minFilter;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\tthis.texture.minFilter = value;\n\t\t\t}\n\t\t},\n\t\tanisotropy: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\treturn this.texture.anisotropy;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\tthis.texture.anisotropy = value;\n\t\t\t}\n\t\t},\n\t\toffset: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\treturn this.texture.offset;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\tthis.texture.offset = value;\n\t\t\t}\n\t\t},\n\t\trepeat: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\treturn this.texture.repeat;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\tthis.texture.repeat = value;\n\t\t\t}\n\t\t},\n\t\tformat: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\treturn this.texture.format;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\tthis.texture.format = value;\n\t\t\t}\n\t\t},\n\t\ttype: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\treturn this.texture.type;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\tthis.texture.type = value;\n\t\t\t}\n\t\t},\n\t\tgenerateMipmaps: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\treturn this.texture.generateMipmaps;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\tthis.texture.generateMipmaps = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.assign( Audio.prototype, {\n\t\tload: function ( file ) {\n\t\t\tconsole.warn( 'THREE.Audio: .load has been deprecated. Please use THREE.AudioLoader.' );\n\t\t\tvar scope = this;\n\t\t\tvar audioLoader = new AudioLoader();\n\t\t\taudioLoader.load( file, function ( buffer ) {\n\t\t\t\tscope.setBuffer( buffer );\n\t\t\t} );\n\t\t\treturn this;\n\t\t}\n\t} );\n\n\tObject.assign( AudioAnalyser.prototype, {\n\t\tgetData: function ( file ) {\n\t\t\tconsole.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );\n\t\t\treturn this.getFrequencyData();\n\t\t}\n\t} );\n\n\t//\n\n\tvar GeometryUtils = {\n\n\t\tmerge: function ( geometry1, geometry2, materialIndexOffset ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );\n\n\t\t\tvar matrix;\n\n\t\t\tif ( geometry2.isMesh ) {\n\n\t\t\t\tgeometry2.matrixAutoUpdate && geometry2.updateMatrix();\n\n\t\t\t\tmatrix = geometry2.matrix;\n\t\t\t\tgeometry2 = geometry2.geometry;\n\n\t\t\t}\n\n\t\t\tgeometry1.merge( geometry2, matrix, materialIndexOffset );\n\n\t\t},\n\n\t\tcenter: function ( geometry ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );\n\t\t\treturn geometry.center();\n\n\t\t}\n\n\t};\n\n\tvar ImageUtils = {\n\n\t\tcrossOrigin: undefined,\n\n\t\tloadTexture: function ( url, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\n\n\t\t\tvar loader = new TextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( url, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadTextureCube: function ( urls, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\n\n\t\t\tvar loader = new CubeTextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( urls, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadCompressedTexture: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t},\n\n\t\tloadCompressedTextureCube: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Projector () {\n\n\t\tconsole.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' );\n\n\t\tthis.projectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .projectVector() is now vector.project().' );\n\t\t\tvector.project( camera );\n\n\t\t};\n\n\t\tthis.unprojectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' );\n\t\t\tvector.unproject( camera );\n\n\t\t};\n\n\t\tthis.pickingRay = function ( vector, camera ) {\n\n\t\t\tconsole.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' );\n\n\t\t};\n\n\t}\n\n\t//\n\n\tfunction CanvasRenderer () {\n\n\t\tconsole.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' );\n\n\t\tthis.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\tthis.clear = function () {};\n\t\tthis.render = function () {};\n\t\tthis.setClearColor = function () {};\n\t\tthis.setSize = function () {};\n\n\t}\n\n\texports.WebGLRenderTargetCube = WebGLRenderTargetCube;\n\texports.WebGLRenderTarget = WebGLRenderTarget;\n\texports.WebGLRenderer = WebGLRenderer;\n\texports.ShaderLib = ShaderLib;\n\texports.UniformsLib = UniformsLib;\n\texports.UniformsUtils = UniformsUtils;\n\texports.ShaderChunk = ShaderChunk;\n\texports.FogExp2 = FogExp2;\n\texports.Fog = Fog;\n\texports.Scene = Scene;\n\texports.LensFlare = LensFlare;\n\texports.Sprite = Sprite;\n\texports.LOD = LOD;\n\texports.SkinnedMesh = SkinnedMesh;\n\texports.Skeleton = Skeleton;\n\texports.Bone = Bone;\n\texports.Mesh = Mesh;\n\texports.LineSegments = LineSegments;\n\texports.Line = Line;\n\texports.Points = Points;\n\texports.Group = Group;\n\texports.VideoTexture = VideoTexture;\n\texports.DataTexture = DataTexture;\n\texports.CompressedTexture = CompressedTexture;\n\texports.CubeTexture = CubeTexture;\n\texports.CanvasTexture = CanvasTexture;\n\texports.DepthTexture = DepthTexture;\n\texports.TextureIdCount = TextureIdCount;\n\texports.Texture = Texture;\n\texports.MaterialIdCount = MaterialIdCount;\n\texports.CompressedTextureLoader = CompressedTextureLoader;\n\texports.BinaryTextureLoader = BinaryTextureLoader;\n\texports.DataTextureLoader = DataTextureLoader;\n\texports.CubeTextureLoader = CubeTextureLoader;\n\texports.TextureLoader = TextureLoader;\n\texports.ObjectLoader = ObjectLoader;\n\texports.MaterialLoader = MaterialLoader;\n\texports.BufferGeometryLoader = BufferGeometryLoader;\n\texports.DefaultLoadingManager = DefaultLoadingManager;\n\texports.LoadingManager = LoadingManager;\n\texports.JSONLoader = JSONLoader;\n\texports.ImageLoader = ImageLoader;\n\texports.FontLoader = FontLoader;\n\texports.XHRLoader = XHRLoader;\n\texports.Loader = Loader;\n\texports.Cache = Cache;\n\texports.AudioLoader = AudioLoader;\n\texports.SpotLightShadow = SpotLightShadow;\n\texports.SpotLight = SpotLight;\n\texports.PointLight = PointLight;\n\texports.HemisphereLight = HemisphereLight;\n\texports.DirectionalLightShadow = DirectionalLightShadow;\n\texports.DirectionalLight = DirectionalLight;\n\texports.AmbientLight = AmbientLight;\n\texports.LightShadow = LightShadow;\n\texports.Light = Light;\n\texports.StereoCamera = StereoCamera;\n\texports.PerspectiveCamera = PerspectiveCamera;\n\texports.OrthographicCamera = OrthographicCamera;\n\texports.CubeCamera = CubeCamera;\n\texports.Camera = Camera;\n\texports.AudioListener = AudioListener;\n\texports.PositionalAudio = PositionalAudio;\n\texports.getAudioContext = getAudioContext;\n\texports.AudioAnalyser = AudioAnalyser;\n\texports.Audio = Audio;\n\texports.VectorKeyframeTrack = VectorKeyframeTrack;\n\texports.StringKeyframeTrack = StringKeyframeTrack;\n\texports.QuaternionKeyframeTrack = QuaternionKeyframeTrack;\n\texports.NumberKeyframeTrack = NumberKeyframeTrack;\n\texports.ColorKeyframeTrack = ColorKeyframeTrack;\n\texports.BooleanKeyframeTrack = BooleanKeyframeTrack;\n\texports.PropertyMixer = PropertyMixer;\n\texports.PropertyBinding = PropertyBinding;\n\texports.KeyframeTrack = KeyframeTrack;\n\texports.AnimationUtils = AnimationUtils;\n\texports.AnimationObjectGroup = AnimationObjectGroup;\n\texports.AnimationMixer = AnimationMixer;\n\texports.AnimationClip = AnimationClip;\n\texports.Uniform = Uniform;\n\texports.InstancedBufferGeometry = InstancedBufferGeometry;\n\texports.BufferGeometry = BufferGeometry;\n\texports.GeometryIdCount = GeometryIdCount;\n\texports.Geometry = Geometry;\n\texports.InterleavedBufferAttribute = InterleavedBufferAttribute;\n\texports.InstancedInterleavedBuffer = InstancedInterleavedBuffer;\n\texports.InterleavedBuffer = InterleavedBuffer;\n\texports.InstancedBufferAttribute = InstancedBufferAttribute;\n\texports.DynamicBufferAttribute = DynamicBufferAttribute;\n\texports.Float64Attribute = Float64Attribute;\n\texports.Float32Attribute = Float32Attribute;\n\texports.Uint32Attribute = Uint32Attribute;\n\texports.Int32Attribute = Int32Attribute;\n\texports.Uint16Attribute = Uint16Attribute;\n\texports.Int16Attribute = Int16Attribute;\n\texports.Uint8ClampedAttribute = Uint8ClampedAttribute;\n\texports.Uint8Attribute = Uint8Attribute;\n\texports.Int8Attribute = Int8Attribute;\n\texports.BufferAttribute = BufferAttribute;\n\texports.Face3 = Face3;\n\texports.Object3DIdCount = Object3DIdCount;\n\texports.Object3D = Object3D;\n\texports.Raycaster = Raycaster;\n\texports.Layers = Layers;\n\texports.EventDispatcher = EventDispatcher;\n\texports.Clock = Clock;\n\texports.QuaternionLinearInterpolant = QuaternionLinearInterpolant;\n\texports.LinearInterpolant = LinearInterpolant;\n\texports.DiscreteInterpolant = DiscreteInterpolant;\n\texports.CubicInterpolant = CubicInterpolant;\n\texports.Interpolant = Interpolant;\n\texports.Triangle = Triangle;\n\texports.Spline = Spline;\n\texports.Math = _Math;\n\texports.Spherical = Spherical;\n\texports.Plane = Plane;\n\texports.Frustum = Frustum;\n\texports.Sphere = Sphere;\n\texports.Ray = Ray;\n\texports.Matrix4 = Matrix4;\n\texports.Matrix3 = Matrix3;\n\texports.Box3 = Box3;\n\texports.Box2 = Box2;\n\texports.Line3 = Line3;\n\texports.Euler = Euler;\n\texports.Vector4 = Vector4;\n\texports.Vector3 = Vector3;\n\texports.Vector2 = Vector2;\n\texports.Quaternion = Quaternion;\n\texports.ColorKeywords = ColorKeywords;\n\texports.Color = Color;\n\texports.MorphBlendMesh = MorphBlendMesh;\n\texports.ImmediateRenderObject = ImmediateRenderObject;\n\texports.VertexNormalsHelper = VertexNormalsHelper;\n\texports.SpotLightHelper = SpotLightHelper;\n\texports.SkeletonHelper = SkeletonHelper;\n\texports.PointLightHelper = PointLightHelper;\n\texports.HemisphereLightHelper = HemisphereLightHelper;\n\texports.GridHelper = GridHelper;\n\texports.FaceNormalsHelper = FaceNormalsHelper;\n\texports.DirectionalLightHelper = DirectionalLightHelper;\n\texports.CameraHelper = CameraHelper;\n\texports.BoundingBoxHelper = BoundingBoxHelper;\n\texports.BoxHelper = BoxHelper;\n\texports.ArrowHelper = ArrowHelper;\n\texports.AxisHelper = AxisHelper;\n\texports.ClosedSplineCurve3 = ClosedSplineCurve3;\n\texports.CatmullRomCurve3 = CatmullRomCurve3;\n\texports.SplineCurve3 = SplineCurve3;\n\texports.CubicBezierCurve3 = CubicBezierCurve3;\n\texports.QuadraticBezierCurve3 = QuadraticBezierCurve3;\n\texports.LineCurve3 = LineCurve3;\n\texports.ArcCurve = ArcCurve;\n\texports.EllipseCurve = EllipseCurve;\n\texports.SplineCurve = SplineCurve;\n\texports.CubicBezierCurve = CubicBezierCurve;\n\texports.QuadraticBezierCurve = QuadraticBezierCurve;\n\texports.LineCurve = LineCurve;\n\texports.Shape = Shape;\n\texports.ShapePath = ShapePath;\n\texports.Path = Path;\n\texports.Font = Font;\n\texports.CurvePath = CurvePath;\n\texports.Curve = Curve;\n\texports.ShapeUtils = ShapeUtils;\n\texports.SceneUtils = SceneUtils;\n\texports.CurveUtils = CurveUtils;\n\texports.WireframeGeometry = WireframeGeometry;\n\texports.ParametricGeometry = ParametricGeometry;\n\texports.ParametricBufferGeometry = ParametricBufferGeometry;\n\texports.TetrahedronGeometry = TetrahedronGeometry;\n\texports.TetrahedronBufferGeometry = TetrahedronBufferGeometry;\n\texports.OctahedronGeometry = OctahedronGeometry;\n\texports.OctahedronBufferGeometry = OctahedronBufferGeometry;\n\texports.IcosahedronGeometry = IcosahedronGeometry;\n\texports.IcosahedronBufferGeometry = IcosahedronBufferGeometry;\n\texports.DodecahedronGeometry = DodecahedronGeometry;\n\texports.DodecahedronBufferGeometry = DodecahedronBufferGeometry;\n\texports.PolyhedronGeometry = PolyhedronGeometry;\n\texports.PolyhedronBufferGeometry = PolyhedronBufferGeometry;\n\texports.TubeGeometry = TubeGeometry;\n\texports.TubeBufferGeometry = TubeBufferGeometry;\n\texports.TorusKnotGeometry = TorusKnotGeometry;\n\texports.TorusKnotBufferGeometry = TorusKnotBufferGeometry;\n\texports.TorusGeometry = TorusGeometry;\n\texports.TorusBufferGeometry = TorusBufferGeometry;\n\texports.TextGeometry = TextGeometry;\n\texports.SphereBufferGeometry = SphereBufferGeometry;\n\texports.SphereGeometry = SphereGeometry;\n\texports.RingGeometry = RingGeometry;\n\texports.RingBufferGeometry = RingBufferGeometry;\n\texports.PlaneBufferGeometry = PlaneBufferGeometry;\n\texports.PlaneGeometry = PlaneGeometry;\n\texports.LatheGeometry = LatheGeometry;\n\texports.LatheBufferGeometry = LatheBufferGeometry;\n\texports.ShapeGeometry = ShapeGeometry;\n\texports.ExtrudeGeometry = ExtrudeGeometry;\n\texports.EdgesGeometry = EdgesGeometry;\n\texports.ConeGeometry = ConeGeometry;\n\texports.ConeBufferGeometry = ConeBufferGeometry;\n\texports.CylinderGeometry = CylinderGeometry;\n\texports.CylinderBufferGeometry = CylinderBufferGeometry;\n\texports.CircleBufferGeometry = CircleBufferGeometry;\n\texports.CircleGeometry = CircleGeometry;\n\texports.BoxBufferGeometry = BoxBufferGeometry;\n\texports.BoxGeometry = BoxGeometry;\n\texports.ShadowMaterial = ShadowMaterial;\n\texports.SpriteMaterial = SpriteMaterial;\n\texports.RawShaderMaterial = RawShaderMaterial;\n\texports.ShaderMaterial = ShaderMaterial;\n\texports.PointsMaterial = PointsMaterial;\n\texports.MultiMaterial = MultiMaterial;\n\texports.MeshPhysicalMaterial = MeshPhysicalMaterial;\n\texports.MeshStandardMaterial = MeshStandardMaterial;\n\texports.MeshPhongMaterial = MeshPhongMaterial;\n\texports.MeshNormalMaterial = MeshNormalMaterial;\n\texports.MeshLambertMaterial = MeshLambertMaterial;\n\texports.MeshDepthMaterial = MeshDepthMaterial;\n\texports.MeshBasicMaterial = MeshBasicMaterial;\n\texports.LineDashedMaterial = LineDashedMaterial;\n\texports.LineBasicMaterial = LineBasicMaterial;\n\texports.Material = Material;\n\texports.REVISION = REVISION;\n\texports.MOUSE = MOUSE;\n\texports.CullFaceNone = CullFaceNone;\n\texports.CullFaceBack = CullFaceBack;\n\texports.CullFaceFront = CullFaceFront;\n\texports.CullFaceFrontBack = CullFaceFrontBack;\n\texports.FrontFaceDirectionCW = FrontFaceDirectionCW;\n\texports.FrontFaceDirectionCCW = FrontFaceDirectionCCW;\n\texports.BasicShadowMap = BasicShadowMap;\n\texports.PCFShadowMap = PCFShadowMap;\n\texports.PCFSoftShadowMap = PCFSoftShadowMap;\n\texports.FrontSide = FrontSide;\n\texports.BackSide = BackSide;\n\texports.DoubleSide = DoubleSide;\n\texports.FlatShading = FlatShading;\n\texports.SmoothShading = SmoothShading;\n\texports.NoColors = NoColors;\n\texports.FaceColors = FaceColors;\n\texports.VertexColors = VertexColors;\n\texports.NoBlending = NoBlending;\n\texports.NormalBlending = NormalBlending;\n\texports.AdditiveBlending = AdditiveBlending;\n\texports.SubtractiveBlending = SubtractiveBlending;\n\texports.MultiplyBlending = MultiplyBlending;\n\texports.CustomBlending = CustomBlending;\n\texports.BlendingMode = BlendingMode;\n\texports.AddEquation = AddEquation;\n\texports.SubtractEquation = SubtractEquation;\n\texports.ReverseSubtractEquation = ReverseSubtractEquation;\n\texports.MinEquation = MinEquation;\n\texports.MaxEquation = MaxEquation;\n\texports.ZeroFactor = ZeroFactor;\n\texports.OneFactor = OneFactor;\n\texports.SrcColorFactor = SrcColorFactor;\n\texports.OneMinusSrcColorFactor = OneMinusSrcColorFactor;\n\texports.SrcAlphaFactor = SrcAlphaFactor;\n\texports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor;\n\texports.DstAlphaFactor = DstAlphaFactor;\n\texports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor;\n\texports.DstColorFactor = DstColorFactor;\n\texports.OneMinusDstColorFactor = OneMinusDstColorFactor;\n\texports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor;\n\texports.NeverDepth = NeverDepth;\n\texports.AlwaysDepth = AlwaysDepth;\n\texports.LessDepth = LessDepth;\n\texports.LessEqualDepth = LessEqualDepth;\n\texports.EqualDepth = EqualDepth;\n\texports.GreaterEqualDepth = GreaterEqualDepth;\n\texports.GreaterDepth = GreaterDepth;\n\texports.NotEqualDepth = NotEqualDepth;\n\texports.MultiplyOperation = MultiplyOperation;\n\texports.MixOperation = MixOperation;\n\texports.AddOperation = AddOperation;\n\texports.NoToneMapping = NoToneMapping;\n\texports.LinearToneMapping = LinearToneMapping;\n\texports.ReinhardToneMapping = ReinhardToneMapping;\n\texports.Uncharted2ToneMapping = Uncharted2ToneMapping;\n\texports.CineonToneMapping = CineonToneMapping;\n\texports.UVMapping = UVMapping;\n\texports.CubeReflectionMapping = CubeReflectionMapping;\n\texports.CubeRefractionMapping = CubeRefractionMapping;\n\texports.EquirectangularReflectionMapping = EquirectangularReflectionMapping;\n\texports.EquirectangularRefractionMapping = EquirectangularRefractionMapping;\n\texports.SphericalReflectionMapping = SphericalReflectionMapping;\n\texports.CubeUVReflectionMapping = CubeUVReflectionMapping;\n\texports.CubeUVRefractionMapping = CubeUVRefractionMapping;\n\texports.TextureMapping = TextureMapping;\n\texports.RepeatWrapping = RepeatWrapping;\n\texports.ClampToEdgeWrapping = ClampToEdgeWrapping;\n\texports.MirroredRepeatWrapping = MirroredRepeatWrapping;\n\texports.TextureWrapping = TextureWrapping;\n\texports.NearestFilter = NearestFilter;\n\texports.NearestMipMapNearestFilter = NearestMipMapNearestFilter;\n\texports.NearestMipMapLinearFilter = NearestMipMapLinearFilter;\n\texports.LinearFilter = LinearFilter;\n\texports.LinearMipMapNearestFilter = LinearMipMapNearestFilter;\n\texports.LinearMipMapLinearFilter = LinearMipMapLinearFilter;\n\texports.TextureFilter = TextureFilter;\n\texports.UnsignedByteType = UnsignedByteType;\n\texports.ByteType = ByteType;\n\texports.ShortType = ShortType;\n\texports.UnsignedShortType = UnsignedShortType;\n\texports.IntType = IntType;\n\texports.UnsignedIntType = UnsignedIntType;\n\texports.FloatType = FloatType;\n\texports.HalfFloatType = HalfFloatType;\n\texports.UnsignedShort4444Type = UnsignedShort4444Type;\n\texports.UnsignedShort5551Type = UnsignedShort5551Type;\n\texports.UnsignedShort565Type = UnsignedShort565Type;\n\texports.UnsignedInt248Type = UnsignedInt248Type;\n\texports.AlphaFormat = AlphaFormat;\n\texports.RGBFormat = RGBFormat;\n\texports.RGBAFormat = RGBAFormat;\n\texports.LuminanceFormat = LuminanceFormat;\n\texports.LuminanceAlphaFormat = LuminanceAlphaFormat;\n\texports.RGBEFormat = RGBEFormat;\n\texports.DepthFormat = DepthFormat;\n\texports.DepthStencilFormat = DepthStencilFormat;\n\texports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format;\n\texports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format;\n\texports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format;\n\texports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format;\n\texports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format;\n\texports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format;\n\texports.RGB_ETC1_Format = RGB_ETC1_Format;\n\texports.LoopOnce = LoopOnce;\n\texports.LoopRepeat = LoopRepeat;\n\texports.LoopPingPong = LoopPingPong;\n\texports.InterpolateDiscrete = InterpolateDiscrete;\n\texports.InterpolateLinear = InterpolateLinear;\n\texports.InterpolateSmooth = InterpolateSmooth;\n\texports.ZeroCurvatureEnding = ZeroCurvatureEnding;\n\texports.ZeroSlopeEnding = ZeroSlopeEnding;\n\texports.WrapAroundEnding = WrapAroundEnding;\n\texports.TrianglesDrawMode = TrianglesDrawMode;\n\texports.TriangleStripDrawMode = TriangleStripDrawMode;\n\texports.TriangleFanDrawMode = TriangleFanDrawMode;\n\texports.LinearEncoding = LinearEncoding;\n\texports.sRGBEncoding = sRGBEncoding;\n\texports.GammaEncoding = GammaEncoding;\n\texports.RGBEEncoding = RGBEEncoding;\n\texports.LogLuvEncoding = LogLuvEncoding;\n\texports.RGBM7Encoding = RGBM7Encoding;\n\texports.RGBM16Encoding = RGBM16Encoding;\n\texports.RGBDEncoding = RGBDEncoding;\n\texports.BasicDepthPacking = BasicDepthPacking;\n\texports.RGBADepthPacking = RGBADepthPacking;\n\texports.CubeGeometry = BoxGeometry;\n\texports.Face4 = Face4;\n\texports.LineStrip = LineStrip;\n\texports.LinePieces = LinePieces;\n\texports.MeshFaceMaterial = MultiMaterial;\n\texports.PointCloud = PointCloud;\n\texports.Particle = Sprite;\n\texports.ParticleSystem = ParticleSystem;\n\texports.PointCloudMaterial = PointCloudMaterial;\n\texports.ParticleBasicMaterial = ParticleBasicMaterial;\n\texports.ParticleSystemMaterial = ParticleSystemMaterial;\n\texports.Vertex = Vertex;\n\texports.EdgesHelper = EdgesHelper;\n\texports.WireframeHelper = WireframeHelper;\n\texports.GeometryUtils = GeometryUtils;\n\texports.ImageUtils = ImageUtils;\n\texports.Projector = Projector;\n\texports.CanvasRenderer = CanvasRenderer;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n\tObject.defineProperty( exports, 'AudioContext', {\n\t\tget: function () {\n\t\t\treturn exports.getAudioContext();\n\t\t}\n\t});\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three/build/three.js\n// module id = 2\n// module chunks = 0","const THREE = require('three');\n\nexport default class Agent {\n constructor(id, pos, vel, goal, size, col) {\n \tthis.id = id;\n this.position = pos;\n this.velocity = vel;\n this.goal = goal\n this.size = size;\n this.markers = [];\n this.color = col;\n this.mesh = null;\n }\n} \n\n\n// WEBPACK FOOTER //\n// ./src/agent.js","export default class Marker {\n\tconstructor(position) {\n\t\tthis.position = position;\n\t\tthis.color = 0xff0000;\n\t\tthis.owned = false;\n\t\tthis.mesh = null;\n\t\tthis.agent = null;\n\t}\n}\n\n\n// WEBPACK FOOTER //\n// ./src/marker.js","const THREE = require('three');\nimport Grid from './grid.js'\nimport Agent from './agent.js'\nimport Marker from './marker.js'\n\nexport default class Crowd {\n constructor(renderengine) {\n \tthis.renderengine = renderengine;\n \tthis.markers = [];\n \tthis.agents = [];\n \tthis.board = new Grid(10.0, 100.0);\n\n \tthis.create_agents();\n \tthis.populate_board();\n \tthis.create_markers();\n \tthis.renderengine.render_plane(100.0);\n \tthis.renderengine.render_agents(this.agents);\n \tthis.renderengine.render_markers(this.markers);\n }\n\n create_agents() {\n \tvar agent_1_pos = new THREE.Vector3(-49, 1, 49);\n \tvar agent_2_pos = new THREE.Vector3(49, 1, 49);\n \tvar agent_1_goal = new THREE.Vector3(49, 0, -49);\n \tvar agent_2_goal = new THREE.Vector3(-49, 0, -49);\n \tvar zero = new THREE.Vector3(0, 0, 0);\n\n \tvar agent_1 = new Agent(0, agent_1_pos, zero, agent_1_goal, 2.0, 0x00ff00);\n \tvar agent_2 = new Agent(1, agent_2_pos, zero, agent_2_goal, 2.0, 0x0000ff);\n\tthis.agents.push(agent_1);\n\tthis.agents.push(agent_2);\n }\n\n populate_board() {\n \tfor (var i = 0; i < this.agents.length; i++) {\n \t\tvar agent = this.agents[i];\n \t\tvar gs = this.board.find_absolute_grid(agent.position.x, agent.position.z);\n \t\tthis.board.grid[gs.z][gs.x].add(agent);\n \t}\n }\n\n create_markers() {\n\tfor (var i = 0; i < 2000; i++) {\n\t\tvar x = Math.random() * 98 - 49;\n\t\tvar z = Math.random() * 98 - 49;\n\t\tvar marker = new Marker(new THREE.Vector3(x, 0.5, z));\n\t\tthis.markers.push(marker);\n\t}\n }\n\n /* \n\tupdate() - for each agent in the crowd, the velocity is calculated based off of the markers that belongs to each agent. \n */ \n update(time) {\n \tthis.update_marker_ownership();\n \tthis.update_agent_velocities(time);\n \tthis.renderengine.update_agents(this.agents);\n \tthis.renderengine.update_markers(this.markers);\n \tthis.reset_ownership();\n }\n\n reset_ownership() {\n \tfor (var i = 0; i < this.agents.length; i++) {\n \t\tthis.agents[i].markers = [];\n \t}\n\n \tfor (var i = 0; i < this.markers.length; i++) {\n \t\tthis.markers[i].owned = false;\n \t\tthis.markers[i].color = 0xff0000;\n \t\tthis.markers[i].agent = null;\n \t}\n }\n\n update_marker_ownership() {\n \tfor (var i = 0; i < this.markers.length; i++) {\n \t\tvar marker = this.markers[i];\n \t\tif (marker.owned) {\n \t\t\tcontinue;\n \t\t}\n \t\tvar ngs = this.board.find_nearest_grid(marker.position.x, marker.position.z);\n \t\tvar top_left = {x: ngs.x -1, z: ngs.z - 1};\n \t\tvar top = {x: ngs.x, z: ngs.z - 1};\n \t\tvar left = {x: ngs.x - 1, z: ngs.z};\n \t\tvar grid = this.board.grid;\n \t\tvar eligible_agents = [];\n \t\tif (top_left.z > -1 && top_left.x > -1 && grid[top_left.z][top_left.x].size > 0) {\n \t\t\tgrid[top_left.z][top_left.x].forEach(function(agent) {\n \t\t\t\teligible_agents.push(agent);\n \t\t\t});\n \t\t}\n \t\tif (top.z > -1 && top.x > -1 && grid[top.z][top.x].size > 0) {\n \t\t\tgrid[top.z][top.x].forEach(function(agent) {\n \t\t\t\teligible_agents.push(agent);\n \t\t\t});\n\t\t}\n \t\tif (left.z > -1 && left.x > -1 && grid[left.z][left.x].size > 0) {\n \t\t\tgrid[left.z][left.x].forEach(function(agent) {\n \t\t\t\teligible_agents.push(agent);\n \t\t\t});\n \t\t}\n \t\tif (ngs.z > -1 && ngs.x > -1 && grid[ngs.z][ngs.x].size > 0) {\n \t\t\tgrid[ngs.z][ngs.x].forEach(function(agent) {\n \t\t\t\teligible_agents.push(agent);\n \t\t\t});\n \t\t}\n \t\tthis.assign_marker_to_agent(eligible_agents, marker);\n \t}\n }\n\n assign_marker_to_agent(agents, marker) {\n \tif (agents.length === 0) {\n \t\tmarker.color = 0xff0000;\n \t\tmarker.owned = false;\n \t\tmarker.agent = null;\n \t\treturn;\n \t}\n \tvar closest = {dist: marker.position.distanceTo(agents[0].position), agent: agents[0]};\n \tagents.forEach(function(agent) {\n \t\tvar test_dist = marker.position.distanceTo(agent.position);\n \t\tif (test_dist < closest.dist) {\n \t\t\tclosest.dist = test_dist;\n \t\t\tclosest.agent = agent;\n \t\t}\n \t});\n \tmarker.agent = closest.agent;\n \tmarker.color = closest.agent.color;\n \tmarker.owned = true;\n \tclosest.agent.markers.push(marker);\n \treturn;\n }\n\n update_agent_velocities(time) {\n \tfor (var i = 0; i < this.agents.length; i++) {\n \t\tvar agent = this.agents[i];\n \t\tif (agent.position.distanceTo(agent.goal) > 2.0) {\n\t \t\tvar old_gs = this.board.find_absolute_grid(agent.position.x, agent.position.z);\n\n\t \t\t// computing total marker influence\n\t \t\tvar G = new THREE.Vector3().subVectors(agent.goal, agent.position)\n\t \t\tvar total_weight = 0.0;\n\t \t\tvar total_velocity = new THREE.Vector3(0, 0, 0);\n\t \t\tfor (var j = 0; j < agent.markers.length; j++) {\n\t \t\t\tvar marker = agent.markers[j];\n\t \t\t\tvar m = new THREE.Vector3().subVectors(marker.position, agent.position);\n\t \t\t\tm.y = 0.0;\n\t \t\t\tvar weight = (1.0 + m.dot(G) / (m.length() * G.length())) / (1.0 + m.length());\n\t \t\t\ttotal_weight += weight;\n\t \t\t}\n\t \t\tfor (var j = 0; j < agent.markers.length; j++) {\n\t \t\t\tvar marker = agent.markers[j];\n\t \t\t\tvar m = new THREE.Vector3().subVectors(marker.position, agent.position);\n\t \t\t\tm.y = 0.0;\n\t\t\t\tvar weight = (1.0 + m.dot(G) / (m.length() * G.length())) / (1.0 + m.length());\n\t \t\t\ttotal_velocity.add(m.multiplyScalar(weight / total_weight));\n\t \t\t}\n\t\t\tif (i === 1) {\n\t \t\t}\n\t \t\t// agent.velocity = total_velocity.normalize();\n\t \t\tagent.position.add(total_velocity.multiplyScalar(time).normalize());\n\t \t\t// agent.position.add(G.divideScalar(100.0));\n\t \t\t// check if the movement of this agent causes it to leave its current grid\n\t\t\tvar agent_gs = this.board.find_absolute_grid(agent.position.x, agent.position.z);\n\t\t\tif (old_gs.x !== agent_gs.x || old_gs.z !== agent_gs.z) {\n \t\t\t\tthis.board.grid[old_gs.z][old_gs.x].delete(agent);\n \t\t\t\tthis.board.grid[agent_gs.z][agent_gs.x].add(agent);\n\t\t\t}\n\t \t}\n \t}\n }\n}\n\n\n// WEBPACK FOOTER //\n// ./src/crowd.js","const THREE = require('three');\n\nexport default class RenderEngine {\n\n\tconstructor(scene) {\n\t\tthis.scene = scene;\n \t}\n\n \trender_plane(size) {\n\t \tvar plane_geo = new THREE.PlaneGeometry(size, size);\n\t\tvar plane_mesh = new THREE.Mesh(plane_geo, new THREE.MeshBasicMaterial( {color: 0xcccccc, side: THREE.DoubleSide}));\n\t\tplane_mesh.rotation.x = Math.PI / 2.0;\n\t\tplane_mesh.position.set(0.0, 0.0, 0.0);\n\t\tthis.scene.add(plane_mesh);\n \t}\n\n \trender_agents(agents) {\n\t \tvar cylinder_geo = new THREE.CylinderGeometry(1, 1, 2, 20);\n\t\tvar agent; \n\t\tfor (var i = 0; i < agents.length; i++) {\n\t\t\tagent = new THREE.Mesh(cylinder_geo, new THREE.MeshBasicMaterial( {color: agents[i].color, side: THREE.DoubleSide}));\n\t\t\tagent.position.set(agents[i].position.x, agents[i].position.y, agents[i].position.z);\n\t\t\tagents[i].mesh = agent;\n\t\t\tthis.scene.add(agent);\n\t\t}\n \t}\n \n \trender_markers(markers) {\n\t\tvar cube_geo = new THREE.BoxGeometry(0.5, 0.5, 0.5);\n\t\tvar marker;\n\t\tfor (var i = 0; i < markers.length; i++) {\n\t\t\tmarker = new THREE.Mesh(cube_geo, new THREE.MeshBasicMaterial( {color: markers[i].color, side: THREE.DoubleSide}));\n\t\t\tmarker.position.set(markers[i].position.x, markers[i].position.y, markers[i].position.z);\n\t\t\tmarkers[i].mesh = marker;\n\t\t\tthis.scene.add(marker);\n\t\t}\n \t}\n\n \tupdate_agents(agents) {\n \t\tfor (var i = 0; i < agents.length; i++) {\n \t\t\tvar pos = agents[i].position;\n \t\t\tvar mesh = agents[i].mesh;\n \t\t\tmesh.position.set(pos.x, pos.y, pos.z);\n \t\t\tmesh.geometry.verticesNeedUpdate = true;\n \t\t}\n \t}\n\n \tupdate_markers(markers) {\n \t\tmarkers.forEach(function(marker) {\n \t\t\tmarker.mesh.material.color.setHex(marker.color);\n \t\t});\n \t}\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/renderengine.js","\nconst THREE = require('three');\nconst OrbitControls = require('three-orbit-controls')(THREE)\nimport Stats from 'stats-js'\nimport DAT from 'dat-gui'\n\n// when the scene is done initializing, the function passed as `callback` will be executed\n// then, every frame, the function passed as `update` will be executed\nfunction init(callback, update) {\n var stats = new Stats();\n stats.setMode(1);\n stats.domElement.style.position = 'absolute';\n stats.domElement.style.left = '0px';\n stats.domElement.style.top = '0px';\n document.body.appendChild(stats.domElement);\n\n var gui = new DAT.GUI();\n\n var framework = {\n gui: gui,\n stats: stats\n };\n\n // run this function after the window loads\n window.addEventListener('load', function() {\n\n var scene = new THREE.Scene();\n var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );\n var renderer = new THREE.WebGLRenderer( { antialias: true } );\n renderer.setPixelRatio(window.devicePixelRatio);\n renderer.setSize(window.innerWidth, window.innerHeight);\n renderer.setClearColor(0x020202, 0);\n\n var controls = new OrbitControls(camera, renderer.domElement);\n controls.enableDamping = true;\n controls.enableZoom = true;\n controls.target.set(0, 0, 0);\n controls.rotateSpeed = 0.3;\n controls.zoomSpeed = 1.0;\n controls.panSpeed = 2.0;\n\n document.body.appendChild(renderer.domElement);\n\n // resize the canvas when the window changes\n window.addEventListener('resize', function() {\n camera.aspect = window.innerWidth / window.innerHeight;\n camera.updateProjectionMatrix();\n renderer.setSize(window.innerWidth, window.innerHeight);\n }, false);\n\n // assign THREE.js objects to the object we will return\n framework.scene = scene;\n framework.camera = camera;\n framework.renderer = renderer;\n\n // begin the animation loop\n (function tick() {\n stats.begin();\n update(framework); // perform any requested updates\n renderer.render(scene, camera); // render the scene\n stats.end();\n requestAnimationFrame(tick); // register to call this again when the browser renders a new frame\n })();\n\n // we will pass the scene, gui, renderer, camera, etc... to the callback function\n return callback(framework);\n });\n}\n\nexport default {\n init: init\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/framework.js","// stats.js - http://github.com/mrdoob/stats.js\nvar Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement(\"div\");f.id=\"stats\";f.addEventListener(\"mousedown\",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText=\"width:80px;opacity:0.9;cursor:pointer\";var a=document.createElement(\"div\");a.id=\"fps\";a.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#002\";f.appendChild(a);var i=document.createElement(\"div\");i.id=\"fpsText\";i.style.cssText=\"color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";\ni.innerHTML=\"FPS\";a.appendChild(i);var c=document.createElement(\"div\");c.id=\"fpsGraph\";c.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0ff\";for(a.appendChild(c);74>c.children.length;){var j=document.createElement(\"span\");j.style.cssText=\"width:1px;height:30px;float:left;background-color:#113\";c.appendChild(j)}var d=document.createElement(\"div\");d.id=\"ms\";d.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#020;display:none\";f.appendChild(d);var k=document.createElement(\"div\");\nk.id=\"msText\";k.style.cssText=\"color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";k.innerHTML=\"MS\";d.appendChild(k);var e=document.createElement(\"div\");e.id=\"msGraph\";e.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0f0\";for(d.appendChild(e);74>e.children.length;)j=document.createElement(\"span\"),j.style.cssText=\"width:1px;height:30px;float:left;background-color:#131\",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display=\n\"block\";d.style.display=\"none\";break;case 1:a.style.display=\"none\",d.style.display=\"block\"}};return{REVISION:12,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+\" MS (\"+n+\"-\"+o+\")\";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+\"px\";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+\" FPS (\"+p+\"-\"+q+\")\",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height=\na+\"px\",m=b,r=0);return b},update:function(){l=this.end()}}};\"object\"===typeof module&&(module.exports=Stats);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/stats-js/build/stats.min.js\n// module id = 8\n// module chunks = 0","module.exports = require('./vendor/dat.gui')\nmodule.exports.color = require('./vendor/dat.color')\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/index.js\n// module id = 9\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.gui = dat.gui || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\n/** @namespace */\ndat.controllers = dat.controllers || {};\n\n/** @namespace */\ndat.dom = dat.dom || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\ndat.utils.css = (function () {\n return {\n load: function (url, doc) {\n doc = doc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function(css, doc) {\n doc = doc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = css;\n doc.getElementsByTagName('head')[0].appendChild(injected);\n }\n }\n})();\n\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.controllers.Controller = (function (common) {\n\n /**\n * @class An \"abstract\" class that represents a given property of an object.\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var Controller = function(object, property) {\n\n this.initialValue = object[property];\n\n /**\n * Those who extend this class will put their DOM elements in here.\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n\n /**\n * The object to manipulate\n * @type {Object}\n */\n this.object = object;\n\n /**\n * The name of the property to manipulate\n * @type {String}\n */\n this.property = property;\n\n /**\n * The function to be called on change.\n * @type {Function}\n * @ignore\n */\n this.__onChange = undefined;\n\n /**\n * The function to be called on finishing change.\n * @type {Function}\n * @ignore\n */\n this.__onFinishChange = undefined;\n\n };\n\n common.extend(\n\n Controller.prototype,\n\n /** @lends dat.controllers.Controller.prototype */\n {\n\n /**\n * Specify that a function fire every time someone changes the value with\n * this Controller.\n *\n * @param {Function} fnc This function will be called whenever the value\n * is modified via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onChange: function(fnc) {\n this.__onChange = fnc;\n return this;\n },\n\n /**\n * Specify that a function fire every time someone \"finishes\" changing\n * the value wih this Controller. Useful for values that change\n * incrementally like numbers or strings.\n *\n * @param {Function} fnc This function will be called whenever\n * someone \"finishes\" changing the value via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onFinishChange: function(fnc) {\n this.__onFinishChange = fnc;\n return this;\n },\n\n /**\n * Change the value of object[property]\n *\n * @param {Object} newValue The new value of object[property]\n */\n setValue: function(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n },\n\n /**\n * Gets the value of object[property]\n *\n * @returns {Object} The current value of object[property]\n */\n getValue: function() {\n return this.object[this.property];\n },\n\n /**\n * Refreshes the visual display of a Controller in order to keep sync\n * with the object's current value.\n * @returns {dat.controllers.Controller} this\n */\n updateDisplay: function() {\n return this;\n },\n\n /**\n * @returns {Boolean} true if the value has deviated from initialValue\n */\n isModified: function() {\n return this.initialValue !== this.getValue()\n }\n\n }\n\n );\n\n return Controller;\n\n\n})(dat.utils.common);\n\n\ndat.dom.dom = (function (common) {\n\n var EVENT_MAP = {\n 'HTMLEvents': ['change'],\n 'MouseEvents': ['click','mousemove','mousedown','mouseup', 'mouseover'],\n 'KeyboardEvents': ['keydown']\n };\n\n var EVENT_MAP_INV = {};\n common.each(EVENT_MAP, function(v, k) {\n common.each(v, function(e) {\n EVENT_MAP_INV[e] = k;\n });\n });\n\n var CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\n\n function cssValueToPixels(val) {\n\n if (val === '0' || common.isUndefined(val)) return 0;\n\n var match = val.match(CSS_VALUE_PIXELS);\n\n if (!common.isNull(match)) {\n return parseFloat(match[1]);\n }\n\n // TODO ...ems? %?\n\n return 0;\n\n }\n\n /**\n * @namespace\n * @member dat.dom\n */\n var dom = {\n\n /**\n * \n * @param elem\n * @param selectable\n */\n makeSelectable: function(elem, selectable) {\n\n if (elem === undefined || elem.style === undefined) return;\n\n elem.onselectstart = selectable ? function() {\n return false;\n } : function() {\n };\n\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n\n },\n\n /**\n *\n * @param elem\n * @param horizontal\n * @param vertical\n */\n makeFullscreen: function(elem, horizontal, vertical) {\n\n if (common.isUndefined(horizontal)) horizontal = true;\n if (common.isUndefined(vertical)) vertical = true;\n\n elem.style.position = 'absolute';\n\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n\n },\n\n /**\n *\n * @param elem\n * @param eventType\n * @param params\n */\n fakeEvent: function(elem, eventType, params, aux) {\n params = params || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false,\n params.cancelable || true, window, params.clickCount || 1,\n 0, //screen X\n 0, //screen Y\n clientX, //client X\n clientY, //client Y\n false, false, false, false, 0, null);\n break;\n case 'KeyboardEvents':\n var init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz\n common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false,\n params.cancelable, window,\n params.ctrlKey, params.altKey,\n params.shiftKey, params.metaKey,\n params.keyCode, params.charCode);\n break;\n default:\n evt.initEvent(eventType, params.bubbles || false,\n params.cancelable || true);\n break;\n }\n common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n bind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.addEventListener)\n elem.addEventListener(event, func, bool);\n else if (elem.attachEvent)\n elem.attachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n unbind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.removeEventListener)\n elem.removeEventListener(event, func, bool);\n else if (elem.detachEvent)\n elem.detachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n addClass: function(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) == -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n removeClass: function(elem, className) {\n if (className) {\n if (elem.className === undefined) {\n // elem.className = className;\n } else if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index != -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n\n hasClass: function(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n\n /**\n *\n * @param elem\n */\n getWidth: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-left-width']) +\n cssValueToPixels(style['border-right-width']) +\n cssValueToPixels(style['padding-left']) +\n cssValueToPixels(style['padding-right']) +\n cssValueToPixels(style['width']);\n },\n\n /**\n *\n * @param elem\n */\n getHeight: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-top-width']) +\n cssValueToPixels(style['border-bottom-width']) +\n cssValueToPixels(style['padding-top']) +\n cssValueToPixels(style['padding-bottom']) +\n cssValueToPixels(style['height']);\n },\n\n /**\n *\n * @param elem\n */\n getOffset: function(elem) {\n var offset = {left: 0, top:0};\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n } while (elem = elem.offsetParent);\n }\n return offset;\n },\n\n // http://stackoverflow.com/posts/2684561/revisions\n /**\n * \n * @param elem\n */\n isActive: function(elem) {\n return elem === document.activeElement && ( elem.type || elem.href );\n }\n\n };\n\n return dom;\n\n})(dat.utils.common);\n\n\ndat.controllers.OptionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a select input to alter the property of an object, using a\n * list of accepted values.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object|string[]} options A map of labels to acceptable values, or\n * a list of acceptable string values.\n *\n * @member dat.controllers\n */\n var OptionController = function(object, property, options) {\n\n OptionController.superclass.call(this, object, property);\n\n var _this = this;\n\n /**\n * The drop down menu\n * @ignore\n */\n this.__select = document.createElement('select');\n\n if (common.isArray(options)) {\n var map = {};\n common.each(options, function(element) {\n map[element] = element;\n });\n options = map;\n }\n\n common.each(options, function(value, key) {\n\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n\n });\n\n // Acknowledge original value\n this.updateDisplay();\n\n dom.bind(this.__select, 'change', function() {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n\n this.domElement.appendChild(this.__select);\n\n };\n\n OptionController.superclass = Controller;\n\n common.extend(\n\n OptionController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = OptionController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n },\n\n updateDisplay: function() {\n this.__select.value = this.getValue();\n return OptionController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return OptionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberController = (function (Controller, common) {\n\n /**\n * @class Represents a given property of an object that is a number.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberController = function(object, property, params) {\n\n NumberController.superclass.call(this, object, property);\n\n params = params || {};\n\n this.__min = params.min;\n this.__max = params.max;\n this.__step = params.step;\n\n if (common.isUndefined(this.__step)) {\n\n if (this.initialValue == 0) {\n this.__impliedStep = 1; // What are we, psychics?\n } else {\n // Hey Doug, check this out.\n this.__impliedStep = Math.pow(10, Math.floor(Math.log(this.initialValue)/Math.LN10))/10;\n }\n\n } else {\n\n this.__impliedStep = this.__step;\n\n }\n\n this.__precision = numDecimals(this.__impliedStep);\n\n\n };\n\n NumberController.superclass = Controller;\n\n common.extend(\n\n NumberController.prototype,\n Controller.prototype,\n\n /** @lends dat.controllers.NumberController.prototype */\n {\n\n setValue: function(v) {\n\n if (this.__min !== undefined && v < this.__min) {\n v = this.__min;\n } else if (this.__max !== undefined && v > this.__max) {\n v = this.__max;\n }\n\n if (this.__step !== undefined && v % this.__step != 0) {\n v = Math.round(v / this.__step) * this.__step;\n }\n\n return NumberController.superclass.prototype.setValue.call(this, v);\n\n },\n\n /**\n * Specify a minimum value for object[property].\n *\n * @param {Number} minValue The minimum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n min: function(v) {\n this.__min = v;\n return this;\n },\n\n /**\n * Specify a maximum value for object[property].\n *\n * @param {Number} maxValue The maximum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n max: function(v) {\n this.__max = v;\n return this;\n },\n\n /**\n * Specify a step value that dat.controllers.NumberController\n * increments by.\n *\n * @param {Number} stepValue The step value for\n * dat.controllers.NumberController\n * @default if minimum and maximum specified increment is 1% of the\n * difference otherwise stepValue is 1\n * @returns {dat.controllers.NumberController} this\n */\n step: function(v) {\n this.__step = v;\n return this;\n }\n\n }\n\n );\n\n function numDecimals(x) {\n x = x.toString();\n if (x.indexOf('.') > -1) {\n return x.length - x.indexOf('.') - 1;\n } else {\n return 0;\n }\n }\n\n return NumberController;\n\n})(dat.controllers.Controller,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerBox = (function (NumberController, dom, common) {\n\n /**\n * @class Represents a given property of an object that is a number and\n * provides an input element with which to manipulate it.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerBox = function(object, property, params) {\n\n this.__truncationSuspended = false;\n\n NumberControllerBox.superclass.call(this, object, property, params);\n\n var _this = this;\n\n /**\n * {Number} Previous mouse y position\n * @ignore\n */\n var prev_y;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n // Makes it so manually specified values are not truncated.\n\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'mousedown', onMouseDown);\n dom.bind(this.__input, 'keydown', function(e) {\n\n // When pressing entire, you can be as precise as you want.\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n }\n\n });\n\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!common.isNaN(attempted)) _this.setValue(attempted);\n }\n\n function onBlur() {\n onChange();\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prev_y = e.clientY;\n }\n\n function onMouseDrag(e) {\n\n var diff = prev_y - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n\n prev_y = e.clientY;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n NumberControllerBox.superclass = NumberController;\n\n common.extend(\n\n NumberControllerBox.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return NumberControllerBox.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n function roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n }\n\n return NumberControllerBox;\n\n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerSlider = (function (NumberController, dom, css, common, styleSheet) {\n\n /**\n * @class Represents a given property of an object that is a number, contains\n * a minimum and maximum, and provides a slider element with which to\n * manipulate it. It should be noted that the slider element is made up of\n * <div> tags, not the html5\n * <slider> element.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n * \n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Number} minValue Minimum allowed value\n * @param {Number} maxValue Maximum allowed value\n * @param {Number} stepValue Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerSlider = function(object, property, min, max, step) {\n\n NumberControllerSlider.superclass.call(this, object, property, { min: min, max: max, step: step });\n\n var _this = this;\n\n this.__background = document.createElement('div');\n this.__foreground = document.createElement('div');\n \n\n\n dom.bind(this.__background, 'mousedown', onMouseDown);\n \n dom.addClass(this.__background, 'slider');\n dom.addClass(this.__foreground, 'slider-fg');\n\n function onMouseDown(e) {\n\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n\n onMouseDrag(e);\n }\n\n function onMouseDrag(e) {\n\n e.preventDefault();\n\n var offset = dom.getOffset(_this.__background);\n var width = dom.getWidth(_this.__background);\n \n _this.setValue(\n map(e.clientX, offset.left, offset.left + width, _this.__min, _this.__max)\n );\n\n return false;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.__background.appendChild(this.__foreground);\n this.domElement.appendChild(this.__background);\n\n };\n\n NumberControllerSlider.superclass = NumberController;\n\n /**\n * Injects default stylesheet for slider elements.\n */\n NumberControllerSlider.useDefaultStyles = function() {\n css.inject(styleSheet);\n };\n\n common.extend(\n\n NumberControllerSlider.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n var pct = (this.getValue() - this.__min)/(this.__max - this.__min);\n this.__foreground.style.width = pct*100+'%';\n return NumberControllerSlider.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n\n\n );\n\n function map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n }\n\n return NumberControllerSlider;\n \n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.css,\ndat.utils.common,\n\".slider {\\n box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);\\n height: 1em;\\n border-radius: 1em;\\n background-color: #eee;\\n padding: 0 0.5em;\\n overflow: hidden;\\n}\\n\\n.slider-fg {\\n padding: 1px 0 2px 0;\\n background-color: #aaa;\\n height: 1em;\\n margin-left: -0.5em;\\n padding-right: 0.5em;\\n border-radius: 1em 0 0 1em;\\n}\\n\\n.slider-fg:after {\\n display: inline-block;\\n border-radius: 1em;\\n background-color: #fff;\\n border: 1px solid #aaa;\\n content: '';\\n float: right;\\n margin-right: -1em;\\n margin-top: -1px;\\n height: 0.9em;\\n width: 0.9em;\\n}\");\n\n\ndat.controllers.FunctionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a GUI interface to fire a specified method, a property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var FunctionController = function(object, property, text) {\n\n FunctionController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__button = document.createElement('div');\n this.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(this.__button, 'click', function(e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n\n dom.addClass(this.__button, 'button');\n\n this.domElement.appendChild(this.__button);\n\n\n };\n\n FunctionController.superclass = Controller;\n\n common.extend(\n\n FunctionController.prototype,\n Controller.prototype,\n {\n \n fire: function() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.getValue().call(this.object);\n }\n }\n\n );\n\n return FunctionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.BooleanController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a checkbox input to alter the boolean property of an object.\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var BooleanController = function(object, property) {\n\n BooleanController.superclass.call(this, object, property);\n\n var _this = this;\n this.__prev = this.getValue();\n\n this.__checkbox = document.createElement('input');\n this.__checkbox.setAttribute('type', 'checkbox');\n\n\n dom.bind(this.__checkbox, 'change', onChange, false);\n\n this.domElement.appendChild(this.__checkbox);\n\n // Match original value\n this.updateDisplay();\n\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n\n };\n\n BooleanController.superclass = Controller;\n\n common.extend(\n\n BooleanController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = BooleanController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n },\n\n updateDisplay: function() {\n \n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true; \n } else {\n this.__checkbox.checked = false;\n }\n\n return BooleanController.superclass.prototype.updateDisplay.call(this);\n\n }\n\n\n }\n\n );\n\n return BooleanController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common);\n\n\ndat.GUI = dat.gui.GUI = (function (css, saveDialogueContents, styleSheet, controllerFactory, Controller, BooleanController, FunctionController, NumberControllerBox, NumberControllerSlider, OptionController, ColorController, requestAnimationFrame, CenteredDiv, dom, common) {\n\n css.inject(styleSheet);\n\n /** Outer-most className for GUI's */\n var CSS_NAMESPACE = 'dg';\n\n var HIDE_KEY_CODE = 72;\n\n /** The only value shared between the JS and SCSS. Use caution. */\n var CLOSE_BUTTON_HEIGHT = 20;\n\n var DEFAULT_DEFAULT_PRESET_NAME = 'Default';\n\n var SUPPORTS_LOCAL_STORAGE = (function() {\n try {\n return 'localStorage' in window && window['localStorage'] !== null;\n } catch (e) {\n return false;\n }\n })();\n\n var SAVE_DIALOGUE;\n\n /** Have we yet to create an autoPlace GUI? */\n var auto_place_virgin = true;\n\n /** Fixed position div that auto place GUI's go inside */\n var auto_place_container;\n\n /** Are we hiding the GUI's ? */\n var hide = false;\n\n /** GUI's which should be hidden */\n var hideable_guis = [];\n\n /**\n * A lightweight controller library for JavaScript. It allows you to easily\n * manipulate variables and fire functions on the fly.\n * @class\n *\n * @member dat.gui\n *\n * @param {Object} [params]\n * @param {String} [params.name] The name of this GUI.\n * @param {Object} [params.load] JSON object representing the saved state of\n * this GUI.\n * @param {Boolean} [params.auto=true]\n * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.\n * @param {Boolean} [params.closed] If true, starts closed\n */\n var GUI = function(params) {\n\n var _this = this;\n\n /**\n * Outermost DOM Element\n * @type DOMElement\n */\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n\n dom.addClass(this.domElement, CSS_NAMESPACE);\n\n /**\n * Nested GUI's by name\n * @ignore\n */\n this.__folders = {};\n\n this.__controllers = [];\n\n /**\n * List of objects I'm remembering for save, only used in top level GUI\n * @ignore\n */\n this.__rememberedObjects = [];\n\n /**\n * Maps the index of remembered objects to a map of controllers, only used\n * in top level GUI.\n *\n * @private\n * @ignore\n *\n * @example\n * [\n * {\n * propertyName: Controller,\n * anotherPropertyName: Controller\n * },\n * {\n * propertyName: Controller\n * }\n * ]\n */\n this.__rememberedObjectIndecesToControllers = [];\n\n this.__listening = [];\n\n params = params || {};\n\n // Default parameters\n params = common.defaults(params, {\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n\n params = common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n\n\n if (!common.isUndefined(params.load)) {\n\n // Explicit preset\n if (params.preset) params.load.preset = params.preset;\n\n } else {\n\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n\n }\n\n if (common.isUndefined(params.parent) && params.hideable) {\n hideable_guis.push(this);\n }\n\n // Only root level GUI's are resizable.\n params.resizable = common.isUndefined(params.parent) && params.resizable;\n\n\n if (params.autoPlace && common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;\n\n // Not part of params because I don't want people passing this in via\n // constructor. Should be a 'remembered' value.\n var use_local_storage =\n SUPPORTS_LOCAL_STORAGE &&\n localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n\n Object.defineProperties(this,\n\n /** @lends dat.gui.GUI.prototype */\n {\n\n /**\n * The parent GUI\n * @type dat.gui.GUI\n */\n parent: {\n get: function() {\n return params.parent;\n }\n },\n\n scrollable: {\n get: function() {\n return params.scrollable;\n }\n },\n\n /**\n * Handles GUI's element placement for you\n * @type Boolean\n */\n autoPlace: {\n get: function() {\n return params.autoPlace;\n }\n },\n\n /**\n * The identifier for a set of saved values\n * @type String\n */\n preset: {\n\n get: function() {\n if (_this.parent) {\n return _this.getRoot().preset;\n } else {\n return params.load.preset;\n }\n },\n\n set: function(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n\n },\n\n /**\n * The width of GUI element\n * @type Number\n */\n width: {\n get: function() {\n return params.width;\n },\n set: function(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n\n /**\n * The name of GUI. Used for folders. i.e\n * a folder's name\n * @type String\n */\n name: {\n get: function() {\n return params.name;\n },\n set: function(v) {\n // TODO Check for collisions among sibling folders\n params.name = v;\n if (title_row_name) {\n title_row_name.innerHTML = params.name;\n }\n }\n },\n\n /**\n * Whether the GUI is collapsed or not\n * @type Boolean\n */\n closed: {\n get: function() {\n return params.closed;\n },\n set: function(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n // For browsers that aren't going to respect the CSS transition,\n // Lets just check our height against the window height right off\n // the bat.\n this.onResize();\n\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n\n /**\n * Contains all presets\n * @type Object\n */\n load: {\n get: function() {\n return params.load;\n }\n },\n\n /**\n * Determines whether or not to use localStorage as the means for\n * remembering\n * @type Boolean\n */\n useLocalStorage: {\n\n get: function() {\n return use_local_storage;\n },\n set: function(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n use_local_storage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n\n }\n\n });\n\n // Are we a root level GUI?\n if (common.isUndefined(params.parent)) {\n\n params.closed = false;\n\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n\n // Are we supposed to be loading locally?\n if (SUPPORTS_LOCAL_STORAGE) {\n\n if (use_local_storage) {\n\n _this.useLocalStorage = true;\n\n var saved_gui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n\n if (saved_gui) {\n params.load = JSON.parse(saved_gui);\n }\n\n }\n\n }\n\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n this.domElement.appendChild(this.__closeButton);\n\n dom.bind(this.__closeButton, 'click', function() {\n\n _this.closed = !_this.closed;\n\n\n });\n\n\n // Oh, you're a nested GUI!\n } else {\n\n if (params.closed === undefined) {\n params.closed = true;\n }\n\n var title_row_name = document.createTextNode(params.name);\n dom.addClass(title_row_name, 'controller-name');\n\n var title_row = addRow(_this, title_row_name);\n\n var on_click_title = function(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n\n dom.addClass(title_row, 'title');\n dom.bind(title_row, 'click', on_click_title);\n\n if (!params.closed) {\n this.closed = false;\n }\n\n }\n\n if (params.autoPlace) {\n\n if (common.isUndefined(params.parent)) {\n\n if (auto_place_virgin) {\n auto_place_container = document.createElement('div');\n dom.addClass(auto_place_container, CSS_NAMESPACE);\n dom.addClass(auto_place_container, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(auto_place_container);\n auto_place_virgin = false;\n }\n\n // Put it in the dom for you.\n auto_place_container.appendChild(this.domElement);\n\n // Apply the auto styles\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n\n }\n\n\n // Make it not elastic.\n if (!this.parent) setWidth(_this, params.width);\n\n }\n\n dom.bind(window, 'resize', function() { _this.onResize() });\n dom.bind(this.__ul, 'webkitTransitionEnd', function() { _this.onResize(); });\n dom.bind(this.__ul, 'transitionend', function() { _this.onResize() });\n dom.bind(this.__ul, 'oTransitionEnd', function() { _this.onResize() });\n this.onResize();\n\n\n if (params.resizable) {\n addResizeHandle(this);\n }\n\n function saveToLocalStorage() {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n\n var root = _this.getRoot();\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n common.defer(function() {\n root.width -= 1;\n });\n }\n\n if (!params.parent) {\n resetWidth();\n }\n\n };\n\n GUI.toggleHide = function() {\n\n hide = !hide;\n common.each(hideable_guis, function(gui) {\n gui.domElement.style.zIndex = hide ? -999 : 999;\n gui.domElement.style.opacity = hide ? 0 : 1;\n });\n };\n\n GUI.CLASS_AUTO_PLACE = 'a';\n GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\n GUI.CLASS_MAIN = 'main';\n GUI.CLASS_CONTROLLER_ROW = 'cr';\n GUI.CLASS_TOO_TALL = 'taller-than-window';\n GUI.CLASS_CLOSED = 'closed';\n GUI.CLASS_CLOSE_BUTTON = 'close-button';\n GUI.CLASS_DRAG = 'drag';\n\n GUI.DEFAULT_WIDTH = 245;\n GUI.TEXT_CLOSED = 'Close Controls';\n GUI.TEXT_OPEN = 'Open Controls';\n\n dom.bind(window, 'keydown', function(e) {\n\n if (document.activeElement.type !== 'text' &&\n (e.which === HIDE_KEY_CODE || e.keyCode == HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n\n }, false);\n\n common.extend(\n\n GUI.prototype,\n\n /** @lends dat.gui.GUI */\n {\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.Controller} The new controller that was added.\n * @instance\n */\n add: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n }\n );\n\n },\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.ColorController} The new controller that was added.\n * @instance\n */\n addColor: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n color: true\n }\n );\n\n },\n\n /**\n * @param controller\n * @instance\n */\n remove: function(controller) {\n\n // TODO listening?\n this.__ul.removeChild(controller.__li);\n this.__controllers.slice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n common.defer(function() {\n _this.onResize();\n });\n\n },\n\n destroy: function() {\n\n if (this.autoPlace) {\n auto_place_container.removeChild(this.domElement);\n }\n\n },\n\n /**\n * @param name\n * @returns {dat.gui.GUI} The new folder.\n * @throws {Error} if this GUI already has a folder by the specified\n * name\n * @instance\n */\n addFolder: function(name) {\n\n // We have to prevent collisions on names in order to have a key\n // by which to remember saved values\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' +\n ' name \"' + name + '\"');\n }\n\n var new_gui_params = { name: name, parent: this };\n\n // We need to pass down the autoPlace trait so that we can\n // attach event listeners to open/close folder actions to\n // ensure that a scrollbar appears if the window is too short.\n new_gui_params.autoPlace = this.autoPlace;\n\n // Do we have saved appearance data for this folder?\n\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[name]) { // Did daddy remember me?\n\n // Start me closed if I was closed\n new_gui_params.closed = this.load.folders[name].closed;\n\n // Pass down the loaded data\n new_gui_params.load = this.load.folders[name];\n\n }\n\n var gui = new GUI(new_gui_params);\n this.__folders[name] = gui;\n\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n\n },\n\n open: function() {\n this.closed = false;\n },\n\n close: function() {\n this.closed = true;\n },\n\n onResize: function() {\n\n var root = this.getRoot();\n\n if (root.scrollable) {\n\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n\n common.each(root.__ul.childNodes, function(node) {\n if (! (root.autoPlace && node === root.__save_row))\n h += dom.getHeight(node);\n });\n\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n\n }\n\n if (root.__resize_handle) {\n common.defer(function() {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n\n },\n\n /**\n * Mark objects for saving. The order of these objects cannot change as\n * the GUI grows. When remembering new objects, append them to the end\n * of the list.\n *\n * @param {Object...} objects\n * @throws {Error} if not called on a top level GUI.\n * @instance\n */\n remember: function() {\n\n if (common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;\n }\n\n if (this.parent) {\n throw new Error(\"You can only call remember on a top level GUI.\");\n }\n\n var _this = this;\n\n common.each(Array.prototype.slice.call(arguments), function(object) {\n if (_this.__rememberedObjects.length == 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) == -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n\n if (this.autoPlace) {\n // Set save row width\n setWidth(this, this.width);\n }\n\n },\n\n /**\n * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.\n * @instance\n */\n getRoot: function() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n\n /**\n * @returns {Object} a JSON object representing the current state of\n * this GUI as well as its remembered properties.\n * @instance\n */\n getSaveObject: function() {\n\n var toReturn = this.load;\n\n toReturn.closed = this.closed;\n\n // Am I remembering any values?\n if (this.__rememberedObjects.length > 0) {\n\n toReturn.preset = this.preset;\n\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n\n }\n\n toReturn.folders = {};\n common.each(this.__folders, function(element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n\n return toReturn;\n\n },\n\n save: function() {\n\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n\n },\n\n saveAs: function(presetName) {\n\n if (!this.load.remembered) {\n\n // Retain default values upon first save\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n\n }\n\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n\n },\n\n revert: function(gui) {\n\n common.each(this.__controllers, function(controller) {\n // Make revert work on Default.\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n }, this);\n\n common.each(this.__folders, function(folder) {\n folder.revert(folder);\n });\n\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n\n\n },\n\n listen: function(controller) {\n\n var init = this.__listening.length == 0;\n this.__listening.push(controller);\n if (init) updateDisplays(this.__listening);\n\n }\n\n }\n\n );\n\n function add(gui, object, property, params) {\n\n if (object[property] === undefined) {\n throw new Error(\"Object \" + object + \" has no property \\\"\" + property + \"\\\"\");\n }\n\n var controller;\n\n if (params.color) {\n\n controller = new ColorController(object, property);\n\n } else {\n\n var factoryArgs = [object,property].concat(params.factoryArgs);\n controller = controllerFactory.apply(gui, factoryArgs);\n\n }\n\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n\n recallSavedValue(gui, controller);\n\n dom.addClass(controller.domElement, 'c');\n\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n\n var li = addRow(gui, container, params.before);\n\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n dom.addClass(li, typeof controller.getValue());\n\n augmentController(gui, li, controller);\n\n gui.__controllers.push(controller);\n\n return controller;\n\n }\n\n /**\n * Add a row to the end of the GUI or before another row.\n *\n * @param gui\n * @param [dom] If specified, inserts the dom content in the new row\n * @param [liBefore] If specified, places the new row before another row\n */\n function addRow(gui, dom, liBefore) {\n var li = document.createElement('li');\n if (dom) li.appendChild(dom);\n if (liBefore) {\n gui.__ul.insertBefore(li, params.before);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n }\n\n function augmentController(gui, li, controller) {\n\n controller.__li = li;\n controller.__gui = gui;\n\n common.extend(controller, {\n\n options: function(options) {\n\n if (arguments.length > 1) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [common.toArray(arguments)]\n }\n );\n\n }\n\n if (common.isArray(options) || common.isObject(options)) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [options]\n }\n );\n\n }\n\n },\n\n name: function(v) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = v;\n return controller;\n },\n\n listen: function() {\n controller.__gui.listen(controller);\n return controller;\n },\n\n remove: function() {\n controller.__gui.remove(controller);\n return controller;\n }\n\n });\n\n // All sliders should be accompanied by a box.\n if (controller instanceof NumberControllerSlider) {\n\n var box = new NumberControllerBox(controller.object, controller.property,\n { min: controller.__min, max: controller.__max, step: controller.__step });\n\n common.each(['updateDisplay', 'onChange', 'onFinishChange'], function(method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function() {\n var args = Array.prototype.slice.call(arguments);\n pc.apply(controller, args);\n return pb.apply(box, args);\n }\n });\n\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n\n }\n else if (controller instanceof NumberControllerBox) {\n\n var r = function(returned) {\n\n // Have we defined both boundaries?\n if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {\n\n // Well, then lets just replace this with a slider.\n controller.remove();\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n\n }\n\n return returned;\n\n };\n\n controller.min = common.compose(r, controller.min);\n controller.max = common.compose(r, controller.max);\n\n }\n else if (controller instanceof BooleanController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n\n dom.bind(controller.__checkbox, 'click', function(e) {\n e.stopPropagation(); // Prevents double-toggle\n })\n\n }\n else if (controller instanceof FunctionController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__button, 'click');\n });\n\n dom.bind(li, 'mouseover', function() {\n dom.addClass(controller.__button, 'hover');\n });\n\n dom.bind(li, 'mouseout', function() {\n dom.removeClass(controller.__button, 'hover');\n });\n\n }\n else if (controller instanceof ColorController) {\n\n dom.addClass(li, 'color');\n controller.updateDisplay = common.compose(function(r) {\n li.style.borderLeftColor = controller.__color.toString();\n return r;\n }, controller.updateDisplay);\n\n controller.updateDisplay();\n\n }\n\n controller.setValue = common.compose(function(r) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return r;\n }, controller.setValue);\n\n }\n\n function recallSavedValue(gui, controller) {\n\n // Find the topmost GUI, that's where remembered objects live.\n var root = gui.getRoot();\n\n // Does the object we're controlling match anything we've been told to\n // remember?\n var matched_index = root.__rememberedObjects.indexOf(controller.object);\n\n // Why yes, it does!\n if (matched_index != -1) {\n\n // Let me fetch a map of controllers for thcommon.isObject.\n var controller_map =\n root.__rememberedObjectIndecesToControllers[matched_index];\n\n // Ohp, I believe this is the first controller we've created for this\n // object. Lets make the map fresh.\n if (controller_map === undefined) {\n controller_map = {};\n root.__rememberedObjectIndecesToControllers[matched_index] =\n controller_map;\n }\n\n // Keep track of this controller\n controller_map[controller.property] = controller;\n\n // Okay, now have we saved any values for this controller?\n if (root.load && root.load.remembered) {\n\n var preset_map = root.load.remembered;\n\n // Which preset are we trying to load?\n var preset;\n\n if (preset_map[gui.preset]) {\n\n preset = preset_map[gui.preset];\n\n } else if (preset_map[DEFAULT_DEFAULT_PRESET_NAME]) {\n\n // Uhh, you can have the default instead?\n preset = preset_map[DEFAULT_DEFAULT_PRESET_NAME];\n\n } else {\n\n // Nada.\n\n return;\n\n }\n\n\n // Did the loaded object remember thcommon.isObject?\n if (preset[matched_index] &&\n\n // Did we remember this particular property?\n preset[matched_index][controller.property] !== undefined) {\n\n // We did remember something for this guy ...\n var value = preset[matched_index][controller.property];\n\n // And that's what it is.\n controller.initialValue = value;\n controller.setValue(value);\n\n }\n\n }\n\n }\n\n }\n\n function getLocalStorageHash(gui, key) {\n // TODO how does this deal with multiple GUI's?\n return document.location.href + '.' + key;\n\n }\n\n function addSaveMenu(gui) {\n\n var div = gui.__save_row = document.createElement('li');\n\n dom.addClass(gui.domElement, 'has-save');\n\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n\n dom.addClass(div, 'save-row');\n\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n\n // TODO replace with FunctionController\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n\n var select = gui.__preset_select = document.createElement('select');\n\n if (gui.load && gui.load.remembered) {\n\n common.each(gui.load.remembered, function(value, key) {\n addPresetOption(gui, key, key == gui.preset);\n });\n\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n\n dom.bind(select, 'change', function() {\n\n\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n\n gui.preset = this.value;\n\n });\n\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n\n if (SUPPORTS_LOCAL_STORAGE) {\n\n var saveLocally = document.getElementById('dg-save-locally');\n var explain = document.getElementById('dg-local-explain');\n\n saveLocally.style.display = 'block';\n\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n\n function showHideExplain() {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n }\n\n showHideExplain();\n\n // TODO: Use a boolean controller, fool!\n dom.bind(localStorageCheckBox, 'change', function() {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain();\n });\n\n }\n\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n\n dom.bind(newConstructorTextArea, 'keydown', function(e) {\n if (e.metaKey && (e.which === 67 || e.keyCode == 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n\n dom.bind(gears, 'click', function() {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n\n dom.bind(button, 'click', function() {\n gui.save();\n });\n\n dom.bind(button2, 'click', function() {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) gui.saveAs(presetName);\n });\n\n dom.bind(button3, 'click', function() {\n gui.revert();\n });\n\n// div.appendChild(button2);\n\n }\n\n function addResizeHandle(gui) {\n\n gui.__resize_handle = document.createElement('div');\n\n common.extend(gui.__resize_handle.style, {\n\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n// border: '1px solid blue'\n\n });\n\n var pmouseX;\n\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n\n function dragStart(e) {\n\n e.preventDefault();\n\n pmouseX = e.clientX;\n\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n\n return false;\n\n }\n\n function drag(e) {\n\n e.preventDefault();\n\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n\n return false;\n\n }\n\n function dragStop() {\n\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n\n }\n\n }\n\n function setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n // Auto placed save-rows are position fixed, so we have to\n // set the width manually if we want it to bleed to the edge\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n }\n\n function getCurrentPreset(gui, useInitialValues) {\n\n var toReturn = {};\n\n // For each object I'm remembering\n common.each(gui.__rememberedObjects, function(val, index) {\n\n var saved_values = {};\n\n // The controllers I've made for thcommon.isObject by property\n var controller_map =\n gui.__rememberedObjectIndecesToControllers[index];\n\n // Remember each value for each property\n common.each(controller_map, function(controller, property) {\n saved_values[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n\n // Save the values for thcommon.isObject\n toReturn[index] = saved_values;\n\n });\n\n return toReturn;\n\n }\n\n function addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n }\n\n function setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value == gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n }\n\n function markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n// console.log('mark', modified, opt);\n if (modified) {\n opt.innerHTML = opt.value + \"*\";\n } else {\n opt.innerHTML = opt.value;\n }\n }\n\n function updateDisplays(controllerArray) {\n\n\n if (controllerArray.length != 0) {\n\n requestAnimationFrame(function() {\n updateDisplays(controllerArray);\n });\n\n }\n\n common.each(controllerArray, function(c) {\n c.updateDisplay();\n });\n\n }\n\n return GUI;\n\n})(dat.utils.css,\n\"
\\n\\n Here's the new load parameter for your GUI's constructor:\\n\\n \\n\\n
\\n\\n Automatically save\\n values to localStorage on exit.\\n\\n
The values saved to localStorage will\\n override those passed to dat.GUI's constructor. This makes it\\n easier to work incrementally, but localStorage is fragile,\\n and your friends may not see the same values you do.\\n \\n
\\n \\n
\\n\\n
\",\n\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear;border:0;position:absolute;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save ul{margin-top:27px}.dg.a.has-save ul.closed{margin-top:0}.dg.a .save-row{position:fixed;top:0;z-index:1002}.dg li{-webkit-transition:height 0.1s ease-out;-o-transition:height 0.1s ease-out;-moz-transition:height 0.1s ease-out;transition:height 0.1s ease-out}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:hidden;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li > *{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:9px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\",\ndat.controllers.factory = (function (OptionController, NumberControllerBox, NumberControllerSlider, StringController, FunctionController, BooleanController, common) {\n\n return function(object, property) {\n\n var initialValue = object[property];\n\n // Providing options?\n if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n\n // Providing a map?\n\n if (common.isNumber(initialValue)) {\n\n if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {\n\n // Has min and max.\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n\n } else {\n\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n\n }\n\n }\n\n if (common.isString(initialValue)) {\n return new StringController(object, property);\n }\n\n if (common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n\n if (common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n\n }\n\n })(dat.controllers.OptionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.StringController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a text input to alter the string property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var StringController = function(object, property) {\n\n StringController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n dom.bind(this.__input, 'keyup', onChange);\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n \n\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n StringController.superclass = Controller;\n\n common.extend(\n\n StringController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n // Stops the caret from moving on account of:\n // keyup -> setValue -> updateDisplay\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return StringController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return StringController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common),\ndat.controllers.FunctionController,\ndat.controllers.BooleanController,\ndat.utils.common),\ndat.controllers.Controller,\ndat.controllers.BooleanController,\ndat.controllers.FunctionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.OptionController,\ndat.controllers.ColorController = (function (Controller, dom, Color, interpret, common) {\n\n var ColorController = function(object, property) {\n\n ColorController.superclass.call(this, object, property);\n\n this.__color = new Color(this.getValue());\n this.__temp = new Color(0);\n\n var _this = this;\n\n this.domElement = document.createElement('div');\n\n dom.makeSelectable(this.domElement, false);\n\n this.__selector = document.createElement('div');\n this.__selector.className = 'selector';\n\n this.__saturation_field = document.createElement('div');\n this.__saturation_field.className = 'saturation-field';\n\n this.__field_knob = document.createElement('div');\n this.__field_knob.className = 'field-knob';\n this.__field_knob_border = '2px solid ';\n\n this.__hue_knob = document.createElement('div');\n this.__hue_knob.className = 'hue-knob';\n\n this.__hue_field = document.createElement('div');\n this.__hue_field.className = 'hue-field';\n\n this.__input = document.createElement('input');\n this.__input.type = 'text';\n this.__input_textShadow = '0 1px 1px ';\n\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) { // on enter\n onBlur.call(this);\n }\n });\n\n dom.bind(this.__input, 'blur', onBlur);\n\n dom.bind(this.__selector, 'mousedown', function(e) {\n\n dom\n .addClass(this, 'drag')\n .bind(window, 'mouseup', function(e) {\n dom.removeClass(_this.__selector, 'drag');\n });\n\n });\n\n var value_field = document.createElement('div');\n\n common.extend(this.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n\n common.extend(this.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: this.__field_knob_border + (this.__color.v < .5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n \n common.extend(this.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n\n common.extend(this.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n\n common.extend(value_field.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n \n linearGradient(value_field, 'top', 'rgba(0,0,0,0)', '#000');\n\n common.extend(this.__hue_field.style, {\n width: '15px',\n height: '100px',\n display: 'inline-block',\n border: '1px solid #555',\n cursor: 'ns-resize'\n });\n\n hueGradient(this.__hue_field);\n\n common.extend(this.__input.style, {\n outline: 'none',\n// width: '120px',\n textAlign: 'center',\n// padding: '4px',\n// marginBottom: '6px',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n\n dom.bind(this.__saturation_field, 'mousedown', fieldDown);\n dom.bind(this.__field_knob, 'mousedown', fieldDown);\n\n dom.bind(this.__hue_field, 'mousedown', function(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'mouseup', unbindH);\n });\n\n function fieldDown(e) {\n setSV(e);\n // document.body.style.cursor = 'none';\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'mouseup', unbindSV);\n }\n\n function unbindSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'mouseup', unbindSV);\n // document.body.style.cursor = 'default';\n }\n\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n\n function unbindH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'mouseup', unbindH);\n }\n\n this.__saturation_field.appendChild(value_field);\n this.__selector.appendChild(this.__field_knob);\n this.__selector.appendChild(this.__saturation_field);\n this.__selector.appendChild(this.__hue_field);\n this.__hue_field.appendChild(this.__hue_knob);\n\n this.domElement.appendChild(this.__input);\n this.domElement.appendChild(this.__selector);\n\n this.updateDisplay();\n\n function setSV(e) {\n\n e.preventDefault();\n\n var w = dom.getWidth(_this.__saturation_field);\n var o = dom.getOffset(_this.__saturation_field);\n var s = (e.clientX - o.left + document.body.scrollLeft) / w;\n var v = 1 - (e.clientY - o.top + document.body.scrollTop) / w;\n\n if (v > 1) v = 1;\n else if (v < 0) v = 0;\n\n if (s > 1) s = 1;\n else if (s < 0) s = 0;\n\n _this.__color.v = v;\n _this.__color.s = s;\n\n _this.setValue(_this.__color.toOriginal());\n\n\n return false;\n\n }\n\n function setH(e) {\n\n e.preventDefault();\n\n var s = dom.getHeight(_this.__hue_field);\n var o = dom.getOffset(_this.__hue_field);\n var h = 1 - (e.clientY - o.top + document.body.scrollTop) / s;\n\n if (h > 1) h = 1;\n else if (h < 0) h = 0;\n\n _this.__color.h = h * 360;\n\n _this.setValue(_this.__color.toOriginal());\n\n return false;\n\n }\n\n };\n\n ColorController.superclass = Controller;\n\n common.extend(\n\n ColorController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n\n var i = interpret(this.getValue());\n\n if (i !== false) {\n\n var mismatch = false;\n\n // Check for mismatch on the interpreted value.\n\n common.each(Color.COMPONENTS, function(component) {\n if (!common.isUndefined(i[component]) &&\n !common.isUndefined(this.__color.__state[component]) &&\n i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {}; // break\n }\n }, this);\n\n // If nothing diverges, we keep our previous values\n // for statefulness, otherwise we recalculate fresh\n if (mismatch) {\n common.extend(this.__color.__state, i);\n }\n\n }\n\n common.extend(this.__temp.__state, this.__color.__state);\n\n this.__temp.a = 1;\n\n var flip = (this.__color.v < .5 || this.__color.s > .5) ? 255 : 0;\n var _flip = 255 - flip;\n\n common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip +')'\n });\n\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'\n\n this.__temp.s = 1;\n this.__temp.v = 1;\n\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toString());\n\n common.extend(this.__input.style, {\n backgroundColor: this.__input.value = this.__color.toString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip +')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip +',.7)'\n });\n\n }\n\n }\n\n );\n \n var vendors = ['-moz-','-o-','-webkit-','-ms-',''];\n \n function linearGradient(elem, x, a, b) {\n elem.style.background = '';\n common.each(vendors, function(vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient('+x+', '+a+' 0%, ' + b + ' 100%); ';\n });\n }\n \n function hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n }\n\n\n return ColorController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret,\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common),\ndat.color.interpret,\ndat.utils.common),\ndat.utils.requestAnimationFrame = (function () {\n\n /**\n * requirejs version of Paul Irish's RequestAnimationFrame\n * http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n */\n\n return window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function(callback, element) {\n\n window.setTimeout(callback, 1000 / 60);\n\n };\n})(),\ndat.dom.CenteredDiv = (function (dom, common) {\n\n\n var CenteredDiv = function() {\n\n this.backgroundElement = document.createElement('div');\n common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear'\n });\n\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n\n this.domElement = document.createElement('div');\n common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear'\n });\n\n\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function() {\n _this.hide();\n });\n\n\n };\n\n CenteredDiv.prototype.show = function() {\n\n var _this = this;\n \n\n\n this.backgroundElement.style.display = 'block';\n\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n// this.domElement.style.top = '52%';\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n this.layout();\n\n common.defer(function() {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n\n };\n\n CenteredDiv.prototype.hide = function() {\n\n var _this = this;\n\n var hide = function() {\n\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n\n };\n\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n\n this.backgroundElement.style.opacity = 0;\n// this.domElement.style.top = '48%';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n };\n\n CenteredDiv.prototype.layout = function() {\n this.domElement.style.left = window.innerWidth/2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight/2 - dom.getHeight(this.domElement) / 2 + 'px';\n };\n \n function lockScroll(e) {\n console.log(e);\n }\n\n return CenteredDiv;\n\n})(dat.dom.dom,\ndat.utils.common),\ndat.dom.dom,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.gui.js\n// module id = 10\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.Color = dat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common),\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.color.js\n// module id = 11\n// module chunks = 0","module.exports = function( THREE ) {\n\t/**\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one finger move\n// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n// Pan - right mouse, or arrow keys / touch: three finter swipe\n\n\tfunction OrbitControls( object, domElement ) {\n\n\t\tthis.object = object;\n\n\t\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new THREE.Vector3();\n\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = - Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t//\n\t\t// public methods\n\t\t//\n\n\t\tthis.getPolarAngle = function () {\n\n\t\t\treturn spherical.phi;\n\n\t\t};\n\n\t\tthis.getAzimuthalAngle = function () {\n\n\t\t\treturn spherical.theta;\n\n\t\t};\n\n\t\tthis.reset = function () {\n\n\t\t\tscope.target.copy( scope.target0 );\n\t\t\tscope.object.position.copy( scope.position0 );\n\t\t\tscope.object.zoom = scope.zoom0;\n\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\tscope.update();\n\n\t\t\tstate = STATE.NONE;\n\n\t\t};\n\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\t// so camera.up is the orbit axis\n\t\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\t\tvar quatInverse = quat.clone().inverse();\n\n\t\t\tvar lastPosition = new THREE.Vector3();\n\t\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\t\treturn function update () {\n\n\t\t\t\tvar position = scope.object.position;\n\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t\t// angle from z-axis around y-axis\n\t\t\t\tspherical.setFromVector3( offset );\n\n\t\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t\t}\n\n\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\tspherical.phi += sphericalDelta.phi;\n\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\tspherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) );\n\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tspherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n\t\t\t\tspherical.makeSafe();\n\n\n\t\t\t\tspherical.radius *= scale;\n\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tspherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n\t\t\t\t// move target to panned location\n\t\t\t\tscope.target.add( panOffset );\n\n\t\t\t\toffset.setFromSpherical( spherical );\n\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\t\tsphericalDelta.theta *= ( 1 - scope.dampingFactor );\n\t\t\t\t\tsphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsphericalDelta.set( 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\t\tif ( zoomChanged ||\n\t\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\t\tzoomChanged = false;\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t};\n\n\t\t}();\n\n\t\tthis.dispose = function() {\n\n\t\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\t\tscope.domElement.removeEventListener( 'wheel', onMouseWheel, false );\n\n\t\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t\t};\n\n\t\t//\n\t\t// internals\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tvar changeEvent = { type: 'change' };\n\t\tvar startEvent = { type: 'start' };\n\t\tvar endEvent = { type: 'end' };\n\n\t\tvar STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\n\t\tvar state = STATE.NONE;\n\n\t\tvar EPS = 0.000001;\n\n\t\t// current position in spherical coordinates\n\t\tvar spherical = new THREE.Spherical();\n\t\tvar sphericalDelta = new THREE.Spherical();\n\n\t\tvar scale = 1;\n\t\tvar panOffset = new THREE.Vector3();\n\t\tvar zoomChanged = false;\n\n\t\tvar rotateStart = new THREE.Vector2();\n\t\tvar rotateEnd = new THREE.Vector2();\n\t\tvar rotateDelta = new THREE.Vector2();\n\n\t\tvar panStart = new THREE.Vector2();\n\t\tvar panEnd = new THREE.Vector2();\n\t\tvar panDelta = new THREE.Vector2();\n\n\t\tvar dollyStart = new THREE.Vector2();\n\t\tvar dollyEnd = new THREE.Vector2();\n\t\tvar dollyDelta = new THREE.Vector2();\n\n\t\tfunction getAutoRotationAngle() {\n\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t\t}\n\n\t\tfunction getZoomScale() {\n\n\t\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t\t}\n\n\t\tfunction rotateLeft( angle ) {\n\n\t\t\tsphericalDelta.theta -= angle;\n\n\t\t}\n\n\t\tfunction rotateUp( angle ) {\n\n\t\t\tsphericalDelta.phi -= angle;\n\n\t\t}\n\n\t\tvar panLeft = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panLeft( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t\t\tv.multiplyScalar( - distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\tvar panUp = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panUp( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 1 ); // get Y column of objectMatrix\n\t\t\t\tv.multiplyScalar( distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tvar pan = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\treturn function pan ( deltaX, deltaY ) {\n\n\t\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\t\t// perspective\n\t\t\t\t\tvar position = scope.object.position;\n\t\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n\t\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\t\tscope.enablePan = false;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}();\n\n\t\tfunction dollyIn( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale /= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction dollyOut( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale *= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\n\t\tfunction handleMouseDownRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseDownRotate' );\n\n\t\t\trotateStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseDownDolly' );\n\n\t\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownPan( event ) {\n\n\t\t\t//console.log( 'handleMouseDownPan' );\n\n\t\t\tpanStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveRotate' );\n\n\t\t\trotateEnd.set( event.clientX, event.clientY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveDolly' );\n\n\t\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMovePan( event ) {\n\n\t\t\t//console.log( 'handleMouseMovePan' );\n\n\t\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseUp( event ) {\n\n\t\t\t//console.log( 'handleMouseUp' );\n\n\t\t}\n\n\t\tfunction handleMouseWheel( event ) {\n\n\t\t\t//console.log( 'handleMouseWheel' );\n\n\t\t\tif ( event.deltaY < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleKeyDown( event ) {\n\n\t\t\t//console.log( 'handleKeyDown' );\n\n\t\t\tswitch ( event.keyCode ) {\n\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction handleTouchStartRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchStartRotate' );\n\n\t\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchStartDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchStartDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyStart.set( 0, distance );\n\n\t\t}\n\n\t\tfunction handleTouchStartPan( event ) {\n\n\t\t\t//console.log( 'handleTouchStartPan' );\n\n\t\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveRotate' );\n\n\t\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyEnd.set( 0, distance );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMovePan( event ) {\n\n\t\t\t//console.log( 'handleTouchMovePan' );\n\n\t\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchEnd( event ) {\n\n\t\t\t//console.log( 'handleTouchEnd' );\n\n\t\t}\n\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\n\t\tfunction onMouseDown( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( event.button === scope.mouseButtons.ORBIT ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.ZOOM ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseDownDolly( event );\n\n\t\t\t\tstate = STATE.DOLLY;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\tstate = STATE.PAN;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseMoveRotate( event );\n\n\t\t\t} else if ( state === STATE.DOLLY ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseMoveDolly( event );\n\n\t\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseMovePan( event );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseUp( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleMouseUp( event );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onMouseWheel( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\thandleMouseWheel( event );\n\n\t\t\tscope.dispatchEvent( startEvent ); // not sure why these are here...\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t}\n\n\t\tfunction onKeyDown( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\t\thandleKeyDown( event );\n\n\t\t}\n\n\t\tfunction onTouchStart( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\t// two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\t\thandleTouchStartDolly( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleTouchStartPan( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2: // two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveDolly( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchEnd( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleTouchEnd( event );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onContextMenu( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t}\n\n\t\t//\n\n\t\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\t\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.addEventListener( 'wheel', onMouseWheel, false );\n\n\t\tscope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\t\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t\t// force an update at start\n\n\t\tthis.update();\n\n\t};\n\n\tOrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\n\tOrbitControls.prototype.constructor = OrbitControls;\n\n\tObject.defineProperties( OrbitControls.prototype, {\n\n\t\tcenter: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .center has been renamed to .target' );\n\t\t\t\treturn this.target;\n\n\t\t\t}\n\n\t\t},\n\n\t\t// backward compatibility\n\n\t\tnoZoom: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\treturn ! this.enableZoom;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\tthis.enableZoom = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoRotate: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\treturn ! this.enableRotate;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\tthis.enableRotate = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoPan: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\treturn ! this.enablePan;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\tthis.enablePan = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoKeys: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\treturn ! this.enableKeys;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\tthis.enableKeys = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tstaticMoving : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\treturn ! this.enableDamping;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\tthis.enableDamping = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tdynamicDampingFactor : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\treturn this.dampingFactor;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\tthis.dampingFactor = value;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\treturn OrbitControls;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-orbit-controls/index.js\n// module id = 12\n// module chunks = 0","'use strict';\n\nmodule.exports = function (THREE) {\n\n /**\n * @author mrdoob / http://mrdoob.com/\n */\n THREE.OBJLoader = function (manager) {\n\n this.manager = manager !== undefined ? manager : THREE.DefaultLoadingManager;\n };\n\n THREE.OBJLoader.prototype = {\n\n constructor: THREE.OBJLoader,\n\n load: function load(url, onLoad, onProgress, onError) {\n\n var scope = this;\n\n var loader = new THREE.XHRLoader(scope.manager);\n loader.load(url, function (text) {\n\n onLoad(scope.parse(text));\n }, onProgress, onError);\n },\n\n parse: function parse(text) {\n\n console.time('OBJLoader');\n\n var object,\n objects = [];\n var geometry, material;\n\n function parseVertexIndex(value) {\n\n var index = parseInt(value);\n\n return (index >= 0 ? index - 1 : index + vertices.length / 3) * 3;\n }\n\n function parseNormalIndex(value) {\n\n var index = parseInt(value);\n\n return (index >= 0 ? index - 1 : index + normals.length / 3) * 3;\n }\n\n function parseUVIndex(value) {\n\n var index = parseInt(value);\n\n return (index >= 0 ? index - 1 : index + uvs.length / 2) * 2;\n }\n\n function addVertex(a, b, c) {\n\n geometry.vertices.push(vertices[a], vertices[a + 1], vertices[a + 2], vertices[b], vertices[b + 1], vertices[b + 2], vertices[c], vertices[c + 1], vertices[c + 2]);\n }\n\n function addNormal(a, b, c) {\n\n geometry.normals.push(normals[a], normals[a + 1], normals[a + 2], normals[b], normals[b + 1], normals[b + 2], normals[c], normals[c + 1], normals[c + 2]);\n }\n\n function addUV(a, b, c) {\n\n geometry.uvs.push(uvs[a], uvs[a + 1], uvs[b], uvs[b + 1], uvs[c], uvs[c + 1]);\n }\n\n function addFace(a, b, c, d, ua, ub, uc, ud, na, nb, nc, nd) {\n\n var ia = parseVertexIndex(a);\n var ib = parseVertexIndex(b);\n var ic = parseVertexIndex(c);\n var id;\n\n if (d === undefined) {\n\n addVertex(ia, ib, ic);\n } else {\n\n id = parseVertexIndex(d);\n\n addVertex(ia, ib, id);\n addVertex(ib, ic, id);\n }\n\n if (ua !== undefined) {\n\n ia = parseUVIndex(ua);\n ib = parseUVIndex(ub);\n ic = parseUVIndex(uc);\n\n if (d === undefined) {\n\n addUV(ia, ib, ic);\n } else {\n\n id = parseUVIndex(ud);\n\n addUV(ia, ib, id);\n addUV(ib, ic, id);\n }\n }\n\n if (na !== undefined) {\n\n ia = parseNormalIndex(na);\n ib = parseNormalIndex(nb);\n ic = parseNormalIndex(nc);\n\n if (d === undefined) {\n\n addNormal(ia, ib, ic);\n } else {\n\n id = parseNormalIndex(nd);\n\n addNormal(ia, ib, id);\n addNormal(ib, ic, id);\n }\n }\n }\n\n // create mesh if no objects in text\n\n if (/^o /gm.test(text) === false) {\n\n geometry = {\n vertices: [],\n normals: [],\n uvs: []\n };\n\n material = {\n name: ''\n };\n\n object = {\n name: '',\n geometry: geometry,\n material: material\n };\n\n objects.push(object);\n }\n\n var vertices = [];\n var normals = [];\n var uvs = [];\n\n // v float float float\n\n var vertex_pattern = /v( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)/;\n\n // vn float float float\n\n var normal_pattern = /vn( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)/;\n\n // vt float float\n\n var uv_pattern = /vt( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)/;\n\n // f vertex vertex vertex ...\n\n var face_pattern1 = /f( +-?\\d+)( +-?\\d+)( +-?\\d+)( +-?\\d+)?/;\n\n // f vertex/uv vertex/uv vertex/uv ...\n\n var face_pattern2 = /f( +(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+))?/;\n\n // f vertex/uv/normal vertex/uv/normal vertex/uv/normal ...\n\n var face_pattern3 = /f( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))?/;\n\n // f vertex//normal vertex//normal vertex//normal ...\n\n var face_pattern4 = /f( +(-?\\d+)\\/\\/(-?\\d+))( +(-?\\d+)\\/\\/(-?\\d+))( +(-?\\d+)\\/\\/(-?\\d+))( +(-?\\d+)\\/\\/(-?\\d+))?/;\n\n //\n\n var lines = text.split('\\n');\n\n for (var i = 0; i < lines.length; i++) {\n\n var line = lines[i];\n line = line.trim();\n\n var result;\n\n if (line.length === 0 || line.charAt(0) === '#') {\n\n continue;\n } else if ((result = vertex_pattern.exec(line)) !== null) {\n\n // [\"v 1.0 2.0 3.0\", \"1.0\", \"2.0\", \"3.0\"]\n\n vertices.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3]));\n } else if ((result = normal_pattern.exec(line)) !== null) {\n\n // [\"vn 1.0 2.0 3.0\", \"1.0\", \"2.0\", \"3.0\"]\n\n normals.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3]));\n } else if ((result = uv_pattern.exec(line)) !== null) {\n\n // [\"vt 0.1 0.2\", \"0.1\", \"0.2\"]\n\n uvs.push(parseFloat(result[1]), parseFloat(result[2]));\n } else if ((result = face_pattern1.exec(line)) !== null) {\n\n // [\"f 1 2 3\", \"1\", \"2\", \"3\", undefined]\n\n addFace(result[1], result[2], result[3], result[4]);\n } else if ((result = face_pattern2.exec(line)) !== null) {\n\n // [\"f 1/1 2/2 3/3\", \" 1/1\", \"1\", \"1\", \" 2/2\", \"2\", \"2\", \" 3/3\", \"3\", \"3\", undefined, undefined, undefined]\n\n addFace(result[2], result[5], result[8], result[11], result[3], result[6], result[9], result[12]);\n } else if ((result = face_pattern3.exec(line)) !== null) {\n\n // [\"f 1/1/1 2/2/2 3/3/3\", \" 1/1/1\", \"1\", \"1\", \"1\", \" 2/2/2\", \"2\", \"2\", \"2\", \" 3/3/3\", \"3\", \"3\", \"3\", undefined, undefined, undefined, undefined]\n\n addFace(result[2], result[6], result[10], result[14], result[3], result[7], result[11], result[15], result[4], result[8], result[12], result[16]);\n } else if ((result = face_pattern4.exec(line)) !== null) {\n\n // [\"f 1//1 2//2 3//3\", \" 1//1\", \"1\", \"1\", \" 2//2\", \"2\", \"2\", \" 3//3\", \"3\", \"3\", undefined, undefined, undefined]\n\n addFace(result[2], result[5], result[8], result[11], undefined, undefined, undefined, undefined, result[3], result[6], result[9], result[12]);\n } else if (/^o /.test(line)) {\n\n geometry = {\n vertices: [],\n normals: [],\n uvs: []\n };\n\n material = {\n name: ''\n };\n\n object = {\n name: line.substring(2).trim(),\n geometry: geometry,\n material: material\n };\n\n objects.push(object);\n } else if (/^g /.test(line)) {\n\n // group\n\n } else if (/^usemtl /.test(line)) {\n\n // material\n\n material.name = line.substring(7).trim();\n } else if (/^mtllib /.test(line)) {\n\n // mtl file\n\n } else if (/^s /.test(line)) {\n\n // smooth shading\n\n } else {\n\n // console.log( \"THREE.OBJLoader: Unhandled line \" + line );\n\n }\n }\n\n var container = new THREE.Object3D();\n var l;\n\n for (i = 0, l = objects.length; i < l; i++) {\n\n object = objects[i];\n geometry = object.geometry;\n\n var buffergeometry = new THREE.BufferGeometry();\n\n buffergeometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array(geometry.vertices), 3));\n\n if (geometry.normals.length > 0) {\n\n buffergeometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(geometry.normals), 3));\n }\n\n if (geometry.uvs.length > 0) {\n\n buffergeometry.addAttribute('uv', new THREE.BufferAttribute(new Float32Array(geometry.uvs), 2));\n }\n\n material = new THREE.MeshLambertMaterial({\n color: 0xff0000\n });\n material.name = object.material.name;\n\n var mesh = new THREE.Mesh(buffergeometry, material);\n mesh.name = object.name;\n\n container.add(mesh);\n }\n\n console.timeEnd('OBJLoader');\n\n return container;\n }\n\n };\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-obj-loader/dist/index.js\n// module id = 13\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 1ef4eb00325bf1e324ff","webpack:///./src/main.js","webpack:///./src/grid.js","webpack:///./~/three/build/three.js","webpack:///./src/agent.js","webpack:///./src/marker.js","webpack:///./src/crowd.js","webpack:///./src/renderengine.js","webpack:///./src/framework.js","webpack:///./~/stats-js/build/stats.min.js","webpack:///./~/dat-gui/index.js","webpack:///./~/dat-gui/vendor/dat.gui.js","webpack:///./~/dat-gui/vendor/dat.color.js","webpack:///./~/three-orbit-controls/index.js","webpack:///./~/three-obj-loader/dist/index.js"],"names":["THREE","require","OBJLoader","crowd","renderengine","time","onLoad","framework","scene","camera","renderer","gui","stats","directionalLight","DirectionalLight","color","setHSL","position","set","multiplyScalar","add","ambientLight","AmbientLight","lookAt","Vector3","onChange","newVal","updateProjectionMatrix","onUpdate","update","init","Grid","cell_size","plane_size","grid_cell_size","grid_len","grid","push","Array","i","j","Set","ws_x","ws_z","tgs","ws_to_tgs","gs_z","Math","round","z","gs_x","x","floor","tgs_x","tgs_z","Agent","id","pos","vel","goal","size","col","velocity","markers","mesh","Marker","owned","agent","Crowd","agents","board","create_agents","populate_board","create_markers","render_plane","render_agents","render_markers","zero","random","length","gs","find_absolute_grid","marker","update_marker_ownership","update_agent_velocities","update_agents","update_markers","reset_ownership","ngs","find_nearest_grid","top_left","top","left","eligible_agents","forEach","assign_marker_to_agent","closest","dist","distanceTo","test_dist","old_gs","G","subVectors","total_weight","total_velocity","m","y","weight","dot","agent_gs","delete","RenderEngine","plane_geo","PlaneGeometry","plane_mesh","Mesh","MeshBasicMaterial","side","DoubleSide","rotation","PI","cylinder_geo","CylinderGeometry","cube_geo","BoxGeometry","geometry","verticesNeedUpdate","material","setHex","OrbitControls","callback","setMode","domElement","style","document","body","appendChild","GUI","window","addEventListener","Scene","PerspectiveCamera","innerWidth","innerHeight","WebGLRenderer","antialias","setPixelRatio","devicePixelRatio","setSize","setClearColor","controls","enableDamping","enableZoom","target","rotateSpeed","zoomSpeed","panSpeed","aspect","tick","begin","render","end","requestAnimationFrame"],"mappings":"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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,qBAAoB,QAAQ;;AAE5B;;AAEA;;AAEA,OAAM;;AAEN;;AAEA,OAAM;;AAEN;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,4BAA2B;AAC3B,4BAA2B;AAC3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,uCAAsC,0BAA0B;;AAEhE;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,4BAA2B;;;AAG3B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA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C3B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA,oEAAmE;;AAEnE;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IA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AAyD,6IAA6I;;AAE7zB,wCAAuC,sBAAsB,8KAA8K,wKAAwK,mCAAmC,gJAAgJ;;AAEtkB,2CAA0C,yKAAyK,+EAA+E,GAAG;;AAErS,oEAAmE,wHAAwH;;AAE3L;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;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EA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA,+CAA8C;;AAE9C;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,OAAO;;AAE1B;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AA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;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA,KAAI;;AA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G;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,8CAA6C,OAAO;;AAEpD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,yCAAwC,QAAQ;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,yCAAwC,QAAQ;;AAEhD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,0CAAyC,QAAQ;;AAEjD;;AAEA;AACA;;AAEA,+CAA8C,QAAQ;;AAEtD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,6CAA4C,QAAQ;;AAEpD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,iDAAgD,4BAA4B;;AAE5E;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,yCAAwC,QAAQ;;AAEhD;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;;AAEA,sBAAqB,cAAc;;AAEnC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,iBAAgB,eAAe;;AAE/B;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,uCAAsC,OAAO;;AAE7C;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,yBAAwB,kBAAkB;;AAE1C;;AAEA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,+EAA8E,kCAAkC;;AAEhH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA,+CAA8C,QAAQ;;AAEtD;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,2CAA0C,OAAO;;AAEjD;AACA;AACA;;AAEA;;AAEA;;AAEA,sDAAqD;AACrD;;AAEA;;AAEA;;AAEA,OAAM;;;AAGN,6CAA4C,OAAO;;AAEnD;AACA;AACA;;AAEA;;AAEA;;AAEA,gCAA+B;AAC/B;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,yCAAwC,QAAQ;;AAEhD;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,kDAAiD,QAAQ;;AAEzD;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,oGAAmG;AACnG,oGAAmG;AACnG,oGAAmG;AACnG,oGAAmG;AACnG,oGAAmG;AACnG,oGAAmG;;AAEnG;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,sCAAqC;AACrC,sCAAqC;AACrC,sCAAqC;;AAErC;;AAEA;;AAEA;;AAEA;;AAEA;AACA,uBAAsB;AACtB,uBAAsB;AACtB,uBAAsB;;AAEtB,qBAAoB;;AAEpB;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,qBAAoB,aAAa;;AAEjC;;AAEA,sBAAqB,aAAa;;AAElC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,iBAAgB,YAAY;;AAE5B,kBAAiB,YAAY;;AAE7B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,oBAAmB,aAAa;;AAEhC;;AAEA,qBAAoB,aAAa;;AAEjC;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,YAAY;;AAE/B,qBAAoB,YAAY;;AAEhC;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,uBAAsB;AACtB,uBAAsB;;AAEtB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,+DAA8D;;AAE9D;AACA;;AAEA;;AAEA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,kEAAiE;;AAEjE;AACA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,+DAA8D;;AAE9D;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kEAAiE;;AAEjE;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB,kBAAkB;;AAEpC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,oDAAmD,+DAA+D,EAAE;;AAEpH;;AAEA;;AAEA;AACA,oDAAmD,0DAA0D,EAAE;;AAE/G;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,oDAAmD,oDAAoD,EAAE;;AAEzG;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB,OAAO;;AAEzB;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,yCAAwC,YAAY,aAAa,eAAe,GAAG;;AAEnF;;AAEA;;AAEA,oCAAmC,qBAAqB;;AAExD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,mDAAkD;AAClD,iDAAgD;;AAEhD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,+BAA8B;AAC9B,mCAAkC;AAClC,oCAAmC;AACnC,8BAA6B;AAC7B,gCAA+B;AAC/B,kCAAiC;;AAEjC,8BAA6B;AAC7B,4BAA2B;AAC3B,wBAAuB;;AAEvB;;AAEA,4BAA2B;;AAE3B;;AAEA;;AAEA,mCAAkC;AAClC,mCAAkC;AAClC,mCAAkC;AAClC,mCAAkC;;AAElC;;AAEA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA;;AAEA;;AAEA,gCAA+B;AAC/B,iCAAgC;;AAEhC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,mDAAkD;AAClD,iDAAgD;;AAEhD;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,8BAA6B;AAC7B,kCAAiC;;AAEjC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,KAAI;;AAEJ;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAG;;;AAGH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,oBAAmB,2BAA2B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,0CAAyC,QAAQ;;AAEjD;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uCAAsC,OAAO;;AAE7C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;AACA;;AAEA,gCAA+B;;AAE/B;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,uCAAsC,OAAO;;AAE7C;AACA;AACA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,mDAAkD,OAAO;;AAEzD;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB,OAAO;;AAE3B;AACA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;;;AAIA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,sBAAqB,OAAO;;AAE5B;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,sBAAqB,OAAO;;AAE5B;;AAEA;;AAEA;;AAEA,SAAQ;;AAER;;AAEA;;AAEA,QAAO;;AAEP;;AAEA,6CAA4C,QAAQ;;AAEpD;;AAEA;;AAEA;;AAEA;;AAEA,WAAU;;AAEV;;AAEA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;;AAEA,2CAA0C,QAAQ;;AAElD;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,KAAI;;AAEJ,0CAAyC,QAAQ;;AAEjD;;AAEA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;AACA;AACA;;AAEA;;AAEA,2CAA0C,QAAQ;;AAElD;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,sBAAqB,OAAO;;AAE5B;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB,OAAO;;AAE3B;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,qBAAoB,OAAO;;AAE3B;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,mCAAkC;AAClC;;AAEA;AACA;AACA;;AAEA,oBAAmB,WAAW;;AAE9B;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,8CAA6C,OAAO;;AAEpD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,kDAAiD,SAAS;;AAE1D;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA,sBAAqB,oBAAoB;;AAEzC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;AACA;;AAEA,OAAM;;AAEN;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,OAAM;;AAEN;;AAEA,OAAM;;AAEN;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,qBAAoB;AACpB;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,oBAAmB,8BAA8B;;AAEjD;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;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;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,oEAAmE;;AAEnE;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA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A;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,gBAAe,qBAAqB;;AAEpC;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,gBAAe,sBAAsB;;AAErC,iBAAgB,qBAAqB;;AAErC;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,eAAc,sBAAsB;;AAEpC;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,gBAAe,qBAAqB;;AAEpC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,eAAc,sBAAsB;;AAEpC,gBAAe,qBAAqB;;AAEpC;AACA;AACA;AACA;AACA;;AAEA;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;AACA,oCAAmC;AACnC,oCAAmC;AACnC,oCAAmC;;AAEnC;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,eAAc,qBAAqB;;AAEnC,gBAAe,sBAAsB;;AAErC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA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wC;AACxC,qCAAoC;;AAEpC,MAAK;;AAEL;AACA,yCAAwC;AACxC,qCAAoC;AACpC,qCAAoC;;AAEpC;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,mCAAkC,eAAe;;AAEjD;;AAEA;AACA;;AAEA,yBAAwB;;AAExB;AACA;;AAEA;;AAEA;;AAEA,mBAAkB,eAAe;;AAEjC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA,0CAAyC,OAAO;;AAEhD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,oBAAmB,2BAA2B;;AAE9C;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA,2BAA0B;;AAE1B;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,mBAAkB;;AAElB;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;AACrC;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,sCAAqC;;AAErC;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA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AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,yCAAwC,OAAO;;AAE/C;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,kBAAiB,qBAAqB;;AAEtC;;AAEA;;AAEA,kBAAiB,eAAe;;AAEhC;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AA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AEA;;AAEA;AACA;AACA,0FAAyF,4CAA4C;AACrI;;AAEA;AACA;AACA,8FAA6F,4CAA4C;AACzI;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA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AACA;AACA;AACA;;AAEA,W;;AAEA,cAAa;;AAEb;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAO;;AAEP;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA,6CAA4C,QAAQ;AACpD;AACA;AACA;AACA;AACA,MAAK;;AAEL;;;AAGA,kD;;AAEA;;AAEA,QAAO,0CAA0C;;AAEjD,0CAAyC,SAAS;AAClD;AACA;;AAEA,QAAO;;AAEP;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,SAAS;AAC5B;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,QAAQ;AAC7B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,qBAAoB;AACpB;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,gBAAgB;AAC7B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,gCAA+B;AAC/B,QAAO;AACP;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;AACA;AACA,sBAAqB,iCAAiC;AACtD;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA,SAAQ,OAAO;AACf;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA,gBAAe,OAAO;AACtB,gBAAe,UAAU;AACzB;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA,qEAAoE,iCAAiC;;AAErG;;AAEA;AACA;;;;AAIA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA,WAAU,iDAAiD,gBAAgB,uBAAuB,2BAA2B,qBAAqB,qBAAqB,GAAG,gBAAgB,yBAAyB,2BAA2B,gBAAgB,wBAAwB,yBAAyB,+BAA+B,GAAG,sBAAsB,0BAA0B,uBAAuB,2BAA2B,4BAA4B,gBAAgB,iBAAiB,uBAAuB,qBAAqB,kBAAkB,iBAAiB,GAAG;;;AAGlkB;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;;AAEA;AACA;AACA,4C;AACA,YAAW;AACX;AACA;;AAEA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA,EAAC;AACD;AACA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA,EAAC;;;AAGD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA,oDAAmD,EAAE;AACrD;;AAEA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;;;AAGA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA,cAAa,QAAQ;AACrB,cAAa,YAAY;AACzB,cAAa,QAAQ;AACrB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;AACA;;AAEA,MAAK;;AAEL,sBAAqB;;AAErB;;AAEA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,UAAS;;AAET;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;;AAGA,QAAO;;;AAGP;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;AACA;;AAEA;;AAEA,4CAA2C,mBAAmB;AAC9D,4DAA2D,kBAAkB,EAAE;AAC/E,sDAAqD,mBAAmB;AACxE,uDAAsD,mBAAmB;AACzE;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,sBAAqB,2BAA2B;AAChD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA,sBAAqB,gCAAgC;AACrD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,sBAAqB,YAAY;AACjC,qBAAoB,MAAM;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAgC;;AAEhC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,yCAAwC;;AAExC;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;AACA;AACA,UAAS;;AAET;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAa;AACb;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA,oBAAmB,UAAU;AAC7B,qBAAoB,MAAM;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;;AAEA,UAAS;;AAET;AACA,sBAAqB,YAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA,sBAAqB,OAAO;AAC5B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW;;AAEX;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,UAAS;;AAET;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,YAAW;;AAEX;AACA;AACA,YAAW;;AAEX;AACA;AACA;;;AAGA,UAAS;;AAET;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA,QAAO;;AAEP;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;;AAEA;AACA,YAAW,wEAAwE;;AAEnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe;;AAEf;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,6BAA4B;AAC5B,QAAO;;AAEP;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;AACA,QAAO;;AAEP;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;;AAEP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,UAAS;;AAET;AACA;;AAEA,UAAS;;AAET;;AAEA;;AAEA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;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AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,QAAO;;AAEP;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA,MAAK;;AAEL;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAC;AACD;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,EAAC;AACD;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;AAGL;AACA;;AAEA;AACA;AACA;AACA,MAAK;;;AAGL;;AAEA;;AAEA;;;;AAIA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AA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AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;;AAEA;;;AAGA,EAAC;AACD;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,EAAC;AACD;AACA,mB;;;;;;AClvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,0BAAyB;AACzB,gCAA+B;;AAE/B;AACA;AACA,qCAAoC;AACpC,mCAAkC;;AAElC;AACA;AACA;AACA;;AAEA,uDAAsD;AACtD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,0BAAyB;;AAEzB;AACA;AACA;AACA,8BAA6B;;AAE7B;AACA;;AAEA;AACA,gBAAe;;AAEf;AACA,wBAAuB;;AAEvB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;AAGA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,MAAK;;AAEL;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,4BAA2B,kBAAkB,GAAG;;AAEhD;;AAEA;AACA;AACA;;AAEA;;AAEA,sBAAqB;AACrB,qBAAoB;AACpB,mBAAkB;;AAElB,gBAAe;;AAEf;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,8CAA6C;AAC7C;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,8CAA6C;AAC7C;;AAEA;;AAEA;;AAEA,IAAG;;AAEH,sCAAqC;AACrC;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA,KAAI;;AAEJ;;AAEA;;AAEA;;AAEA;;AAEA;;AA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","file":"./bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 1ef4eb00325bf1e324ff","\nconst THREE = require('three'); // older modules are imported like this. You shouldn't have to worry about this much\nconst OBJLoader = require('three-obj-loader')(THREE)\nimport Grid from './grid.js'\nimport Agent from './agent.js'\nimport Marker from './marker.js'\nimport Crowd from './crowd.js'\nimport RenderEngine from './renderengine.js'\nimport Framework from './framework'\n\nvar crowd, renderengine;\nvar time = 0;\n// called after the scene loads\nfunction onLoad(framework) {\n var scene = framework.scene;\n var camera = framework.camera;\n var renderer = framework.renderer;\n var gui = framework.gui;\n var stats = framework.stats;\n\n // initialize a simple box and material\n var directionalLight = new THREE.DirectionalLight( 0xffffff, 1.25 );\n directionalLight.color.setHSL(0.1, 1, 0.95);\n directionalLight.position.set(1, 3, 2);\n directionalLight.position.multiplyScalar(10);\n scene.add(directionalLight);\n\n var ambientLight = new THREE.AmbientLight(0x404040);\n scene.add(ambientLight);\n\n // set camera position\n camera.position.set(50, 50, 100);\n camera.lookAt(new THREE.Vector3(0,0,0));\n\n gui.add(camera, 'fov', 0, 180).onChange(function(newVal) {\n camera.updateProjectionMatrix();\n });\n\n renderengine = new RenderEngine(scene);\n crowd = new Crowd(renderengine);\n}\n\n// called on frame updates\nfunction onUpdate(framework) {\n time += 1;\n if (crowd && time % 5 === 0) {\n crowd.update();\n }\n}\n\n// when the scene is done initializing, it will call onLoad, then on frame updates, call onUpdate\nFramework.init(onLoad, onUpdate);\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.js","const THREE = require('three');\n\n// GRID IS ASSUMED TO BE A SQUARE\nexport default class Grid {\n\tconstructor(cell_size, plane_size) {\n\t\tthis.plane_size = plane_size;\n\t\tthis.grid_cell_size = cell_size;\n\t\tthis.grid_len = plane_size / cell_size;\n\t\tthis.grid = [];\n\t\twhile(this.grid.push(new Array(this.grid_len)) < this.grid_len);\n\t\tfor (var i = 0; i < this.grid_len; i++) {\n\t\t\tfor (var j = 0; j < this.grid_len; j++) {\n\t\t\t\tthis.grid[i][j] = new Set();\n\t\t\t}\n\t\t}\n\t}\n\n\t// find_nearest_grid will be used by marker to ultimately find nearest 4 grid\n\tfind_nearest_grid(ws_x, ws_z) {\n\t\tvar tgs = this.ws_to_tgs(ws_x, ws_z);\n\t\tvar gs_z = Math.round(tgs.z / this.grid_cell_size);\n\t\tvar gs_x = Math.round(tgs.x / this.grid_cell_size);\n\t\tif (gs_z === 10.0) {\n\t\t\tgs_z = 9.0;\n\t\t}\n\t\tif (gs_x === 10.0) {\n\t\t\tgs_x = 9.0;\n\t\t}\n\t\treturn {z: gs_z, x: gs_x};\n\t}\n\n\t// find_absolute_grid will be used by agent to demarcate it's exact grid location\n\tfind_absolute_grid(ws_x, ws_z) {\n\t\tvar tgs = this.ws_to_tgs(ws_x, ws_z);\n\t\t// console.log('tgs:', tgs);\n\t\tvar gs_z = Math.floor(tgs.z / this.grid_cell_size);\n\t\tvar gs_x = Math.floor(tgs.x / this.grid_cell_size);\n\t\treturn {z: gs_z, x: gs_x};\n\t}\n\n\t// convert from world space to uniform grid space\n\tws_to_tgs(ws_x, ws_z) {\n\t\t// perform translation\n\t\tvar tgs_x = ws_x + 50.0;\n\t\tvar tgs_z = ws_z + 50.0;\n\t\treturn {x: tgs_x, z: tgs_z};\n\t}\n}\n\n\n// WEBPACK FOOTER //\n// ./src/grid.js","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.THREE = global.THREE || {})));\n}(this, (function (exports) { 'use strict';\n\n\t// Polyfills\n\n\tif ( Number.EPSILON === undefined ) {\n\n\t\tNumber.EPSILON = Math.pow( 2, - 52 );\n\n\t}\n\n\t//\n\n\tif ( Math.sign === undefined ) {\n\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign\n\n\t\tMath.sign = function ( x ) {\n\n\t\t\treturn ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;\n\n\t\t};\n\n\t}\n\n\tif ( Function.prototype.name === undefined ) {\n\n\t\t// Missing in IE9-11.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\n\n\t\tObject.defineProperty( Function.prototype, 'name', {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.toString().match( /^\\s*function\\s*(\\S*)\\s*\\(/ )[ 1 ];\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tif ( Object.assign === undefined ) {\n\n\t\t// Missing in IE.\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n\n\t\t( function () {\n\n\t\t\tObject.assign = function ( target ) {\n\n\t\t\t\t'use strict';\n\n\t\t\t\tif ( target === undefined || target === null ) {\n\n\t\t\t\t\tthrow new TypeError( 'Cannot convert undefined or null to object' );\n\n\t\t\t\t}\n\n\t\t\t\tvar output = Object( target );\n\n\t\t\t\tfor ( var index = 1; index < arguments.length; index ++ ) {\n\n\t\t\t\t\tvar source = arguments[ index ];\n\n\t\t\t\t\tif ( source !== undefined && source !== null ) {\n\n\t\t\t\t\t\tfor ( var nextKey in source ) {\n\n\t\t\t\t\t\t\tif ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {\n\n\t\t\t\t\t\t\t\toutput[ nextKey ] = source[ nextKey ];\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\treturn output;\n\n\t\t\t};\n\n\t\t} )();\n\n\t}\n\n\t/**\n\t * https://github.com/mrdoob/eventdispatcher.js/\n\t */\n\n\tfunction EventDispatcher() {}\n\n\tObject.assign( EventDispatcher.prototype, {\n\n\t\taddEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\t\tlisteners[ type ] = [];\n\n\t\t\t}\n\n\t\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\t\tlisteners[ type ].push( listener );\n\n\t\t\t}\n\n\t\t},\n\n\t\thasEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return false;\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\tif ( listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tremoveEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tvar index = listenerArray.indexOf( listener );\n\n\t\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tdispatchEvent: function ( event ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ event.type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tevent.target = this;\n\n\t\t\t\tvar array = [], i = 0;\n\t\t\t\tvar length = listenerArray.length;\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ] = listenerArray[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\tvar REVISION = '82';\n\tvar MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };\n\tvar CullFaceNone = 0;\n\tvar CullFaceBack = 1;\n\tvar CullFaceFront = 2;\n\tvar CullFaceFrontBack = 3;\n\tvar FrontFaceDirectionCW = 0;\n\tvar FrontFaceDirectionCCW = 1;\n\tvar BasicShadowMap = 0;\n\tvar PCFShadowMap = 1;\n\tvar PCFSoftShadowMap = 2;\n\tvar FrontSide = 0;\n\tvar BackSide = 1;\n\tvar DoubleSide = 2;\n\tvar FlatShading = 1;\n\tvar SmoothShading = 2;\n\tvar NoColors = 0;\n\tvar FaceColors = 1;\n\tvar VertexColors = 2;\n\tvar NoBlending = 0;\n\tvar NormalBlending = 1;\n\tvar AdditiveBlending = 2;\n\tvar SubtractiveBlending = 3;\n\tvar MultiplyBlending = 4;\n\tvar CustomBlending = 5;\n\tvar BlendingMode = {\n\t\tNoBlending: NoBlending,\n\t\tNormalBlending: NormalBlending,\n\t\tAdditiveBlending: AdditiveBlending,\n\t\tSubtractiveBlending: SubtractiveBlending,\n\t\tMultiplyBlending: MultiplyBlending,\n\t\tCustomBlending: CustomBlending\n\t};\n\tvar AddEquation = 100;\n\tvar SubtractEquation = 101;\n\tvar ReverseSubtractEquation = 102;\n\tvar MinEquation = 103;\n\tvar MaxEquation = 104;\n\tvar ZeroFactor = 200;\n\tvar OneFactor = 201;\n\tvar SrcColorFactor = 202;\n\tvar OneMinusSrcColorFactor = 203;\n\tvar SrcAlphaFactor = 204;\n\tvar OneMinusSrcAlphaFactor = 205;\n\tvar DstAlphaFactor = 206;\n\tvar OneMinusDstAlphaFactor = 207;\n\tvar DstColorFactor = 208;\n\tvar OneMinusDstColorFactor = 209;\n\tvar SrcAlphaSaturateFactor = 210;\n\tvar NeverDepth = 0;\n\tvar AlwaysDepth = 1;\n\tvar LessDepth = 2;\n\tvar LessEqualDepth = 3;\n\tvar EqualDepth = 4;\n\tvar GreaterEqualDepth = 5;\n\tvar GreaterDepth = 6;\n\tvar NotEqualDepth = 7;\n\tvar MultiplyOperation = 0;\n\tvar MixOperation = 1;\n\tvar AddOperation = 2;\n\tvar NoToneMapping = 0;\n\tvar LinearToneMapping = 1;\n\tvar ReinhardToneMapping = 2;\n\tvar Uncharted2ToneMapping = 3;\n\tvar CineonToneMapping = 4;\n\tvar UVMapping = 300;\n\tvar CubeReflectionMapping = 301;\n\tvar CubeRefractionMapping = 302;\n\tvar EquirectangularReflectionMapping = 303;\n\tvar EquirectangularRefractionMapping = 304;\n\tvar SphericalReflectionMapping = 305;\n\tvar CubeUVReflectionMapping = 306;\n\tvar CubeUVRefractionMapping = 307;\n\tvar TextureMapping = {\n\t\tUVMapping: UVMapping,\n\t\tCubeReflectionMapping: CubeReflectionMapping,\n\t\tCubeRefractionMapping: CubeRefractionMapping,\n\t\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\t\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\t\tSphericalReflectionMapping: SphericalReflectionMapping,\n\t\tCubeUVReflectionMapping: CubeUVReflectionMapping,\n\t\tCubeUVRefractionMapping: CubeUVRefractionMapping\n\t};\n\tvar RepeatWrapping = 1000;\n\tvar ClampToEdgeWrapping = 1001;\n\tvar MirroredRepeatWrapping = 1002;\n\tvar TextureWrapping = {\n\t\tRepeatWrapping: RepeatWrapping,\n\t\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\t\tMirroredRepeatWrapping: MirroredRepeatWrapping\n\t};\n\tvar NearestFilter = 1003;\n\tvar NearestMipMapNearestFilter = 1004;\n\tvar NearestMipMapLinearFilter = 1005;\n\tvar LinearFilter = 1006;\n\tvar LinearMipMapNearestFilter = 1007;\n\tvar LinearMipMapLinearFilter = 1008;\n\tvar TextureFilter = {\n\t\tNearestFilter: NearestFilter,\n\t\tNearestMipMapNearestFilter: NearestMipMapNearestFilter,\n\t\tNearestMipMapLinearFilter: NearestMipMapLinearFilter,\n\t\tLinearFilter: LinearFilter,\n\t\tLinearMipMapNearestFilter: LinearMipMapNearestFilter,\n\t\tLinearMipMapLinearFilter: LinearMipMapLinearFilter\n\t};\n\tvar UnsignedByteType = 1009;\n\tvar ByteType = 1010;\n\tvar ShortType = 1011;\n\tvar UnsignedShortType = 1012;\n\tvar IntType = 1013;\n\tvar UnsignedIntType = 1014;\n\tvar FloatType = 1015;\n\tvar HalfFloatType = 1016;\n\tvar UnsignedShort4444Type = 1017;\n\tvar UnsignedShort5551Type = 1018;\n\tvar UnsignedShort565Type = 1019;\n\tvar UnsignedInt248Type = 1020;\n\tvar AlphaFormat = 1021;\n\tvar RGBFormat = 1022;\n\tvar RGBAFormat = 1023;\n\tvar LuminanceFormat = 1024;\n\tvar LuminanceAlphaFormat = 1025;\n\tvar RGBEFormat = RGBAFormat;\n\tvar DepthFormat = 1026;\n\tvar DepthStencilFormat = 1027;\n\tvar RGB_S3TC_DXT1_Format = 2001;\n\tvar RGBA_S3TC_DXT1_Format = 2002;\n\tvar RGBA_S3TC_DXT3_Format = 2003;\n\tvar RGBA_S3TC_DXT5_Format = 2004;\n\tvar RGB_PVRTC_4BPPV1_Format = 2100;\n\tvar RGB_PVRTC_2BPPV1_Format = 2101;\n\tvar RGBA_PVRTC_4BPPV1_Format = 2102;\n\tvar RGBA_PVRTC_2BPPV1_Format = 2103;\n\tvar RGB_ETC1_Format = 2151;\n\tvar LoopOnce = 2200;\n\tvar LoopRepeat = 2201;\n\tvar LoopPingPong = 2202;\n\tvar InterpolateDiscrete = 2300;\n\tvar InterpolateLinear = 2301;\n\tvar InterpolateSmooth = 2302;\n\tvar ZeroCurvatureEnding = 2400;\n\tvar ZeroSlopeEnding = 2401;\n\tvar WrapAroundEnding = 2402;\n\tvar TrianglesDrawMode = 0;\n\tvar TriangleStripDrawMode = 1;\n\tvar TriangleFanDrawMode = 2;\n\tvar LinearEncoding = 3000;\n\tvar sRGBEncoding = 3001;\n\tvar GammaEncoding = 3007;\n\tvar RGBEEncoding = 3002;\n\tvar LogLuvEncoding = 3003;\n\tvar RGBM7Encoding = 3004;\n\tvar RGBM16Encoding = 3005;\n\tvar RGBDEncoding = 3006;\n\tvar BasicDepthPacking = 3200;\n\tvar RGBADepthPacking = 3201;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar _Math = {\n\n\t\tDEG2RAD: Math.PI / 180,\n\t\tRAD2DEG: 180 / Math.PI,\n\n\t\tgenerateUUID: function () {\n\n\t\t\t// http://www.broofa.com/Tools/Math.uuid.htm\n\n\t\t\tvar chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' );\n\t\t\tvar uuid = new Array( 36 );\n\t\t\tvar rnd = 0, r;\n\n\t\t\treturn function generateUUID() {\n\n\t\t\t\tfor ( var i = 0; i < 36; i ++ ) {\n\n\t\t\t\t\tif ( i === 8 || i === 13 || i === 18 || i === 23 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '-';\n\n\t\t\t\t\t} else if ( i === 14 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '4';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0;\n\t\t\t\t\t\tr = rnd & 0xf;\n\t\t\t\t\t\trnd = rnd >> 4;\n\t\t\t\t\t\tuuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn uuid.join( '' );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclamp: function ( value, min, max ) {\n\n\t\t\treturn Math.max( min, Math.min( max, value ) );\n\n\t\t},\n\n\t\t// compute euclidian modulo of m % n\n\t\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\t\teuclideanModulo: function ( n, m ) {\n\n\t\t\treturn ( ( n % m ) + m ) % m;\n\n\t\t},\n\n\t\t// Linear mapping from range to range \n\n\t\tmapLinear: function ( x, a1, a2, b1, b2 ) {\n\n\t\t\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n\t\t},\n\n\t\t// https://en.wikipedia.org/wiki/Linear_interpolation\n\n\t\tlerp: function ( x, y, t ) {\n\n\t\t\treturn ( 1 - t ) * x + t * y;\n\n\t\t},\n\n\t\t// http://en.wikipedia.org/wiki/Smoothstep\n\n\t\tsmoothstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * ( 3 - 2 * x );\n\n\t\t},\n\n\t\tsmootherstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n\t\t},\n\n\t\trandom16: function () {\n\n\t\t\tconsole.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' );\n\t\t\treturn Math.random();\n\n\t\t},\n\n\t\t// Random integer from interval\n\n\t\trandInt: function ( low, high ) {\n\n\t\t\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n\t\t},\n\n\t\t// Random float from interval\n\n\t\trandFloat: function ( low, high ) {\n\n\t\t\treturn low + Math.random() * ( high - low );\n\n\t\t},\n\n\t\t// Random float from <-range/2, range/2> interval\n\n\t\trandFloatSpread: function ( range ) {\n\n\t\t\treturn range * ( 0.5 - Math.random() );\n\n\t\t},\n\n\t\tdegToRad: function ( degrees ) {\n\n\t\t\treturn degrees * _Math.DEG2RAD;\n\n\t\t},\n\n\t\tradToDeg: function ( radians ) {\n\n\t\t\treturn radians * _Math.RAD2DEG;\n\n\t\t},\n\n\t\tisPowerOfTwo: function ( value ) {\n\n\t\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t\t},\n\n\t\tnearestPowerOfTwo: function ( value ) {\n\n\t\t\treturn Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) );\n\n\t\t},\n\n\t\tnextPowerOfTwo: function ( value ) {\n\n\t\t\tvalue --;\n\t\t\tvalue |= value >> 1;\n\t\t\tvalue |= value >> 2;\n\t\t\tvalue |= value >> 4;\n\t\t\tvalue |= value >> 8;\n\t\t\tvalue |= value >> 16;\n\t\t\tvalue ++;\n\n\t\t\treturn value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author egraether / http://egraether.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tfunction Vector2( x, y ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\n\t}\n\n\tVector2.prototype = {\n\n\t\tconstructor: Vector2,\n\n\t\tisVector2: true,\n\n\t\tget width() {\n\n\t\t\treturn this.x;\n\n\t\t},\n\n\t\tset width( value ) {\n\n\t\t\tthis.x = value;\n\n\t\t},\n\n\t\tget height() {\n\n\t\t\treturn this.y;\n\n\t\t},\n\n\t\tset height( value ) {\n\n\t\t\tthis.y = value;\n\n\t\t},\n\n\t\t//\n\n\t\tset: function ( x, y ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\t\t\t\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v ) {\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector2();\n\t\t\t\t\tmax = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t\t},\n\n\t\tlengthManhattan: function() {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tangle: function () {\n\n\t\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\t\tvar angle = Math.atan2( this.y, this.x );\n\n\t\t\tif ( angle < 0 ) angle += 2 * Math.PI;\n\n\t\t\treturn angle;\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y;\n\t\t\treturn dx * dx + dy * dy;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tindex = index * attribute.itemSize + offset;\n\n\t\t\tthis.x = attribute.array[ index ];\n\t\t\tthis.y = attribute.array[ index + 1 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateAround: function ( center, angle ) {\n\n\t\t\tvar c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\t\tvar x = this.x - center.x;\n\t\t\tvar y = this.y - center.y;\n\n\t\t\tthis.x = x * c - y * s + center.x;\n\t\t\tthis.y = x * s + y * c + center.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t */\n\n\tfunction Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\tObject.defineProperty( this, 'id', { value: TextureIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.sourceFile = '';\n\n\t\tthis.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;\n\n\t\tthis.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;\n\t\tthis.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter;\n\n\t\tthis.anisotropy = anisotropy !== undefined ? anisotropy : 1;\n\n\t\tthis.format = format !== undefined ? format : RGBAFormat;\n\t\tthis.type = type !== undefined ? type : UnsignedByteType;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\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\n\t\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t\t//\n\t\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\t\tthis.encoding = encoding !== undefined ? encoding : LinearEncoding;\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t}\n\n\tTexture.DEFAULT_IMAGE = undefined;\n\tTexture.DEFAULT_MAPPING = UVMapping;\n\n\tTexture.prototype = {\n\n\t\tconstructor: Texture,\n\n\t\tisTexture: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.image = source.image;\n\t\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\t\tthis.mapping = source.mapping;\n\n\t\t\tthis.wrapS = source.wrapS;\n\t\t\tthis.wrapT = source.wrapT;\n\n\t\t\tthis.magFilter = source.magFilter;\n\t\t\tthis.minFilter = source.minFilter;\n\n\t\t\tthis.anisotropy = source.anisotropy;\n\n\t\t\tthis.format = source.format;\n\t\t\tthis.type = source.type;\n\n\t\t\tthis.offset.copy( source.offset );\n\t\t\tthis.repeat.copy( source.repeat );\n\n\t\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\t\tthis.flipY = source.flipY;\n\t\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\t\tthis.encoding = source.encoding;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tif ( meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t\t}\n\n\t\t\tfunction getDataURL( image ) {\n\n\t\t\t\tvar canvas;\n\n\t\t\t\tif ( image.toDataURL !== undefined ) {\n\n\t\t\t\t\tcanvas = image;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcanvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\t\tcanvas.width = image.width;\n\t\t\t\t\tcanvas.height = image.height;\n\n\t\t\t\t\tcanvas.getContext( '2d' ).drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Texture',\n\t\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t\t},\n\n\t\t\t\tuuid: this.uuid,\n\t\t\t\tname: this.name,\n\n\t\t\t\tmapping: this.mapping,\n\n\t\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\t\tminFilter: this.minFilter,\n\t\t\t\tmagFilter: this.magFilter,\n\t\t\t\tanisotropy: this.anisotropy,\n\n\t\t\t\tflipY: this.flipY\n\t\t\t};\n\n\t\t\tif ( this.image !== undefined ) {\n\n\t\t\t\t// TODO: Move to THREE.Image\n\n\t\t\t\tvar image = this.image;\n\n\t\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\t\timage.uuid = _Math.generateUUID(); // UGH\n\n\t\t\t\t}\n\n\t\t\t\tif ( meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\t\turl: getDataURL( image )\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\toutput.image = image.uuid;\n\n\t\t\t}\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t},\n\n\t\ttransformUv: function ( uv ) {\n\n\t\t\tif ( this.mapping !== UVMapping ) return;\n\n\t\t\tuv.multiply( this.repeat );\n\t\t\tuv.add( this.offset );\n\n\t\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.flipY ) {\n\n\t\t\t\tuv.y = 1 - uv.y;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tObject.assign( Texture.prototype, EventDispatcher.prototype );\n\n\tvar count = 0;\n\tfunction TextureIdCount() { return count++; }\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector4( x, y, z, w ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\t\tthis.w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tVector4.prototype = {\n\n\t\tconstructor: Vector4,\n\n\t\tisVector4: true,\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\t\t\tthis.w = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( w ) {\n\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tcase 3: this.w = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\t\t\t\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tcase 3: return this.w;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\t\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\t\t\tthis.w += v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\t\t\tthis.w += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\t\t\tthis.w = a.w + b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\t\t\tthis.w += v.w * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\t\t\tthis.w -= v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\t\t\tthis.w -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\t\t\tthis.w = a.w - b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\t\t\t\tthis.w *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\t\t\t\tthis.w = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z, w = this.w;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tsetAxisAngleFromQuaternion: function ( q ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t\t// q is assumed to be normalized\n\n\t\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\t\tvar s = Math.sqrt( 1 - q.w * q.w );\n\n\t\t\tif ( s < 0.0001 ) {\n\n\t\t\t\t this.x = 1;\n\t\t\t\t this.y = 0;\n\t\t\t\t this.z = 0;\n\n\t\t\t} else {\n\n\t\t\t\t this.x = q.x / s;\n\t\t\t\t this.y = q.y / s;\n\t\t\t\t this.z = q.z / s;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetAxisAngleFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar angle, x, y, z,\t\t// variables for result\n\t\t\t\tepsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\t\tte = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t\t// singularity found\n\t\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t\t}\n\n\t\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\t\tangle = Math.PI;\n\n\t\t\t\tvar xx = ( m11 + 1 ) / 2;\n\t\t\t\tvar yy = ( m22 + 1 ) / 2;\n\t\t\t\tvar zz = ( m33 + 1 ) / 2;\n\t\t\t\tvar xy = ( m12 + m21 ) / 4;\n\t\t\t\tvar xz = ( m13 + m31 ) / 4;\n\t\t\t\tvar yz = ( m23 + m32 ) / 4;\n\n\t\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\t\tx = 0;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\t\ty = xy / x;\n\t\t\t\t\t\tz = xz / x;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\t\tx = xy / y;\n\t\t\t\t\t\tz = yz / y;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\t\tx = xz / z;\n\t\t\t\t\t\ty = yz / z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.set( x, y, z, angle );\n\n\t\t\t\treturn this; // return 180 deg rotation\n\n\t\t\t}\n\n\t\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\t\tvar 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\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t\t// caught by singularity test above, but I've left it in just in case\n\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\t\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\t\t\tthis.w = Math.min( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\t\t\tthis.w = Math.max( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector4();\n\t\t\t\t\tmax = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\t\t\tthis.w = Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\t\t\tthis.w = Math.ceil( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\t\t\tthis.w = Math.round( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\t\t\tthis.w = - this.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\t\t\tthis.w = array[ offset + 3 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\t\t\tarray[ offset + 3 ] = this.w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tindex = index * attribute.itemSize + offset;\n\n\t\t\tthis.x = attribute.array[ index ];\n\t\t\tthis.y = attribute.array[ index + 1 ];\n\t\t\tthis.z = attribute.array[ index + 2 ];\n\t\t\tthis.w = attribute.array[ index + 3 ];\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author szimek / https://github.com/szimek/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Marius Kintel / https://github.com/kintel\n\t */\n\n\t/*\n\t In options, we can specify:\n\t * Texture parameters for an auto-generated target texture\n\t * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n\t*/\n\tfunction WebGLRenderTarget( width, height, options ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\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\toptions = options || {};\n\n\t\tif ( options.minFilter === undefined ) options.minFilter = LinearFilter;\n\n\t\tthis.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\t\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\t\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;\n\t\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n\t}\n\n\tObject.assign( WebGLRenderTarget.prototype, EventDispatcher.prototype, {\n\n\t\tisWebGLRenderTarget: true,\n\n\t\tsetSize: function ( width, height ) {\n\n\t\t\tif ( this.width !== width || this.height !== height ) {\n\n\t\t\t\tthis.width = width;\n\t\t\t\tthis.height = height;\n\n\t\t\t\tthis.dispose();\n\n\t\t\t}\n\n\t\t\tthis.viewport.set( 0, 0, width, height );\n\t\t\tthis.scissor.set( 0, 0, width, height );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\tthis.viewport.copy( source.viewport );\n\n\t\t\tthis.texture = source.texture.clone();\n\n\t\t\tthis.depthBuffer = source.depthBuffer;\n\t\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\t\tthis.depthTexture = source.depthTexture;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com\n\t */\n\n\tfunction WebGLRenderTargetCube( width, height, options ) {\n\n\t\tWebGLRenderTarget.call( this, width, height, options );\n\n\t\tthis.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5\n\t\tthis.activeMipMapLevel = 0;\n\n\t}\n\n\tWebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype );\n\tWebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube;\n\n\tWebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true;\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Quaternion( x, y, z, w ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tQuaternion.prototype = {\n\n\t\tconstructor: Quaternion,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget w () {\n\n\t\t\treturn this._w;\n\n\t\t},\n\n\t\tset w ( value ) {\n\n\t\t\tthis._w = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._w = w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t\t},\n\n\t\tcopy: function ( quaternion ) {\n\n\t\t\tthis._x = quaternion.x;\n\t\t\tthis._y = quaternion.y;\n\t\t\tthis._z = quaternion.z;\n\t\t\tthis._w = quaternion.w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromEuler: function ( euler, update ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t\t//\tcontent/SpinCalc.m\n\n\t\t\tvar c1 = Math.cos( euler._x / 2 );\n\t\t\tvar c2 = Math.cos( euler._y / 2 );\n\t\t\tvar c3 = Math.cos( euler._z / 2 );\n\t\t\tvar s1 = Math.sin( euler._x / 2 );\n\t\t\tvar s2 = Math.sin( euler._y / 2 );\n\t\t\tvar s3 = Math.sin( euler._z / 2 );\n\n\t\t\tvar order = euler.order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\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\n\t\t\t} else if ( order === 'YXZ' ) {\n\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\n\t\t\t} else if ( order === 'ZXY' ) {\n\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\n\t\t\t} else if ( order === 'ZYX' ) {\n\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\n\t\t\t} else if ( order === 'YZX' ) {\n\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\n\t\t\t} else if ( order === 'XZY' ) {\n\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\n\t\t\t}\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tvar halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\t\tthis._x = axis.x * s;\n\t\t\tthis._y = axis.y * s;\n\t\t\tthis._z = axis.z * s;\n\t\t\tthis._w = Math.cos( halfAngle );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\t\ttrace = m11 + m22 + m33,\n\t\t\t\ts;\n\n\t\t\tif ( trace > 0 ) {\n\n\t\t\t\ts = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\t\tthis._w = 0.25 / s;\n\t\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\t\tthis._x = 0.25 * s;\n\t\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t\t} else if ( m22 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\t\tthis._y = 0.25 * s;\n\t\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t\t} else {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\t\tthis._z = 0.25 * s;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromUnitVectors: function () {\n\n\t\t\t// http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n\n\t\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\t\tvar v1, r;\n\n\t\t\tvar EPS = 0.000001;\n\n\t\t\treturn function setFromUnitVectors( vFrom, vTo ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tr = vFrom.dot( vTo ) + 1;\n\n\t\t\t\tif ( r < EPS ) {\n\n\t\t\t\t\tr = 0;\n\n\t\t\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\t\t\tv1.set( - vFrom.y, vFrom.x, 0 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv1.set( 0, - vFrom.z, vFrom.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv1.crossVectors( vFrom, vTo );\n\n\t\t\t\t}\n\n\t\t\t\tthis._x = v1.x;\n\t\t\t\tthis._y = v1.y;\n\t\t\t\tthis._z = v1.z;\n\t\t\t\tthis._w = r;\n\n\t\t\t\treturn this.normalize();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tinverse: function () {\n\n\t\t\treturn this.conjugate().normalize();\n\n\t\t},\n\n\t\tconjugate: function () {\n\n\t\t\tthis._x *= - 1;\n\t\t\tthis._y *= - 1;\n\t\t\tthis._z *= - 1;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tvar l = this.length();\n\n\t\t\tif ( l === 0 ) {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = 0;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = 1;\n\n\t\t\t} else {\n\n\t\t\t\tl = 1 / l;\n\n\t\t\t\tthis._x = this._x * l;\n\t\t\t\tthis._y = this._y * l;\n\t\t\t\tthis._z = this._z * l;\n\t\t\t\tthis._w = this._w * l;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( q, p ) {\n\n\t\t\tif ( p !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyQuaternions( this, q );\n\n\t\t},\n\n\t\tpremultiply: function ( q ) {\n\n\t\t\treturn this.multiplyQuaternions( q, this );\n\n\t\t},\n\n\t\tmultiplyQuaternions: function ( a, b ) {\n\n\t\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\t\tvar qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\t\tvar qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tslerp: function ( qb, t ) {\n\n\t\t\tif ( t === 0 ) return this;\n\t\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\t\tvar x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\t\tvar cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\t\tthis._w = - qb._w;\n\t\t\t\tthis._x = - qb._x;\n\t\t\t\tthis._y = - qb._y;\n\t\t\t\tthis._z = - qb._z;\n\n\t\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t\t} else {\n\n\t\t\t\tthis.copy( qb );\n\n\t\t\t}\n\n\t\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\t\tthis._w = w;\n\t\t\t\tthis._x = x;\n\t\t\t\tthis._y = y;\n\t\t\t\tthis._z = z;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n\t\t\tif ( Math.abs( sinHalfTheta ) < 0.001 ) {\n\n\t\t\t\tthis._w = 0.5 * ( w + this._w );\n\t\t\t\tthis._x = 0.5 * ( x + this._x );\n\t\t\t\tthis._y = 0.5 * ( y + this._y );\n\t\t\t\tthis._z = 0.5 * ( z + this._z );\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\t\tvar ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( quaternion ) {\n\n\t\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis._x = array[ offset ];\n\t\t\tthis._y = array[ offset + 1 ];\n\t\t\tthis._z = array[ offset + 2 ];\n\t\t\tthis._w = array[ offset + 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\tObject.assign( Quaternion, {\n\n\t\tslerp: function( qa, qb, qm, t ) {\n\n\t\t\treturn qm.copy( qa ).slerp( qb, t );\n\n\t\t},\n\n\t\tslerpFlat: function(\n\t\t\t\tdst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\t\tvar x0 = src0[ srcOffset0 + 0 ],\n\t\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\t\tw0 = src0[ srcOffset0 + 3 ],\n\n\t\t\t\tx1 = src1[ srcOffset1 + 0 ],\n\t\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\t\tvar s = 1 - t,\n\n\t\t\t\t\tcos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\n\t\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\t\tvar sin = Math.sqrt( sqrSin ),\n\t\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t\t}\n\n\t\t\t\tvar tDir = t * dir;\n\n\t\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t\t// Normalize in case we just did a lerp:\n\t\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\t\tvar f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\t\tx0 *= f;\n\t\t\t\t\ty0 *= f;\n\t\t\t\t\tz0 *= f;\n\t\t\t\t\tw0 *= f;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdst[ dstOffset ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author *kile / http://kile.stravaganza.org/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector3( x, y, z ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\n\t}\n\n\tVector3.prototype = {\n\n\t\tconstructor: Vector3,\n\n\t\tisVector3: true,\n\n\t\tset: function ( x, y, z ) {\n\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\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\t\t\t\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\t\t\tthis.z *= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tif ( isFinite( scalar ) ) {\n\n\t\t\t\tthis.x *= scalar;\n\t\t\t\tthis.y *= scalar;\n\t\t\t\tthis.z *= scalar;\n\n\t\t\t} else {\n\n\t\t\t\tthis.x = 0;\n\t\t\t\tthis.y = 0;\n\t\t\t\tthis.z = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x * b.x;\n\t\t\tthis.y = a.y * b.y;\n\t\t\tthis.z = a.z * b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyEuler: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyEuler( euler ) {\n\n\t\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromEuler( euler ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyAxisAngle: function () {\n\n\t\t\tvar quaternion;\n\n\t\t\treturn function applyAxisAngle( axis, angle ) {\n\n\t\t\t\tif ( quaternion === undefined ) quaternion = new Quaternion();\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix3: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 affine matrix\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ];\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ];\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyProjection: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 projection matrix\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\t\t\tvar d = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] ); // perspective divide\n\n\t\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * d;\n\t\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * d;\n\t\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * d;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyQuaternion: function ( q ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t\t// calculate quat * vector\n\n\t\t\tvar ix = qw * x + qy * z - qz * y;\n\t\t\tvar iy = qw * y + qz * x - qx * z;\n\t\t\tvar iz = qw * z + qx * y - qy * x;\n\t\t\tvar iw = - qx * x - qy * y - qz * z;\n\n\t\t\t// calculate result * inverse quat\n\n\t\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function project( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );\n\t\t\t\treturn this.applyProjection( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tunproject: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function unproject( camera ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );\n\t\t\t\treturn this.applyProjection( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttransformDirection: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 affine matrix\n\t\t\t// vector interpreted as a direction\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\t\treturn this.normalize();\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\t\t\tthis.z /= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector3();\n\t\t\t\t\tmax = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.multiplyScalar( Math.max( min, Math.min( max, length ) ) / length );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.multiplyScalar( length / this.length() );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tcross: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\t\treturn this.crossVectors( v, w );\n\n\t\t\t}\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\n\t\t\tthis.x = y * v.z - z * v.y;\n\t\t\tthis.y = z * v.x - x * v.z;\n\t\t\tthis.z = x * v.y - y * v.x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossVectors: function ( a, b ) {\n\n\t\t\tvar ax = a.x, ay = a.y, az = a.z;\n\t\t\tvar bx = b.x, by = b.y, bz = b.z;\n\n\t\t\tthis.x = ay * bz - az * by;\n\t\t\tthis.y = az * bx - ax * bz;\n\t\t\tthis.z = ax * by - ay * bx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tprojectOnVector: function ( vector ) {\n\n\t\t\tvar scalar = vector.dot( this ) / vector.lengthSq();\n\n\t\t\treturn this.copy( vector ).multiplyScalar( scalar );\n\n\t\t},\n\n\t\tprojectOnPlane: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function projectOnPlane( planeNormal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tv1.copy( this ).projectOnVector( planeNormal );\n\n\t\t\t\treturn this.sub( v1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\treflect: function () {\n\n\t\t\t// reflect incident vector off plane orthogonal to normal\n\t\t\t// normal is assumed to have unit length\n\n\t\t\tvar v1;\n\n\t\t\treturn function reflect( normal ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\treturn this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tangleTo: function ( v ) {\n\n\t\t\tvar theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );\n\n\t\t\t// clamp, to handle numerical problems\n\n\t\t\treturn Math.acos( _Math.clamp( theta, - 1, 1 ) );\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t\t},\n\n\t\tsetFromSpherical: function( s ) {\n\n\t\t\tvar sinPhiRadius = Math.sin( s.phi ) * s.radius;\n\n\t\t\tthis.x = sinPhiRadius * Math.sin( s.theta );\n\t\t\tthis.y = Math.cos( s.phi ) * s.radius;\n\t\t\tthis.z = sinPhiRadius * Math.cos( s.theta );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixPosition: function ( m ) {\n\n\t\t\treturn this.setFromMatrixColumn( m, 3 );\n\n\t\t},\n\n\t\tsetFromMatrixScale: function ( m ) {\n\n\t\t\tvar sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\t\tvar sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\t\tvar sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\tthis.x = sx;\n\t\t\tthis.y = sy;\n\t\t\tthis.z = sz;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixColumn: function ( m, index ) {\n\n\t\t\tif ( typeof m === 'number' ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: setFromMatrixColumn now expects ( matrix, index ).' );\n\t\t\t\tvar temp = m;\n\t\t\t\tm = index;\n\t\t\t\tindex = temp;\n\n\t\t\t}\n\n\t\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tindex = index * attribute.itemSize + offset;\n\n\t\t\tthis.x = attribute.array[ index ];\n\t\t\tthis.y = attribute.array[ index + 1 ];\n\t\t\tthis.z = attribute.array[ index + 2 ];\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author jordi_ros / http://plattsoft.com\n\t * @author D1plo1d / http://github.com/D1plo1d\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author timknip / http://www.floorplanner.com/\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Matrix4() {\n\n\t\tthis.elements = new Float32Array( [\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 ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix4.prototype = {\n\n\t\tconstructor: Matrix4,\n\n\t\tisMatrix4: true,\n\n\t\tset: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, 1, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new Matrix4().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tthis.elements.set( m.elements );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyPosition: function ( m ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = m.elements;\n\n\t\t\tte[ 12 ] = me[ 12 ];\n\t\t\tte[ 13 ] = me[ 13 ];\n\t\t\tte[ 14 ] = me[ 14 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\tthis.set(\n\t\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractRotation: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function extractRotation( m ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tvar te = this.elements;\n\t\t\t\tvar me = m.elements;\n\n\t\t\t\tvar scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length();\n\t\t\t\tvar scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length();\n\t\t\t\tvar scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\t\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\t\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\n\t\t\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\t\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\t\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\n\t\t\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\t\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\t\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakeRotationFromEuler: function ( euler ) {\n\n\t\t\tif ( (euler && euler.isEuler) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = euler.x, y = euler.y, z = euler.z;\n\t\t\tvar a = Math.cos( x ), b = Math.sin( x );\n\t\t\tvar c = Math.cos( y ), d = Math.sin( y );\n\t\t\tvar e = Math.cos( z ), f = Math.sin( z );\n\n\t\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - c * f;\n\t\t\t\tte[ 8 ] = d;\n\n\t\t\t\tte[ 1 ] = af + be * d;\n\t\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\t\tte[ 9 ] = - b * c;\n\n\t\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\t\tte[ 6 ] = be + af * d;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce + df * b;\n\t\t\t\tte[ 4 ] = de * b - cf;\n\t\t\t\tte[ 8 ] = a * d;\n\n\t\t\t\tte[ 1 ] = a * f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b;\n\n\t\t\t\tte[ 2 ] = cf * b - de;\n\t\t\t\tte[ 6 ] = df + ce * b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce - df * b;\n\t\t\t\tte[ 4 ] = - a * f;\n\t\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\t\tte[ 1 ] = cf + de * b;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\t\tte[ 2 ] = - a * d;\n\t\t\t\tte[ 6 ] = b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = be * d - af;\n\t\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\t\tte[ 1 ] = c * f;\n\t\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\t\tte[ 2 ] = - d;\n\t\t\t\tte[ 6 ] = b * c;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\t\tte[ 1 ] = f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b * e;\n\n\t\t\t\tte[ 2 ] = - d * e;\n\t\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - f;\n\t\t\t\tte[ 8 ] = d * e;\n\n\t\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\t\tte[ 6 ] = b * e;\n\t\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t\t}\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationFromQuaternion: function ( q ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = q.x, y = q.y, z = q.z, w = q.w;\n\t\t\tvar x2 = x + x, y2 = y + y, z2 = z + z;\n\t\t\tvar xx = x * x2, xy = x * y2, xz = x * z2;\n\t\t\tvar yy = y * y2, yz = y * z2, zz = z * z2;\n\t\t\tvar wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\t\tte[ 0 ] = 1 - ( yy + zz );\n\t\t\tte[ 4 ] = xy - wz;\n\t\t\tte[ 8 ] = xz + wy;\n\n\t\t\tte[ 1 ] = xy + wz;\n\t\t\tte[ 5 ] = 1 - ( xx + zz );\n\t\t\tte[ 9 ] = yz - wx;\n\n\t\t\tte[ 2 ] = xz - wy;\n\t\t\tte[ 6 ] = yz + wx;\n\t\t\tte[ 10 ] = 1 - ( xx + yy );\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlookAt: function () {\n\n\t\t\tvar x, y, z;\n\n\t\t\treturn function lookAt( eye, target, up ) {\n\n\t\t\t\tif ( x === undefined ) {\n\n\t\t\t\t\tx = new Vector3();\n\t\t\t\t\ty = new Vector3();\n\t\t\t\t\tz = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tz.subVectors( eye, target ).normalize();\n\n\t\t\t\tif ( z.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z = 1;\n\n\t\t\t\t}\n\n\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\tif ( x.lengthSq() === 0 ) {\n\n\t\t\t\t\tz.z += 0.0001;\n\t\t\t\t\tx.crossVectors( up, z ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\ty.crossVectors( z, x );\n\n\n\t\t\t\tte[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;\n\t\t\t\tte[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;\n\t\t\t\tte[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiply: function ( m, n ) {\n\n\t\t\tif ( n !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyMatrices( this, m );\n\n\t\t},\n\n\t\tpremultiply: function ( m ) {\n\n\t\t\treturn this.multiplyMatrices( m, this );\n\n\t\t},\n\n\t\tmultiplyMatrices: function ( a, b ) {\n\n\t\t\tvar ae = a.elements;\n\t\t\tvar be = b.elements;\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\t\tvar a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\t\tvar a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\t\tvar a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\t\tvar b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\t\tvar b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\t\tvar b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\t\tvar b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyToArray: function ( a, b, r ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tthis.multiplyMatrices( a, b );\n\n\t\t\tr[ 0 ] = te[ 0 ]; r[ 1 ] = te[ 1 ]; r[ 2 ] = te[ 2 ]; r[ 3 ] = te[ 3 ];\n\t\t\tr[ 4 ] = te[ 4 ]; r[ 5 ] = te[ 5 ]; r[ 6 ] = te[ 6 ]; r[ 7 ] = te[ 7 ];\n\t\t\tr[ 8 ] = te[ 8 ]; r[ 9 ] = te[ 9 ]; r[ 10 ] = te[ 10 ]; r[ 11 ] = te[ 11 ];\n\t\t\tr[ 12 ] = te[ 12 ]; r[ 13 ] = te[ 13 ]; r[ 14 ] = te[ 14 ]; r[ 15 ] = te[ 15 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToVector3Array: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToVector3Array( array, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = array.length;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i += 3, j += 3 ) {\n\n\t\t\t\t\tv1.fromArray( array, j );\n\t\t\t\t\tv1.applyMatrix4( this );\n\t\t\t\t\tv1.toArray( array, j );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyToBuffer: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBuffer( buffer, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = buffer.length / buffer.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i ++, j ++ ) {\n\n\t\t\t\t\tv1.x = buffer.getX( j );\n\t\t\t\t\tv1.y = buffer.getY( j );\n\t\t\t\t\tv1.z = buffer.getZ( j );\n\n\t\t\t\t\tv1.applyMatrix4( this );\n\n\t\t\t\t\tbuffer.setXYZ( j, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn buffer;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\t\tvar n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\t\tvar n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\t\tvar n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t\t//TODO: make this more efficient\n\t\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\t\treturn (\n\t\t\t\tn41 * (\n\t\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t\t - n13 * n24 * n32\n\t\t\t\t\t - n14 * n22 * n33\n\t\t\t\t\t + n12 * n24 * n33\n\t\t\t\t\t + n13 * n22 * n34\n\t\t\t\t\t - n12 * n23 * n34\n\t\t\t\t) +\n\t\t\t\tn42 * (\n\t\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t\t - n11 * n24 * n33\n\t\t\t\t\t + n14 * n21 * n33\n\t\t\t\t\t - n13 * n21 * n34\n\t\t\t\t\t + n13 * n24 * n31\n\t\t\t\t\t - n14 * n23 * n31\n\t\t\t\t) +\n\t\t\t\tn43 * (\n\t\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t\t - n11 * n22 * n34\n\t\t\t\t\t - n14 * n21 * n32\n\t\t\t\t\t + n12 * n21 * n34\n\t\t\t\t\t + n14 * n22 * n31\n\t\t\t\t\t - n12 * n24 * n31\n\t\t\t\t) +\n\t\t\t\tn44 * (\n\t\t\t\t\t- n13 * n22 * n31\n\t\t\t\t\t - n11 * n23 * n32\n\t\t\t\t\t + n11 * n22 * n33\n\t\t\t\t\t + n13 * n21 * n32\n\t\t\t\t\t - n12 * n21 * n33\n\t\t\t\t\t + n12 * n23 * n31\n\t\t\t\t)\n\n\t\t\t);\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar tmp;\n\n\t\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset is deprecated \" +\n\t\t\t\t\t\"- just use .toArray instead.\" );\n\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\n\t\tgetPosition: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function getPosition() {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\n\n\t\t\t\treturn v1.setFromMatrixColumn( this, 3 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetPosition: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 12 ] = v.x;\n\t\t\tte[ 13 ] = v.y;\n\t\t\tte[ 14 ] = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetInverse: function ( m, throwOnDegenerate ) {\n\n\t\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\t\tvar te = this.elements,\n\t\t\t\tme = m.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],\n\t\t\t\tn12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],\n\t\t\t\tn13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],\n\t\t\t\tn14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],\n\n\t\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\t\tvar det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\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\t\tte[ 4 ] = t12 * detInv;\n\t\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\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\t\tte[ 8 ] = t13 * detInv;\n\t\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\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\t\tte[ 12 ] = t14 * detInv;\n\t\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\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\t\treturn this;\n\n\t\t},\n\n\t\tscale: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = v.x, y = v.y, z = v.z;\n\n\t\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetMaxScaleOnAxis: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\t\tvar scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\t\tvar scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t\t},\n\n\t\tmakeTranslation: function ( x, y, z ) {\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\treturn this;\n\n\t\t},\n\n\t\tmakeRotationX: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, c, - s, 0,\n\t\t\t\t0, s, c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationY: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t c, 0, s, 0,\n\t\t\t\t 0, 1, 0, 0,\n\t\t\t\t- s, 0, c, 0,\n\t\t\t\t 0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationZ: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\tc, - s, 0, 0,\n\t\t\t\ts, c, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationAxis: function ( axis, angle ) {\n\n\t\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\t\tvar c = Math.cos( angle );\n\t\t\tvar s = Math.sin( angle );\n\t\t\tvar t = 1 - c;\n\t\t\tvar x = axis.x, y = axis.y, z = axis.z;\n\t\t\tvar tx = t * x, ty = t * y;\n\n\t\t\tthis.set(\n\n\t\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\t return this;\n\n\t\t},\n\n\t\tmakeScale: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\tx, 0, 0, 0,\n\t\t\t\t0, y, 0, 0,\n\t\t\t\t0, 0, z, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcompose: function ( position, quaternion, scale ) {\n\n\t\t\tthis.makeRotationFromQuaternion( quaternion );\n\t\t\tthis.scale( scale );\n\t\t\tthis.setPosition( position );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdecompose: function () {\n\n\t\t\tvar vector, matrix;\n\n\t\t\treturn function decompose( position, quaternion, scale ) {\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tvector = new Vector3();\n\t\t\t\t\tmatrix = new Matrix4();\n\n\t\t\t\t}\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tvar sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\t\t\tvar sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\t\t\tvar sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t\t\t// if determine is negative, we need to invert one scale\n\t\t\t\tvar det = this.determinant();\n\t\t\t\tif ( det < 0 ) {\n\n\t\t\t\t\tsx = - sx;\n\n\t\t\t\t}\n\n\t\t\t\tposition.x = te[ 12 ];\n\t\t\t\tposition.y = te[ 13 ];\n\t\t\t\tposition.z = te[ 14 ];\n\n\t\t\t\t// scale the rotation part\n\n\t\t\t\tmatrix.elements.set( this.elements ); // at this point matrix is incomplete so we can't use .copy()\n\n\t\t\t\tvar invSX = 1 / sx;\n\t\t\t\tvar invSY = 1 / sy;\n\t\t\t\tvar invSZ = 1 / sz;\n\n\t\t\t\tmatrix.elements[ 0 ] *= invSX;\n\t\t\t\tmatrix.elements[ 1 ] *= invSX;\n\t\t\t\tmatrix.elements[ 2 ] *= invSX;\n\n\t\t\t\tmatrix.elements[ 4 ] *= invSY;\n\t\t\t\tmatrix.elements[ 5 ] *= invSY;\n\t\t\t\tmatrix.elements[ 6 ] *= invSY;\n\n\t\t\t\tmatrix.elements[ 8 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 9 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 10 ] *= invSZ;\n\n\t\t\t\tquaternion.setFromRotationMatrix( matrix );\n\n\t\t\t\tscale.x = sx;\n\t\t\t\tscale.y = sy;\n\t\t\t\tscale.z = sz;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakeFrustum: function ( left, right, bottom, top, near, far ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = 2 * near / ( right - left );\n\t\t\tvar y = 2 * near / ( top - bottom );\n\n\t\t\tvar a = ( right + left ) / ( right - left );\n\t\t\tvar b = ( top + bottom ) / ( top - bottom );\n\t\t\tvar c = - ( far + near ) / ( far - near );\n\t\t\tvar d = - 2 * far * near / ( far - near );\n\n\t\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakePerspective: function ( fov, aspect, near, far ) {\n\n\t\t\tvar ymax = near * Math.tan( _Math.DEG2RAD * fov * 0.5 );\n\t\t\tvar ymin = - ymax;\n\t\t\tvar xmin = ymin * aspect;\n\t\t\tvar xmax = ymax * aspect;\n\n\t\t\treturn this.makeFrustum( xmin, xmax, ymin, ymax, near, far );\n\n\t\t},\n\n\t\tmakeOrthographic: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar w = 1.0 / ( right - left );\n\t\t\tvar h = 1.0 / ( top - bottom );\n\t\t\tvar p = 1.0 / ( far - near );\n\n\t\t\tvar x = ( right + left ) * w;\n\t\t\tvar y = ( top + bottom ) * h;\n\t\t\tvar z = ( far + near ) * p;\n\n\t\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( matrix ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = matrix.elements;\n\n\t\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tTexture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tCubeTexture.prototype = Object.create( Texture.prototype );\n\tCubeTexture.prototype.constructor = CubeTexture;\n\n\tCubeTexture.prototype.isCubeTexture = true;\n\n\tObject.defineProperty( CubeTexture.prototype, 'images', {\n\n\t\tget: function () {\n\n\t\t\treturn this.image;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.image = value;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t *\n\t * Uniforms of a program.\n\t * Those form a tree structure with a special top-level container for the root,\n\t * which you get by calling 'new WebGLUniforms( gl, program, renderer )'.\n\t *\n\t *\n\t * Properties of inner nodes including the top-level container:\n\t *\n\t * .seq - array of nested uniforms\n\t * .map - nested uniforms by name\n\t *\n\t *\n\t * Methods of all nodes except the top-level container:\n\t *\n\t * .setValue( gl, value, [renderer] )\n\t *\n\t * \t\tuploads a uniform value(s)\n\t * \tthe 'renderer' parameter is needed for sampler uniforms\n\t *\n\t *\n\t * Static methods of the top-level container (renderer factorizations):\n\t *\n\t * .upload( gl, seq, values, renderer )\n\t *\n\t * \t\tsets uniforms in 'seq' to 'values[id].value'\n\t *\n\t * .seqWithValue( seq, values ) : filteredSeq\n\t *\n\t * \t\tfilters 'seq' entries with corresponding entry in values\n\t *\n\t *\n\t * Methods of the top-level container (renderer factorizations):\n\t *\n\t * .setValue( gl, name, value )\n\t *\n\t * \t\tsets uniform with name 'name' to 'value'\n\t *\n\t * .set( gl, obj, prop )\n\t *\n\t * \t\tsets uniform from object and property with same name than uniform\n\t *\n\t * .setOptional( gl, obj, prop )\n\t *\n\t * \t\tlike .set for an optional property of the object\n\t *\n\t */\n\n\tvar emptyTexture = new Texture();\n\tvar emptyCubeTexture = new CubeTexture();\n\n\t// --- Base for inner nodes (including the root) ---\n\n\tfunction UniformContainer() {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\t// --- Utilities ---\n\n\t// Array Caches (provide typed arrays for temporary by size)\n\n\tvar arrayCacheF32 = [];\n\tvar arrayCacheI32 = [];\n\n\t// Flattening for arrays of vectors and matrices\n\n\tfunction flatten( array, nBlocks, blockSize ) {\n\n\t\tvar firstElem = array[ 0 ];\n\n\t\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t\t// unoptimized: ! isNaN( firstElem )\n\t\t// see http://jacksondunstan.com/articles/983\n\n\t\tvar n = nBlocks * blockSize,\n\t\t\tr = arrayCacheF32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Float32Array( n );\n\t\t\tarrayCacheF32[ n ] = r;\n\n\t\t}\n\n\t\tif ( nBlocks !== 0 ) {\n\n\t\t\tfirstElem.toArray( r, 0 );\n\n\t\t\tfor ( var i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\t\toffset += blockSize;\n\t\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n\t// Texture unit allocation\n\n\tfunction allocTexUnits( renderer, n ) {\n\n\t\tvar r = arrayCacheI32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Int32Array( n );\n\t\t\tarrayCacheI32[ n ] = r;\n\n\t\t}\n\n\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\tr[ i ] = renderer.allocTextureUnit();\n\n\t\treturn r;\n\n\t}\n\n\t// --- Setters ---\n\n\t// Note: Defining these methods externally, because they come in a bunch\n\t// and this way their names minify.\n\n\t// Single scalar\n\n\tfunction setValue1f( gl, v ) { gl.uniform1f( this.addr, v ); }\n\tfunction setValue1i( gl, v ) { gl.uniform1i( this.addr, v ); }\n\n\t// Single float vector (from flat array or THREE.VectorN)\n\n\tfunction setValue2fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform2fv( this.addr, v );\n\t\telse gl.uniform2f( this.addr, v.x, v.y );\n\n\t}\n\n\tfunction setValue3fv( gl, v ) {\n\n\t\tif ( v.x !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\t\telse if ( v.r !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\t\telse\n\t\t\tgl.uniform3fv( this.addr, v );\n\n\t}\n\n\tfunction setValue4fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform4fv( this.addr, v );\n\t\telse gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t}\n\n\t// Single matrix (from flat array or MatrixN)\n\n\tfunction setValue2fm( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue3fm( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue4fm( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v.elements || v );\n\n\t}\n\n\t// Single texture (2D / Cube)\n\n\tfunction setValueT1( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTexture2D( v || emptyTexture, unit );\n\n\t}\n\n\tfunction setValueT6( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTextureCube( v || emptyCubeTexture, unit );\n\n\t}\n\n\t// Integer / Boolean vectors or arrays thereof (always flat arrays)\n\n\tfunction setValue2iv( gl, v ) { gl.uniform2iv( this.addr, v ); }\n\tfunction setValue3iv( gl, v ) { gl.uniform3iv( this.addr, v ); }\n\tfunction setValue4iv( gl, v ) { gl.uniform4iv( this.addr, v ); }\n\n\t// Helper to pick the right setter for the singular case\n\n\tfunction getSingularSetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1f; // FLOAT\n\t\t\tcase 0x8b50: return setValue2fv; // _VEC2\n\t\t\tcase 0x8b51: return setValue3fv; // _VEC3\n\t\t\tcase 0x8b52: return setValue4fv; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValue2fm; // _MAT2\n\t\t\tcase 0x8b5b: return setValue3fm; // _MAT3\n\t\t\tcase 0x8b5c: return setValue4fm; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1i; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// Array of scalars\n\n\tfunction setValue1fv( gl, v ) { gl.uniform1fv( this.addr, v ); }\n\tfunction setValue1iv( gl, v ) { gl.uniform1iv( this.addr, v ); }\n\n\t// Array of vectors (flat or from THREE classes)\n\n\tfunction setValueV2a( gl, v ) {\n\n\t\tgl.uniform2fv( this.addr, flatten( v, this.size, 2 ) );\n\n\t}\n\n\tfunction setValueV3a( gl, v ) {\n\n\t\tgl.uniform3fv( this.addr, flatten( v, this.size, 3 ) );\n\n\t}\n\n\tfunction setValueV4a( gl, v ) {\n\n\t\tgl.uniform4fv( this.addr, flatten( v, this.size, 4 ) );\n\n\t}\n\n\t// Array of matrices (flat or from THREE clases)\n\n\tfunction setValueM2a( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) );\n\n\t}\n\n\tfunction setValueM3a( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) );\n\n\t}\n\n\tfunction setValueM4a( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) );\n\n\t}\n\n\t// Array of textures (2D / Cube)\n\n\tfunction setValueT1a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\tfunction setValueT6a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\t// Helper to pick the right setter for a pure (bottom-level) array\n\n\tfunction getPureArraySetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1fv; // FLOAT\n\t\t\tcase 0x8b50: return setValueV2a; // _VEC2\n\t\t\tcase 0x8b51: return setValueV3a; // _VEC3\n\t\t\tcase 0x8b52: return setValueV4a; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValueM2a; // _MAT2\n\t\t\tcase 0x8b5b: return setValueM3a; // _MAT3\n\t\t\tcase 0x8b5c: return setValueM4a; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1a; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6a; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// --- Uniform Classes ---\n\n\tfunction SingleUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\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\tfunction StructuredUniform( id ) {\n\n\t\tthis.id = id;\n\n\t\tUniformContainer.call( this ); // mix-in\n\n\t}\n\n\tStructuredUniform.prototype.setValue = function( gl, value ) {\n\n\t\t// Note: Don't need an extra 'renderer' parameter, since samplers\n\t\t// are not allowed in structured uniforms.\n\n\t\tvar seq = this.seq;\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ] );\n\n\t\t}\n\n\t};\n\n\t// --- Top-level ---\n\n\t// Parser - builds up the property tree from the path strings\n\n\tvar RePathPart = /([\\w\\d_]+)(\\])?(\\[|\\.)?/g;\n\n\t// extracts\n\t// \t- the identifier (member name or array index)\n\t// - followed by an optional right bracket (found when array index)\n\t// - followed by an optional left bracket or dot (type of subscript)\n\t//\n\t// Note: These portions can be read in a non-overlapping fashion and\n\t// allow straightforward parsing of the hierarchy that WebGL encodes\n\t// in the uniform names.\n\n\tfunction addUniform( container, uniformObject ) {\n\n\t\tcontainer.seq.push( uniformObject );\n\t\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n\t}\n\n\tfunction parseUniform( activeInfo, addr, container ) {\n\n\t\tvar path = activeInfo.name,\n\t\t\tpathLength = path.length;\n\n\t\t// reset RegExp object, because of the early exit of a previous run\n\t\tRePathPart.lastIndex = 0;\n\n\t\tfor (; ;) {\n\n\t\t\tvar match = RePathPart.exec( path ),\n\t\t\t\tmatchEnd = RePathPart.lastIndex,\n\n\t\t\t\tid = match[ 1 ],\n\t\t\t\tidIsIndex = match[ 2 ] === ']',\n\t\t\t\tsubscript = match[ 3 ];\n\n\t\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\t\tif ( subscript === undefined ||\n\t\t\t\t\tsubscript === '[' && matchEnd + 2 === pathLength ) {\n\t\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\t\tbreak;\n\n\t\t\t} else {\n\t\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\t\tvar map = container.map,\n\t\t\t\t\tnext = map[ id ];\n\n\t\t\t\tif ( next === undefined ) {\n\n\t\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\t\taddUniform( container, next );\n\n\t\t\t\t}\n\n\t\t\t\tcontainer = next;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Root Container\n\n\tfunction WebGLUniforms( gl, program, renderer ) {\n\n\t\tUniformContainer.call( this );\n\n\t\tthis.renderer = renderer;\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\tvar info = gl.getActiveUniform( program, i ),\n\t\t\t\tpath = info.name,\n\t\t\t\taddr = gl.getUniformLocation( program, path );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tWebGLUniforms.prototype.setValue = function( gl, name, value ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.set = function( gl, object, name ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, object[ name ], this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.setOptional = function( gl, object, name ) {\n\n\t\tvar v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t};\n\n\n\t// Static interface\n\n\tWebGLUniforms.upload = function( gl, seq, values, renderer ) {\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\n\t\t\t\tu.setValue( gl, v.value, renderer );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tWebGLUniforms.seqWithValue = function( seq, values ) {\n\n\t\tvar r = [];\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar 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\t/**\n\t * Uniform Utilities\n\t */\n\n\tvar UniformsUtils = {\n\n\t\tmerge: function ( uniforms ) {\n\n\t\t\tvar merged = {};\n\n\t\t\tfor ( var u = 0; u < uniforms.length; u ++ ) {\n\n\t\t\t\tvar tmp = this.clone( uniforms[ u ] );\n\n\t\t\t\tfor ( var p in tmp ) {\n\n\t\t\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn merged;\n\n\t\t},\n\n\t\tclone: function ( uniforms_src ) {\n\n\t\t\tvar uniforms_dst = {};\n\n\t\t\tfor ( var u in uniforms_src ) {\n\n\t\t\t\tuniforms_dst[ u ] = {};\n\n\t\t\t\tfor ( var p in uniforms_src[ u ] ) {\n\n\t\t\t\t\tvar parameter_src = uniforms_src[ u ][ p ];\n\n\t\t\t\t\tif ( parameter_src && ( parameter_src.isColor ||\n\t\t\t\t\t\tparameter_src.isMatrix3 || parameter_src.isMatrix4 ||\n\t\t\t\t\t\tparameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 ||\n\t\t\t\t\t\tparameter_src.isTexture ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.clone();\n\n\t\t\t\t\t} else if ( Array.isArray( parameter_src ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.slice();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn uniforms_dst;\n\n\t\t}\n\n\t};\n\n\tvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\\n\";\n\n\tvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\\n\";\n\n\tvar alphatest_fragment = \"#ifdef ALPHATEST\\n\\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\\n\";\n\n\tvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\\n\\t#endif\\n#endif\\n\";\n\n\tvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\n\tvar begin_vertex = \"\\nvec3 transformed = vec3( position );\\n\";\n\n\tvar beginnormal_vertex = \"\\nvec3 objectNormal = vec3( normal );\\n\";\n\n\tvar bsdfs = \"bool testLightInRange( const in float lightDistance, const in float cutoffDistance ) {\\n\\treturn any( bvec2( cutoffDistance == 0.0, lightDistance < cutoffDistance ) );\\n}\\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\t\\tif( decayExponent > 0.0 ) {\\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\\n\\t\\t\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\t\\t\\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t\\t\\treturn distanceFalloff * maxDistanceCutoffFactor;\\n#else\\n\\t\\t\\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\\n#endif\\n\\t\\t}\\n\\t\\treturn 1.0;\\n}\\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\\n\\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\\n\\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\\n}\\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\treturn 1.0 / ( gl * gv );\\n}\\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\tfloat D = D_GGX( alpha, dotNH );\\n\\treturn F * ( G * D );\\n}\\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\\n\\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\\n\\tvec4 r = roughness * c0 + c1;\\n\\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\\n\\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\\n\\treturn specularColor * AB.x + AB.y;\\n}\\nfloat G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n}\\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\\n\\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\\n}\\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\\n\\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\\n}\\n\";\n\n\tvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vUv );\\n\\t\\tvec2 dSTdy = dFdy( vUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\\n\\t\\tvec3 vSigmaX = dFdx( surf_pos );\\n\\t\\tvec3 vSigmaY = dFdy( surf_pos );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 );\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\\n\";\n\n\tvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\\n\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t\\t\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\\n\\t\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\tif ( clipped ) discard;\\n\\t\\n\\t#endif\\n#endif\\n\";\n\n\tvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\t\\tvarying vec3 vViewPosition;\\n\\t#endif\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\\n\";\n\n\tvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n\";\n\n\tvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n\";\n\n\tvar color_fragment = \"#ifdef USE_COLOR\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\n\tvar color_pars_fragment = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\\n\";\n\n\tvar color_pars_vertex = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\";\n\n\tvar color_vertex = \"#ifdef USE_COLOR\\n\\tvColor.xyz = color.xyz;\\n#endif\";\n\n\tvar common = \"#define PI 3.14159265359\\n#define PI2 6.28318530718\\n#define RECIPROCAL_PI 0.31830988618\\n#define RECIPROCAL_PI2 0.15915494\\n#define LOG2 1.442695\\n#define EPSILON 1e-6\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract(sin(sn) * c);\\n}\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\tfloat distance = dot( planeNormal, point - pointOnPlane );\\n\\treturn - distance * planeNormal + point;\\n}\\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn sign( dot( point - pointOnPlane, planeNormal ) );\\n}\\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\\n}\\n\";\n\n\tvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n#define cubeUV_textureSize (1024.0)\\nint getFaceFromDirection(vec3 direction) {\\n\\tvec3 absDirection = abs(direction);\\n\\tint face = -1;\\n\\tif( absDirection.x > absDirection.z ) {\\n\\t\\tif(absDirection.x > absDirection.y )\\n\\t\\t\\tface = direction.x > 0.0 ? 0 : 3;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\telse {\\n\\t\\tif(absDirection.z > absDirection.y )\\n\\t\\t\\tface = direction.z > 0.0 ? 2 : 5;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\treturn face;\\n}\\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\\n\\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\\n\\tfloat dxRoughness = dFdx(roughness);\\n\\tfloat dyRoughness = dFdy(roughness);\\n\\tvec3 dx = dFdx( vec * scale * dxRoughness );\\n\\tvec3 dy = dFdy( vec * scale * dyRoughness );\\n\\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\\n\\td = clamp(d, 1.0, cubeUV_rangeClamp);\\n\\tfloat mipLevel = 0.5 * log2(d);\\n\\treturn vec2(floor(mipLevel), fract(mipLevel));\\n}\\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\\n\\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\\n\\tfloat a = 16.0 * cubeUV_rcpTextureSize;\\n\\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\\n\\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\\n\\tfloat powScale = exp2_packed.x * exp2_packed.y;\\n\\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\\n\\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\\n\\tbool bRes = mipLevel == 0.0;\\n\\tscale = bRes && (scale < a) ? a : scale;\\n\\tvec3 r;\\n\\tvec2 offset;\\n\\tint face = getFaceFromDirection(direction);\\n\\tfloat rcpPowScale = 1.0 / powScale;\\n\\tif( face == 0) {\\n\\t\\tr = vec3(direction.x, -direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 1) {\\n\\t\\tr = vec3(direction.y, direction.x, direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 2) {\\n\\t\\tr = vec3(direction.z, direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 3) {\\n\\t\\tr = vec3(direction.x, direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse if( face == 4) {\\n\\t\\tr = vec3(direction.y, direction.x, -direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse {\\n\\t\\tr = vec3(direction.z, -direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\tr = normalize(r);\\n\\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\\n\\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\\n\\tvec2 base = offset + vec2( texelOffset );\\n\\treturn base + s * ( scale - 2.0 * texelOffset );\\n}\\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\\n\\tfloat roughnessVal = roughness* cubeUV_maxLods3;\\n\\tfloat r1 = floor(roughnessVal);\\n\\tfloat r2 = r1 + 1.0;\\n\\tfloat t = fract(roughnessVal);\\n\\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\\n\\tfloat s = mipInfo.y;\\n\\tfloat level0 = mipInfo.x;\\n\\tfloat level1 = level0 + 1.0;\\n\\tlevel1 = level1 > 5.0 ? 5.0 : level1;\\n\\tlevel0 += min( floor( s + 0.5 ), 5.0 );\\n\\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\\n\\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\\n\\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\\n\\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\\n\\tvec4 result = mix(color10, color20, t);\\n\\treturn vec4(result.rgb, 1.0);\\n}\\n#endif\\n\";\n\n\tvar defaultnormal_vertex = \"#ifdef FLIP_SIDED\\n\\tobjectNormal = -objectNormal;\\n#endif\\nvec3 transformedNormal = normalMatrix * objectNormal;\\n\";\n\n\tvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\\n\";\n\n\tvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\\n#endif\\n\";\n\n\tvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\\n\";\n\n\tvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\\n\";\n\n\tvar encodings_fragment = \" gl_FragColor = linearToOutputTexel( gl_FragColor );\\n\";\n\n\tvar encodings_pars_fragment = \"\\nvec4 LinearToLinear( in vec4 value ) {\\n return value;\\n}\\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\\n return vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\\n}\\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\\n return vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n return vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\\n}\\nvec4 RGBEToLinear( in vec4 value ) {\\n return vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n float maxComponent = max( max( value.r, value.g ), value.b );\\n float fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n return vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n return vec4( value.xyz * value.w * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n float maxRGB = max( value.x, max( value.g, value.b ) );\\n float M = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n M = ceil( M * 255.0 ) / 255.0;\\n return vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n return vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n float maxRGB = max( value.x, max( value.g, value.b ) );\\n float D = max( maxRange / maxRGB, 1.0 );\\n D = min( floor( D ) / 255.0, 1.0 );\\n return vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\\n}\\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\\nvec4 LinearToLogLuv( in vec4 value ) {\\n vec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\\n Xp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\\n vec4 vResult;\\n vResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n float Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n vResult.w = fract(Le);\\n vResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\\n return vResult;\\n}\\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\\nvec4 LogLuvToLinear( in vec4 value ) {\\n float Le = value.z * 255.0 + value.w;\\n vec3 Xp_Y_XYZp;\\n Xp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\\n Xp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n Xp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n vec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\\n return vec4( max(vRGB, 0.0), 1.0 );\\n}\\n\";\n\n\tvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\tvec2 sampleUV;\\n\\t\\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\\n\\t\\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\tvec4 envColor = texture2D( envMap, sampleUV );\\n\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\\n\\t\\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\tenvColor = envMapTexelToLinear( envColor );\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_pars_fragment = \"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\\n\\tuniform float reflectivity;\\n\\tuniform float envMapIntenstiy;\\n#endif\\n#ifdef USE_ENVMAP\\n\\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\tuniform float flipEnvMap;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\\n\";\n\n\tvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tfloat depth = gl_FragDepthEXT / gl_FragCoord.w;\\n\\t#else\\n\\t\\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\\n\\t#endif\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, depth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\\n\";\n\n\tvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\n\tvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n#endif\\n\";\n\n\tvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\n\tvar lights_lambert_vertex = \"vec3 diffuse = vec3( 1.0 );\\nGeometricContext geometry;\\ngeometry.position = mvPosition.xyz;\\ngeometry.normal = normalize( transformedNormal );\\ngeometry.viewDir = normalize( -mvPosition.xyz );\\nGeometricContext backGeometry;\\nbackGeometry.position = geometry.position;\\nbackGeometry.normal = -geometry.normal;\\nbackGeometry.viewDir = geometry.viewDir;\\nvLightFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\n\\tvLightBack = vec3( 0.0 );\\n#endif\\nIncidentLight directLight;\\nfloat dotNL;\\nvec3 directLightColor_Diffuse;\\n#if NUM_POINT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_DIR_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar lights_pars = \"uniform vec3 ambientLightColor;\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treturn irradiance;\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tdirectLight.color = directionalLight.color;\\n\\t\\tdirectLight.direction = directionalLight.direction;\\n\\t\\tdirectLight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = pointLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tif ( testLightInRange( lightDistance, pointLight.distance ) ) {\\n\\t\\t\\tdirectLight.color = pointLight.color;\\n\\t\\t\\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tfloat angleCos = dot( directLight.direction, spotLight.direction );\\n\\t\\tif ( all( bvec2( angleCos > spotLight.coneCos, testLightInRange( lightDistance, spotLight.distance ) ) ) ) {\\n\\t\\t\\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\t\\tdirectLight.color = spotLight.color;\\n\\t\\t\\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\\n\\t\\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tirradiance *= PI;\\n\\t\\t#endif\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\\t\\t#include \\n\\t\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\\n\\t\\t#else\\n\\t\\t\\tvec4 envMapColor = vec4( 0.0 );\\n\\t\\t#endif\\n\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t}\\n\\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\tfloat maxMIPLevelScalar = float( maxMIPLevel );\\n\\t\\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\\n\\t\\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\\n\\t}\\n\\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\\n\\t\\t#endif\\n\\t\\t#include \\n\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\\n\\t\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\t\\tvec2 sampleUV;\\n\\t\\t\\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\\n\\t\\t\\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\t\\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#endif\\n\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t}\\n#endif\\n\";\n\n\tvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\\n\";\n\n\tvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\nstruct BlinnPhongMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tvec3\\tspecularColor;\\n\\tfloat\\tspecularShininess;\\n\\tfloat\\tspecularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\\n\";\n\n\tvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\\n#ifdef STANDARD\\n\\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.clearCoat = saturate( clearCoat );\\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\\n#endif\\n\";\n\n\tvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tfloat\\tspecularRoughness;\\n\\tvec3\\tspecularColor;\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoat;\\n\\t\\tfloat clearCoatRoughness;\\n\\t#endif\\n};\\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\\n\\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\\n}\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\\n\\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifndef STANDARD\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\tfloat dotNL = dotNV;\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\\n\";\n\n\tvar lights_template = \"\\nGeometricContext geometry;\\ngeometry.position = - vViewPosition;\\ngeometry.normal = normal;\\ngeometry.viewDir = normalize( vViewPosition );\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tlightMapIrradiance *= PI;\\n\\t\\t#endif\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t}\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t \\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\\n\\t#endif\\n\\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\\n\\t#ifndef STANDARD\\n\\t\\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\\n\\t#else\\n\\t\\tvec3 clearCoatRadiance = vec3( 0.0 );\\n\\t#endif\\n\\t\\t\\n\\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\\n#endif\\n\";\n\n\tvar logdepthbuf_fragment = \"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\\n\\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\\n#endif\";\n\n\tvar logdepthbuf_pars_fragment = \"#ifdef USE_LOGDEPTHBUF\\n\\tuniform float logDepthBufFC;\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n#endif\\n\";\n\n\tvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n\\tuniform float logDepthBufFC;\\n#endif\";\n\n\tvar logdepthbuf_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvFragDepth = 1.0 + gl_Position.w;\\n\\t#else\\n\\t\\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\\n\\t#endif\\n#endif\\n\";\n\n\tvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\ttexelColor = mapTexelToLinear( texelColor );\\n\\tdiffuseColor *= texelColor;\\n#endif\\n\";\n\n\tvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar map_particle_fragment = \"#ifdef USE_MAP\\n\\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\\n\\tdiffuseColor *= mapTexelToLinear( mapTexel );\\n#endif\\n\";\n\n\tvar map_particle_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform vec4 offsetRepeat;\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.r;\\n#endif\\n\";\n\n\tvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\n\tvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\n\\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\n\\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\n\\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\n#endif\\n\";\n\n\tvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_MORPHNORMALS\\n\\tuniform float morphTargetInfluences[ 8 ];\\n\\t#else\\n\\tuniform float morphTargetInfluences[ 4 ];\\n\\t#endif\\n#endif\";\n\n\tvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\n\\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\n\\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\n\\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n\\t#ifndef USE_MORPHNORMALS\\n\\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\n\\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\n\\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\n\\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n\\t#endif\\n#endif\\n\";\n\n\tvar normal_flip = \"#ifdef DOUBLE_SIDED\\n\\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n#else\\n\\tfloat flipNormal = 1.0;\\n#endif\\n\";\n\n\tvar normal_fragment = \"#ifdef FLAT_SHADED\\n\\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\\n\\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal ) * flipNormal;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tnormal = perturbNormal2Arb( -vViewPosition, normal );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\\n#endif\\n\";\n\n\tvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n\\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\\n\\t\\tvec3 q0 = dFdx( eye_pos.xyz );\\n\\t\\tvec3 q1 = dFdy( eye_pos.xyz );\\n\\t\\tvec2 st0 = dFdx( vUv.st );\\n\\t\\tvec2 st1 = dFdy( vUv.st );\\n\\t\\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\\n\\t\\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\\n\\t\\tvec3 N = normalize( surf_norm );\\n\\t\\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t\\tmapN.xy = normalScale * mapN.xy;\\n\\t\\tmat3 tsn = mat3( S, T, N );\\n\\t\\treturn normalize( tsn * mapN );\\n\\t}\\n#endif\\n\";\n\n\tvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n return normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n return 1.0 - 2.0 * rgb.xyz;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n return ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n return linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n return (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n return ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\\n\";\n\n\tvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\\n\";\n\n\tvar project_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 mvPosition = modelViewMatrix * skinned;\\n#else\\n\\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\\n#endif\\ngl_Position = projectionMatrix * mvPosition;\\n\";\n\n\tvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.r;\\n#endif\\n\";\n\n\tvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\n\tvar shadowmap_pars_fragment = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\\n\\t\\tconst vec2 offset = vec2( 0.0, 1.0 );\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / size;\\n\\t\\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\\n\\t\\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\\n\\t\\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\\n\\t\\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\\n\\t\\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\\n\\t\\tvec2 f = fract( uv * size + 0.5 );\\n\\t\\tfloat a = mix( lb, lt, f.y );\\n\\t\\tfloat b = mix( rb, rt, f.y );\\n\\t\\tfloat c = mix( a, b, f.x );\\n\\t\\treturn c;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\n\\t\\tbool inFrustum = all( inFrustumVec );\\n\\t\\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n\\t\\tbool frustumTest = all( frustumTestVec );\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn 1.0;\\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 ) {\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar shadowmap_pars_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n#endif\\n\";\n\n\tvar shadowmap_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n#endif\\n\";\n\n\tvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\tDirectionalLight directionalLight;\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\tSpotLight spotLight;\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\tPointLight pointLight;\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\\n\";\n\n\tvar 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\n\tvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\t#ifdef BONE_TEXTURE\\n\\t\\tuniform sampler2D boneTexture;\\n\\t\\tuniform int boneTextureWidth;\\n\\t\\tuniform int boneTextureHeight;\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tfloat j = i * 4.0;\\n\\t\\t\\tfloat x = mod( j, float( boneTextureWidth ) );\\n\\t\\t\\tfloat y = floor( j / float( boneTextureWidth ) );\\n\\t\\t\\tfloat dx = 1.0 / float( boneTextureWidth );\\n\\t\\t\\tfloat dy = 1.0 / float( boneTextureHeight );\\n\\t\\t\\ty = dy * ( y + 0.5 );\\n\\t\\t\\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n\\t\\t\\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n\\t\\t\\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n\\t\\t\\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n\\t\\t\\tmat4 bone = mat4( v1, v2, v3, v4 );\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#else\\n\\t\\tuniform mat4 boneMatrices[ MAX_BONES ];\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tmat4 bone = boneMatrices[ int(i) ];\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#endif\\n#endif\\n\";\n\n\tvar 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\\tskinned = bindMatrixInverse * skinned;\\n#endif\\n\";\n\n\tvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n#endif\\n\";\n\n\tvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\n\tvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\n\tvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\\n\";\n\n\tvar tonemapping_pars_fragment = \"#define saturate(a) clamp( a, 0.0, 1.0 )\\nuniform float toneMappingExposure;\\nuniform float toneMappingWhitePoint;\\nvec3 LinearToneMapping( vec3 color ) {\\n return toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n color *= toneMappingExposure;\\n return saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\\nvec3 Uncharted2ToneMapping( vec3 color ) {\\n color *= toneMappingExposure;\\n return saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n color *= toneMappingExposure;\\n color = max( vec3( 0.0 ), color - 0.004 );\\n return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\n\";\n\n\tvar uv_pars_fragment = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n#endif\";\n\n\tvar uv_pars_vertex = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n\\tuniform vec4 offsetRepeat;\\n#endif\\n\";\n\n\tvar uv_vertex = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\\n#endif\";\n\n\tvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = uv2;\\n#endif\";\n\n\tvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\\n\\t#ifdef USE_SKINNING\\n\\t\\tvec4 worldPosition = modelMatrix * skinned;\\n\\t#else\\n\\t\\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\\n\\t#endif\\n#endif\\n\";\n\n\tvar cube_frag = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\\n\\tgl_FragColor.a *= opacity;\\n}\\n\";\n\n\tvar cube_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar depth_frag = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\\n\\t#endif\\n}\\n\";\n\n\tvar depth_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar distanceRGBA_frag = \"uniform vec3 lightPos;\\nvarying vec4 vWorldPosition;\\n#include \\n#include \\n#include \\nvoid main () {\\n\\t#include \\n\\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\\n}\\n\";\n\n\tvar distanceRGBA_vert = \"varying vec4 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvWorldPosition = worldPosition;\\n}\\n\";\n\n\tvar equirect_frag = \"uniform sampler2D tEquirect;\\nuniform float tFlip;\\nvarying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvec3 direction = normalize( vWorldPosition );\\n\\tvec2 sampleUV;\\n\\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\\n\\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n}\\n\";\n\n\tvar equirect_vert = \"varying vec3 vWorldPosition;\\n#include \\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar linedashed_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar linedashed_vert = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvLineDistance = scale * lineDistance;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight;\\n\\treflectedLight.directDiffuse = vec3( 0.0 );\\n\\treflectedLight.directSpecular = vec3( 0.0 );\\n\\treflectedLight.indirectDiffuse = diffuseColor.rgb;\\n\\treflectedLight.indirectSpecular = vec3( 0.0 );\\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshbasic_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_ENVMAP\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshlambert_frag = \"uniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\\n\\t#else\\n\\t\\treflectedLight.directDiffuse = vLightFront;\\n\\t#endif\\n\\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshlambert_vert = \"#define LAMBERT\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphong_frag = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphong_vert = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphysical_frag = \"#define PHYSICAL\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifndef STANDARD\\n\\tuniform float clearCoat;\\n\\tuniform float clearCoatRoughness;\\n#endif\\nuniform float envMapIntensity;\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar meshphysical_vert = \"#define PHYSICAL\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar normal_frag = \"uniform float opacity;\\nvarying vec3 vNormal;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( vNormal ), opacity );\\n\\t#include \\n}\\n\";\n\n\tvar normal_vert = \"varying vec3 vNormal;\\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvNormal = normalize( normalMatrix * normal );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar points_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar points_vert = \"uniform float size;\\nuniform float scale;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tgl_PointSize = size * ( scale / - mvPosition.z );\\n\\t#else\\n\\t\\tgl_PointSize = size;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar shadow_frag = \"uniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\\n}\\n\";\n\n\tvar shadow_vert = \"#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\\n\";\n\n\tvar ShaderChunk = {\n\t\talphamap_fragment: alphamap_fragment,\n\t\talphamap_pars_fragment: alphamap_pars_fragment,\n\t\talphatest_fragment: alphatest_fragment,\n\t\taomap_fragment: aomap_fragment,\n\t\taomap_pars_fragment: aomap_pars_fragment,\n\t\tbegin_vertex: begin_vertex,\n\t\tbeginnormal_vertex: beginnormal_vertex,\n\t\tbsdfs: bsdfs,\n\t\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\t\tclipping_planes_fragment: clipping_planes_fragment,\n\t\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\t\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\t\tclipping_planes_vertex: clipping_planes_vertex,\n\t\tcolor_fragment: color_fragment,\n\t\tcolor_pars_fragment: color_pars_fragment,\n\t\tcolor_pars_vertex: color_pars_vertex,\n\t\tcolor_vertex: color_vertex,\n\t\tcommon: common,\n\t\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\t\tdefaultnormal_vertex: defaultnormal_vertex,\n\t\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\t\tdisplacementmap_vertex: displacementmap_vertex,\n\t\temissivemap_fragment: emissivemap_fragment,\n\t\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\t\tencodings_fragment: encodings_fragment,\n\t\tencodings_pars_fragment: encodings_pars_fragment,\n\t\tenvmap_fragment: envmap_fragment,\n\t\tenvmap_pars_fragment: envmap_pars_fragment,\n\t\tenvmap_pars_vertex: envmap_pars_vertex,\n\t\tenvmap_vertex: envmap_vertex,\n\t\tfog_fragment: fog_fragment,\n\t\tfog_pars_fragment: fog_pars_fragment,\n\t\tlightmap_fragment: lightmap_fragment,\n\t\tlightmap_pars_fragment: lightmap_pars_fragment,\n\t\tlights_lambert_vertex: lights_lambert_vertex,\n\t\tlights_pars: lights_pars,\n\t\tlights_phong_fragment: lights_phong_fragment,\n\t\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\t\tlights_physical_fragment: lights_physical_fragment,\n\t\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\t\tlights_template: lights_template,\n\t\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\t\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\t\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\t\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\t\tmap_fragment: map_fragment,\n\t\tmap_pars_fragment: map_pars_fragment,\n\t\tmap_particle_fragment: map_particle_fragment,\n\t\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\t\tmetalnessmap_fragment: metalnessmap_fragment,\n\t\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\t\tmorphnormal_vertex: morphnormal_vertex,\n\t\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\t\tmorphtarget_vertex: morphtarget_vertex,\n\t\tnormal_flip: normal_flip,\n\t\tnormal_fragment: normal_fragment,\n\t\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\t\tpacking: packing,\n\t\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\t\tproject_vertex: project_vertex,\n\t\troughnessmap_fragment: roughnessmap_fragment,\n\t\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\t\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\t\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\t\tshadowmap_vertex: shadowmap_vertex,\n\t\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\t\tskinbase_vertex: skinbase_vertex,\n\t\tskinning_pars_vertex: skinning_pars_vertex,\n\t\tskinning_vertex: skinning_vertex,\n\t\tskinnormal_vertex: skinnormal_vertex,\n\t\tspecularmap_fragment: specularmap_fragment,\n\t\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\t\ttonemapping_fragment: tonemapping_fragment,\n\t\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\t\tuv_pars_fragment: uv_pars_fragment,\n\t\tuv_pars_vertex: uv_pars_vertex,\n\t\tuv_vertex: uv_vertex,\n\t\tuv2_pars_fragment: uv2_pars_fragment,\n\t\tuv2_pars_vertex: uv2_pars_vertex,\n\t\tuv2_vertex: uv2_vertex,\n\t\tworldpos_vertex: worldpos_vertex,\n\n\t\tcube_frag: cube_frag,\n\t\tcube_vert: cube_vert,\n\t\tdepth_frag: depth_frag,\n\t\tdepth_vert: depth_vert,\n\t\tdistanceRGBA_frag: distanceRGBA_frag,\n\t\tdistanceRGBA_vert: distanceRGBA_vert,\n\t\tequirect_frag: equirect_frag,\n\t\tequirect_vert: equirect_vert,\n\t\tlinedashed_frag: linedashed_frag,\n\t\tlinedashed_vert: linedashed_vert,\n\t\tmeshbasic_frag: meshbasic_frag,\n\t\tmeshbasic_vert: meshbasic_vert,\n\t\tmeshlambert_frag: meshlambert_frag,\n\t\tmeshlambert_vert: meshlambert_vert,\n\t\tmeshphong_frag: meshphong_frag,\n\t\tmeshphong_vert: meshphong_vert,\n\t\tmeshphysical_frag: meshphysical_frag,\n\t\tmeshphysical_vert: meshphysical_vert,\n\t\tnormal_frag: normal_frag,\n\t\tnormal_vert: normal_vert,\n\t\tpoints_frag: points_frag,\n\t\tpoints_vert: points_vert,\n\t\tshadow_frag: shadow_frag,\n\t\tshadow_vert: shadow_vert\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Color( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\t\t\treturn this.set( r );\n\n\t\t}\n\n\t\treturn this.setRGB( r, g, b );\n\n\t}\n\n\tColor.prototype = {\n\n\t\tconstructor: Color,\n\n\t\tisColor: true,\n\n\t\tr: 1, g: 1, b: 1,\n\n\t\tset: function ( value ) {\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\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.r = scalar;\n\t\t\tthis.g = scalar;\n\t\t\tthis.b = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHex: function ( hex ) {\n\n\t\t\thex = Math.floor( hex );\n\n\t\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetRGB: function ( r, g, b ) {\n\n\t\t\tthis.r = r;\n\t\t\tthis.g = g;\n\t\t\tthis.b = b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHSL: function () {\n\n\t\t\tfunction hue2rgb( p, q, t ) {\n\n\t\t\t\tif ( t < 0 ) t += 1;\n\t\t\t\tif ( t > 1 ) t -= 1;\n\t\t\t\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\t\t\t\tif ( t < 1 / 2 ) return q;\n\t\t\t\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\t\t\t\treturn p;\n\n\t\t\t}\n\n\t\t\treturn function setHSL( h, s, l ) {\n\n\t\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\t\t\th = _Math.euclideanModulo( h, 1 );\n\t\t\t\ts = _Math.clamp( s, 0, 1 );\n\t\t\t\tl = _Math.clamp( l, 0, 1 );\n\n\t\t\t\tif ( s === 0 ) {\n\n\t\t\t\t\tthis.r = this.g = this.b = l;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\t\t\tvar q = ( 2 * l ) - p;\n\n\t\t\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetStyle: function ( style ) {\n\n\t\t\tfunction handleAlpha( string ) {\n\n\t\t\t\tif ( string === undefined ) return;\n\n\t\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tvar m;\n\n\t\t\tif ( m = /^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t\t// rgb / hsl\n\n\t\t\t\tvar color;\n\t\t\t\tvar name = m[ 1 ];\n\t\t\t\tvar components = m[ 2 ];\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'rgb':\n\t\t\t\t\tcase 'rgba':\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'hsl':\n\t\t\t\t\tcase 'hsla':\n\n\t\t\t\t\t\tif ( color = /^([0-9]*\\.?[0-9]+)\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\t\tvar h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\t\tvar s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\t\tvar l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( m = /^\\#([A-Fa-f0-9]+)$/.exec( style ) ) {\n\n\t\t\t\t// hex color\n\n\t\t\t\tvar hex = m[ 1 ];\n\t\t\t\tvar size = hex.length;\n\n\t\t\t\tif ( size === 3 ) {\n\n\t\t\t\t\t// #ff0\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t\t// #ff0000\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( style && style.length > 0 ) {\n\n\t\t\t\t// color keywords\n\t\t\t\tvar hex = ColorKeywords[ style ];\n\n\t\t\t\tif ( hex !== undefined ) {\n\n\t\t\t\t\t// red\n\t\t\t\t\tthis.setHex( hex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// unknown color\n\t\t\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t\t},\n\n\t\tcopy: function ( color ) {\n\n\t\t\tthis.r = color.r;\n\t\t\tthis.g = color.g;\n\t\t\tthis.b = color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyGammaToLinear: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tthis.r = Math.pow( color.r, gammaFactor );\n\t\t\tthis.g = Math.pow( color.g, gammaFactor );\n\t\t\tthis.b = Math.pow( color.b, gammaFactor );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyLinearToGamma: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tvar safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;\n\n\t\t\tthis.r = Math.pow( color.r, safeInverse );\n\t\t\tthis.g = Math.pow( color.g, safeInverse );\n\t\t\tthis.b = Math.pow( color.b, safeInverse );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertGammaToLinear: function () {\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tthis.r = r * r;\n\t\t\tthis.g = g * g;\n\t\t\tthis.b = b * b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertLinearToGamma: function () {\n\n\t\t\tthis.r = Math.sqrt( this.r );\n\t\t\tthis.g = Math.sqrt( this.g );\n\t\t\tthis.b = Math.sqrt( this.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetHex: function () {\n\n\t\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t\t},\n\n\t\tgetHexString: function () {\n\n\t\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t\t},\n\n\t\tgetHSL: function ( optionalTarget ) {\n\n\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\t\tvar hsl = optionalTarget || { h: 0, s: 0, l: 0 };\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tvar max = Math.max( r, g, b );\n\t\t\tvar min = Math.min( r, g, b );\n\n\t\t\tvar hue, saturation;\n\t\t\tvar lightness = ( min + max ) / 2.0;\n\n\t\t\tif ( min === max ) {\n\n\t\t\t\thue = 0;\n\t\t\t\tsaturation = 0;\n\n\t\t\t} else {\n\n\t\t\t\tvar delta = max - min;\n\n\t\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\t\tswitch ( max ) {\n\n\t\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t\t}\n\n\t\t\t\thue /= 6;\n\n\t\t\t}\n\n\t\t\thsl.h = hue;\n\t\t\thsl.s = saturation;\n\t\t\thsl.l = lightness;\n\n\t\t\treturn hsl;\n\n\t\t},\n\n\t\tgetStyle: function () {\n\n\t\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t\t},\n\n\t\toffsetHSL: function ( h, s, l ) {\n\n\t\t\tvar hsl = this.getHSL();\n\n\t\t\thsl.h += h; hsl.s += s; hsl.l += l;\n\n\t\t\tthis.setHSL( hsl.h, hsl.s, hsl.l );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( color ) {\n\n\t\t\tthis.r += color.r;\n\t\t\tthis.g += color.g;\n\t\t\tthis.b += color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddColors: function ( color1, color2 ) {\n\n\t\t\tthis.r = color1.r + color2.r;\n\t\t\tthis.g = color1.g + color2.g;\n\t\t\tthis.b = color1.b + color2.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.r += s;\n\t\t\tthis.g += s;\n\t\t\tthis.b += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function( color ) {\n\n\t\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( color ) {\n\n\t\t\tthis.r *= color.r;\n\t\t\tthis.g *= color.g;\n\t\t\tthis.b *= color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tthis.r *= s;\n\t\t\tthis.g *= s;\n\t\t\tthis.b *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerp: function ( color, alpha ) {\n\n\t\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( c ) {\n\n\t\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.r = array[ offset ];\n\t\t\tthis.g = array[ offset + 1 ];\n\t\t\tthis.b = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.r;\n\t\t\tarray[ offset + 1 ] = this.g;\n\t\t\tarray[ offset + 2 ] = this.b;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\treturn this.getHex();\n\n\t\t}\n\n\t};\n\n\tvar 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, '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\n\t/**\n\t * Uniforms library for shared webgl shaders\n\t */\n\n\tvar UniformsLib = {\n\n\t\tcommon: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) },\n\n\t\t\tspecularMap: { value: null },\n\t\t\talphaMap: { value: null },\n\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: - 1 },\n\t\t\treflectivity: { value: 1.0 },\n\t\t\trefractionRatio: { value: 0.98 }\n\n\t\t},\n\n\t\taomap: {\n\n\t\t\taoMap: { value: null },\n\t\t\taoMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\tlightmap: {\n\n\t\t\tlightMap: { value: null },\n\t\t\tlightMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\temissivemap: {\n\n\t\t\temissiveMap: { value: null }\n\n\t\t},\n\n\t\tbumpmap: {\n\n\t\t\tbumpMap: { value: null },\n\t\t\tbumpScale: { value: 1 }\n\n\t\t},\n\n\t\tnormalmap: {\n\n\t\t\tnormalMap: { value: null },\n\t\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t\t},\n\n\t\tdisplacementmap: {\n\n\t\t\tdisplacementMap: { value: null },\n\t\t\tdisplacementScale: { value: 1 },\n\t\t\tdisplacementBias: { value: 0 }\n\n\t\t},\n\n\t\troughnessmap: {\n\n\t\t\troughnessMap: { value: null }\n\n\t\t},\n\n\t\tmetalnessmap: {\n\n\t\t\tmetalnessMap: { value: null }\n\n\t\t},\n\n\t\tfog: {\n\n\t\t\tfogDensity: { value: 0.00025 },\n\t\t\tfogNear: { value: 1 },\n\t\t\tfogFar: { value: 2000 },\n\t\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t\t},\n\n\t\tlights: {\n\n\t\t\tambientLightColor: { value: [] },\n\n\t\t\tdirectionalLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tcolor: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tdirectionalShadowMap: { value: [] },\n\t\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\t\tspotLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdirection: {},\n\t\t\t\tdistance: {},\n\t\t\t\tconeCos: {},\n\t\t\t\tpenumbraCos: {},\n\t\t\t\tdecay: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tspotShadowMap: { value: [] },\n\t\t\tspotShadowMatrix: { value: [] },\n\n\t\t\tpointLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdecay: {},\n\t\t\t\tdistance: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tpointShadowMap: { value: [] },\n\t\t\tpointShadowMatrix: { value: [] },\n\n\t\t\themisphereLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tskyColor: {},\n\t\t\t\tgroundColor: {}\n\t\t\t} }\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\t\t\tsize: { value: 1.0 },\n\t\t\tscale: { value: 1.0 },\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) }\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t */\n\n\tvar ShaderLib = {\n\n\t\tbasic: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.fog\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t\t},\n\n\t\tlambert: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\n\t\t\t\t{\n\t\t\t\t\temissive : { value: new Color( 0x000000 ) }\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t\t},\n\n\t\tphong: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\n\t\t\t\t{\n\t\t\t\t\temissive : { value: new Color( 0x000000 ) },\n\t\t\t\t\tspecular : { value: new Color( 0x111111 ) },\n\t\t\t\t\tshininess: { value: 30 }\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t\t},\n\n\t\tstandard: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.roughnessmap,\n\t\t\t\tUniformsLib.metalnessmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\n\t\t\t\t{\n\t\t\t\t\temissive : { value: new Color( 0x000000 ) },\n\t\t\t\t\troughness: { value: 0.5 },\n\t\t\t\t\tmetalness: { value: 0 },\n\t\t\t\t\tenvMapIntensity : { value: 1 }, // temporary\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.points,\n\t\t\t\tUniformsLib.fog\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.points_vert,\n\t\t\tfragmentShader: ShaderChunk.points_frag\n\n\t\t},\n\n\t\tdashed: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.fog,\n\n\t\t\t\t{\n\t\t\t\t\tscale : { value: 1 },\n\t\t\t\t\tdashSize : { value: 1 },\n\t\t\t\t\ttotalSize: { value: 2 }\n\t\t\t\t}\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t\t},\n\n\t\tdepth: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.displacementmap\n\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.depth_vert,\n\t\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t\t},\n\n\t\tnormal: {\n\n\t\t\tuniforms: {\n\n\t\t\t\topacity : { value: 1.0 }\n\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.normal_vert,\n\t\t\tfragmentShader: ShaderChunk.normal_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tcube: {\n\n\t\t\tuniforms: {\n\t\t\t\ttCube: { value: null },\n\t\t\t\ttFlip: { value: - 1 },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.cube_vert,\n\t\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tequirect: {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t\ttFlip: { value: - 1 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t\t},\n\n\t\tdistanceRGBA: {\n\n\t\t\tuniforms: {\n\n\t\t\t\tlightPos: { value: new Vector3() }\n\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t\t}\n\n\t};\n\n\tShaderLib.physical = {\n\n\t\tuniforms: UniformsUtils.merge( [\n\n\t\t\tShaderLib.standard.uniforms,\n\n\t\t\t{\n\t\t\t\tclearCoat: { value: 0 },\n\t\t\t\tclearCoatRoughness: { value: 0 }\n\t\t\t}\n\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Box2( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );\n\n\t}\n\n\tBox2.prototype = {\n\n\t\tconstructor: Box2,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = + Infinity;\n\t\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\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\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tif ( point.x < this.min.x || point.x > this.max.x ||\n\t\t\t point.y < this.min.y || point.y > this.max.y ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\tif ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) &&\n\t\t\t ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\n\t\t\tif ( box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t box.max.y < this.min.y || box.min.y > this.max.y ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlarePlugin( renderer, flares ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar shader, program, attributes, uniforms;\n\n\t\tvar tempTexture, occlusionTexture;\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 1, - 1, 0, 0,\n\t\t\t\t 1, - 1, 1, 0,\n\t\t\t\t 1, 1, 1, 1,\n\t\t\t\t- 1, 1, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\t// buffers\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\t// textures\n\n\t\t\ttempTexture = gl.createTexture();\n\t\t\tocclusionTexture = gl.createTexture();\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tshader = {\n\n\t\t\t\tvertexShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform vec3 screenPosition;\",\n\t\t\t\t\t\"uniform vec2 scale;\",\n\t\t\t\t\t\"uniform float rotation;\",\n\n\t\t\t\t\t\"uniform sampler2D occlusionMap;\",\n\n\t\t\t\t\t\"attribute vec2 position;\",\n\t\t\t\t\t\"attribute vec2 uv;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t\"vUV = uv;\",\n\n\t\t\t\t\t\t\"vec2 pos = position;\",\n\n\t\t\t\t\t\t\"if ( renderType == 2 ) {\",\n\n\t\t\t\t\t\t\t\"vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\",\n\n\t\t\t\t\t\t\t\"vVisibility = visibility.r / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.g / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= visibility.b / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.a / 9.0;\",\n\n\t\t\t\t\t\t\t\"pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\",\n\t\t\t\t\t\t\t\"pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\t\"gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" ),\n\n\t\t\t\tfragmentShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform sampler2D map;\",\n\t\t\t\t\t\"uniform float opacity;\",\n\t\t\t\t\t\"uniform vec3 color;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t// pink square\n\n\t\t\t\t\t\t\"if ( renderType == 0 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\",\n\n\t\t\t\t\t\t// restore\n\n\t\t\t\t\t\t\"} else if ( renderType == 1 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = texture2D( map, vUV );\",\n\n\t\t\t\t\t\t// flare\n\n\t\t\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\t\t\"vec4 texture = texture2D( map, vUV );\",\n\t\t\t\t\t\t\t\"texture.a *= opacity * vVisibility;\",\n\t\t\t\t\t\t\t\"gl_FragColor = texture;\",\n\t\t\t\t\t\t\t\"gl_FragColor.rgb *= color;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" )\n\n\t\t\t};\n\n\t\t\tprogram = createProgram( shader );\n\n\t\t\tattributes = {\n\t\t\t\tvertex: gl.getAttribLocation ( program, \"position\" ),\n\t\t\t\tuv: gl.getAttribLocation ( program, \"uv\" )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\trenderType: gl.getUniformLocation( program, \"renderType\" ),\n\t\t\t\tmap: gl.getUniformLocation( program, \"map\" ),\n\t\t\t\tocclusionMap: gl.getUniformLocation( program, \"occlusionMap\" ),\n\t\t\t\topacity: gl.getUniformLocation( program, \"opacity\" ),\n\t\t\t\tcolor: gl.getUniformLocation( program, \"color\" ),\n\t\t\t\tscale: gl.getUniformLocation( program, \"scale\" ),\n\t\t\t\trotation: gl.getUniformLocation( program, \"rotation\" ),\n\t\t\t\tscreenPosition: gl.getUniformLocation( program, \"screenPosition\" )\n\t\t\t};\n\n\t\t}\n\n\t\t/*\n\t\t * Render lens flares\n\t\t * Method: renders 16x16 0xff00ff-colored points scattered over the light source area,\n\t\t * reads these back and calculates occlusion.\n\t\t */\n\n\t\tthis.render = function ( scene, camera, viewport ) {\n\n\t\t\tif ( flares.length === 0 ) return;\n\n\t\t\tvar tempPosition = new Vector3();\n\n\t\t\tvar invAspect = viewport.w / viewport.z,\n\t\t\t\thalfViewportWidth = viewport.z * 0.5,\n\t\t\t\thalfViewportHeight = viewport.w * 0.5;\n\n\t\t\tvar size = 16 / viewport.w,\n\t\t\t\tscale = new Vector2( size * invAspect, size );\n\n\t\t\tvar screenPosition = new Vector3( 1, 1, 0 ),\n\t\t\t\tscreenPositionPixels = new Vector2( 1, 1 );\n\n\t\t\tvar validArea = new Box2();\n\n\t\t\tvalidArea.min.set( viewport.x, viewport.y );\n\t\t\tvalidArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) );\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.vertex );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t// loop through all lens flares to update their occlusion and positions\n\t\t\t// setup gl and common used attribs/uniforms\n\n\t\t\tgl.uniform1i( uniforms.occlusionMap, 0 );\n\t\t\tgl.uniform1i( uniforms.map, 1 );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.setDepthWrite( false );\n\n\t\t\tfor ( var i = 0, l = flares.length; i < l; i ++ ) {\n\n\t\t\t\tsize = 16 / viewport.w;\n\t\t\t\tscale.set( size * invAspect, size );\n\n\t\t\t\t// calc object screen position\n\n\t\t\t\tvar flare = flares[ i ];\n\n\t\t\t\ttempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] );\n\n\t\t\t\ttempPosition.applyMatrix4( camera.matrixWorldInverse );\n\t\t\t\ttempPosition.applyProjection( camera.projectionMatrix );\n\n\t\t\t\t// setup arrays for gl programs\n\n\t\t\t\tscreenPosition.copy( tempPosition );\n\n\t\t\t\t// horizontal and vertical coordinate of the lower left corner of the pixels to copy\n\n\t\t\t\tscreenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8;\n\t\t\t\tscreenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8;\n\n\t\t\t\t// screen cull\n\n\t\t\t\tif ( validArea.containsPoint( screenPositionPixels ) === true ) {\n\n\t\t\t\t\t// save current RGB to temp texture\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, null );\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// render pink quad\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\n\t\t\t\t\tstate.disable( gl.BLEND );\n\t\t\t\t\tstate.enable( gl.DEPTH_TEST );\n\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// copy result to occlusionMap\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// restore graphics\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 1 );\n\t\t\t\t\tstate.disable( gl.DEPTH_TEST );\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// update object positions\n\n\t\t\t\t\tflare.positionScreen.copy( screenPosition );\n\n\t\t\t\t\tif ( flare.customUpdateCallback ) {\n\n\t\t\t\t\t\tflare.customUpdateCallback( flare );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tflare.updateLensFlares();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// render flares\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 2 );\n\t\t\t\t\tstate.enable( gl.BLEND );\n\n\t\t\t\t\tfor ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar sprite = flare.lensFlares[ j ];\n\n\t\t\t\t\t\tif ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) {\n\n\t\t\t\t\t\t\tscreenPosition.x = sprite.x;\n\t\t\t\t\t\t\tscreenPosition.y = sprite.y;\n\t\t\t\t\t\t\tscreenPosition.z = sprite.z;\n\n\t\t\t\t\t\t\tsize = sprite.size * sprite.scale / viewport.w;\n\n\t\t\t\t\t\t\tscale.x = size * invAspect;\n\t\t\t\t\t\t\tscale.y = size;\n\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\t\t\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.rotation, sprite.rotation );\n\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.opacity, sprite.opacity );\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b );\n\n\t\t\t\t\t\t\tstate.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst );\n\t\t\t\t\t\t\trenderer.setTexture2D( sprite.texture, 1 );\n\n\t\t\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\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// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.DEPTH_TEST );\n\t\t\tstate.setDepthWrite( true );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram( shader ) {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\n\t\t\tvar prefix = \"precision \" + renderer.getPrecision() + \" float;\\n\";\n\n\t\t\tgl.shaderSource( fragmentShader, prefix + shader.fragmentShader );\n\t\t\tgl.shaderSource( vertexShader, prefix + shader.vertexShader );\n\n\t\t\tgl.compileShader( fragmentShader );\n\t\t\tgl.compileShader( vertexShader );\n\n\t\t\tgl.attachShader( program, fragmentShader );\n\t\t\tgl.attachShader( program, vertexShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpritePlugin( renderer, sprites ) {\n\n\t\tvar gl = renderer.context;\n\t\tvar state = renderer.state;\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar program, attributes, uniforms;\n\n\t\tvar texture;\n\n\t\t// decompose matrixWorld\n\n\t\tvar spritePosition = new Vector3();\n\t\tvar spriteRotation = new Quaternion();\n\t\tvar spriteScale = new Vector3();\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 0.5, - 0.5, 0, 0,\n\t\t\t\t 0.5, - 0.5, 1, 0,\n\t\t\t\t 0.5, 0.5, 1, 1,\n\t\t\t\t- 0.5, 0.5, 0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\tvertexBuffer = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\tprogram = createProgram();\n\n\t\t\tattributes = {\n\t\t\t\tposition:\t\t\tgl.getAttribLocation ( program, 'position' ),\n\t\t\t\tuv:\t\t\t\t\tgl.getAttribLocation ( program, 'uv' )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\tuvOffset:\t\t\tgl.getUniformLocation( program, 'uvOffset' ),\n\t\t\t\tuvScale:\t\t\tgl.getUniformLocation( program, 'uvScale' ),\n\n\t\t\t\trotation:\t\t\tgl.getUniformLocation( program, 'rotation' ),\n\t\t\t\tscale:\t\t\t\tgl.getUniformLocation( program, 'scale' ),\n\n\t\t\t\tcolor:\t\t\t\tgl.getUniformLocation( program, 'color' ),\n\t\t\t\tmap:\t\t\t\tgl.getUniformLocation( program, 'map' ),\n\t\t\t\topacity:\t\t\tgl.getUniformLocation( program, 'opacity' ),\n\n\t\t\t\tmodelViewMatrix: \tgl.getUniformLocation( program, 'modelViewMatrix' ),\n\t\t\t\tprojectionMatrix:\tgl.getUniformLocation( program, 'projectionMatrix' ),\n\n\t\t\t\tfogType:\t\t\tgl.getUniformLocation( program, 'fogType' ),\n\t\t\t\tfogDensity:\t\t\tgl.getUniformLocation( program, 'fogDensity' ),\n\t\t\t\tfogNear:\t\t\tgl.getUniformLocation( program, 'fogNear' ),\n\t\t\t\tfogFar:\t\t\t\tgl.getUniformLocation( program, 'fogFar' ),\n\t\t\t\tfogColor:\t\t\tgl.getUniformLocation( program, 'fogColor' ),\n\n\t\t\t\talphaTest:\t\t\tgl.getUniformLocation( program, 'alphaTest' )\n\t\t\t};\n\n\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\tcanvas.width = 8;\n\t\t\tcanvas.height = 8;\n\n\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\tcontext.fillStyle = 'white';\n\t\t\tcontext.fillRect( 0, 0, 8, 8 );\n\n\t\t\ttexture = new Texture( canvas );\n\t\t\ttexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( sprites.length === 0 ) return;\n\n\t\t\t// setup gl\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.position );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.BLEND );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tgl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );\n\n\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\tgl.uniform1i( uniforms.map, 0 );\n\n\t\t\tvar oldFogType = 0;\n\t\t\tvar sceneFogType = 0;\n\t\t\tvar fog = scene.fog;\n\n\t\t\tif ( fog ) {\n\n\t\t\t\tgl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );\n\n\t\t\t\tif ( (fog && fog.isFog) ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogNear, fog.near );\n\t\t\t\t\tgl.uniform1f( uniforms.fogFar, fog.far );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 1 );\n\t\t\t\t\toldFogType = 1;\n\t\t\t\t\tsceneFogType = 1;\n\n\t\t\t\t} else if ( (fog && fog.isFogExp2) ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogDensity, fog.density );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 2 );\n\t\t\t\t\toldFogType = 2;\n\t\t\t\t\tsceneFogType = 2;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tgl.uniform1i( uniforms.fogType, 0 );\n\t\t\t\toldFogType = 0;\n\t\t\t\tsceneFogType = 0;\n\n\t\t\t}\n\n\n\t\t\t// update positions and sort\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\n\t\t\t\tsprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld );\n\t\t\t\tsprite.z = - sprite.modelViewMatrix.elements[ 14 ];\n\n\t\t\t}\n\n\t\t\tsprites.sort( painterSortStable );\n\n\t\t\t// render all sprites\n\n\t\t\tvar scale = [];\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\t\t\t\tvar material = sprite.material;\n\n\t\t\t\tif ( material.visible === false ) continue;\n\n\t\t\t\tgl.uniform1f( uniforms.alphaTest, material.alphaTest );\n\t\t\t\tgl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements );\n\n\t\t\t\tsprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale );\n\n\t\t\t\tscale[ 0 ] = spriteScale.x;\n\t\t\t\tscale[ 1 ] = spriteScale.y;\n\n\t\t\t\tvar fogType = 0;\n\n\t\t\t\tif ( scene.fog && material.fog ) {\n\n\t\t\t\t\tfogType = sceneFogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( oldFogType !== fogType ) {\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, fogType );\n\t\t\t\t\toldFogType = fogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.map !== null ) {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, 0, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, 1, 1 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.uniform1f( uniforms.opacity, material.opacity );\n\t\t\t\tgl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );\n\n\t\t\t\tgl.uniform1f( uniforms.rotation, material.rotation );\n\t\t\t\tgl.uniform2fv( uniforms.scale, scale );\n\n\t\t\t\tstate.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );\n\t\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\t\tstate.setDepthWrite( material.depthWrite );\n\n\t\t\t\tif ( material.map ) {\n\n\t\t\t\t\trenderer.setTexture2D( material.map, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setTexture2D( texture, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\n\t\t\trenderer.resetGLState();\n\n\t\t};\n\n\t\tfunction createProgram() {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\n\t\t\tgl.shaderSource( vertexShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform float rotation;',\n\t\t\t\t'uniform vec2 scale;',\n\t\t\t\t'uniform vec2 uvOffset;',\n\t\t\t\t'uniform vec2 uvScale;',\n\n\t\t\t\t'attribute vec2 position;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vUV = uvOffset + uv * uvScale;',\n\n\t\t\t\t\t'vec2 alignedPosition = position * scale;',\n\n\t\t\t\t\t'vec2 rotatedPosition;',\n\t\t\t\t\t'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',\n\t\t\t\t\t'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',\n\n\t\t\t\t\t'vec4 finalPosition;',\n\n\t\t\t\t\t'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',\n\t\t\t\t\t'finalPosition.xy += rotatedPosition;',\n\t\t\t\t\t'finalPosition = projectionMatrix * finalPosition;',\n\n\t\t\t\t\t'gl_Position = finalPosition;',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.shaderSource( fragmentShader, [\n\n\t\t\t\t'precision ' + renderer.getPrecision() + ' float;',\n\n\t\t\t\t'uniform vec3 color;',\n\t\t\t\t'uniform sampler2D map;',\n\t\t\t\t'uniform float opacity;',\n\n\t\t\t\t'uniform int fogType;',\n\t\t\t\t'uniform vec3 fogColor;',\n\t\t\t\t'uniform float fogDensity;',\n\t\t\t\t'uniform float fogNear;',\n\t\t\t\t'uniform float fogFar;',\n\t\t\t\t'uniform float alphaTest;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vec4 texture = texture2D( map, vUV );',\n\n\t\t\t\t\t'if ( texture.a < alphaTest ) discard;',\n\n\t\t\t\t\t'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',\n\n\t\t\t\t\t'if ( fogType > 0 ) {',\n\n\t\t\t\t\t\t'float depth = gl_FragCoord.z / gl_FragCoord.w;',\n\t\t\t\t\t\t'float fogFactor = 0.0;',\n\n\t\t\t\t\t\t'if ( fogType == 1 ) {',\n\n\t\t\t\t\t\t\t'fogFactor = smoothstep( fogNear, fogFar, depth );',\n\n\t\t\t\t\t\t'} else {',\n\n\t\t\t\t\t\t\t'const float LOG2 = 1.442695;',\n\t\t\t\t\t\t\t'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );',\n\t\t\t\t\t\t\t'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',\n\n\t\t\t\t\t\t'}',\n\n\t\t\t\t\t\t'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );',\n\n\t\t\t\t\t'}',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.compileShader( vertexShader );\n\t\t\tgl.compileShader( fragmentShader );\n\n\t\t\tgl.attachShader( program, vertexShader );\n\t\t\tgl.attachShader( program, fragmentShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\t\treturn a.renderOrder - b.renderOrder;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn b.id - a.id;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Material() {\n\n\t\tObject.defineProperty( this, 'id', { value: MaterialIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.fog = true;\n\t\tthis.lights = true;\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading\n\t\tthis.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = 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\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\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.alphaTest = 0;\n\t\tthis.premultipliedAlpha = false;\n\n\t\tthis.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer\n\n\t\tthis.visible = true;\n\n\t\tthis._needsUpdate = true;\n\n\t}\n\n\tMaterial.prototype = {\n\n\t\tconstructor: Material,\n\n\t\tisMaterial: true,\n\n\t\tget needsUpdate() {\n\n\t\t\treturn this._needsUpdate;\n\n\t\t},\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.update();\n\t\t\tthis._needsUpdate = value;\n\n\t\t},\n\n\t\tsetValues: function ( values ) {\n\n\t\t\tif ( values === undefined ) return;\n\n\t\t\tfor ( var key in values ) {\n\n\t\t\t\tvar newValue = values[ key ];\n\n\t\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.Material: '\" + key + \"' parameter is undefined.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar currentValue = this[ key ];\n\n\t\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.\" + this.type + \": '\" + key + \"' is not a property of this material.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tif ( (currentValue && currentValue.isColor) ) {\n\n\t\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t\t} else if ( (currentValue && currentValue.isVector3) && (newValue && newValue.isVector3) ) {\n\n\t\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t\t} else if ( key === 'overdraw' ) {\n\n\t\t\t\t\t// ensure overdraw is backwards-compatible with legacy boolean type\n\t\t\t\t\tthis[ key ] = Number( newValue );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar isRoot = meta === undefined;\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tmeta = {\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Material',\n\t\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Material serialization\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( (this.color && this.color.isColor) ) data.color = this.color.getHex();\n\n\t\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\t\tif ( (this.emissive && this.emissive.isColor) ) data.emissive = this.emissive.getHex();\n\t\t\tif ( (this.specular && this.specular.isColor) ) data.specular = this.specular.getHex();\n\t\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\n\t\t\tif ( (this.map && this.map.isTexture) ) data.map = this.map.toJSON( meta ).uuid;\n\t\t\tif ( (this.alphaMap && this.alphaMap.isTexture) ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.lightMap && this.lightMap.isTexture) ) data.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.bumpMap && this.bumpMap.isTexture) ) {\n\n\t\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t\t}\n\t\t\tif ( (this.normalMap && this.normalMap.isTexture) ) {\n\n\t\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t\t}\n\t\t\tif ( (this.displacementMap && this.displacementMap.isTexture) ) {\n\n\t\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t\t}\n\t\t\tif ( (this.roughnessMap && this.roughnessMap.isTexture) ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.metalnessMap && this.metalnessMap.isTexture) ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\t\tif ( (this.emissiveMap && this.emissiveMap.isTexture) ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\t\tif ( (this.specularMap && this.specularMap.isTexture) ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\n\t\t\tif ( (this.envMap && this.envMap.isTexture) ) {\n\n\t\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\t\t\t\tdata.reflectivity = this.reflectivity; // Scale behind envMap\n\n\t\t\t}\n\n\t\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\t\tif ( this.shading !== SmoothShading ) data.shading = this.shading;\n\t\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\t\tif ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors;\n\n\t\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\t\tdata.depthFunc = this.depthFunc;\n\t\t\tdata.depthTest = this.depthTest;\n\t\t\tdata.depthWrite = this.depthWrite;\n\n\t\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\t\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\t\tdata.skinning = this.skinning;\n\t\t\tdata.morphTargets = this.morphTargets;\n\n\t\t\t// TODO: Copied from Object3D.toJSON\n\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.fog = source.fog;\n\t\t\tthis.lights = source.lights;\n\n\t\t\tthis.blending = source.blending;\n\t\t\tthis.side = source.side;\n\t\t\tthis.shading = source.shading;\n\t\t\tthis.vertexColors = source.vertexColors;\n\n\t\t\tthis.opacity = source.opacity;\n\t\t\tthis.transparent = source.transparent;\n\n\t\t\tthis.blendSrc = source.blendSrc;\n\t\t\tthis.blendDst = source.blendDst;\n\t\t\tthis.blendEquation = source.blendEquation;\n\t\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\t\tthis.depthFunc = source.depthFunc;\n\t\t\tthis.depthTest = source.depthTest;\n\t\t\tthis.depthWrite = source.depthWrite;\n\n\t\t\tthis.colorWrite = source.colorWrite;\n\n\t\t\tthis.precision = source.precision;\n\n\t\t\tthis.polygonOffset = source.polygonOffset;\n\t\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\t\tthis.alphaTest = source.alphaTest;\n\n\t\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\t\tthis.overdraw = source.overdraw;\n\n\t\t\tthis.visible = source.visible;\n\t\t\tthis.clipShadows = source.clipShadows;\n\t\t\tthis.clipIntersection = source.clipIntersection;\n\n\t\t\tvar srcPlanes = source.clippingPlanes,\n\t\t\t\tdstPlanes = null;\n\n\t\t\tif ( srcPlanes !== null ) {\n\n\t\t\t\tvar n = srcPlanes.length;\n\t\t\t\tdstPlanes = new Array( n );\n\n\t\t\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t\tthis.clippingPlanes = dstPlanes;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdate: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'update' } );\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t};\n\n\tObject.assign( Material.prototype, EventDispatcher.prototype );\n\n\tvar count$1 = 0;\n\tfunction MaterialIdCount() { return count$1++; }\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * defines: { \"label\" : \"value\" },\n\t * uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n\t *\n\t * fragmentShader: ,\n\t * vertexShader: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * lights: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction ShaderMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\n\t\tthis.vertexShader = 'void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}';\n\t\tthis.fragmentShader = 'void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}';\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.skinning = false; // set to use skinning attribute streams\n\t\tthis.morphTargets = false; // set to use morph targets\n\t\tthis.morphNormals = false; // set to use morph normals\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'uv2': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tShaderMaterial.prototype = Object.create( Material.prototype );\n\tShaderMaterial.prototype.constructor = ShaderMaterial;\n\n\tShaderMaterial.prototype.isShaderMaterial = true;\n\n\tShaderMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = UniformsUtils.clone( source.uniforms );\n\n\t\tthis.defines = source.defines;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.skinning = source.skinning;\n\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\tthis.extensions = source.extensions;\n\n\t\treturn this;\n\n\t};\n\n\tShaderMaterial.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Material.prototype.toJSON.call( this, meta );\n\n\t\tdata.uniforms = this.uniforms;\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / https://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t *\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t * }\n\t */\n\n\tfunction MeshDepthMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\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.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshDepthMaterial.prototype = Object.create( Material.prototype );\n\tMeshDepthMaterial.prototype.constructor = MeshDepthMaterial;\n\n\tMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\n\tMeshDepthMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\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\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Box3( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );\n\n\t}\n\n\tBox3.prototype = {\n\n\t\tconstructor: Box3,\n\n\t\tisBox3: true,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromArray: function ( array ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tvar x = array[ i ];\n\t\t\t\tvar y = array[ i + 1 ];\n\t\t\t\tvar z = array[ i + 2 ];\n\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\t\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromObject: function () {\n\n\t\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t\t// accounting for both the object's, and children's, world transforms\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function setFromObject( object ) {\n\n\t\t\t\tvar scope = this;\n\n\t\t\t\tobject.updateMatrixWorld( true );\n\n\t\t\t\tthis.makeEmpty();\n\n\t\t\t\tobject.traverse( function ( node ) {\n\n\t\t\t\t\tvar geometry = node.geometry;\n\n\t\t\t\t\tif ( geometry !== undefined ) {\n\n\t\t\t\t\t\tif ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\tv1.copy( vertices[ i ] );\n\t\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\t\t\tvar attribute = geometry.attributes.position;\n\n\t\t\t\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\t\t\t\tvar array, offset, stride;\n\n\t\t\t\t\t\t\t\tif ( (attribute && attribute.isInterleavedBufferAttribute) ) {\n\n\t\t\t\t\t\t\t\t\tarray = attribute.data.array;\n\t\t\t\t\t\t\t\t\toffset = attribute.offset;\n\t\t\t\t\t\t\t\t\tstride = attribute.data.stride;\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tarray = attribute.array;\n\t\t\t\t\t\t\t\t\toffset = 0;\n\t\t\t\t\t\t\t\t\tstride = 3;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tfor ( var i = offset, il = array.length; i < il; i += stride ) {\n\n\t\t\t\t\t\t\t\t\tv1.fromArray( array, i );\n\t\t\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\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} );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\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\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tif ( point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\t\t point.y < this.min.y || point.y > this.max.y ||\n\t\t\t\t\t point.z < this.min.z || point.z > this.max.z ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\tif ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) &&\n\t\t\t\t ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) &&\n\t\t\t\t ( this.min.z <= box.min.z ) && ( box.max.z <= this.max.z ) ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\n\t\t\tif ( box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\t\t box.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\t\t\t box.max.z < this.min.z || box.min.z > this.max.z ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tintersectsSphere: ( function () {\n\n\t\t\tvar closestPoint;\n\n\t\t\treturn function intersectsSphere( sphere ) {\n\n\t\t\t\tif ( closestPoint === undefined ) closestPoint = new Vector3();\n\n\t\t\t\t// Find the point on the AABB closest to the sphere center.\n\t\t\t\tthis.clampPoint( sphere.center, closestPoint );\n\n\t\t\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\t\t\treturn closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\t\tvar min, max;\n\n\t\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t\t} else {\n\n\t\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t\t}\n\n\t\t\treturn ( min <= plane.constant && max >= plane.constant );\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetBoundingSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function getBoundingSphere( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Sphere();\n\n\t\t\t\tthis.getCenter( result.center );\n\n\t\t\t\tresult.radius = this.getSize( v1 ).length() * 0.5;\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\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\t\tif( this.isEmpty() ) this.makeEmpty();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar points = [\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3()\n\t\t\t];\n\n\t\t\treturn function applyMatrix4( matrix ) {\n\n\t\t\t\t// transform of empty box is an empty box.\n\t\t\t\tif( this.isEmpty() ) return this;\n\n\t\t\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t\t\tpoints[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t\t\tpoints[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t\t\tpoints[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t\t\tpoints[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t\t\tpoints[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t\t\tpoints[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t\t\tpoints[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t\t\tpoints[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix );\t// 111\n\n\t\t\t\tthis.setFromPoints( points );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Sphere( center, radius ) {\n\n\t\tthis.center = ( center !== undefined ) ? center : new Vector3();\n\t\tthis.radius = ( radius !== undefined ) ? radius : 0;\n\n\t}\n\n\tSphere.prototype = {\n\n\t\tconstructor: Sphere,\n\n\t\tset: function ( center, radius ) {\n\n\t\t\tthis.center.copy( center );\n\t\t\tthis.radius = radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function () {\n\n\t\t\tvar box = new Box3();\n\n\t\t\treturn function setFromPoints( points, optionalCenter ) {\n\n\t\t\t\tvar center = this.center;\n\n\t\t\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\t\t\tcenter.copy( optionalCenter );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbox.setFromPoints( points ).getCenter( center );\n\n\t\t\t\t}\n\n\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( sphere ) {\n\n\t\t\tthis.center.copy( sphere.center );\n\t\t\tthis.radius = sphere.radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tempty: function () {\n\n\t\t\treturn ( this.radius <= 0 );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar radiusSum = this.radius + sphere.radius;\n\n\t\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsSphere( this );\n\n\t\t},\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We use the following equation to compute the signed distance from\n\t\t\t// the center of the sphere to the plane.\n\t\t\t//\n\t\t\t// distance = q * n - d\n\t\t\t//\n\t\t\t// If this distance is greater than the radius of the sphere,\n\t\t\t// then there is no intersection.\n\n\t\t\treturn Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.copy( point );\n\n\t\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t\tresult.sub( this.center ).normalize();\n\t\t\t\tresult.multiplyScalar( this.radius ).add( this.center );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\tgetBoundingBox: function ( optionalTarget ) {\n\n\t\t\tvar box = optionalTarget || new Box3();\n\n\t\t\tbox.set( this.center, this.center );\n\t\t\tbox.expandByScalar( this.radius );\n\n\t\t\treturn box;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.center.applyMatrix4( matrix );\n\t\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.center.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( sphere ) {\n\n\t\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t * @author tschw\n\t */\n\n\tfunction Matrix3() {\n\n\t\tthis.elements = new Float32Array( [\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 ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tMatrix3.prototype = {\n\n\t\tconstructor: Matrix3,\n\n\t\tisMatrix3: true,\n\n\t\tset: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0,\n\t\t\t\t0, 1, 0,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 3 ], me[ 6 ],\n\t\t\t\tme[ 1 ], me[ 4 ], me[ 7 ],\n\t\t\t\tme[ 2 ], me[ 5 ], me[ 8 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix4: function( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToVector3Array: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToVector3Array( array, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = array.length;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i += 3, j += 3 ) {\n\n\t\t\t\t\tv1.fromArray( array, j );\n\t\t\t\t\tv1.applyMatrix3( this );\n\t\t\t\t\tv1.toArray( array, j );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyToBuffer: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function applyToBuffer( buffer, offset, length ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tif ( offset === undefined ) offset = 0;\n\t\t\t\tif ( length === undefined ) length = buffer.length / buffer.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = offset; i < length; i ++, j ++ ) {\n\n\t\t\t\t\tv1.x = buffer.getX( j );\n\t\t\t\t\tv1.y = buffer.getY( j );\n\t\t\t\t\tv1.z = buffer.getZ( j );\n\n\t\t\t\t\tv1.applyMatrix3( this );\n\n\t\t\t\t\tbuffer.setXYZ( j, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn buffer;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t\t},\n\n\t\tgetInverse: function ( matrix, throwOnDegenerate ) {\n\n\t\t\tif ( (matrix && matrix.isMatrix4) ) {\n\n\t\t\t\tconsole.error( \"THREE.Matrix3.getInverse no longer takes a Matrix4 argument.\" );\n\n\t\t\t}\n\n\t\t\tvar me = matrix.elements,\n\t\t\t\tte = this.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],\n\t\t\t\tn12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],\n\t\t\t\tn13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],\n\n\t\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\t\tte[ 3 ] = t12 * detInv;\n\t\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\t\tte[ 6 ] = t13 * detInv;\n\t\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar tmp, m = this.elements;\n\n\t\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset is deprecated \" +\n\t\t\t\t\t\"- just use .toArray instead.\" );\n\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\n\t\tgetNormalMatrix: function ( matrix4 ) {\n\n\t\t\treturn this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();\n\n\t\t},\n\n\t\ttransposeIntoArray: function ( r ) {\n\n\t\t\tvar m = this.elements;\n\n\t\t\tr[ 0 ] = m[ 0 ];\n\t\t\tr[ 1 ] = m[ 3 ];\n\t\t\tr[ 2 ] = m[ 6 ];\n\t\t\tr[ 3 ] = m[ 1 ];\n\t\t\tr[ 4 ] = m[ 4 ];\n\t\t\tr[ 5 ] = m[ 7 ];\n\t\t\tr[ 6 ] = m[ 2 ];\n\t\t\tr[ 7 ] = m[ 5 ];\n\t\t\tr[ 8 ] = m[ 8 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor( var i = 0; i < 9; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Plane( normal, constant ) {\n\n\t\tthis.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );\n\t\tthis.constant = ( constant !== undefined ) ? constant : 0;\n\n\t}\n\n\tPlane.prototype = {\n\n\t\tconstructor: Plane,\n\n\t\tset: function ( normal, constant ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponents: function ( x, y, z, w ) {\n\n\t\t\tthis.normal.set( x, y, z );\n\t\t\tthis.constant = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromNormalAndCoplanarPoint: function ( normal, point ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = - point.dot( this.normal );\t// must be this.normal, not normal, as this.normal is normalized\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCoplanarPoints: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function setFromCoplanarPoints( a, b, c ) {\n\n\t\t\t\tvar normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();\n\n\t\t\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\t\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( plane ) {\n\n\t\t\tthis.normal.copy( plane.normal );\n\t\t\tthis.constant = plane.constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\t\tvar inverseNormalLength = 1.0 / this.normal.length();\n\t\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\t\tthis.constant *= inverseNormalLength;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.constant *= - 1;\n\t\t\tthis.normal.negate();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn this.normal.dot( point ) + this.constant;\n\n\t\t},\n\n\t\tdistanceToSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t\t},\n\n\t\tprojectPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn this.orthoPoint( point, optionalTarget ).sub( point ).negate();\n\n\t\t},\n\n\t\torthoPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar perpendicularMagnitude = this.distanceToPoint( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( perpendicularMagnitude );\n\n\t\t},\n\n\t\tintersectLine: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectLine( line, optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tvar direction = line.delta( v1 );\n\n\t\t\t\tvar denominator = this.normal.dot( direction );\n\n\t\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t\t// line is coplanar, return origin\n\t\t\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\t\t\treturn result.copy( line.start );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\tvar t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\t\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\treturn result.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsLine: function ( line ) {\n\n\t\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\t\tvar startSign = this.distanceToPoint( line.start );\n\t\t\tvar endSign = this.distanceToPoint( line.end );\n\n\t\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsPlane( this );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn sphere.intersectsPlane( this );\n\n\t\t},\n\n\t\tcoplanarPoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar m1 = new Matrix3();\n\n\t\t\treturn function applyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\t\t\tvar referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix );\n\n\t\t\t\t// transform normal based on theory here:\n\t\t\t\t// http://www.songho.ca/opengl/gl_normaltransform.html\n\t\t\t\tvar normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix );\n\t\t\t\tvar normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t// recalculate constant (like in setFromNormalAndCoplanarPoint)\n\t\t\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.constant = this.constant - offset.dot( this.normal );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( plane ) {\n\n\t\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Frustum( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tthis.planes = [\n\n\t\t\t( p0 !== undefined ) ? p0 : new Plane(),\n\t\t\t( p1 !== undefined ) ? p1 : new Plane(),\n\t\t\t( p2 !== undefined ) ? p2 : new Plane(),\n\t\t\t( p3 !== undefined ) ? p3 : new Plane(),\n\t\t\t( p4 !== undefined ) ? p4 : new Plane(),\n\t\t\t( p5 !== undefined ) ? p5 : new Plane()\n\n\t\t];\n\n\t}\n\n\tFrustum.prototype = {\n\n\t\tconstructor: Frustum,\n\n\t\tset: function ( p0, p1, p2, p3, p4, p5 ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tplanes[ 0 ].copy( p0 );\n\t\t\tplanes[ 1 ].copy( p1 );\n\t\t\tplanes[ 2 ].copy( p2 );\n\t\t\tplanes[ 3 ].copy( p3 );\n\t\t\tplanes[ 4 ].copy( p4 );\n\t\t\tplanes[ 5 ].copy( p5 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( frustum ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix: function ( m ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar me = m.elements;\n\t\t\tvar me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\t\tvar me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\t\tvar me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\t\tvar me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tintersectsObject: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsObject( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere )\n\t\t\t\t\t.applyMatrix4( object.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSprite: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsSprite( sprite ) {\n\n\t\t\t\tsphere.center.set( 0, 0, 0 );\n\t\t\t\tsphere.radius = 0.7071067811865476;\n\t\t\t\tsphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar center = sphere.center;\n\t\t\tvar negRadius = - sphere.radius;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tvar distance = planes[ i ].distanceToPoint( center );\n\n\t\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tintersectsBox: function () {\n\n\t\t\tvar p1 = new Vector3(),\n\t\t\t\tp2 = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\tvar planes = this.planes;\n\n\t\t\t\tfor ( var i = 0; i < 6 ; i ++ ) {\n\n\t\t\t\t\tvar plane = planes[ i ];\n\n\t\t\t\t\tp1.x = plane.normal.x > 0 ? box.min.x : box.max.x;\n\t\t\t\t\tp2.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t\t\tp1.y = plane.normal.y > 0 ? box.min.y : box.max.y;\n\t\t\t\t\tp2.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t\t\tp1.z = plane.normal.z > 0 ? box.min.z : box.max.z;\n\t\t\t\t\tp2.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\t\t\tvar d1 = plane.distanceToPoint( p1 );\n\t\t\t\t\tvar d2 = plane.distanceToPoint( p2 );\n\n\t\t\t\t\t// if both outside plane, no intersection\n\n\t\t\t\t\tif ( d1 < 0 && d2 < 0 ) {\n\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t};\n\n\t\t}(),\n\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLShadowMap( _renderer, _lights, _objects, capabilities ) {\n\n\t\tvar _gl = _renderer.context,\n\t\t_state = _renderer.state,\n\t\t_frustum = new Frustum(),\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_lightShadows = _lights.shadows,\n\n\t\t_shadowMapSize = new Vector2(),\n\t\t_maxShadowMapSize = new Vector2( capabilities.maxTextureSize, capabilities.maxTextureSize ),\n\n\t\t_lookTarget = new Vector3(),\n\t\t_lightPositionWorld = new Vector3(),\n\n\t\t_renderList = [],\n\n\t\t_MorphingFlag = 1,\n\t\t_SkinningFlag = 2,\n\n\t\t_NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1,\n\n\t\t_depthMaterials = new Array( _NumberOfMaterialVariants ),\n\t\t_distanceMaterials = new Array( _NumberOfMaterialVariants ),\n\n\t\t_materialCache = {};\n\n\t\tvar 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\tvar 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\tvar cube2DViewPorts = [\n\t\t\tnew Vector4(), new Vector4(), new Vector4(),\n\t\t\tnew Vector4(), new Vector4(), new Vector4()\n\t\t];\n\n\t\t// init\n\n\t\tvar depthMaterialTemplate = new MeshDepthMaterial();\n\t\tdepthMaterialTemplate.depthPacking = RGBADepthPacking;\n\t\tdepthMaterialTemplate.clipping = true;\n\n\t\tvar distanceShader = ShaderLib[ \"distanceRGBA\" ];\n\t\tvar distanceUniforms = UniformsUtils.clone( distanceShader.uniforms );\n\n\t\tfor ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {\n\n\t\t\tvar useMorphing = ( i & _MorphingFlag ) !== 0;\n\t\t\tvar useSkinning = ( i & _SkinningFlag ) !== 0;\n\n\t\t\tvar depthMaterial = depthMaterialTemplate.clone();\n\t\t\tdepthMaterial.morphTargets = useMorphing;\n\t\t\tdepthMaterial.skinning = useSkinning;\n\n\t\t\t_depthMaterials[ i ] = depthMaterial;\n\n\t\t\tvar distanceMaterial = new ShaderMaterial( {\n\t\t\t\tdefines: {\n\t\t\t\t\t'USE_SHADOWMAP': ''\n\t\t\t\t},\n\t\t\t\tuniforms: distanceUniforms,\n\t\t\t\tvertexShader: distanceShader.vertexShader,\n\t\t\t\tfragmentShader: distanceShader.fragmentShader,\n\t\t\t\tmorphTargets: useMorphing,\n\t\t\t\tskinning: useSkinning,\n\t\t\t\tclipping: true\n\t\t\t} );\n\n\t\t\t_distanceMaterials[ i ] = distanceMaterial;\n\n\t\t}\n\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tthis.enabled = false;\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis.type = PCFShadowMap;\n\n\t\tthis.renderReverseSided = true;\n\t\tthis.renderSingleSided = true;\n\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\t\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\t\tif ( _lightShadows.length === 0 ) return;\n\n\t\t\t// Set GL state for depth map.\n\t\t\t_state.clearColor( 1, 1, 1, 1 );\n\t\t\t_state.disable( _gl.BLEND );\n\t\t\t_state.setDepthTest( true );\n\t\t\t_state.setScissorTest( false );\n\n\t\t\t// render depth map\n\n\t\t\tvar faceCount, isPointLight;\n\n\t\t\tfor ( var i = 0, il = _lightShadows.length; i < il; i ++ ) {\n\n\t\t\t\tvar light = _lightShadows[ i ];\n\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowCamera = shadow.camera;\n\n\t\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\t\t\t\t_shadowMapSize.min( _maxShadowMapSize );\n\n\t\t\t\tif ( (light && light.isPointLight) ) {\n\n\t\t\t\t\tfaceCount = 6;\n\t\t\t\t\tisPointLight = true;\n\n\t\t\t\t\tvar vpWidth = _shadowMapSize.x;\n\t\t\t\t\tvar vpHeight = _shadowMapSize.y;\n\n\t\t\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t\t\t// following orientation:\n\t\t\t\t\t//\n\t\t\t\t\t// xzXZ\n\t\t\t\t\t// y Y\n\t\t\t\t\t//\n\t\t\t\t\t// X - Positive x direction\n\t\t\t\t\t// x - Negative x direction\n\t\t\t\t\t// Y - Positive y direction\n\t\t\t\t\t// y - Negative y direction\n\t\t\t\t\t// Z - Positive z direction\n\t\t\t\t\t// z - Negative z direction\n\n\t\t\t\t\t// positive X\n\t\t\t\t\tcube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative X\n\t\t\t\t\tcube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Z\n\t\t\t\t\tcube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative Z\n\t\t\t\t\tcube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Y\n\t\t\t\t\tcube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight );\n\t\t\t\t\t// negative Y\n\t\t\t\t\tcube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight );\n\n\t\t\t\t\t_shadowMapSize.x *= 4.0;\n\t\t\t\t\t_shadowMapSize.y *= 2.0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfaceCount = 1;\n\t\t\t\t\tisPointLight = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\t\tvar pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\n\t\t\t\t\tshadowCamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tif ( (shadow && shadow.isSpotLightShadow) ) {\n\n\t\t\t\t\tshadow.update( light );\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowMap = shadow.map;\n\t\t\t\tvar shadowMatrix = shadow.matrix;\n\n\t\t\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tshadowCamera.position.copy( _lightPositionWorld );\n\n\t\t\t\t_renderer.setRenderTarget( shadowMap );\n\t\t\t\t_renderer.clear();\n\n\t\t\t\t// render shadow map for each cube face (if omni-directional) or\n\t\t\t\t// run a single pass if not\n\n\t\t\t\tfor ( var face = 0; face < faceCount; face ++ ) {\n\n\t\t\t\t\tif ( isPointLight ) {\n\n\t\t\t\t\t\t_lookTarget.copy( shadowCamera.position );\n\t\t\t\t\t\t_lookTarget.add( cubeDirections[ face ] );\n\t\t\t\t\t\tshadowCamera.up.copy( cubeUps[ face ] );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t\tvar vpDimensions = cube2DViewPorts[ face ];\n\t\t\t\t\t\t_state.viewport( vpDimensions );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_lookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tshadowCamera.updateMatrixWorld();\n\t\t\t\t\tshadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld );\n\n\t\t\t\t\t// compute shadow matrix\n\n\t\t\t\t\tshadowMatrix.set(\n\t\t\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t\t\t);\n\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t\t\t\t\t// update camera matrices and frustum\n\n\t\t\t\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\t\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\t\t\t// set object matrices & frustum culling\n\n\t\t\t\t\t_renderList.length = 0;\n\n\t\t\t\t\tprojectObject( scene, camera, shadowCamera );\n\n\t\t\t\t\t// render shadow map\n\t\t\t\t\t// render regular objects\n\n\t\t\t\t\tfor ( var j = 0, jl = _renderList.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar object = _renderList[ j ];\n\t\t\t\t\t\tvar geometry = _objects.update( object );\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( (material && material.isMultiMaterial) ) {\n\n\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\tfor ( var k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\t\t\tvar group = groups[ k ];\n\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, 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 {\n\n\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld );\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, 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\t// Restore GL state.\n\t\t\tvar clearColor = _renderer.getClearColor(),\n\t\t\tclearAlpha = _renderer.getClearAlpha();\n\t\t\t_renderer.setClearColor( clearColor, clearAlpha );\n\n\t\t\tscope.needsUpdate = false;\n\n\t\t};\n\n\t\tfunction getDepthMaterial( object, material, isPointLight, lightPositionWorld ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tvar result = null;\n\n\t\t\tvar materialVariants = _depthMaterials;\n\t\t\tvar customMaterial = object.customDepthMaterial;\n\n\t\t\tif ( isPointLight ) {\n\n\t\t\t\tmaterialVariants = _distanceMaterials;\n\t\t\t\tcustomMaterial = object.customDistanceMaterial;\n\n\t\t\t}\n\n\t\t\tif ( ! customMaterial ) {\n\n\t\t\t\tvar useMorphing = false;\n\n\t\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;\n\n\t\t\t\t\t} else if ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphTargets && geometry.morphTargets.length > 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar useSkinning = object.isSkinnedMesh && material.skinning;\n\n\t\t\t\tvar variantIndex = 0;\n\n\t\t\t\tif ( useMorphing ) variantIndex |= _MorphingFlag;\n\t\t\t\tif ( useSkinning ) variantIndex |= _SkinningFlag;\n\n\t\t\t\tresult = materialVariants[ variantIndex ];\n\n\t\t\t} else {\n\n\t\t\t\tresult = customMaterial;\n\n\t\t\t}\n\n\t\t\tif ( _renderer.localClippingEnabled &&\n\t\t\t\t material.clipShadows === true &&\n\t\t\t\t\tmaterial.clippingPlanes.length !== 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\tvar keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tvar 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\tvar 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\tresult.visible = material.visible;\n\t\t\tresult.wireframe = material.wireframe;\n\n\t\t\tvar side = material.side;\n\n\t\t\tif ( scope.renderSingleSided && side == DoubleSide ) {\n\n\t\t\t\tside = FrontSide;\n\n\t\t\t}\n\n\t\t\tif ( scope.renderReverseSided ) {\n\n\t\t\t\tif ( side === FrontSide ) side = BackSide;\n\t\t\t\telse if ( side === BackSide ) side = FrontSide;\n\n\t\t\t}\n\n\t\t\tresult.side = side;\n\n\t\t\tresult.clipShadows = material.clipShadows;\n\t\t\tresult.clippingPlanes = material.clippingPlanes;\n\n\t\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\t\tresult.linewidth = material.linewidth;\n\n\t\t\tif ( isPointLight && result.uniforms.lightPos !== undefined ) {\n\n\t\t\t\tresult.uniforms.lightPos.value.copy( lightPositionWorld );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera, shadowCamera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\t\tif ( object.castShadow && ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) ) {\n\n\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\t\t\t_renderList.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, shadowCamera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Ray( origin, direction ) {\n\n\t\tthis.origin = ( origin !== undefined ) ? origin : new Vector3();\n\t\tthis.direction = ( direction !== undefined ) ? direction : new Vector3();\n\n\t}\n\n\tRay.prototype = {\n\n\t\tconstructor: Ray,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\tthis.origin.copy( origin );\n\t\t\tthis.direction.copy( direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( ray ) {\n\n\t\t\tthis.origin.copy( ray.origin );\n\t\t\tthis.direction.copy( ray.direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t\t},\n\n\t\tlookAt: function ( v ) {\n\n\t\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trecast: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function recast( t ) {\n\n\t\t\t\tthis.origin.copy( this.at( t, v1 ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\tresult.subVectors( point, this.origin );\n\t\t\tvar directionDistance = result.dot( this.direction );\n\n\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\treturn result.copy( this.origin );\n\n\t\t\t}\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t\t},\n\n\t\tdistanceSqToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceSqToPoint( point ) {\n\n\t\t\t\tvar directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t\t\t// point behind the ray\n\n\t\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t\t\t}\n\n\t\t\t\tv1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t\t\treturn v1.distanceToSquared( point );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdistanceSqToSegment: function () {\n\n\t\t\tvar segCenter = new Vector3();\n\t\t\tvar segDir = new Vector3();\n\t\t\tvar diff = new Vector3();\n\n\t\t\treturn function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t\t\t// It returns the min distance between the ray and the segment\n\t\t\t\t// defined by v0 and v1\n\t\t\t\t// It can also set two optional targets :\n\t\t\t\t// - The closest point on the ray\n\t\t\t\t// - The closest point on the segment\n\n\t\t\t\tsegCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t\t\tsegDir.copy( v1 ).sub( v0 ).normalize();\n\t\t\t\tdiff.copy( this.origin ).sub( segCenter );\n\n\t\t\t\tvar segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\t\t\tvar a01 = - this.direction.dot( segDir );\n\t\t\t\tvar b0 = diff.dot( this.direction );\n\t\t\t\tvar b1 = - diff.dot( segDir );\n\t\t\t\tvar c = diff.lengthSq();\n\t\t\t\tvar det = Math.abs( 1 - a01 * a01 );\n\t\t\t\tvar s0, s1, sqrDist, extDet;\n\n\t\t\t\tif ( det > 0 ) {\n\n\t\t\t\t\t// The ray and segment are not parallel.\n\n\t\t\t\t\ts0 = a01 * b1 - b0;\n\t\t\t\t\ts1 = a01 * b0 - b1;\n\t\t\t\t\textDet = segExtent * det;\n\n\t\t\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\t\t\tvar invDet = 1 / det;\n\t\t\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\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\t// region 5\n\n\t\t\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t\t\t// region 4\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t// region 3\n\n\t\t\t\t\t\t\ts0 = 0;\n\t\t\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 2\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Ray and segment are parallel.\n\n\t\t\t\t\ts1 = ( a01 > 0 ) ? - segExtent : 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\tif ( optionalPointOnRay ) {\n\n\t\t\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnSegment ) {\n\n\t\t\t\t\toptionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter );\n\n\t\t\t\t}\n\n\t\t\t\treturn sqrDist;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectSphere( sphere, optionalTarget ) {\n\n\t\t\t\tv1.subVectors( sphere.center, this.origin );\n\t\t\t\tvar tca = v1.dot( this.direction );\n\t\t\t\tvar d2 = v1.dot( v1 ) - tca * tca;\n\t\t\t\tvar radius2 = sphere.radius * sphere.radius;\n\n\t\t\t\tif ( d2 > radius2 ) return null;\n\n\t\t\t\tvar thc = Math.sqrt( radius2 - d2 );\n\n\t\t\t\t// t0 = first intersect point - entrance on front of sphere\n\t\t\t\tvar t0 = tca - thc;\n\n\t\t\t\t// t1 = second intersect point - exit point on back of sphere\n\t\t\t\tvar t1 = tca + thc;\n\n\t\t\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\t\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t\t\t// test to see if t0 is behind the ray:\n\t\t\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t\t\t// in order to always return an intersect point that is in front of the ray.\n\t\t\t\tif ( t0 < 0 ) return this.at( t1, optionalTarget );\n\n\t\t\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\t\t\treturn this.at( t0, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) <= sphere.radius;\n\n\t\t},\n\n\t\tdistanceToPlane: function ( plane ) {\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t// line is coplanar, return origin\n\t\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\t\treturn 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t\t// Return if the ray never intersects the plane\n\n\t\t\treturn t >= 0 ? t : null;\n\n\t\t},\n\n\t\tintersectPlane: function ( plane, optionalTarget ) {\n\n\t\t\tvar t = this.distanceToPlane( plane );\n\n\t\t\tif ( t === null ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\treturn this.at( t, optionalTarget );\n\n\t\t},\n\n\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// check if the ray lies on the plane first\n\n\t\t\tvar distToPoint = plane.distanceToPoint( this.origin );\n\n\t\t\tif ( distToPoint === 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tintersectBox: function ( box, optionalTarget ) {\n\n\t\t\tvar tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\t\tvar invdirx = 1 / this.direction.x,\n\t\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\t\tvar origin = this.origin;\n\n\t\t\tif ( invdirx >= 0 ) {\n\n\t\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t\t} else {\n\n\t\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t\t}\n\n\t\t\tif ( invdiry >= 0 ) {\n\n\t\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t\t} else {\n\n\t\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\t\tif ( invdirz >= 0 ) {\n\n\t\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t\t} else {\n\n\t\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t\t//return point closest to the ray (positive side)\n\n\t\t\tif ( tmax < 0 ) return null;\n\n\t\t\treturn this.at( tmin >= 0 ? tmin : tmax, optionalTarget );\n\n\t\t},\n\n\t\tintersectsBox: ( function () {\n\n\t\t\tvar v = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\treturn this.intersectBox( box, v ) !== null;\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectTriangle: function () {\n\n\t\t\t// Compute the offset origin, edges, and normal.\n\t\t\tvar diff = new Vector3();\n\t\t\tvar edge1 = new Vector3();\n\t\t\tvar edge2 = new Vector3();\n\t\t\tvar normal = new Vector3();\n\n\t\t\treturn function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t\t\tedge1.subVectors( b, a );\n\t\t\t\tedge2.subVectors( c, a );\n\t\t\t\tnormal.crossVectors( edge1, edge2 );\n\n\t\t\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\t\t\tvar DdN = this.direction.dot( normal );\n\t\t\t\tvar sign;\n\n\t\t\t\tif ( DdN > 0 ) {\n\n\t\t\t\t\tif ( backfaceCulling ) return null;\n\t\t\t\t\tsign = 1;\n\n\t\t\t\t} else if ( DdN < 0 ) {\n\n\t\t\t\t\tsign = - 1;\n\t\t\t\t\tDdN = - DdN;\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\tdiff.subVectors( this.origin, a );\n\t\t\t\tvar DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) );\n\n\t\t\t\t// b1 < 0, no intersection\n\t\t\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tvar DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) );\n\n\t\t\t\t// b2 < 0, no intersection\n\t\t\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// b1+b2 > 1, no intersection\n\t\t\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Line intersects triangle, check if ray does.\n\t\t\t\tvar QdN = - sign * diff.dot( normal );\n\n\t\t\t\t// t < 0, no intersection\n\t\t\t\tif ( QdN < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Ray intersects triangle.\n\t\t\t\treturn this.at( QdN / DdN, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix4: function ( matrix4 ) {\n\n\t\t\tthis.direction.add( this.origin ).applyMatrix4( matrix4 );\n\t\t\tthis.origin.applyMatrix4( matrix4 );\n\t\t\tthis.direction.sub( this.origin );\n\t\t\tthis.direction.normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( ray ) {\n\n\t\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Euler( x, y, z, order ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._order = order || Euler.DefaultOrder;\n\n\t}\n\n\tEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\n\tEuler.DefaultOrder = 'XYZ';\n\n\tEuler.prototype = {\n\n\t\tconstructor: Euler,\n\n\t\tisEuler: true,\n\n\t\tget x () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset x ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget y () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset y ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget z () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset z ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tget order () {\n\n\t\t\treturn this._order;\n\n\t\t},\n\n\t\tset order ( value ) {\n\n\t\t\tthis._order = value;\n\t\t\tthis.onChangeCallback();\n\n\t\t},\n\n\t\tset: function ( x, y, z, order ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._order = order || this._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t\t},\n\n\t\tcopy: function ( euler ) {\n\n\t\t\tthis._x = euler._x;\n\t\t\tthis._y = euler._y;\n\t\t\tthis._z = euler._z;\n\t\t\tthis._order = euler._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m, order, update ) {\n\n\t\t\tvar clamp = _Math.clamp;\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements;\n\t\t\tvar m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\t\tvar m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\t\tvar m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\torder = order || this._order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.99999 ) {\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} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.99999 ) {\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} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.99999 ) {\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} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.99999 ) {\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} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.99999 ) {\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} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.99999 ) {\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} else {\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order );\n\n\t\t\t}\n\n\t\t\tthis._order = order;\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromQuaternion: function () {\n\n\t\t\tvar matrix;\n\n\t\t\treturn function setFromQuaternion( q, order, update ) {\n\n\t\t\t\tif ( matrix === undefined ) matrix = new Matrix4();\n\n\t\t\t\tmatrix.makeRotationFromQuaternion( q );\n\n\t\t\t\treturn this.setFromRotationMatrix( matrix, order, update );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromVector3: function ( v, order ) {\n\n\t\t\treturn this.set( v.x, v.y, v.z, order || this._order );\n\n\t\t},\n\n\t\treorder: function () {\n\n\t\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t\tvar q = new Quaternion();\n\n\t\t\treturn function reorder( newOrder ) {\n\n\t\t\t\tq.setFromEuler( this );\n\n\t\t\t\treturn this.setFromQuaternion( q, newOrder );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( euler ) {\n\n\t\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t\t},\n\n\t\tfromArray: function ( array ) {\n\n\t\t\tthis._x = array[ 0 ];\n\t\t\tthis._y = array[ 1 ];\n\t\t\tthis._z = array[ 2 ];\n\t\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._order;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoVector3: function ( optionalResult ) {\n\n\t\t\tif ( optionalResult ) {\n\n\t\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t\t} else {\n\n\t\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t\t}\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Layers() {\n\n\t\tthis.mask = 1;\n\n\t}\n\n\tLayers.prototype = {\n\n\t\tconstructor: Layers,\n\n\t\tset: function ( channel ) {\n\n\t\t\tthis.mask = 1 << channel;\n\n\t\t},\n\n\t\tenable: function ( channel ) {\n\n\t\t\tthis.mask |= 1 << channel;\n\n\t\t},\n\n\t\ttoggle: function ( channel ) {\n\n\t\t\tthis.mask ^= 1 << channel;\n\n\t\t},\n\n\t\tdisable: function ( channel ) {\n\n\t\t\tthis.mask &= ~ ( 1 << channel );\n\n\t\t},\n\n\t\ttest: function ( layers ) {\n\n\t\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author elephantatwork / www.elephantatwork.ch\n\t */\n\n\tfunction Object3D() {\n\n\t\tObject.defineProperty( this, 'id', { value: Object3DIdCount() } );\n\n\t\tthis.uuid = _Math.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.DefaultUp.clone();\n\n\t\tvar position = new Vector3();\n\t\tvar rotation = new Euler();\n\t\tvar quaternion = new Quaternion();\n\t\tvar 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\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\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.DefaultMatrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = false;\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.userData = {};\n\n\t\tthis.onBeforeRender = function(){}; \n\t\tthis.onAfterRender = function(){};\n\n\t}\n\n\tObject3D.DefaultUp = new Vector3( 0, 1, 0 );\n\tObject3D.DefaultMatrixAutoUpdate = true;\n\n\tObject.assign( Object3D.prototype, EventDispatcher.prototype, {\n\n\t\tisObject3D: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tthis.matrix.multiplyMatrices( matrix, this.matrix );\n\n\t\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t\t},\n\n\t\tsetRotationFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t\t},\n\n\t\tsetRotationFromEuler: function ( euler ) {\n\n\t\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t\t},\n\n\t\tsetRotationFromMatrix: function ( m ) {\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t\t},\n\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\t// assumes q is normalized\n\n\t\t\tthis.quaternion.copy( q );\n\n\t\t},\n\n\t\trotateOnAxis: function () {\n\n\t\t\t// rotate object on axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar q1 = new Quaternion();\n\n\t\t\treturn function rotateOnAxis( axis, angle ) {\n\n\t\t\t\tq1.setFromAxisAngle( axis, angle );\n\n\t\t\t\tthis.quaternion.multiply( q1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateOnAxis: function () {\n\n\t\t\t// translate object by distance along axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function translateOnAxis( axis, distance ) {\n\n\t\t\t\tv1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\t\t\tthis.position.add( v1.multiplyScalar( distance ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function translateX( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function translateY( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function translateZ( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlocalToWorld: function ( vector ) {\n\n\t\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t\t},\n\n\t\tworldToLocal: function () {\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function worldToLocal( vector ) {\n\n\t\t\t\treturn vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\t// This routine does not support objects with rotated and/or translated parent(s)\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tm1.lookAt( vector, this.position, this.up );\n\n\t\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tadd: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( object === this ) {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object can't be added as a child of itself.\", object );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( (object && object.isObject3D) ) {\n\n\t\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\t\tobject.parent.remove( object );\n\n\t\t\t\t}\n\n\t\t\t\tobject.parent = this;\n\t\t\t\tobject.dispatchEvent( { type: 'added' } );\n\n\t\t\t\tthis.children.push( object );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object not an instance of THREE.Object3D.\", object );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tremove: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar index = this.children.indexOf( object );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tobject.parent = null;\n\n\t\t\t\tobject.dispatchEvent( { type: 'removed' } );\n\n\t\t\t\tthis.children.splice( index, 1 );\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetObjectById: function ( id ) {\n\n\t\t\treturn this.getObjectByProperty( 'id', id );\n\n\t\t},\n\n\t\tgetObjectByName: function ( name ) {\n\n\t\t\treturn this.getObjectByProperty( 'name', name );\n\n\t\t},\n\n\t\tgetObjectByProperty: function ( name, value ) {\n\n\t\t\tif ( this[ name ] === value ) return this;\n\n\t\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = this.children[ i ];\n\t\t\t\tvar object = child.getObjectByProperty( name, value );\n\n\t\t\t\tif ( object !== undefined ) {\n\n\t\t\t\t\treturn object;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\n\t\t},\n\n\t\tgetWorldPosition: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\treturn result.setFromMatrixPosition( this.matrixWorld );\n\n\t\t},\n\n\t\tgetWorldQuaternion: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar scale = new Vector3();\n\n\t\t\treturn function getWorldQuaternion( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Quaternion();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, result, scale );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldRotation: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldRotation( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Euler();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.setFromQuaternion( quaternion, this.rotation.order, false );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldScale: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldScale( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, result );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldDirection: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.set( 0, 0, 1 ).applyQuaternion( quaternion );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\traycast: function () {},\n\n\t\ttraverse: function ( callback ) {\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverse( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseVisible: function ( callback ) {\n\n\t\t\tif ( this.visible === false ) return;\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseAncestors: function ( callback ) {\n\n\t\t\tvar parent = this.parent;\n\n\t\t\tif ( parent !== null ) {\n\n\t\t\t\tcallback( parent );\n\n\t\t\t\tparent.traverseAncestors( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrix: function () {\n\n\t\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t\t},\n\n\t\tupdateMatrixWorld: function ( force ) {\n\n\t\t\tif ( this.matrixAutoUpdate === true ) this.updateMatrix();\n\n\t\t\tif ( this.matrixWorldNeedsUpdate === true || force === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\t\tforce = true;\n\n\t\t\t}\n\n\t\t\t// update children\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\t// meta is '' when called from JSON.stringify\n\t\t\tvar isRootObject = ( meta === undefined || meta === '' );\n\n\t\t\tvar output = {};\n\n\t\t\t// meta is a hash used to collect geometries, materials.\n\t\t\t// not providing it implies that this is the root object\n\t\t\t// being serialized.\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\t// initialize meta obj\n\t\t\t\tmeta = {\n\t\t\t\t\tgeometries: {},\n\t\t\t\t\tmaterials: {},\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t\toutput.metadata = {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Object',\n\t\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t// standard Object3D serialization\n\n\t\t\tvar object = {};\n\n\t\t\tobject.uuid = this.uuid;\n\t\t\tobject.type = this.type;\n\n\t\t\tif ( this.name !== '' ) object.name = this.name;\n\t\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\t\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\t\tif ( this.visible === false ) object.visible = false;\n\n\t\t\tobject.matrix = this.matrix.toArray();\n\n\t\t\t//\n\n\t\t\tif ( this.geometry !== undefined ) {\n\n\t\t\t\tif ( meta.geometries[ this.geometry.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.geometries[ this.geometry.uuid ] = this.geometry.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.geometry = this.geometry.uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.material !== undefined ) {\n\n\t\t\t\tif ( meta.materials[ this.material.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.materials[ this.material.uuid ] = this.material.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = this.material.uuid;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( this.children.length > 0 ) {\n\n\t\t\t\tobject.children = [];\n\n\t\t\t\tfor ( var i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\tvar geometries = extractFromCache( meta.geometries );\n\t\t\t\tvar materials = extractFromCache( meta.materials );\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\t\tif ( images.length > 0 ) output.images = images;\n\n\t\t\t}\n\n\t\t\toutput.object = object;\n\n\t\t\treturn output;\n\n\t\t\t// extract data from the cache hash\n\t\t\t// remove metadata on each item\n\t\t\t// and return as array\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function ( recursive ) {\n\n\t\t\treturn new this.constructor().copy( this, recursive );\n\n\t\t},\n\n\t\tcopy: function ( source, recursive ) {\n\n\t\t\tif ( recursive === undefined ) recursive = true;\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.up.copy( source.up );\n\n\t\t\tthis.position.copy( source.position );\n\t\t\tthis.quaternion.copy( source.quaternion );\n\t\t\tthis.scale.copy( source.scale );\n\n\t\t\tthis.matrix.copy( source.matrix );\n\t\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\t\tthis.visible = source.visible;\n\n\t\t\tthis.castShadow = source.castShadow;\n\t\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\t\tthis.frustumCulled = source.frustumCulled;\n\t\t\tthis.renderOrder = source.renderOrder;\n\n\t\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\t\tif ( recursive === true ) {\n\n\t\t\t\tfor ( var i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\t\tvar child = source.children[ i ];\n\t\t\t\t\tthis.add( child.clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\tvar count$2 = 0;\n\tfunction Object3DIdCount() { return count$2++; }\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Line3( start, end ) {\n\n\t\tthis.start = ( start !== undefined ) ? start : new Vector3();\n\t\tthis.end = ( end !== undefined ) ? end : new Vector3();\n\n\t}\n\n\tLine3.prototype = {\n\n\t\tconstructor: Line3,\n\n\t\tset: function ( start, end ) {\n\n\t\t\tthis.start.copy( start );\n\t\t\tthis.end.copy( end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( line ) {\n\n\t\t\tthis.start.copy( line.start );\n\t\t\tthis.end.copy( line.end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tdelta: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.subVectors( this.end, this.start );\n\n\t\t},\n\n\t\tdistanceSq: function () {\n\n\t\t\treturn this.start.distanceToSquared( this.end );\n\n\t\t},\n\n\t\tdistance: function () {\n\n\t\t\treturn this.start.distanceTo( this.end );\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tclosestPointToPointParameter: function () {\n\n\t\t\tvar startP = new Vector3();\n\t\t\tvar startEnd = new Vector3();\n\n\t\t\treturn function closestPointToPointParameter( point, clampToLine ) {\n\n\t\t\t\tstartP.subVectors( point, this.start );\n\t\t\t\tstartEnd.subVectors( this.end, this.start );\n\n\t\t\t\tvar startEnd2 = startEnd.dot( startEnd );\n\t\t\t\tvar startEnd_startP = startEnd.dot( startP );\n\n\t\t\t\tvar t = startEnd_startP / startEnd2;\n\n\t\t\t\tif ( clampToLine ) {\n\n\t\t\t\t\tt = _Math.clamp( t, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t\treturn t;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, clampToLine, optionalTarget ) {\n\n\t\t\tvar t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.start.applyMatrix4( matrix );\n\t\t\tthis.end.applyMatrix4( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( line ) {\n\n\t\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Triangle( a, b, c ) {\n\n\t\tthis.a = ( a !== undefined ) ? a : new Vector3();\n\t\tthis.b = ( b !== undefined ) ? b : new Vector3();\n\t\tthis.c = ( c !== undefined ) ? c : new Vector3();\n\n\t}\n\n\tTriangle.normal = function () {\n\n\t\tvar v0 = new Vector3();\n\n\t\treturn function normal( a, b, c, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.subVectors( c, b );\n\t\t\tv0.subVectors( a, b );\n\t\t\tresult.cross( v0 );\n\n\t\t\tvar resultLengthSq = result.lengthSq();\n\t\t\tif ( resultLengthSq > 0 ) {\n\n\t\t\t\treturn result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) );\n\n\t\t\t}\n\n\t\t\treturn result.set( 0, 0, 0 );\n\n\t\t};\n\n\t}();\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tTriangle.barycoordFromPoint = function () {\n\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function barycoordFromPoint( point, a, b, c, optionalTarget ) {\n\n\t\t\tv0.subVectors( c, a );\n\t\t\tv1.subVectors( b, a );\n\t\t\tv2.subVectors( point, a );\n\n\t\t\tvar dot00 = v0.dot( v0 );\n\t\t\tvar dot01 = v0.dot( v1 );\n\t\t\tvar dot02 = v0.dot( v2 );\n\t\t\tvar dot11 = v1.dot( v1 );\n\t\t\tvar dot12 = v1.dot( v2 );\n\n\t\t\tvar denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t// collinear or singular triangle\n\t\t\tif ( denom === 0 ) {\n\n\t\t\t\t// arbitrary location outside of triangle?\n\t\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\t\treturn result.set( - 2, - 1, - 1 );\n\n\t\t\t}\n\n\t\t\tvar invDenom = 1 / denom;\n\t\t\tvar u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\t\tvar v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t\t// barycentric coordinates must always sum to 1\n\t\t\treturn result.set( 1 - u - v, v, u );\n\n\t\t};\n\n\t}();\n\n\tTriangle.containsPoint = function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function containsPoint( point, a, b, c ) {\n\n\t\t\tvar result = Triangle.barycoordFromPoint( point, a, b, c, v1 );\n\n\t\t\treturn ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 );\n\n\t\t};\n\n\t}();\n\n\tTriangle.prototype = {\n\n\t\tconstructor: Triangle,\n\n\t\tset: function ( a, b, c ) {\n\n\t\t\tthis.a.copy( a );\n\t\t\tthis.b.copy( b );\n\t\t\tthis.c.copy( c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPointsAndIndices: function ( points, i0, i1, i2 ) {\n\n\t\t\tthis.a.copy( points[ i0 ] );\n\t\t\tthis.b.copy( points[ i1 ] );\n\t\t\tthis.c.copy( points[ i2 ] );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( triangle ) {\n\n\t\t\tthis.a.copy( triangle.a );\n\t\t\tthis.b.copy( triangle.b );\n\t\t\tthis.c.copy( triangle.c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tarea: function () {\n\n\t\t\tvar v0 = new Vector3();\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function area() {\n\n\t\t\t\tv0.subVectors( this.c, this.b );\n\t\t\t\tv1.subVectors( this.a, this.b );\n\n\t\t\t\treturn v0.cross( v1 ).length() * 0.5;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmidpoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t\t},\n\n\t\tnormal: function ( optionalTarget ) {\n\n\t\t\treturn Triangle.normal( this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tplane: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Plane();\n\n\t\t\treturn result.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t\t},\n\n\t\tbarycoordFromPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t\t},\n\n\t\tclosestPointToPoint: function () {\n\n\t\t\tvar plane, edgeList, projectedPoint, closestPoint;\n\n\t\t\treturn function closestPointToPoint( point, optionalTarget ) {\n\n\t\t\t\tif ( plane === undefined ) {\n\n\t\t\t\t\tplane = new Plane();\n\t\t\t\t\tedgeList = [ new Line3(), new Line3(), new Line3() ];\n\t\t\t\t\tprojectedPoint = new Vector3();\n\t\t\t\t\tclosestPoint = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\t\tvar minDistance = Infinity;\n\n\t\t\t\t// project the point onto the plane of the triangle\n\n\t\t\t\tplane.setFromCoplanarPoints( this.a, this.b, this.c );\n\t\t\t\tplane.projectPoint( point, projectedPoint );\n\n\t\t\t\t// check if the projection lies within the triangle\n\n\t\t\t\tif( this.containsPoint( projectedPoint ) === true ) {\n\n\t\t\t\t\t// if so, this is the closest point\n\n\t\t\t\t\tresult.copy( projectedPoint );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// if not, the point falls outside the triangle. the result is the closest point to the triangle's edges or vertices\n\n\t\t\t\t\tedgeList[ 0 ].set( this.a, this.b );\n\t\t\t\t\tedgeList[ 1 ].set( this.b, this.c );\n\t\t\t\t\tedgeList[ 2 ].set( this.c, this.a );\n\n\t\t\t\t\tfor( var i = 0; i < edgeList.length; i ++ ) {\n\n\t\t\t\t\t\tedgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint );\n\n\t\t\t\t\t\tvar distance = projectedPoint.distanceToSquared( closestPoint );\n\n\t\t\t\t\t\tif( distance < minDistance ) {\n\n\t\t\t\t\t\t\tminDistance = distance;\n\n\t\t\t\t\t\t\tresult.copy( closestPoint );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( triangle ) {\n\n\t\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Face3( a, b, c, normal, color, materialIndex ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t\tthis.normal = (normal && normal.isVector3) ? normal : new Vector3();\n\t\tthis.vertexNormals = Array.isArray( normal ) ? normal : [];\n\n\t\tthis.color = (color && color.isColor) ? color : new Color();\n\t\tthis.vertexColors = Array.isArray( color ) ? color : [];\n\n\t\tthis.materialIndex = materialIndex !== undefined ? materialIndex : 0;\n\n\t}\n\n\tFace3.prototype = {\n\n\t\tconstructor: Face3,\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.a = source.a;\n\t\t\tthis.b = source.b;\n\t\t\tthis.c = source.c;\n\n\t\t\tthis.normal.copy( source.normal );\n\t\t\tthis.color.copy( source.color );\n\n\t\t\tthis.materialIndex = source.materialIndex;\n\n\t\t\tfor ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexNormals[ i ] = source.vertexNormals[ i ].clone();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexColors[ i ] = source.vertexColors[ i ].clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * shading: THREE.SmoothShading,\n\t * depthTest: ,\n\t * depthWrite: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: \n\t * }\n\t */\n\n\tfunction MeshBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\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.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.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshBasicMaterial.prototype = Object.create( Material.prototype );\n\tMeshBasicMaterial.prototype.constructor = MeshBasicMaterial;\n\n\tMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\n\tMeshBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\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.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferAttribute( array, itemSize, normalized ) {\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.uuid = _Math.generateUUID();\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 === true;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t}\n\n\tBufferAttribute.prototype = {\n\n\t\tconstructor: BufferAttribute,\n\n\t\tisBufferAttribute: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.itemSize : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.itemSize = source.itemSize;\n\t\t\tthis.count = source.count;\n\t\t\tthis.normalized = source.normalized;\n\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.itemSize;\n\t\t\tindex2 *= attribute.itemSize;\n\n\t\t\tfor ( var i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyArray: function ( array ) {\n\n\t\t\tthis.array.set( array );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyColorsArray: function ( colors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\t\tvar color = colors[ i ];\n\n\t\t\t\tif ( color === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\t\tcolor = new Color();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = color.r;\n\t\t\t\tarray[ offset ++ ] = color.g;\n\t\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyIndicesArray: function ( indices ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tvar index = indices[ i ];\n\n\t\t\t\tarray[ offset ++ ] = index.a;\n\t\t\t\tarray[ offset ++ ] = index.b;\n\t\t\t\tarray[ offset ++ ] = index.c;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector2sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector3sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector4sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize ];\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\t\t\tthis.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Int8Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Int8Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint8Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint8Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint8ClampedAttribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint8ClampedArray( array ), itemSize );\n\n\t}\n\n\tfunction Int16Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Int16Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint16Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint16Array( array ), itemSize );\n\n\t}\n\n\tfunction Int32Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Int32Array( array ), itemSize );\n\n\t}\n\n\tfunction Uint32Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Uint32Array( array ), itemSize );\n\n\t}\n\n\tfunction Float32Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Float32Array( array ), itemSize );\n\n\t}\n\n\tfunction Float64Attribute( array, itemSize ) {\n\n\t\treturn new BufferAttribute( new Float64Array( array ), itemSize );\n\n\t}\n\n\t// Deprecated\n\n\tfunction DynamicBufferAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' );\n\t\treturn new BufferAttribute( array, itemSize ).setDynamic( true );\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author kile / http://kile.stravaganza.org/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Geometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Geometry';\n\n\t\tthis.vertices = [];\n\t\tthis.colors = [];\n\t\tthis.faces = [];\n\t\tthis.faceVertexUvs = [ [] ];\n\n\t\tthis.morphTargets = [];\n\t\tthis.morphNormals = [];\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\tthis.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.elementsNeedUpdate = false;\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.lineDistancesNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tObject.assign( Geometry.prototype, EventDispatcher.prototype, {\n\n\t\tisGeometry: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tfor ( var i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertex.applyMatrix4( matrix );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\t\t\t\tface.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tface.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\tthis.verticesNeedUpdate = true;\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfromBufferGeometry: function ( geometry ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar indices = geometry.index !== null ? geometry.index.array : undefined;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tvar positions = attributes.position.array;\n\t\t\tvar normals = attributes.normal !== undefined ? attributes.normal.array : undefined;\n\t\t\tvar colors = attributes.color !== undefined ? attributes.color.array : undefined;\n\t\t\tvar uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;\n\t\t\tvar uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;\n\n\t\t\tif ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = [];\n\n\t\t\tvar tempNormals = [];\n\t\t\tvar tempUVs = [];\n\t\t\tvar tempUVs2 = [];\n\n\t\t\tfor ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {\n\n\t\t\t\tscope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) );\n\n\t\t\t\tif ( normals !== undefined ) {\n\n\t\t\t\t\ttempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( colors !== undefined ) {\n\n\t\t\t\t\tscope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\ttempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\ttempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction addFace( a, b, c, materialIndex ) {\n\n\t\t\t\tvar vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : [];\n\t\t\t\tvar vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : [];\n\n\t\t\t\tvar face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );\n\n\t\t\t\tscope.faces.push( face );\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( indices !== undefined ) {\n\n\t\t\t\tvar groups = geometry.groups;\n\n\t\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\t\tfor ( var i = 0; i < groups.length; i ++ ) {\n\n\t\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\taddFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t\t\taddFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( var i = 0; i < positions.length / 3; i += 3 ) {\n\n\t\t\t\t\taddFace( i, i + 1, i + 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t\tvar center = this.boundingSphere.center;\n\t\t\tvar radius = this.boundingSphere.radius;\n\n\t\t\tvar s = radius === 0 ? 1 : 1.0 / radius;\n\n\t\t\tvar matrix = new Matrix4();\n\t\t\tmatrix.set(\n\t\t\t\ts, 0, 0, - s * center.x,\n\t\t\t\t0, s, 0, - s * center.y,\n\t\t\t\t0, 0, s, - s * center.z,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\tthis.applyMatrix( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\tfor ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tvar face = this.faces[ f ];\n\n\t\t\t\tvar vA = this.vertices[ face.a ];\n\t\t\t\tvar vB = this.vertices[ face.b ];\n\t\t\t\tvar vC = this.vertices[ face.c ];\n\n\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\tcb.cross( ab );\n\n\t\t\t\tcb.normalize();\n\n\t\t\t\tface.normal.copy( cb );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeVertexNormals: function ( areaWeighted ) {\n\n\t\t\tif ( areaWeighted === undefined ) areaWeighted = true;\n\n\t\t\tvar v, vl, f, fl, face, vertices;\n\n\t\t\tvertices = new Array( this.vertices.length );\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ] = new Vector3();\n\n\t\t\t}\n\n\t\t\tif ( areaWeighted ) {\n\n\t\t\t\t// vertex normals weighted by triangle areas\n\t\t\t\t// http://www.iquilezles.org/www/articles/normals/normals.htm\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvA = this.vertices[ face.a ];\n\t\t\t\t\tvB = this.vertices[ face.b ];\n\t\t\t\t\tvC = this.vertices[ face.c ];\n\n\t\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tvertices[ face.a ].add( cb );\n\t\t\t\t\tvertices[ face.b ].add( cb );\n\t\t\t\t\tvertices[ face.c ].add( cb );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.computeFaceNormals();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvertices[ face.a ].add( face.normal );\n\t\t\t\t\tvertices[ face.b ].add( face.normal );\n\t\t\t\t\tvertices[ face.c ].add( face.normal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ].normalize();\n\n\t\t\t}\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( vertices[ face.a ] );\n\t\t\t\t\tvertexNormals[ 1 ].copy( vertices[ face.b ] );\n\t\t\t\t\tvertexNormals[ 2 ].copy( vertices[ face.c ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = vertices[ face.a ].clone();\n\t\t\t\t\tvertexNormals[ 1 ] = vertices[ face.b ].clone();\n\t\t\t\t\tvertexNormals[ 2 ] = vertices[ face.c ].clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeFlatVertexNormals: function () {\n\n\t\t\tvar f, fl, face;\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 1 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 2 ].copy( face.normal );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 1 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 2 ] = face.normal.clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeMorphNormals: function () {\n\n\t\t\tvar i, il, f, fl, face;\n\n\t\t\t// save original normals\n\t\t\t// - create temp variables on first access\n\t\t\t// otherwise just copy (for faster repeated calls)\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tif ( ! face.__originalFaceNormal ) {\n\n\t\t\t\t\tface.__originalFaceNormal = face.normal.clone();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface.__originalFaceNormal.copy( face.normal );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];\n\n\t\t\t\tfor ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\t\tif ( ! face.__originalVertexNormals[ i ] ) {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// use temp geometry to compute face and vertex normals for each morph\n\n\t\t\tvar tmpGeo = new Geometry();\n\t\t\ttmpGeo.faces = this.faces;\n\n\t\t\tfor ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\t// create on first access\n\n\t\t\t\tif ( ! this.morphNormals[ i ] ) {\n\n\t\t\t\t\tthis.morphNormals[ i ] = {};\n\t\t\t\t\tthis.morphNormals[ i ].faceNormals = [];\n\t\t\t\t\tthis.morphNormals[ i ].vertexNormals = [];\n\n\t\t\t\t\tvar dstNormalsFace = this.morphNormals[ i ].faceNormals;\n\t\t\t\t\tvar dstNormalsVertex = this.morphNormals[ i ].vertexNormals;\n\n\t\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tfaceNormal = new Vector3();\n\t\t\t\t\t\tvertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };\n\n\t\t\t\t\t\tdstNormalsFace.push( faceNormal );\n\t\t\t\t\t\tdstNormalsVertex.push( vertexNormals );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar morphNormals = this.morphNormals[ i ];\n\n\t\t\t\t// set vertices to morph target\n\n\t\t\t\ttmpGeo.vertices = this.morphTargets[ i ].vertices;\n\n\t\t\t\t// compute morph normals\n\n\t\t\t\ttmpGeo.computeFaceNormals();\n\t\t\t\ttmpGeo.computeVertexNormals();\n\n\t\t\t\t// store morph normals\n\n\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tfaceNormal = morphNormals.faceNormals[ f ];\n\t\t\t\t\tvertexNormals = morphNormals.vertexNormals[ f ];\n\n\t\t\t\t\tfaceNormal.copy( face.normal );\n\n\t\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\n\t\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\n\t\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore original normals\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tface.normal = face.__originalFaceNormal;\n\t\t\t\tface.vertexNormals = face.__originalVertexNormals;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeTangents: function () {\n\n\t\t\tconsole.warn( 'THREE.Geometry: .computeTangents() has been removed.' );\n\n\t\t},\n\n\t\tcomputeLineDistances: function () {\n\n\t\t\tvar d = 0;\n\t\t\tvar vertices = this.vertices;\n\n\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tif ( i > 0 ) {\n\n\t\t\t\t\td += vertices[ i ].distanceTo( vertices[ i - 1 ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.lineDistances[ i ] = d;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tthis.boundingBox.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tmerge: function ( geometry, matrix, materialIndexOffset ) {\n\n\t\t\tif ( (geometry && geometry.isGeometry) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar normalMatrix,\n\t\t\tvertexOffset = this.vertices.length,\n\t\t\tvertices1 = this.vertices,\n\t\t\tvertices2 = geometry.vertices,\n\t\t\tfaces1 = this.faces,\n\t\t\tfaces2 = geometry.faces,\n\t\t\tuvs1 = this.faceVertexUvs[ 0 ],\n\t\t\tuvs2 = geometry.faceVertexUvs[ 0 ],\n\t\t\tcolors1 = this.colors,\n\t\t\tcolors2 = geometry.colors;\n\n\t\t\tif ( materialIndexOffset === undefined ) materialIndexOffset = 0;\n\n\t\t\tif ( matrix !== undefined ) {\n\n\t\t\t\tnormalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t}\n\n\t\t\t// vertices\n\n\t\t\tfor ( var i = 0, il = vertices2.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = vertices2[ i ];\n\n\t\t\t\tvar vertexCopy = vertex.clone();\n\n\t\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\n\n\t\t\t\tvertices1.push( vertexCopy );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tfor ( var i = 0, il = colors2.length; i < il; i ++ ) {\n\n\t\t\t\tcolors1.push( colors2[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tfor ( i = 0, il = faces2.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = faces2[ i ], faceCopy, normal, color,\n\t\t\t\tfaceVertexNormals = face.vertexNormals,\n\t\t\t\tfaceVertexColors = face.vertexColors;\n\n\t\t\t\tfaceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );\n\t\t\t\tfaceCopy.normal.copy( face.normal );\n\n\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\tfaceCopy.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tnormal = faceVertexNormals[ j ].clone();\n\n\t\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCopy.vertexNormals.push( normal );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.color.copy( face.color );\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {\n\n\t\t\t\t\tcolor = faceVertexColors[ j ];\n\t\t\t\t\tfaceCopy.vertexColors.push( color.clone() );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\n\n\t\t\t\tfaces1.push( faceCopy );\n\n\t\t\t}\n\n\t\t\t// uvs\n\n\t\t\tfor ( i = 0, il = uvs2.length; i < il; i ++ ) {\n\n\t\t\t\tvar uv = uvs2[ i ], uvCopy = [];\n\n\t\t\t\tif ( uv === undefined ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = uv.length; j < jl; j ++ ) {\n\n\t\t\t\t\tuvCopy.push( uv[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tuvs1.push( uvCopy );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmergeMesh: function ( mesh ) {\n\n\t\t\tif ( (mesh && mesh.isMesh) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tmesh.matrixAutoUpdate && mesh.updateMatrix();\n\n\t\t\tthis.merge( mesh.geometry, mesh.matrix );\n\n\t\t},\n\n\t\t/*\n\t\t * Checks for duplicate vertices with hashmap.\n\t\t * Duplicated vertices are removed\n\t\t * and faces' vertices are updated.\n\t\t */\n\n\t\tmergeVertices: function () {\n\n\t\t\tvar verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n\t\t\tvar unique = [], changes = [];\n\n\t\t\tvar v, key;\n\t\t\tvar precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n\t\t\tvar precision = Math.pow( 10, precisionPoints );\n\t\t\tvar i, il, face;\n\t\t\tvar indices, j, jl;\n\n\t\t\tfor ( i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tv = this.vertices[ i ];\n\t\t\t\tkey = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );\n\n\t\t\t\tif ( verticesMap[ key ] === undefined ) {\n\n\t\t\t\t\tverticesMap[ key ] = i;\n\t\t\t\t\tunique.push( this.vertices[ i ] );\n\t\t\t\t\tchanges[ i ] = unique.length - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\n\t\t\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// if faces are completely degenerate after merging vertices, we\n\t\t\t// have to remove them from the geometry.\n\t\t\tvar faceIndicesToRemove = [];\n\n\t\t\tfor ( i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tface = this.faces[ i ];\n\n\t\t\t\tface.a = changes[ face.a ];\n\t\t\t\tface.b = changes[ face.b ];\n\t\t\t\tface.c = changes[ face.c ];\n\n\t\t\t\tindices = [ face.a, face.b, face.c ];\n\n\t\t\t\tvar dupIndex = - 1;\n\n\t\t\t\t// if any duplicate vertices are found in a Face3\n\t\t\t\t// we have to remove the face as nothing can be saved\n\t\t\t\tfor ( var n = 0; n < 3; n ++ ) {\n\n\t\t\t\t\tif ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {\n\n\t\t\t\t\t\tdupIndex = n;\n\t\t\t\t\t\tfaceIndicesToRemove.push( i );\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\tfor ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\n\n\t\t\t\tvar idx = faceIndicesToRemove[ i ];\n\n\t\t\t\tthis.faces.splice( idx, 1 );\n\n\t\t\t\tfor ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ j ].splice( idx, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Use unique set of vertices\n\n\t\t\tvar diff = this.vertices.length - unique.length;\n\t\t\tthis.vertices = unique;\n\t\t\treturn diff;\n\n\t\t},\n\n\t\tsortFacesByMaterialIndex: function () {\n\n\t\t\tvar faces = this.faces;\n\t\t\tvar length = faces.length;\n\n\t\t\t// tag faces\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tfaces[ i ]._id = i;\n\n\t\t\t}\n\n\t\t\t// sort faces\n\n\t\t\tfunction materialIndexSort( a, b ) {\n\n\t\t\t\treturn a.materialIndex - b.materialIndex;\n\n\t\t\t}\n\n\t\t\tfaces.sort( materialIndexSort );\n\n\t\t\t// sort uvs\n\n\t\t\tvar uvs1 = this.faceVertexUvs[ 0 ];\n\t\t\tvar uvs2 = this.faceVertexUvs[ 1 ];\n\n\t\t\tvar newUvs1, newUvs2;\n\n\t\t\tif ( uvs1 && uvs1.length === length ) newUvs1 = [];\n\t\t\tif ( uvs2 && uvs2.length === length ) newUvs2 = [];\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tvar id = faces[ i ]._id;\n\n\t\t\t\tif ( newUvs1 ) newUvs1.push( uvs1[ id ] );\n\t\t\t\tif ( newUvs2 ) newUvs2.push( uvs2[ id ] );\n\n\t\t\t}\n\n\t\t\tif ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;\n\t\t\tif ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'Geometry',\n\t\t\t\t\tgenerator: 'Geometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Geometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tvar vertices = [];\n\n\t\t\tfor ( var i = 0; i < this.vertices.length; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t\tvar faces = [];\n\t\t\tvar normals = [];\n\t\t\tvar normalsHash = {};\n\t\t\tvar colors = [];\n\t\t\tvar colorsHash = {};\n\t\t\tvar uvs = [];\n\t\t\tvar uvsHash = {};\n\n\t\t\tfor ( var i = 0; i < this.faces.length; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\n\t\t\t\tvar hasMaterial = true;\n\t\t\t\tvar hasFaceUv = false; // deprecated\n\t\t\t\tvar hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;\n\t\t\t\tvar hasFaceNormal = face.normal.length() > 0;\n\t\t\t\tvar hasFaceVertexNormal = face.vertexNormals.length > 0;\n\t\t\t\tvar hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;\n\t\t\t\tvar hasFaceVertexColor = face.vertexColors.length > 0;\n\n\t\t\t\tvar faceType = 0;\n\n\t\t\t\tfaceType = setBit( faceType, 0, 0 ); // isQuad\n\t\t\t\tfaceType = setBit( faceType, 1, hasMaterial );\n\t\t\t\tfaceType = setBit( faceType, 2, hasFaceUv );\n\t\t\t\tfaceType = setBit( faceType, 3, hasFaceVertexUv );\n\t\t\t\tfaceType = setBit( faceType, 4, hasFaceNormal );\n\t\t\t\tfaceType = setBit( faceType, 5, hasFaceVertexNormal );\n\t\t\t\tfaceType = setBit( faceType, 6, hasFaceColor );\n\t\t\t\tfaceType = setBit( faceType, 7, hasFaceVertexColor );\n\n\t\t\t\tfaces.push( faceType );\n\t\t\t\tfaces.push( face.a, face.b, face.c );\n\t\t\t\tfaces.push( face.materialIndex );\n\n\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\tvar faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 0 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 1 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\tfaces.push( getNormalIndex( face.normal ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 0 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 1 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\tfaces.push( getColorIndex( face.color ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 0 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 1 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction setBit( value, position, enabled ) {\n\n\t\t\t\treturn enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );\n\n\t\t\t}\n\n\t\t\tfunction getNormalIndex( normal ) {\n\n\t\t\t\tvar hash = normal.x.toString() + normal.y.toString() + normal.z.toString();\n\n\t\t\t\tif ( normalsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tnormalsHash[ hash ] = normals.length / 3;\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getColorIndex( color ) {\n\n\t\t\t\tvar hash = color.r.toString() + color.g.toString() + color.b.toString();\n\n\t\t\t\tif ( colorsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tcolorsHash[ hash ] = colors.length;\n\t\t\t\tcolors.push( color.getHex() );\n\n\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getUvIndex( uv ) {\n\n\t\t\t\tvar hash = uv.x.toString() + uv.y.toString();\n\n\t\t\t\tif ( uvsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tuvsHash[ hash ] = uvs.length / 2;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tdata.data = {};\n\n\t\t\tdata.data.vertices = vertices;\n\t\t\tdata.data.normals = normals;\n\t\t\tif ( colors.length > 0 ) data.data.colors = colors;\n\t\t\tif ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility\n\t\t\tdata.data.faces = faces;\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new Geometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.vertices = [];\n\t\t\tthis.faces = [];\n\t\t\tthis.faceVertexUvs = [ [] ];\n\t\t\tthis.colors = [];\n\n\t\t\tvar vertices = source.vertices;\n\n\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertices.push( vertices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tvar colors = source.colors;\n\n\t\t\tfor ( var i = 0, il = colors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.colors.push( colors[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tvar faces = source.faces;\n\n\t\t\tfor ( var i = 0, il = faces.length; i < il; i ++ ) {\n\n\t\t\t\tthis.faces.push( faces[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\t\t\tvar faceVertexUvs = source.faceVertexUvs[ i ];\n\n\t\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar uvs = faceVertexUvs[ j ], uvsCopy = [];\n\n\t\t\t\t\tfor ( var k = 0, kl = uvs.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tvar uv = uvs[ k ];\n\n\t\t\t\t\t\tuvsCopy.push( uv.clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\tvar count$3 = 0;\n\tfunction GeometryIdCount() { return count$3++; }\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectGeometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'DirectGeometry';\n\n\t\tthis.indices = [];\n\t\tthis.vertices = [];\n\t\tthis.normals = [];\n\t\tthis.colors = [];\n\t\tthis.uvs = [];\n\t\tthis.uvs2 = [];\n\n\t\tthis.groups = [];\n\n\t\tthis.morphTargets = {};\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\t// this.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tObject.assign( DirectGeometry.prototype, EventDispatcher.prototype, {\n\n\t\tcomputeBoundingBox: Geometry.prototype.computeBoundingBox,\n\t\tcomputeBoundingSphere: Geometry.prototype.computeBoundingSphere,\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\tconsole.warn( 'THREE.DirectGeometry: computeFaceNormals() is not a method of this type of geometry.' );\n\n\t\t},\n\n\t\tcomputeVertexNormals: function () {\n\n\t\t\tconsole.warn( 'THREE.DirectGeometry: computeVertexNormals() is not a method of this type of geometry.' );\n\n\t\t},\n\n\t\tcomputeGroups: function ( geometry ) {\n\n\t\t\tvar group;\n\t\t\tvar groups = [];\n\t\t\tvar materialIndex;\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t// materials\n\n\t\t\t\tif ( face.materialIndex !== materialIndex ) {\n\n\t\t\t\t\tmaterialIndex = face.materialIndex;\n\n\t\t\t\t\tif ( group !== undefined ) {\n\n\t\t\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\t\t\tgroups.push( group );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgroup = {\n\t\t\t\t\t\tstart: i * 3,\n\t\t\t\t\t\tmaterialIndex: materialIndex\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( group !== undefined ) {\n\n\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\tgroups.push( group );\n\n\t\t\t}\n\n\t\t\tthis.groups = groups;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tvar faces = geometry.faces;\n\t\t\tvar vertices = geometry.vertices;\n\t\t\tvar faceVertexUvs = geometry.faceVertexUvs;\n\n\t\t\tvar hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;\n\t\t\tvar hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;\n\n\t\t\t// morphs\n\n\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\tvar morphTargetsLength = morphTargets.length;\n\n\t\t\tvar morphTargetsPosition;\n\n\t\t\tif ( morphTargetsLength > 0 ) {\n\n\t\t\t\tmorphTargetsPosition = [];\n\n\t\t\t\tfor ( var i = 0; i < morphTargetsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsPosition[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.position = morphTargetsPosition;\n\n\t\t\t}\n\n\t\t\tvar morphNormals = geometry.morphNormals;\n\t\t\tvar morphNormalsLength = morphNormals.length;\n\n\t\t\tvar morphTargetsNormal;\n\n\t\t\tif ( morphNormalsLength > 0 ) {\n\n\t\t\t\tmorphTargetsNormal = [];\n\n\t\t\t\tfor ( var i = 0; i < morphNormalsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsNormal[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.normal = morphTargetsNormal;\n\n\t\t\t}\n\n\t\t\t// skins\n\n\t\t\tvar skinIndices = geometry.skinIndices;\n\t\t\tvar skinWeights = geometry.skinWeights;\n\n\t\t\tvar hasSkinIndices = skinIndices.length === vertices.length;\n\t\t\tvar hasSkinWeights = skinWeights.length === vertices.length;\n\n\t\t\t//\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tthis.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tthis.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar normal = face.normal;\n\n\t\t\t\t\tthis.normals.push( normal, normal, normal );\n\n\t\t\t\t}\n\n\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\tif ( vertexColors.length === 3 ) {\n\n\t\t\t\t\tthis.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar color = face.color;\n\n\t\t\t\t\tthis.colors.push( color, color, color );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );\n\n\t\t\t\t\t\tthis.uvs.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv2 === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 1 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );\n\n\t\t\t\t\t\tthis.uvs2.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// morphs\n\n\t\t\t\tfor ( var j = 0; j < morphTargetsLength; j ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ j ].vertices;\n\n\t\t\t\t\tmorphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0; j < morphNormalsLength; j ++ ) {\n\n\t\t\t\t\tvar morphNormal = morphNormals[ j ].vertexNormals[ i ];\n\n\t\t\t\t\tmorphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );\n\n\t\t\t\t}\n\n\t\t\t\t// skins\n\n\t\t\t\tif ( hasSkinIndices ) {\n\n\t\t\t\t\tthis.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasSkinWeights ) {\n\n\t\t\t\t\tthis.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeGroups( geometry );\n\n\t\t\tthis.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.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\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}\n\n\tObject.assign( BufferGeometry.prototype, EventDispatcher.prototype, {\n\n\t\tisBufferGeometry: true,\n\n\t\tgetIndex: function () {\n\n\t\t\treturn this.index;\n\n\t\t},\n\n\t\tsetIndex: function ( index ) {\n\n\t\t\tthis.index = index;\n\n\t\t},\n\n\t\taddAttribute: function ( name, attribute ) {\n\n\t\t\tif ( (attribute && attribute.isBufferAttribute) === false && (attribute && attribute.isInterleavedBufferAttribute) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\n\n\t\t\t\tthis.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( name === 'index' ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\n\t\t\t\tthis.setIndex( attribute );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.attributes[ name ] = attribute;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetAttribute: function ( name ) {\n\n\t\t\treturn this.attributes[ name ];\n\n\t\t},\n\n\t\tremoveAttribute: function ( name ) {\n\n\t\t\tdelete this.attributes[ name ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddGroup: function ( start, count, materialIndex ) {\n\n\t\t\tthis.groups.push( {\n\n\t\t\t\tstart: start,\n\t\t\t\tcount: count,\n\t\t\t\tmaterialIndex: materialIndex !== undefined ? materialIndex : 0\n\n\t\t\t} );\n\n\t\t},\n\n\t\tclearGroups: function () {\n\n\t\t\tthis.groups = [];\n\n\t\t},\n\n\t\tsetDrawRange: function ( start, count ) {\n\n\t\t\tthis.drawRange.start = start;\n\t\t\tthis.drawRange.count = count;\n\n\t\t},\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tmatrix.applyToVector3Array( position.array );\n\t\t\t\tposition.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tvar normal = this.attributes.normal;\n\n\t\t\tif ( normal !== undefined ) {\n\n\t\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t\tnormalMatrix.applyToVector3Array( normal.array );\n\t\t\t\tnormal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1;\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1;\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tif ( m1 === undefined ) m1 = new Matrix4();\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj;\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( obj === undefined ) obj = new Object3D();\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\t// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( (object && object.isPoints) || (object && object.isLine) ) {\n\n\t\t\t\tvar positions = new Float32Attribute( geometry.vertices.length * 3, 3 );\n\t\t\t\tvar colors = new Float32Attribute( geometry.colors.length * 3, 3 );\n\n\t\t\t\tthis.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\n\t\t\t\tthis.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\n\n\t\t\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\n\n\t\t\t\t\tvar lineDistances = new Float32Attribute( geometry.lineDistances.length, 1 );\n\n\t\t\t\t\tthis.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( (object && object.isMesh) ) {\n\n\t\t\t\tif ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\tthis.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateFromObject: function ( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( (object && object.isMesh) ) {\n\n\t\t\t\tvar direct = geometry.__directGeometry;\n\n\t\t\t\tif ( geometry.elementsNeedUpdate === true ) {\n\n\t\t\t\t\tdirect = undefined;\n\t\t\t\t\tgeometry.elementsNeedUpdate = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( direct === undefined ) {\n\n\t\t\t\t\treturn this.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t\tdirect.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\t\tdirect.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\t\tdirect.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\t\tdirect.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\t\tdirect.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t\tgeometry = direct;\n\n\t\t\t}\n\n\t\t\tvar attribute;\n\n\t\t\tif ( geometry.verticesNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.position;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.vertices );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.normalsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.normal;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.normals );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.colorsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.color;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyColorsArray( geometry.colors );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvsNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.uv;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector2sArray( geometry.uvs );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.lineDistancesNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.lineDistance;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyArray( geometry.lineDistances );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.lineDistancesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.groupsNeedUpdate ) {\n\n\t\t\t\tgeometry.computeGroups( object.geometry );\n\t\t\t\tthis.groups = geometry.groups;\n\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tgeometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );\n\n\t\t\treturn this.fromDirectGeometry( geometry.__directGeometry );\n\n\t\t},\n\n\t\tfromDirectGeometry: function ( geometry ) {\n\n\t\t\tvar positions = new Float32Array( geometry.vertices.length * 3 );\n\t\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );\n\n\t\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\t\tvar normals = new Float32Array( geometry.normals.length * 3 );\n\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\t\tvar colors = new Float32Array( geometry.colors.length * 3 );\n\t\t\t\tthis.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs.length > 0 ) {\n\n\t\t\t\tvar uvs = new Float32Array( geometry.uvs.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs2.length > 0 ) {\n\n\t\t\t\tvar uvs2 = new Float32Array( geometry.uvs2.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.indices.length > 0 ) {\n\n\t\t\t\tvar TypeArray = geometry.vertices.length > 65535 ? Uint32Array : Uint16Array;\n\t\t\t\tvar indices = new TypeArray( geometry.indices.length * 3 );\n\t\t\t\tthis.setIndex( new BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) );\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tthis.groups = geometry.groups;\n\n\t\t\t// morphs\n\n\t\t\tfor ( var name in geometry.morphTargets ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphTargets = geometry.morphTargets[ name ];\n\n\t\t\t\tfor ( var i = 0, l = morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ i ];\n\n\t\t\t\t\tvar attribute = new Float32Attribute( morphTarget.length * 3, 3 );\n\n\t\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// skinning\n\n\t\t\tif ( geometry.skinIndices.length > 0 ) {\n\n\t\t\t\tvar skinIndices = new Float32Attribute( geometry.skinIndices.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.skinWeights.length > 0 ) {\n\n\t\t\t\tvar skinWeights = new Float32Attribute( geometry.skinWeights.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tvar positions = this.attributes.position.array;\n\n\t\t\tif ( positions !== undefined ) {\n\n\t\t\t\tthis.boundingBox.setFromArray( positions );\n\n\t\t\t} else {\n\n\t\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t\t}\n\n\t\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\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\t}\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tvar box = new Box3();\n\t\t\tvar vector = new Vector3();\n\n\t\t\treturn function computeBoundingSphere() {\n\n\t\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t\t}\n\n\t\t\t\tvar positions = this.attributes.position;\n\n\t\t\t\tif ( positions ) {\n\n\t\t\t\t\tvar array = positions.array;\n\t\t\t\t\tvar center = this.boundingSphere.center;\n\n\t\t\t\t\tbox.setFromArray( array );\n\t\t\t\t\tbox.getCenter( center );\n\n\t\t\t\t\t// hoping to find a boundingSphere with a radius smaller than the\n\t\t\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\t\tfor ( var i = 0, il = array.length; i < il; i += 3 ) {\n\n\t\t\t\t\t\tvector.fromArray( array, i );\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\t// backwards compatibility\n\n\t\t},\n\n\t\tcomputeVertexNormals: function () {\n\n\t\t\tvar index = this.index;\n\t\t\tvar attributes = this.attributes;\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( attributes.position ) {\n\n\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\tif ( attributes.normal === undefined ) {\n\n\t\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// reset existing normals to zero\n\n\t\t\t\t\tvar array = attributes.normal.array;\n\n\t\t\t\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tarray[ i ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar normals = attributes.normal.array;\n\n\t\t\t\tvar vA, vB, vC,\n\n\t\t\t\tpA = new Vector3(),\n\t\t\t\tpB = new Vector3(),\n\t\t\t\tpC = new Vector3(),\n\n\t\t\t\tcb = new Vector3(),\n\t\t\t\tab = new Vector3();\n\n\t\t\t\t// indexed elements\n\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\t\tthis.addGroup( 0, indices.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var j = 0, jl = groups.length; j < jl; ++ j ) {\n\n\t\t\t\t\t\tvar group = groups[ j ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\t\tvA = indices[ i + 0 ] * 3;\n\t\t\t\t\t\t\tvB = indices[ i + 1 ] * 3;\n\t\t\t\t\t\t\tvC = indices[ i + 2 ] * 3;\n\n\t\t\t\t\t\t\tpA.fromArray( positions, vA );\n\t\t\t\t\t\t\tpB.fromArray( positions, vB );\n\t\t\t\t\t\t\tpC.fromArray( positions, vC );\n\n\t\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\t\tnormals[ vA ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vA + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vA + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vB ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vB + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vB + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vC ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vC + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vC + 2 ] += cb.z;\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\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\t\tfor ( var i = 0, il = positions.length; i < il; i += 9 ) {\n\n\t\t\t\t\t\tpA.fromArray( positions, i );\n\t\t\t\t\t\tpB.fromArray( positions, i + 3 );\n\t\t\t\t\t\tpC.fromArray( positions, i + 6 );\n\n\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\tnormals[ i ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 1 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 2 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 3 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 4 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 5 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 6 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 7 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 8 ] = cb.z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.normalizeNormals();\n\n\t\t\t\tattributes.normal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tmerge: function ( geometry, offset ) {\n\n\t\t\tif ( (geometry && geometry.isBufferGeometry) === false ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\t\tvar attribute1 = attributes[ key ];\n\t\t\t\tvar attributeArray1 = attribute1.array;\n\n\t\t\t\tvar attribute2 = geometry.attributes[ key ];\n\t\t\t\tvar attributeArray2 = attribute2.array;\n\n\t\t\t\tvar attributeSize = attribute2.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) {\n\n\t\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalizeNormals: function () {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\n\t\t\tvar x, y, z, n;\n\n\t\t\tfor ( var i = 0, il = normals.length; i < il; i += 3 ) {\n\n\t\t\t\tx = normals[ i ];\n\t\t\t\ty = normals[ i + 1 ];\n\t\t\t\tz = normals[ i + 2 ];\n\n\t\t\t\tn = 1.0 / Math.sqrt( x * x + y * y + z * z );\n\n\t\t\t\tnormals[ i ] *= n;\n\t\t\t\tnormals[ i + 1 ] *= n;\n\t\t\t\tnormals[ i + 2 ] *= n;\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoNonIndexed: function () {\n\n\t\t\tif ( this.index === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar geometry2 = new BufferGeometry();\n\n\t\t\tvar indices = this.index.array;\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\n\t\t\t\tvar array = attribute.array;\n\t\t\t\tvar itemSize = attribute.itemSize;\n\n\t\t\t\tvar array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\t\tvar index = 0, index2 = 0;\n\n\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t\tfor ( var j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) );\n\n\t\t\t}\n\n\t\t\treturn geometry2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.4,\n\t\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard BufferGeometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tdata.data = { attributes: {} };\n\n\t\t\tvar index = this.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar array = Array.prototype.slice.call( index.array );\n\n\t\t\t\tdata.data.index = {\n\t\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\t\tarray: array\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\n\t\t\t\tvar array = Array.prototype.slice.call( attribute.array );\n\n\t\t\t\tdata.data.attributes[ key ] = {\n\t\t\t\t\titemSize: attribute.itemSize,\n\t\t\t\t\ttype: attribute.array.constructor.name,\n\t\t\t\t\tarray: array,\n\t\t\t\t\tnormalized: attribute.normalized\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = this.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tdata.data.boundingSphere = {\n\t\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\t\tradius: boundingSphere.radius\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t// Handle primitives\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tif ( parameters !== undefined ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tvalues.push( parameters[ key ] );\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = Object.create( this.constructor.prototype );\n\t\t\t\tthis.constructor.apply( geometry, values );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t\treturn new this.constructor().copy( this );\n\t\t\t*/\n\n\t\t\treturn new BufferGeometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar index = source.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tthis.setIndex( index.clone() );\n\n\t\t\t}\n\n\t\t\tvar attributes = source.attributes;\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\t\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t\t}\n\n\t\t\tvar groups = source.groups;\n\n\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\tvar group = groups[ i ];\n\t\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\tBufferGeometry.MaxIndex = 65535;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author jonobr1 / http://jonobr1.com/\n\t */\n\n\tfunction Mesh( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t\tthis.drawMode = TrianglesDrawMode;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tMesh.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Mesh,\n\n\t\tisMesh: true,\n\n\t\tsetDrawMode: function ( value ) {\n\n\t\t\tthis.drawMode = value;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.drawMode = source.drawMode;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateMorphTargets: function () {\n\n\t\t\tvar morphTargets = this.geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( var m = 0, ml = morphTargets.length; m < ml; m ++ ) {\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ morphTargets[ m ].name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\tvar vA = new Vector3();\n\t\t\tvar vB = new Vector3();\n\t\t\tvar vC = new Vector3();\n\n\t\t\tvar tempA = new Vector3();\n\t\t\tvar tempB = new Vector3();\n\t\t\tvar tempC = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tvar barycoord = new Vector3();\n\n\t\t\tvar intersectionPoint = new Vector3();\n\t\t\tvar intersectionPointWorld = new Vector3();\n\n\t\t\tfunction uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) {\n\n\t\t\t\tTriangle.barycoordFromPoint( point, p1, p2, p3, barycoord );\n\n\t\t\t\tuv1.multiplyScalar( barycoord.x );\n\t\t\t\tuv2.multiplyScalar( barycoord.y );\n\t\t\t\tuv3.multiplyScalar( barycoord.z );\n\n\t\t\t\tuv1.add( uv2 ).add( uv3 );\n\n\t\t\t\treturn uv1.clone();\n\n\t\t\t}\n\n\t\t\tfunction checkIntersection( object, raycaster, ray, pA, pB, pC, point ) {\n\n\t\t\t\tvar intersect;\n\t\t\t\tvar material = object.material;\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t\t\t\t}\n\n\t\t\t\tif ( intersect === null ) return null;\n\n\t\t\t\tintersectionPointWorld.copy( point );\n\t\t\t\tintersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\t\t\t\treturn {\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\tpoint: intersectionPointWorld.clone(),\n\t\t\t\t\tobject: object\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tfunction checkBufferGeometryIntersection( object, raycaster, ray, positions, uvs, a, b, c ) {\n\n\t\t\t\tvA.fromArray( positions, a * 3 );\n\t\t\t\tvB.fromArray( positions, b * 3 );\n\t\t\t\tvC.fromArray( positions, c * 3 );\n\n\t\t\t\tvar intersection = checkIntersection( object, raycaster, ray, vA, vB, vC, intersectionPoint );\n\n\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\t\tuvA.fromArray( uvs, a * 2 );\n\t\t\t\t\t\tuvB.fromArray( uvs, b * 2 );\n\t\t\t\t\t\tuvC.fromArray( uvs, c * 2 );\n\n\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tintersection.face = new Face3( a, b, c, Triangle.normal( vA, vB, vC ) );\n\t\t\t\t\tintersection.faceIndex = a;\n\n\t\t\t\t}\n\n\t\t\t\treturn intersection;\n\n\t\t\t}\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar material = this.material;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\tif ( material === undefined ) return;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\t// Check boundingBox before continuing\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tif ( ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t\t\t}\n\n\t\t\t\tvar uvs, intersection;\n\n\t\t\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\tvar a, b, c;\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( attributes.uv !== undefined ) {\n\n\t\t\t\t\t\tuvs = attributes.uv.array;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = indices[ i ];\n\t\t\t\t\t\t\tb = indices[ i + 1 ];\n\t\t\t\t\t\t\tc = indices[ i + 2 ];\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\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\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length; i < l; i += 9 ) {\n\n\t\t\t\t\t\t\ta = i / 3;\n\t\t\t\t\t\t\tb = a + 1;\n\t\t\t\t\t\t\tc = a + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, positions, uvs, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.index = a; // triangle number in positions buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\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 if ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\tvar fvA, fvB, fvC;\n\t\t\t\t\tvar isFaceMaterial = (material && material.isMultiMaterial);\n\t\t\t\t\tvar materials = isFaceMaterial === true ? material.materials : null;\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar faceVertexUvs = geometry.faceVertexUvs[ 0 ];\n\t\t\t\t\tif ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;\n\n\t\t\t\t\tfor ( var f = 0, fl = faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tvar face = faces[ f ];\n\t\t\t\t\t\tvar faceMaterial = isFaceMaterial === true ? materials[ face.materialIndex ] : material;\n\n\t\t\t\t\t\tif ( faceMaterial === undefined ) continue;\n\n\t\t\t\t\t\tfvA = vertices[ face.a ];\n\t\t\t\t\t\tfvB = vertices[ face.b ];\n\t\t\t\t\t\tfvC = vertices[ face.c ];\n\n\t\t\t\t\t\tif ( faceMaterial.morphTargets === true ) {\n\n\t\t\t\t\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\t\t\t\t\tvar morphInfluences = this.morphTargetInfluences;\n\n\t\t\t\t\t\t\tvA.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvB.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvC.set( 0, 0, 0 );\n\n\t\t\t\t\t\t\tfor ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {\n\n\t\t\t\t\t\t\t\tvar influence = morphInfluences[ t ];\n\n\t\t\t\t\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t\t\t\t\tvar targets = morphTargets[ t ].vertices;\n\n\t\t\t\t\t\t\t\tvA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence );\n\t\t\t\t\t\t\t\tvB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence );\n\t\t\t\t\t\t\t\tvC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvA.add( fvA );\n\t\t\t\t\t\t\tvB.add( fvB );\n\t\t\t\t\t\t\tvC.add( fvC );\n\n\t\t\t\t\t\t\tfvA = vA;\n\t\t\t\t\t\t\tfvB = vB;\n\t\t\t\t\t\t\tfvC = vC;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tintersection = checkIntersection( this, raycaster, ray, fvA, fvB, fvC, intersectionPoint );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\t\t\t\tvar uvs_f = uvs[ f ];\n\t\t\t\t\t\t\t\tuvA.copy( uvs_f[ 0 ] );\n\t\t\t\t\t\t\t\tuvB.copy( uvs_f[ 1 ] );\n\t\t\t\t\t\t\t\tuvC.copy( uvs_f[ 2 ] );\n\n\t\t\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tintersection.face = face;\n\t\t\t\t\t\t\tintersection.faceIndex = f;\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};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'BoxBufferGeometry';\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\tvar scope = this;\n\n\t\t// segments\n\t\twidthSegments = Math.floor( widthSegments ) || 1;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\t\tdepthSegments = Math.floor( depthSegments ) || 1;\n\n\t\t// these are used to calculate buffer length\n\t\tvar vertexCount = calculateVertexCount( widthSegments, heightSegments, depthSegments );\n\t\tvar indexCount = calculateIndexCount( widthSegments, heightSegments, depthSegments );\n\n\t\t// buffers\n\t\tvar indices = new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount );\n\t\tvar vertices = new Float32Array( vertexCount * 3 );\n\t\tvar normals = new Float32Array( vertexCount * 3 );\n\t\tvar uvs = new Float32Array( vertexCount * 2 );\n\n\t\t// offset variables\n\t\tvar vertexBufferOffset = 0;\n\t\tvar uvBufferOffset = 0;\n\t\tvar indexBufferOffset = 0;\n\t\tvar numberOfVertices = 0;\n\n\t\t// group variables\n\t\tvar groupStart = 0;\n\n\t\t// build each side of the box geometry\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\t\tthis.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t\t// helper functions\n\n\t\tfunction calculateVertexCount( w, h, d ) {\n\n\t\t\tvar vertices = 0;\n\n\t\t\t// calculate the amount of vertices for each side (plane)\n\t\t\tvertices += (w + 1) * (h + 1) * 2; // xy\n\t\t\tvertices += (w + 1) * (d + 1) * 2; // xz\n\t\t\tvertices += (d + 1) * (h + 1) * 2; // zy\n\n\t\t\treturn vertices;\n\n\t\t}\n\n\t\tfunction calculateIndexCount( w, h, d ) {\n\n\t\t\tvar index = 0;\n\n\t\t\t// calculate the amount of squares for each side\n\t\t\tindex += w * h * 2; // xy\n\t\t\tindex += w * d * 2; // xz\n\t\t\tindex += d * h * 2; // zy\n\n\t\t\treturn index * 6; // two triangles per square => six vertices per square\n\n\t\t}\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tvar segmentWidth\t= width / gridX;\n\t\t\tvar segmentHeight = height / gridY;\n\n\t\t\tvar widthHalf = width / 2;\n\t\t\tvar heightHalf = height / 2;\n\t\t\tvar depthHalf = depth / 2;\n\n\t\t\tvar gridX1 = gridX + 1;\n\t\t\tvar gridY1 = gridY + 1;\n\n\t\t\tvar vertexCounter = 0;\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( var iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tvar y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( var ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tvar x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\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\t\t\t\t\tvertices[ vertexBufferOffset ] = vector.x;\n\t\t\t\t\tvertices[ vertexBufferOffset + 1 ] = vector.y;\n\t\t\t\t\tvertices[ vertexBufferOffset + 2 ] = vector.z;\n\n\t\t\t\t\t// set values to correct vector component\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\t\t\t\t\tnormals[ vertexBufferOffset ] = vector.x;\n\t\t\t\t\tnormals[ vertexBufferOffset + 1 ] = vector.y;\n\t\t\t\t\tnormals[ vertexBufferOffset + 2 ] = vector.z;\n\n\t\t\t\t\t// uvs\n\t\t\t\t\tuvs[ uvBufferOffset ] = ix / gridX;\n\t\t\t\t\tuvs[ uvBufferOffset + 1 ] = 1 - ( iy / gridY );\n\n\t\t\t\t\t// update offsets and counters\n\t\t\t\t\tvertexBufferOffset += 3;\n\t\t\t\t\tuvBufferOffset += 2;\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\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 ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\t// indices\n\t\t\t\t\tvar a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tvar b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// face one\n\t\t\t\t\tindices[ indexBufferOffset ] = a;\n\t\t\t\t\tindices[ indexBufferOffset + 1 ] = b;\n\t\t\t\t\tindices[ indexBufferOffset + 2 ] = d;\n\n\t\t\t\t\t// face two\n\t\t\t\t\tindices[ indexBufferOffset + 3 ] = b;\n\t\t\t\t\tindices[ indexBufferOffset + 4 ] = c;\n\t\t\t\t\tindices[ indexBufferOffset + 5 ] = d;\n\n\t\t\t\t\t// update offsets and counters\n\t\t\t\t\tindexBufferOffset += 6;\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\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tBoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tBoxBufferGeometry.prototype.constructor = BoxBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PlaneBufferGeometry';\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\tvar width_half = width / 2;\n\t\tvar height_half = height / 2;\n\n\t\tvar gridX = Math.floor( widthSegments ) || 1;\n\t\tvar gridY = Math.floor( heightSegments ) || 1;\n\n\t\tvar gridX1 = gridX + 1;\n\t\tvar gridY1 = gridY + 1;\n\n\t\tvar segment_width = width / gridX;\n\t\tvar segment_height = height / gridY;\n\n\t\tvar vertices = new Float32Array( gridX1 * gridY1 * 3 );\n\t\tvar normals = new Float32Array( gridX1 * gridY1 * 3 );\n\t\tvar uvs = new Float32Array( gridX1 * gridY1 * 2 );\n\n\t\tvar offset = 0;\n\t\tvar offset2 = 0;\n\n\t\tfor ( var iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tvar y = iy * segment_height - height_half;\n\n\t\t\tfor ( var ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tvar x = ix * segment_width - width_half;\n\n\t\t\t\tvertices[ offset ] = x;\n\t\t\t\tvertices[ offset + 1 ] = - y;\n\n\t\t\t\tnormals[ offset + 2 ] = 1;\n\n\t\t\t\tuvs[ offset2 ] = ix / gridX;\n\t\t\t\tuvs[ offset2 + 1 ] = 1 - ( iy / gridY );\n\n\t\t\t\toffset += 3;\n\t\t\t\toffset2 += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\toffset = 0;\n\n\t\tvar indices = new ( ( vertices.length / 3 ) > 65535 ? Uint32Array : Uint16Array )( gridX * gridY * 6 );\n\n\t\tfor ( var iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( var ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tvar a = ix + gridX1 * iy;\n\t\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices[ offset ] = a;\n\t\t\t\tindices[ offset + 1 ] = b;\n\t\t\t\tindices[ offset + 2 ] = d;\n\n\t\t\t\tindices[ offset + 3 ] = b;\n\t\t\t\tindices[ offset + 4 ] = c;\n\t\t\t\tindices[ offset + 5 ] = d;\n\n\t\t\t\toffset += 6;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tPlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction Camera() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t}\n\n\tCamera.prototype = Object.create( Object3D.prototype );\n\tCamera.prototype.constructor = Camera;\n\n\tCamera.prototype.isCamera = true;\n\n\tCamera.prototype.getWorldDirection = function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\treturn result.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.lookAt = function () {\n\n\t\t// This routine does not support cameras with rotated and/or translated parent(s)\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function lookAt( vector ) {\n\n\t\t\tm1.lookAt( this.position, vector, this.up );\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t};\n\n\t}();\n\n\tCamera.prototype.clone = function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t};\n\n\tCamera.prototype.copy = function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author greggman / http://games.greggman.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author tschw\n\t */\n\n\tfunction PerspectiveCamera( fov, aspect, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov !== undefined ? fov : 50;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near !== undefined ? near : 0.1;\n\t\tthis.far = far !== undefined ? far : 2000;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect !== undefined ? aspect : 1;\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\tPerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: PerspectiveCamera,\n\n\t\tisPerspectiveCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.fov = source.fov;\n\t\t\tthis.zoom = source.zoom;\n\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\t\t\tthis.focus = source.focus;\n\n\t\t\tthis.aspect = source.aspect;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\tthis.filmGauge = source.filmGauge;\n\t\t\tthis.filmOffset = source.filmOffset;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t\t *\n\t\t * The default film gauge is 35, so that the focal length can be specified for\n\t\t * a 35mm (full frame) camera.\n\t\t *\n\t\t * Values for focal length and film gauge must have the same unit.\n\t\t */\n\t\tsetFocalLength: function ( focalLength ) {\n\n\t\t\t// see http://www.bobatkins.com/photography/technical/field_of_view.html\n\t\t\tvar vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\t\tthis.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\t/**\n\t\t * Calculates the focal length from the current .fov and .filmGauge.\n\t\t */\n\t\tgetFocalLength: function () {\n\n\t\t\tvar vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov );\n\n\t\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t\t},\n\n\t\tgetEffectiveFOV: function () {\n\n\t\t\treturn _Math.RAD2DEG * 2 * Math.atan(\n\t\t\t\t\tMath.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t\t},\n\n\t\tgetFilmWidth: function () {\n\n\t\t\t// film not completely covered in portrait format (aspect < 1)\n\t\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t\t},\n\n\t\tgetFilmHeight: function () {\n\n\t\t\t// film not completely covered in landscape format (aspect > 1)\n\t\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t\t},\n\n\t\t/**\n\t\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t\t * multi-monitor/multi-machine setups.\n\t\t *\n\t\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t\t * the monitors are in grid like this\n\t\t *\n\t\t * +---+---+---+\n\t\t * | A | B | C |\n\t\t * +---+---+---+\n\t\t * | D | E | F |\n\t\t * +---+---+---+\n\t\t *\n\t\t * then for each monitor you would call it like this\n\t\t *\n\t\t * var w = 1920;\n\t\t * var h = 1080;\n\t\t * var fullWidth = w * 3;\n\t\t * var fullHeight = h * 2;\n\t\t *\n\t\t * --A--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t\t * --B--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t\t * --C--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t\t * --D--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t\t * --E--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t\t * --F--\n\t\t * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t\t *\n\t\t * Note there is no reason monitors have to be the same size or in a grid.\n\t\t */\n\t\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar near = this.near,\n\t\t\t\ttop = near * Math.tan(\n\t\t\t\t\t\t_Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,\n\t\t\t\theight = 2 * top,\n\t\t\t\twidth = this.aspect * height,\n\t\t\t\tleft = - 0.5 * width,\n\t\t\t\tview = this.view;\n\n\t\t\tif ( view !== null ) {\n\n\t\t\t\tvar fullWidth = view.fullWidth,\n\t\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\t\twidth *= view.width / fullWidth;\n\t\t\t\theight *= view.height / fullHeight;\n\n\t\t\t}\n\n\t\t\tvar skew = this.filmOffset;\n\t\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\t\tthis.projectionMatrix.makeFrustum(\n\t\t\t\t\tleft, left + width, top - height, top, near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.fov = this.fov;\n\t\t\tdata.object.zoom = this.zoom;\n\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\t\t\tdata.object.focus = this.focus;\n\n\t\t\tdata.object.aspect = this.aspect;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\tdata.object.filmGauge = this.filmGauge;\n\t\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author arose / http://github.com/arose\n\t */\n\n\tfunction OrthographicCamera( left, right, top, bottom, near, far ) {\n\n\t\tCamera.call( this );\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 !== undefined ) ? near : 0.1;\n\t\tthis.far = ( far !== undefined ) ? far : 2000;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tOrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: OrthographicCamera,\n\n\t\tisOrthographicCamera: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tCamera.prototype.copy.call( this, source );\n\n\t\t\tthis.left = source.left;\n\t\t\tthis.right = source.right;\n\t\t\tthis.top = source.top;\n\t\t\tthis.bottom = source.bottom;\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\n\t\t\tthis.zoom = source.zoom;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetViewOffset: function( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\t\tvar dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\t\tvar cx = ( this.right + this.left ) / 2;\n\t\t\tvar cy = ( this.top + this.bottom ) / 2;\n\n\t\t\tvar left = cx - dx;\n\t\t\tvar right = cx + dx;\n\t\t\tvar top = cy + dy;\n\t\t\tvar bottom = cy - dy;\n\n\t\t\tif ( this.view !== null ) {\n\n\t\t\t\tvar zoomW = this.zoom / ( this.view.width / this.view.fullWidth );\n\t\t\t\tvar zoomH = this.zoom / ( this.view.height / this.view.fullHeight );\n\t\t\t\tvar scaleW = ( this.right - this.left ) / this.view.width;\n\t\t\t\tvar scaleH = ( this.top - this.bottom ) / this.view.height;\n\n\t\t\t\tleft += scaleW * ( this.view.offsetX / zoomW );\n\t\t\t\tright = left + scaleW * ( this.view.width / zoomW );\n\t\t\t\ttop -= scaleH * ( this.view.offsetY / zoomH );\n\t\t\t\tbottom = top - scaleH * ( this.view.height / zoomH );\n\n\t\t\t}\n\n\t\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.zoom = this.zoom;\n\t\t\tdata.object.left = this.left;\n\t\t\tdata.object.right = this.right;\n\t\t\tdata.object.top = this.top;\n\t\t\tdata.object.bottom = this.bottom;\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLIndexedBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tvar type, size;\n\n\t\tfunction setIndex( index ) {\n\n\t\t\tif ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\t\ttype = gl.UNSIGNED_INT;\n\t\t\t\tsize = 4;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\t\t\t\tsize = 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawElements( mode, count, type, start * size );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry, start, count ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\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\textension.drawElementsInstancedANGLE( mode, count, type, start * size, geometry.maxInstancedCount );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tsetMode: setMode,\n\t\t\tsetIndex: setIndex,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawArrays( mode, start, count );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\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\tvar position = geometry.attributes.position;\n\n\t\t\tvar count = 0;\n\n\t\t\tif ( (position && position.isInterleavedBufferAttribute) ) {\n\n\t\t\t\tcount = position.data.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t} else {\n\n\t\t\t\tcount = position.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t}\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\n\t\t}\n\n\t\treturn {\n\t\t\tsetMode: setMode,\n\t\t\trender: render,\n\t\t\trenderInstances: renderInstances\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLLights() {\n\n\t\tvar lights = {};\n\n\t\treturn {\n\n\t\t\tget: function ( light ) {\n\n\t\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\t\treturn lights[ light.id ];\n\n\t\t\t\t}\n\n\t\t\t\tvar uniforms;\n\n\t\t\t\tswitch ( light.type ) {\n\n\t\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\t\treturn uniforms;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction addLineNumbers( string ) {\n\n\t\tvar lines = string.split( '\\n' );\n\n\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t\t}\n\n\t\treturn lines.join( '\\n' );\n\n\t}\n\n\tfunction WebGLShader( gl, type, string ) {\n\n\t\tvar shader = gl.createShader( type );\n\n\t\tgl.shaderSource( shader, string );\n\t\tgl.compileShader( shader );\n\n\t\tif ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {\n\n\t\t\tconsole.error( 'THREE.WebGLShader: Shader couldn\\'t compile.' );\n\n\t\t}\n\n\t\tif ( gl.getShaderInfoLog( shader ) !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );\n\n\t\t}\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\treturn shader;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar programIdCount = 0;\n\n\tfunction getEncodingComponents( encoding ) {\n\n\t\tswitch ( encoding ) {\n\n\t\t\tcase LinearEncoding:\n\t\t\t\treturn [ 'Linear','( value )' ];\n\t\t\tcase sRGBEncoding:\n\t\t\t\treturn [ 'sRGB','( value )' ];\n\t\t\tcase RGBEEncoding:\n\t\t\t\treturn [ 'RGBE','( value )' ];\n\t\t\tcase RGBM7Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 7.0 )' ];\n\t\t\tcase RGBM16Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 16.0 )' ];\n\t\t\tcase RGBDEncoding:\n\t\t\t\treturn [ 'RGBD','( value, 256.0 )' ];\n\t\t\tcase GammaEncoding:\n\t\t\t\treturn [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ];\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported encoding: ' + encoding );\n\n\t\t}\n\n\t}\n\n\tfunction getTexelDecodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return \" + components[ 0 ] + \"ToLinear\" + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return LinearTo\" + components[ 0 ] + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\t\tvar toneMappingName;\n\n\t\tswitch ( toneMapping ) {\n\n\t\t\tcase LinearToneMapping:\n\t\t\t\ttoneMappingName = \"Linear\";\n\t\t\t\tbreak;\n\n\t\t\tcase ReinhardToneMapping:\n\t\t\t\ttoneMappingName = \"Reinhard\";\n\t\t\t\tbreak;\n\n\t\t\tcase Uncharted2ToneMapping:\n\t\t\t\ttoneMappingName = \"Uncharted2\";\n\t\t\t\tbreak;\n\n\t\t\tcase CineonToneMapping:\n\t\t\t\ttoneMappingName = \"OptimizedCineon\";\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported toneMapping: ' + toneMapping );\n\n\t\t}\n\n\t\treturn \"vec3 \" + functionName + \"( vec3 color ) { return \" + toneMappingName + \"ToneMapping( color ); }\";\n\n\t}\n\n\tfunction generateExtensions( extensions, parameters, rendererExtensions ) {\n\n\t\textensions = extensions || {};\n\n\t\tvar chunks = [\n\t\t\t( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t\t( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t\t( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t\t( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : '',\n\t\t];\n\n\t\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tfunction generateDefines( defines ) {\n\n\t\tvar chunks = [];\n\n\t\tfor ( var name in defines ) {\n\n\t\t\tvar value = defines[ name ];\n\n\t\t\tif ( value === false ) continue;\n\n\t\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t\t}\n\n\t\treturn chunks.join( '\\n' );\n\n\t}\n\n\tfunction fetchAttributeLocations( gl, program, identifiers ) {\n\n\t\tvar attributes = {};\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\t\tfor ( var i = 0; i < n; i ++ ) {\n\n\t\t\tvar info = gl.getActiveAttrib( program, i );\n\t\t\tvar name = info.name;\n\n\t\t\t// console.log(\"THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:\", name, i );\n\n\t\t\tattributes[ name ] = gl.getAttribLocation( program, name );\n\n\t\t}\n\n\t\treturn attributes;\n\n\t}\n\n\tfunction filterEmptyLine( string ) {\n\n\t\treturn string !== '';\n\n\t}\n\n\tfunction replaceLightNums( string, parameters ) {\n\n\t\treturn string\n\t\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );\n\n\t}\n\n\tfunction parseIncludes( string ) {\n\n\t\tvar pattern = /#include +<([\\w\\d.]+)>/g;\n\n\t\tfunction replace( match, include ) {\n\n\t\t\tvar replace = ShaderChunk[ include ];\n\n\t\t\tif ( replace === undefined ) {\n\n\t\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t\t}\n\n\t\t\treturn parseIncludes( replace );\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction unrollLoops( string ) {\n\n\t\tvar pattern = /for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\n\n\t\tfunction replace( match, start, end, snippet ) {\n\n\t\t\tvar unroll = '';\n\n\t\t\tfor ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\t\t\tunroll += snippet.replace( /\\[ i \\]/g, '[ ' + i + ' ]' );\n\n\t\t\t}\n\n\t\t\treturn unroll;\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction WebGLProgram( renderer, code, material, parameters ) {\n\n\t\tvar gl = renderer.context;\n\n\t\tvar extensions = material.extensions;\n\t\tvar defines = material.defines;\n\n\t\tvar vertexShader = material.__webglShader.vertexShader;\n\t\tvar fragmentShader = material.__webglShader.fragmentShader;\n\n\t\tvar shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\t\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t\t}\n\n\t\tvar envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\tvar envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\t\tvar envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\n\t\tif ( parameters.envMap ) {\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeReflectionMapping:\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EquirectangularReflectionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SphericalReflectionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_SPHERE';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.combine ) {\n\n\t\t\t\tcase MultiplyOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MixOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AddOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;\n\n\t\t// console.log( 'building new program ' );\n\n\t\t//\n\n\t\tvar customExtensions = generateExtensions( extensions, parameters, renderer.extensions );\n\n\t\tvar customDefines = generateDefines( defines );\n\n\t\t//\n\n\t\tvar program = gl.createProgram();\n\n\t\tvar prefixVertex, prefixFragment;\n\n\t\tif ( material.isRawShaderMaterial ) {\n\n\t\t\tprefixVertex = [\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t} else {\n\n\t\t\tprefixVertex = [\n\n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t'attribute vec3 position;',\n\t\t\t\t'attribute vec3 normal;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'#ifdef USE_COLOR',\n\n\t\t\t\t'\tattribute vec3 color;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_MORPHTARGETS',\n\n\t\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t\t'\t#else',\n\n\t\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t\t'\t#endif',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + material.__webglShader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\t\t\t\t'#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection),\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.premultipliedAlpha ? \"#define PREMULTIPLIED_ALPHA\" : '',\n\n\t\t\t\tparameters.physicallyCorrectLights ? \"#define PHYSICALLY_CORRECT_LIGHTS\" : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\tparameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? \"#define TONE_MAPPING\" : '',\n\t\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\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( \"toneMapping\", parameters.toneMapping ) : '',\n\n\t\t\t\t( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\t\tparameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',\n\t\t\t\tparameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',\n\t\t\t\tparameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',\n\t\t\t\tparameters.outputEncoding ? getTexelEncodingFunction( \"linearToOutputTexel\", parameters.outputEncoding ) : '',\n\n\t\t\t\tparameters.depthPacking ? \"#define DEPTH_PACKING \" + material.depthPacking : '',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t}\n\n\t\tvertexShader = parseIncludes( vertexShader, parameters );\n\t\tvertexShader = replaceLightNums( vertexShader, parameters );\n\n\t\tfragmentShader = parseIncludes( fragmentShader, parameters );\n\t\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\n\t\tif ( ! material.isShaderMaterial ) {\n\n\t\t\tvertexShader = unrollLoops( vertexShader );\n\t\t\tfragmentShader = unrollLoops( fragmentShader );\n\n\t\t}\n\n\t\tvar vertexGlsl = prefixVertex + vertexShader;\n\t\tvar fragmentGlsl = prefixFragment + fragmentShader;\n\n\t\t// console.log( '*VERTEX*', vertexGlsl );\n\t\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\t\tvar glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\t\tvar glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\t\tgl.attachShader( program, glVertexShader );\n\t\tgl.attachShader( program, glFragmentShader );\n\n\t\t// Force a particular attribute to index 0.\n\n\t\tif ( material.index0AttributeName !== undefined ) {\n\n\t\t\tgl.bindAttribLocation( program, 0, material.index0AttributeName );\n\n\t\t} else if ( parameters.morphTargets === true ) {\n\n\t\t\t// programs with morphTargets displace position out of attribute 0\n\t\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t\t}\n\n\t\tgl.linkProgram( program );\n\n\t\tvar programLog = gl.getProgramInfoLog( program );\n\t\tvar vertexLog = gl.getShaderInfoLog( glVertexShader );\n\t\tvar fragmentLog = gl.getShaderInfoLog( glFragmentShader );\n\n\t\tvar runnable = true;\n\t\tvar haveDiagnostics = true;\n\n\t\t// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );\n\t\t// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );\n\n\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\trunnable = false;\n\n\t\t\tconsole.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog );\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\t\t\t\tmaterial: material,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t// clean up\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\t// set up caching for uniform locations\n\n\t\tvar cachedUniforms;\n\n\t\tthis.getUniforms = function() {\n\n\t\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t\tcachedUniforms =\n\t\t\t\t\t\tnew WebGLUniforms( gl, program, renderer );\n\n\t\t\t}\n\n\t\t\treturn cachedUniforms;\n\n\t\t};\n\n\t\t// set up caching for attribute locations\n\n\t\tvar cachedAttributes;\n\n\t\tthis.getAttributes = function() {\n\n\t\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t\t}\n\n\t\t\treturn cachedAttributes;\n\n\t\t};\n\n\t\t// free resource\n\n\t\tthis.destroy = function() {\n\n\t\t\tgl.deleteProgram( program );\n\t\t\tthis.program = undefined;\n\n\t\t};\n\n\t\t// DEPRECATED\n\n\t\tObject.defineProperties( this, {\n\n\t\t\tuniforms: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );\n\t\t\t\t\treturn this.getUniforms();\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tattributes: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );\n\t\t\t\t\treturn this.getAttributes();\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t} );\n\n\n\t\t//\n\n\t\tthis.id = programIdCount ++;\n\t\tthis.code = code;\n\t\tthis.usedTimes = 1;\n\t\tthis.program = program;\n\t\tthis.vertexShader = glVertexShader;\n\t\tthis.fragmentShader = glFragmentShader;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLPrograms( renderer, capabilities ) {\n\n\t\tvar programs = [];\n\n\t\tvar shaderIDs = {\n\t\t\tMeshDepthMaterial: 'depth',\n\t\t\tMeshNormalMaterial: 'normal',\n\t\t\tMeshBasicMaterial: 'basic',\n\t\t\tMeshLambertMaterial: 'lambert',\n\t\t\tMeshPhongMaterial: 'phong',\n\t\t\tMeshStandardMaterial: 'physical',\n\t\t\tMeshPhysicalMaterial: 'physical',\n\t\t\tLineBasicMaterial: 'basic',\n\t\t\tLineDashedMaterial: 'dashed',\n\t\t\tPointsMaterial: 'points'\n\t\t};\n\n\t\tvar parameterNames = [\n\t\t\t\"precision\", \"supportsVertexTextures\", \"map\", \"mapEncoding\", \"envMap\", \"envMapMode\", \"envMapEncoding\",\n\t\t\t\"lightMap\", \"aoMap\", \"emissiveMap\", \"emissiveMapEncoding\", \"bumpMap\", \"normalMap\", \"displacementMap\", \"specularMap\",\n\t\t\t\"roughnessMap\", \"metalnessMap\",\n\t\t\t\"alphaMap\", \"combine\", \"vertexColors\", \"fog\", \"useFog\", \"fogExp\",\n\t\t\t\"flatShading\", \"sizeAttenuation\", \"logarithmicDepthBuffer\", \"skinning\",\n\t\t\t\"maxBones\", \"useVertexTexture\", \"morphTargets\", \"morphNormals\",\n\t\t\t\"maxMorphTargets\", \"maxMorphNormals\", \"premultipliedAlpha\",\n\t\t\t\"numDirLights\", \"numPointLights\", \"numSpotLights\", \"numHemiLights\",\n\t\t\t\"shadowMapEnabled\", \"shadowMapType\", \"toneMapping\", 'physicallyCorrectLights',\n\t\t\t\"alphaTest\", \"doubleSided\", \"flipSided\", \"numClippingPlanes\", \"numClipIntersection\", \"depthPacking\"\n\t\t];\n\n\n\t\tfunction allocateBones( object ) {\n\n\t\t\tif ( capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture ) {\n\n\t\t\t\treturn 1024;\n\n\t\t\t} else {\n\n\t\t\t\t// default for when object is not specified\n\t\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t\t//\n\t\t\t\t// - leave some extra space for other uniforms\n\t\t\t\t// - limit here is ANGLE's 254 max uniform vectors\n\t\t\t\t// (up to 54 should be safe)\n\n\t\t\t\tvar nVertexUniforms = capabilities.maxVertexUniforms;\n\t\t\t\tvar nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\t\tvar maxBones = nVertexMatrices;\n\n\t\t\t\tif ( object !== undefined && (object && object.isSkinnedMesh) ) {\n\n\t\t\t\t\tmaxBones = Math.min( object.skeleton.bones.length, maxBones );\n\n\t\t\t\t\tif ( maxBones < object.skeleton.bones.length ) {\n\n\t\t\t\t\t\tconsole.warn( 'WebGLRenderer: too many bones - ' + object.skeleton.bones.length + ', this GPU supports just ' + maxBones + ' (try OpenGL instead of ANGLE)' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn maxBones;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getTextureEncodingFromMap( map, gammaOverrideLinear ) {\n\n\t\t\tvar encoding;\n\n\t\t\tif ( ! map ) {\n\n\t\t\t\tencoding = LinearEncoding;\n\n\t\t\t} else if ( (map && map.isTexture) ) {\n\n\t\t\t\tencoding = map.encoding;\n\n\t\t\t} else if ( (map && map.isWebGLRenderTarget) ) {\n\n\t\t\t\tconsole.warn( \"THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\tencoding = map.texture.encoding;\n\n\t\t\t}\n\n\t\t\t// add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.\n\t\t\tif ( encoding === LinearEncoding && gammaOverrideLinear ) {\n\n\t\t\t\tencoding = GammaEncoding;\n\n\t\t\t}\n\n\t\t\treturn encoding;\n\n\t\t}\n\n\t\tthis.getParameters = function ( material, lights, fog, nClipPlanes, nClipIntersection, object ) {\n\n\t\t\tvar shaderID = shaderIDs[ material.type ];\n\n\t\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t\t// (not to blow over maxLights budget)\n\n\t\t\tvar maxBones = allocateBones( object );\n\t\t\tvar precision = renderer.getPrecision();\n\n\t\t\tif ( material.precision !== null ) {\n\n\t\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar currentRenderTarget = renderer.getCurrentRenderTarget();\n\n\t\t\tvar parameters = {\n\n\t\t\t\tshaderID: shaderID,\n\n\t\t\t\tprecision: precision,\n\t\t\t\tsupportsVertexTextures: capabilities.vertexTextures,\n\t\t\t\toutputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ),\n\t\t\t\tmap: !! material.map,\n\t\t\t\tmapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),\n\t\t\t\tenvMap: !! material.envMap,\n\t\t\t\tenvMapMode: material.envMap && material.envMap.mapping,\n\t\t\t\tenvMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),\n\t\t\t\tenvMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\t\tlightMap: !! material.lightMap,\n\t\t\t\taoMap: !! material.aoMap,\n\t\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\t\temissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),\n\t\t\t\tbumpMap: !! material.bumpMap,\n\t\t\t\tnormalMap: !! material.normalMap,\n\t\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\t\tspecularMap: !! material.specularMap,\n\t\t\t\talphaMap: !! material.alphaMap,\n\n\t\t\t\tcombine: material.combine,\n\n\t\t\t\tvertexColors: material.vertexColors,\n\n\t\t\t\tfog: !! fog,\n\t\t\t\tuseFog: material.fog,\n\t\t\t\tfogExp: (fog && fog.isFogExp2),\n\n\t\t\t\tflatShading: material.shading === FlatShading,\n\n\t\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\t\tlogarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,\n\n\t\t\t\tskinning: material.skinning,\n\t\t\t\tmaxBones: maxBones,\n\t\t\t\tuseVertexTexture: capabilities.floatVertexTextures && object && object.skeleton && object.skeleton.useVertexTexture,\n\n\t\t\t\tmorphTargets: material.morphTargets,\n\t\t\t\tmorphNormals: material.morphNormals,\n\t\t\t\tmaxMorphTargets: renderer.maxMorphTargets,\n\t\t\t\tmaxMorphNormals: renderer.maxMorphNormals,\n\n\t\t\t\tnumDirLights: lights.directional.length,\n\t\t\t\tnumPointLights: lights.point.length,\n\t\t\t\tnumSpotLights: lights.spot.length,\n\t\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\t\tnumClippingPlanes: nClipPlanes,\n\t\t\t\tnumClipIntersection: nClipIntersection,\n\n\t\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && lights.shadows.length > 0,\n\t\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\t\ttoneMapping: renderer.toneMapping,\n\t\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\t\talphaTest: material.alphaTest,\n\t\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\t\tflipSided: material.side === BackSide,\n\n\t\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false\n\n\t\t\t};\n\n\t\t\treturn parameters;\n\n\t\t};\n\n\t\tthis.getProgramCode = function ( material, parameters ) {\n\n\t\t\tvar array = [];\n\n\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\tarray.push( parameters.shaderID );\n\n\t\t\t} else {\n\n\t\t\t\tarray.push( material.fragmentShader );\n\t\t\t\tarray.push( material.vertexShader );\n\n\t\t\t}\n\n\t\t\tif ( material.defines !== undefined ) {\n\n\t\t\t\tfor ( var name in material.defines ) {\n\n\t\t\t\t\tarray.push( name );\n\t\t\t\t\tarray.push( material.defines[ name ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < parameterNames.length; i ++ ) {\n\n\t\t\t\tarray.push( parameters[ parameterNames[ i ] ] );\n\n\t\t\t}\n\n\t\t\treturn array.join();\n\n\t\t};\n\n\t\tthis.acquireProgram = function ( material, parameters, code ) {\n\n\t\t\tvar program;\n\n\t\t\t// Check if code has been already compiled\n\t\t\tfor ( var p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\t\tvar programInfo = programs[ p ];\n\n\t\t\t\tif ( programInfo.code === code ) {\n\n\t\t\t\t\tprogram = programInfo;\n\t\t\t\t\t++ program.usedTimes;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tprogram = new WebGLProgram( renderer, code, material, parameters );\n\t\t\t\tprograms.push( program );\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t};\n\n\t\tthis.releaseProgram = function( program ) {\n\n\t\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t\t// Remove from unordered set\n\t\t\t\tvar i = programs.indexOf( program );\n\t\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\t\tprograms.pop();\n\n\t\t\t\t// Free WebGL resources\n\t\t\t\tprogram.destroy();\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tthis.programs = programs;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLGeometries( gl, properties, info ) {\n\n\t\tvar geometries = {};\n\n\t\tfunction onGeometryDispose( event ) {\n\n\t\t\tvar geometry = event.target;\n\t\t\tvar buffergeometry = geometries[ geometry.id ];\n\n\t\t\tif ( buffergeometry.index !== null ) {\n\n\t\t\t\tdeleteAttribute( buffergeometry.index );\n\n\t\t\t}\n\n\t\t\tdeleteAttributes( buffergeometry.attributes );\n\n\t\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\t\tdelete geometries[ geometry.id ];\n\n\t\t\t// TODO\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe ) {\n\n\t\t\t\tdeleteAttribute( property.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( geometry );\n\n\t\t\tvar bufferproperty = properties.get( buffergeometry );\n\n\t\t\tif ( bufferproperty.wireframe ) {\n\n\t\t\t\tdeleteAttribute( bufferproperty.wireframe );\n\n\t\t\t}\n\n\t\t\tproperties.delete( buffergeometry );\n\n\t\t\t//\n\n\t\t\tinfo.memory.geometries --;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction deleteAttribute( attribute ) {\n\n\t\t\tvar buffer = getAttributeBuffer( attribute );\n\n\t\t\tif ( buffer !== undefined ) {\n\n\t\t\t\tgl.deleteBuffer( buffer );\n\t\t\t\tremoveAttributeBuffer( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction deleteAttributes( attributes ) {\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tdeleteAttribute( attributes[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction removeAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tproperties.delete( attribute.data );\n\n\t\t\t} else {\n\n\t\t\t\tproperties.delete( attribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometries[ geometry.id ] !== undefined ) {\n\n\t\t\t\t\treturn geometries[ geometry.id ];\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\t\t\tvar buffergeometry;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tbuffergeometry = geometry;\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tif ( geometry._bufferGeometry === undefined ) {\n\n\t\t\t\t\t\tgeometry._bufferGeometry = new BufferGeometry().setFromObject( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbuffergeometry = geometry._bufferGeometry;\n\n\t\t\t\t}\n\n\t\t\t\tgeometries[ geometry.id ] = buffergeometry;\n\n\t\t\t\tinfo.memory.geometries ++;\n\n\t\t\t\treturn buffergeometry;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLObjects( gl, properties, info ) {\n\n\t\tvar geometries = new WebGLGeometries( gl, properties, info );\n\n\t\t//\n\n\t\tfunction update( object ) {\n\n\t\t\t// TODO: Avoid updating twice (when using shadowMap). Maybe add frame counter.\n\n\t\t\tvar geometry = geometries.get( object );\n\n\t\t\tif ( object.geometry.isGeometry ) {\n\n\t\t\t\tgeometry.updateFromObject( object );\n\n\t\t\t}\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tupdateAttribute( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tupdateAttribute( attributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\tfor ( var name in morphAttributes ) {\n\n\t\t\t\tvar array = morphAttributes[ name ];\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\t\tupdateAttribute( array[ i ], gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction updateAttribute( attribute, bufferType ) {\n\n\t\t\tvar data = ( attribute.isInterleavedBufferAttribute ) ? attribute.data : attribute;\n\n\t\t\tvar attributeProperties = properties.get( data );\n\n\t\t\tif ( attributeProperties.__webglBuffer === undefined ) {\n\n\t\t\t\tcreateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t} else if ( attributeProperties.version !== data.version ) {\n\n\t\t\t\tupdateBuffer( attributeProperties, data, bufferType );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tattributeProperties.__webglBuffer = gl.createBuffer();\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tvar usage = data.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;\n\n\t\t\tgl.bufferData( bufferType, data.array, usage );\n\n\t\t\tattributeProperties.version = data.version;\n\n\t\t}\n\n\t\tfunction updateBuffer( attributeProperties, data, bufferType ) {\n\n\t\t\tgl.bindBuffer( bufferType, attributeProperties.__webglBuffer );\n\n\t\t\tif ( data.dynamic === false ) {\n\n\t\t\t\tgl.bufferData( bufferType, data.array, gl.STATIC_DRAW );\n\n\t\t\t} else if ( data.updateRange.count === - 1 ) {\n\n\t\t\t\t// Not using update ranges\n\n\t\t\t\tgl.bufferSubData( bufferType, 0, data.array );\n\n\t\t\t} else if ( data.updateRange.count === 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, data.updateRange.offset * data.array.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t data.array.subarray( data.updateRange.offset, data.updateRange.offset + data.updateRange.count ) );\n\n\t\t\t\tdata.updateRange.count = 0; // reset range\n\n\t\t\t}\n\n\t\t\tattributeProperties.version = data.version;\n\n\t\t}\n\n\t\tfunction getAttributeBuffer( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\treturn properties.get( attribute.data ).__webglBuffer;\n\n\t\t\t}\n\n\t\t\treturn properties.get( attribute ).__webglBuffer;\n\n\t\t}\n\n\t\tfunction getWireframeAttribute( geometry ) {\n\n\t\t\tvar property = properties.get( geometry );\n\n\t\t\tif ( property.wireframe !== undefined ) {\n\n\t\t\t\treturn property.wireframe;\n\n\t\t\t}\n\n\t\t\tvar indices = [];\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar attributes = geometry.attributes;\n\t\t\tvar position = attributes.position;\n\n\t\t\t// console.time( 'wireframe' );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar edges = {};\n\t\t\t\tvar array = index.array;\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = array[ i + 0 ];\n\t\t\t\t\tvar b = array[ i + 1 ];\n\t\t\t\t\tvar c = array[ i + 2 ];\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar array = attributes.position.array;\n\n\t\t\t\tfor ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = i + 0;\n\t\t\t\t\tvar b = i + 1;\n\t\t\t\t\tvar c = i + 2;\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// console.timeEnd( 'wireframe' );\n\n\t\t\tvar TypeArray = position.count > 65535 ? Uint32Array : Uint16Array;\n\t\t\tvar attribute = new BufferAttribute( new TypeArray( indices ), 1 );\n\n\t\t\tupdateAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\tproperty.wireframe = attribute;\n\n\t\t\treturn attribute;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tgetAttributeBuffer: getAttributeBuffer,\n\t\t\tgetWireframeAttribute: getWireframeAttribute,\n\n\t\t\tupdate: update\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, info ) {\n\n\t\tvar _infoMemory = info.memory;\n\t\tvar _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext );\n\n\t\t//\n\n\t\tfunction clampToMaxSize( image, maxSize ) {\n\n\t\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\t\t// Warning: Scaling through the canvas will only work with images that use\n\t\t\t\t// premultiplied alpha.\n\n\t\t\t\tvar scale = maxSize / Math.max( image.width, image.height );\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = Math.floor( image.width * scale );\n\t\t\t\tcanvas.height = Math.floor( image.height * scale );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction isPowerOfTwo( image ) {\n\n\t\t\treturn _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height );\n\n\t\t}\n\n\t\tfunction makePowerOfTwo( image ) {\n\n\t\t\tif ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) {\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = _Math.nearestPowerOfTwo( image.width );\n\t\t\t\tcanvas.height = _Math.nearestPowerOfTwo( image.height );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) return true;\n\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) return true;\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// Fallback filters for non-power-of-2 textures\n\n\t\tfunction filterFallback( f ) {\n\n\t\t\tif ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) {\n\n\t\t\t\treturn _gl.NEAREST;\n\n\t\t\t}\n\n\t\t\treturn _gl.LINEAR;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction onTextureDispose( event ) {\n\n\t\t\tvar texture = event.target;\n\n\t\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\t\tdeallocateTexture( texture );\n\n\t\t\t_infoMemory.textures --;\n\n\n\t\t}\n\n\t\tfunction onRenderTargetDispose( event ) {\n\n\t\t\tvar renderTarget = event.target;\n\n\t\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\tdeallocateRenderTarget( renderTarget );\n\n\t\t\t_infoMemory.textures --;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction deallocateTexture( texture ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image && textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__image__webglTextureCube );\n\n\t\t\t} else {\n\n\t\t\t\t// 2D texture\n\n\t\t\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\t// remove all webgl properties\n\t\t\tproperties.delete( texture );\n\n\t\t}\n\n\t\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\tif ( ! renderTarget ) return;\n\n\t\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\t}\n\n\t\t\tif ( (renderTarget && renderTarget.isWebGLRenderTargetCube) ) {\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\n\t\t\t}\n\n\t\t\tproperties.delete( renderTarget.texture );\n\t\t\tproperties.delete( renderTarget );\n\n\t\t}\n\n\t\t//\n\n\n\n\t\tfunction setTexture2D( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\tvar image = texture.image;\n\n\t\t\t\tif ( image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture );\n\n\t\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureCube( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image.length === 6 ) {\n\n\t\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\t\tif ( ! textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\ttextureProperties.__image__webglTextureCube = _gl.createTexture();\n\n\t\t\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\n\t\t\t\t\tvar isCompressed = (texture && texture.isCompressedTexture);\n\t\t\t\t\tvar isDataTexture = (texture.image[ 0 ] && texture.image[ 0 ].isDataTexture);\n\n\t\t\t\t\tvar cubeImage = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar image = cubeImage[ 0 ],\n\t\t\t\t\tisPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage );\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed ) {\n\n\t\t\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar mipmap, mipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\t\t\tfor ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\t\tmipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()\" );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\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\tif ( texture.generateMipmaps && isPowerOfTwoImage ) {\n\n\t\t\t\t\t\t_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setTextureCubeDynamic( texture, slot ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureParameters( textureType, texture, isPowerOfTwoImage ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( isPowerOfTwoImage ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) );\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\n\n\t\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );\n\n\t\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\textension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension ) {\n\n\t\t\t\tif ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;\n\t\t\t\tif ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return;\n\n\t\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t_infoMemory.textures ++;\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\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\n\t\t\tvar image = clampToMaxSize( texture.image, capabilities.maxTextureSize );\n\n\t\t\tif ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) {\n\n\t\t\t\timage = makePowerOfTwo( image );\n\n\t\t\t}\n\n\t\t\tvar isPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\tglFormat = paramThreeToGL( texture.format ),\n\t\t\tglType = paramThreeToGL( texture.type );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage );\n\n\t\t\tvar mipmap, mipmaps = texture.mipmaps;\n\n\t\t\tif ( (texture && texture.isDepthTexture) ) {\n\n\t\t\t\t// populate depth texture with dummy data\n\n\t\t\t\tvar internalFormat = _gl.DEPTH_COMPONENT;\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tif ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0');\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t} else if ( _isWebGL2 ) {\n\n\t\t\t\t\t// WebGL 2.0 requires signed internalformat for glTexImage2D\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t\t}\n\n\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.format === DepthStencilFormat ) {\n\n\t\t\t\t\tinternalFormat = _gl.DEPTH_STENCIL;\n\n\t\t\t\t}\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t} else if ( (texture && 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 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( (texture && texture.isCompressedTexture) ) {\n\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\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}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\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 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );\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\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\n\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\t// Render targets\n\n\t\t// Setup storage for target texture and bind it to correct framebuffer\n\t\tfunction setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {\n\n\t\t\tvar glFormat = paramThreeToGL( renderTarget.texture.format );\n\t\t\tvar glType = paramThreeToGL( renderTarget.texture.type );\n\t\t\tstate.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\t\tfunction setupRenderBufferStorage( renderbuffer, renderTarget ) {\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else {\n\n\t\t\t\t// FIXME: We don't support !depth !stencil\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t}\n\n\t\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\t\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\t\tvar isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) );\n\t\t\tif ( isCube ) throw new Error('Depth Texture with cube render targets is not supported!');\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( !( (renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture) ) ) {\n\n\t\t\t\tthrow new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture');\n\n\t\t\t}\n\n\t\t\t// upload an empty depth texture with framebuffer size\n\t\t\tif ( !properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\t\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\t\t\t}\n\n\t\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\t\tvar webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\n\t\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error('Unknown depthTexture format')\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup GL resources for a non-texture depth buffer\n\t\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\tvar isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) );\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\tif ( isCube ) throw new Error('target.depthTexture not supported in Cube render targets');\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Set up GL resources for the render target\n\t\tfunction setupRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t_infoMemory.textures ++;\n\n\t\t\tvar isCube = ( (renderTarget && renderTarget.isWebGLRenderTargetCube) );\n\t\t\tvar isTargetPowerOfTwo = isPowerOfTwo( renderTarget );\n\n\t\t\t// Setup framebuffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _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\t// Setup color buffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );\n\n\t\t\t\tif ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, null );\n\n\t\t\t}\n\n\t\t\t// Setup depth and stencil buffers\n\n\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\t\tvar texture = renderTarget.texture;\n\n\t\t\tif ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) &&\n\t\t\t\t\ttexture.minFilter !== NearestFilter &&\n\t\t\t\t\ttexture.minFilter !== LinearFilter ) {\n\n\t\t\t\tvar target = (renderTarget && renderTarget.isWebGLRenderTargetCube) ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\t\t\t\tvar webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\t_gl.generateMipmap( target );\n\t\t\t\tstate.bindTexture( target, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setTexture2D = setTexture2D;\n\t\tthis.setTextureCube = setTextureCube;\n\t\tthis.setTextureCubeDynamic = setTextureCubeDynamic;\n\t\tthis.setupRenderTarget = setupRenderTarget;\n\t\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\n\t}\n\n\t/**\n\t * @author fordacious / fordacious.github.io\n\t */\n\n\tfunction WebGLProperties() {\n\n\t\tvar properties = {};\n\n\t\treturn {\n\n\t\t\tget: function ( object ) {\n\n\t\t\t\tvar uuid = object.uuid;\n\t\t\t\tvar map = properties[ uuid ];\n\n\t\t\t\tif ( map === undefined ) {\n\n\t\t\t\t\tmap = {};\n\t\t\t\t\tproperties[ uuid ] = map;\n\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\n\t\t\t},\n\n\t\t\tdelete: function ( object ) {\n\n\t\t\t\tdelete properties[ object.uuid ];\n\n\t\t\t},\n\n\t\t\tclear: function () {\n\n\t\t\t\tproperties = {};\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLState( gl, extensions, paramThreeToGL ) {\n\n\t\tfunction ColorBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar color = new Vector4();\n\t\t\tvar currentColorMask = null;\n\t\t\tvar currentColorClear = new Vector4();\n\n\t\t\treturn {\n\n\t\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( r, g, b, a ) {\n\n\t\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentColorMask = null;\n\t\t\t\t\tcurrentColorClear.set( 0, 0, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction DepthBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentDepthMask = null;\n\t\t\tvar currentDepthFunc = null;\n\t\t\tvar currentDepthClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\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\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentDepthMask = null;\n\t\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction StencilBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentStencilMask = null;\n\t\t\tvar currentStencilFunc = null;\n\t\t\tvar currentStencilRef = null;\n\t\t\tvar currentStencilFuncMask = null;\n\t\t\tvar currentStencilFail = null;\n\t\t\tvar currentStencilZFail = null;\n\t\t\tvar currentStencilZPass = null;\n\t\t\tvar currentStencilClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( stencilTest ) {\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\tsetMask: function ( stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t\t currentStencilRef \t!== stencilRef \t||\n\t\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\t\tif ( currentStencilFail\t !== stencilFail \t||\n\t\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentStencilMask = null;\n\t\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\t\tcurrentStencilRef = null;\n\t\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\t\tcurrentStencilFail = null;\n\t\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t//\n\n\t\tvar colorBuffer = new ColorBuffer();\n\t\tvar depthBuffer = new DepthBuffer();\n\t\tvar stencilBuffer = new StencilBuffer();\n\n\t\tvar maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar newAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar enabledAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar attributeDivisors = new Uint8Array( maxVertexAttributes );\n\n\t\tvar capabilities = {};\n\n\t\tvar compressedTextureFormats = null;\n\n\t\tvar currentBlending = null;\n\t\tvar currentBlendEquation = null;\n\t\tvar currentBlendSrc = null;\n\t\tvar currentBlendDst = null;\n\t\tvar currentBlendEquationAlpha = null;\n\t\tvar currentBlendSrcAlpha = null;\n\t\tvar currentBlendDstAlpha = null;\n\t\tvar currentPremultipledAlpha = false;\n\n\t\tvar currentFlipSided = null;\n\t\tvar currentCullFace = null;\n\n\t\tvar currentLineWidth = null;\n\n\t\tvar currentPolygonOffsetFactor = null;\n\t\tvar currentPolygonOffsetUnits = null;\n\n\t\tvar currentScissorTest = null;\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\n\t\tvar currentTextureSlot = null;\n\t\tvar currentBoundTextures = {};\n\n\t\tvar currentScissor = new Vector4();\n\t\tvar currentViewport = new Vector4();\n\n\t\tfunction createTexture( type, target, count ) {\n\n\t\t\tvar data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\t\tvar texture = gl.createTexture();\n\n\t\t\tgl.bindTexture( type, texture );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\t\tfor ( var i = 0; i < count; i ++ ) {\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\treturn texture;\n\n\t\t}\n\n\t\tvar emptyTextures = {};\n\t\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\t\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\n\t\t//\n\n\t\tfunction init() {\n\n\t\t\tclearColor( 0, 0, 0, 1 );\n\t\t\tclearDepth( 1 );\n\t\t\tclearStencil( 0 );\n\n\t\t\tenable( gl.DEPTH_TEST );\n\t\t\tsetDepthFunc( LessEqualDepth );\n\n\t\t\tsetFlipSided( false );\n\t\t\tsetCullFace( CullFaceBack );\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tenable( gl.BLEND );\n\t\t\tsetBlending( NormalBlending );\n\n\t\t}\n\n\t\tfunction initAttributes() {\n\n\t\t\tfor ( var i = 0, l = newAttributes.length; i < l; i ++ ) {\n\n\t\t\t\tnewAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttribute( attribute ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== 0 ) {\n\n\t\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, 0 );\n\t\t\t\tattributeDivisors[ attribute ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute, extension ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, meshPerAttribute );\n\t\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disableUnusedAttributes() {\n\n\t\t\tfor ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== true ) {\n\n\t\t\t\tgl.enable( id );\n\t\t\t\tcapabilities[ id ] = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== false ) {\n\n\t\t\t\tgl.disable( id );\n\t\t\t\tcapabilities[ id ] = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getCompressedTextureFormats() {\n\n\t\t\tif ( compressedTextureFormats === null ) {\n\n\t\t\t\tcompressedTextureFormats = [];\n\n\t\t\t\tif ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_s3tc' ) ||\n\t\t\t\t extensions.get( 'WEBGL_compressed_texture_etc1' ) ) {\n\n\t\t\t\t\tvar formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS );\n\n\t\t\t\t\tfor ( var i = 0; i < formats.length; i ++ ) {\n\n\t\t\t\t\t\tcompressedTextureFormats.push( formats[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn compressedTextureFormats;\n\n\t\t}\n\n\t\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\t\tif ( blending !== NoBlending ) {\n\n\t\t\t\tenable( gl.BLEND );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.BLEND );\n\n\t\t\t}\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( blending === AdditiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === SubtractiveBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( blending === MultiplyBlending ) {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\tif ( blending === CustomBlending ) {\n\n\t\t\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\t\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\t\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\t\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\t\t\tgl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) );\n\n\t\t\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t\t\t}\n\n\t\t\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\t\t\tgl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) );\n\n\t\t\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\t\t\tcurrentBlendDst = blendDst;\n\t\t\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tcurrentBlendEquation = null;\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendEquationAlpha = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Deprecate\n\n\t\tfunction setColorWrite( colorWrite ) {\n\n\t\t\tcolorBuffer.setMask( colorWrite );\n\n\t\t}\n\n\t\tfunction setDepthTest( depthTest ) {\n\n\t\t\tdepthBuffer.setTest( depthTest );\n\n\t\t}\n\n\t\tfunction setDepthWrite( depthWrite ) {\n\n\t\t\tdepthBuffer.setMask( depthWrite );\n\n\t\t}\n\n\t\tfunction setDepthFunc( depthFunc ) {\n\n\t\t\tdepthBuffer.setFunc( depthFunc );\n\n\t\t}\n\n\t\tfunction setStencilTest( stencilTest ) {\n\n\t\t\tstencilBuffer.setTest( stencilTest );\n\n\t\t}\n\n\t\tfunction setStencilWrite( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( stencilWrite );\n\n\t\t}\n\n\t\tfunction setStencilFunc( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\tstencilBuffer.setFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t}\n\n\t\tfunction setStencilOp( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\tstencilBuffer.setOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction setFlipSided( flipSided ) {\n\n\t\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\t\tif ( flipSided ) {\n\n\t\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t\t}\n\n\t\t\t\tcurrentFlipSided = flipSided;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setCullFace( cullFace ) {\n\n\t\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\t\tenable( gl.CULL_FACE );\n\n\t\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.CULL_FACE );\n\n\t\t\t}\n\n\t\t\tcurrentCullFace = cullFace;\n\n\t\t}\n\n\t\tfunction setLineWidth( width ) {\n\n\t\t\tif ( width !== currentLineWidth ) {\n\n\t\t\t\tgl.lineWidth( width );\n\n\t\t\t\tcurrentLineWidth = width;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\t\tif ( polygonOffset ) {\n\n\t\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getScissorTest() {\n\n\t\t\treturn currentScissorTest;\n\n\t\t}\n\n\t\tfunction setScissorTest( scissorTest ) {\n\n\t\t\tcurrentScissorTest = scissorTest;\n\n\t\t\tif ( scissorTest ) {\n\n\t\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// texture\n\n\t\tfunction activeTexture( webglSlot ) {\n\n\t\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\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}\n\n\t\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\tactiveTexture();\n\n\t\t\t}\n\n\t\t\tvar boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\t\tif ( boundTexture === undefined ) {\n\n\t\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t\t}\n\n\t\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\t\tboundTexture.type = webglType;\n\t\t\t\tboundTexture.texture = webglTexture;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction compressedTexImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction texImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Deprecate\n\n\t\tfunction clearColor( r, g, b, a ) {\n\n\t\t\tcolorBuffer.setClear( r, g, b, a );\n\n\t\t}\n\n\t\tfunction clearDepth( depth ) {\n\n\t\t\tdepthBuffer.setClear( depth );\n\n\t\t}\n\n\t\tfunction clearStencil( stencil ) {\n\n\t\t\tstencilBuffer.setClear( stencil );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction scissor( scissor ) {\n\n\t\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\t\tcurrentScissor.copy( scissor );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction viewport( viewport ) {\n\n\t\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\t\tcurrentViewport.copy( viewport );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction reset() {\n\n\t\t\tfor ( var i = 0; i < enabledAttributes.length; i ++ ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] === 1 ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcapabilities = {};\n\n\t\t\tcompressedTextureFormats = null;\n\n\t\t\tcurrentTextureSlot = null;\n\t\t\tcurrentBoundTextures = {};\n\n\t\t\tcurrentBlending = null;\n\n\t\t\tcurrentFlipSided = null;\n\t\t\tcurrentCullFace = null;\n\n\t\t\tcolorBuffer.reset();\n\t\t\tdepthBuffer.reset();\n\t\t\tstencilBuffer.reset();\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tbuffers: {\n\t\t\t\tcolor: colorBuffer,\n\t\t\t\tdepth: depthBuffer,\n\t\t\t\tstencil: stencilBuffer\n\t\t\t},\n\n\t\t\tinit: init,\n\t\t\tinitAttributes: initAttributes,\n\t\t\tenableAttribute: enableAttribute,\n\t\t\tenableAttributeAndDivisor: enableAttributeAndDivisor,\n\t\t\tdisableUnusedAttributes: disableUnusedAttributes,\n\t\t\tenable: enable,\n\t\t\tdisable: disable,\n\t\t\tgetCompressedTextureFormats: getCompressedTextureFormats,\n\n\t\t\tsetBlending: setBlending,\n\n\t\t\tsetColorWrite: setColorWrite,\n\t\t\tsetDepthTest: setDepthTest,\n\t\t\tsetDepthWrite: setDepthWrite,\n\t\t\tsetDepthFunc: setDepthFunc,\n\t\t\tsetStencilTest: setStencilTest,\n\t\t\tsetStencilWrite: setStencilWrite,\n\t\t\tsetStencilFunc: setStencilFunc,\n\t\t\tsetStencilOp: setStencilOp,\n\n\t\t\tsetFlipSided: setFlipSided,\n\t\t\tsetCullFace: setCullFace,\n\n\t\t\tsetLineWidth: setLineWidth,\n\t\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\t\tgetScissorTest: getScissorTest,\n\t\t\tsetScissorTest: setScissorTest,\n\n\t\t\tactiveTexture: activeTexture,\n\t\t\tbindTexture: bindTexture,\n\t\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\t\ttexImage2D: texImage2D,\n\n\t\t\tclearColor: clearColor,\n\t\t\tclearDepth: clearDepth,\n\t\t\tclearStencil: clearStencil,\n\n\t\t\tscissor: scissor,\n\t\t\tviewport: viewport,\n\n\t\t\treset: reset\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\t\tvar maxAnisotropy;\n\n\t\tfunction getMaxAnisotropy() {\n\n\t\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\t\tvar extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t\t} else {\n\n\t\t\t\tmaxAnisotropy = 0;\n\n\t\t\t}\n\n\t\t\treturn maxAnisotropy;\n\n\t\t}\n\n\t\tfunction getMaxPrecision( precision ) {\n\n\t\t\tif ( precision === 'highp' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'highp';\n\n\t\t\t\t}\n\n\t\t\t\tprecision = 'mediump';\n\n\t\t\t}\n\n\t\t\tif ( precision === 'mediump' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\t gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'mediump';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn 'lowp';\n\n\t\t}\n\n\t\tvar precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\t\tvar maxPrecision = getMaxPrecision( precision );\n\n\t\tif ( maxPrecision !== precision ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\t\tprecision = maxPrecision;\n\n\t\t}\n\n\t\tvar logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' );\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\t\tvar maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\t\tvar maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\t\tvar maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\t\tvar maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\t\tvar vertexTextures = maxVertexTextures > 0;\n\t\tvar floatFragmentTextures = !! extensions.get( 'OES_texture_float' );\n\t\tvar floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\t\treturn {\n\n\t\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\t\tprecision: precision,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tmaxTextures: maxTextures,\n\t\t\tmaxVertexTextures: maxVertexTextures,\n\t\t\tmaxTextureSize: maxTextureSize,\n\t\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\t\tmaxAttributes: maxAttributes,\n\t\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\t\tmaxVaryings: maxVaryings,\n\t\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\t\tvertexTextures: vertexTextures,\n\t\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\t\tfloatVertexTextures: floatVertexTextures\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLExtensions( gl ) {\n\n\t\tvar extensions = {};\n\n\t\treturn {\n\n\t\t\tget: function ( name ) {\n\n\t\t\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\t\t\treturn extensions[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tvar extension;\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_etc1':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_etc1' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\textension = gl.getExtension( name );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t\t}\n\n\t\t\t\textensions[ name ] = extension;\n\n\t\t\t\treturn extension;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction WebGLClipping() {\n\n\t\tvar scope = this,\n\n\t\t\tglobalState = null,\n\t\t\tnumGlobalPlanes = 0,\n\t\t\tlocalClippingEnabled = false,\n\t\t\trenderingShadows = false,\n\n\t\t\tplane = new Plane(),\n\t\t\tviewNormalMatrix = new Matrix3(),\n\n\t\t\tuniform = { value: null, needsUpdate: false };\n\n\t\tthis.uniform = uniform;\n\t\tthis.numPlanes = 0;\n\t\tthis.numIntersection = 0;\n\n\t\tthis.init = function( planes, enableLocalClipping, camera ) {\n\n\t\t\tvar enabled =\n\t\t\t\tplanes.length !== 0 ||\n\t\t\t\tenableLocalClipping ||\n\t\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t\t// run another frame in order to reset the state:\n\t\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\t\tlocalClippingEnabled;\n\n\t\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\t\tnumGlobalPlanes = planes.length;\n\n\t\t\treturn enabled;\n\n\t\t};\n\n\t\tthis.beginShadows = function() {\n\n\t\t\trenderingShadows = true;\n\t\t\tprojectPlanes( null );\n\n\t\t};\n\n\t\tthis.endShadows = function() {\n\n\t\t\trenderingShadows = false;\n\t\t\tresetGlobalState();\n\n\t\t};\n\n\t\tthis.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) {\n\n\t\t\tif ( ! localClippingEnabled ||\n\t\t\t\t\tplanes === null || planes.length === 0 ||\n\t\t\t\t\trenderingShadows && ! clipShadows ) {\n\t\t\t\t// there's no local clipping\n\n\t\t\t\tif ( renderingShadows ) {\n\t\t\t\t\t// there's no global clipping\n\n\t\t\t\t\tprojectPlanes( null );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tresetGlobalState();\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\t\tlGlobal = nGlobal * 4,\n\n\t\t\t\t\tdstArray = cache.clippingState || null;\n\n\t\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, fromCache );\n\n\t\t\t\tfor ( var i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcache.clippingState = dstArray;\n\t\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\t\tthis.numPlanes += nGlobal;\n\n\t\t\t}\n\n\n\t\t};\n\n\t\tfunction resetGlobalState() {\n\n\t\t\tif ( uniform.value !== globalState ) {\n\n\t\t\t\tuniform.value = globalState;\n\t\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = numGlobalPlanes;\n\t\t\tscope.numIntersection = 0;\n\n\t\t}\n\n\t\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\t\tvar nPlanes = planes !== null ? planes.length : 0,\n\t\t\t\tdstArray = null;\n\n\t\t\tif ( nPlanes !== 0 ) {\n\n\t\t\t\tdstArray = uniform.value;\n\n\t\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\t\tvar flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0, i4 = dstOffset;\n\t\t\t\t\t\t\t\t\t\ti !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\t\tplane.copy( planes[ i ] ).\n\t\t\t\t\t\t\t\tapplyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tuniform.value = dstArray;\n\t\t\t\tuniform.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = nPlanes;\n\t\t\t\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t * @author tschw\n\t */\n\n\tfunction WebGLRenderer( parameters ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer', REVISION );\n\n\t\tparameters = parameters || {};\n\n\t\tvar _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),\n\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;\n\n\t\tvar lights = [];\n\n\t\tvar opaqueObjects = [];\n\t\tvar opaqueObjectsLastIndex = - 1;\n\t\tvar transparentObjects = [];\n\t\tvar transparentObjectsLastIndex = - 1;\n\n\t\tvar morphInfluences = new Float32Array( 8 );\n\n\t\tvar sprites = [];\n\t\tvar lensFlares = [];\n\n\t\t// public properties\n\n\t\tthis.domElement = _canvas;\n\t\tthis.context = null;\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.gammaFactor = 2.0;\t// for backwards compatibility\n\t\tthis.gammaInput = false;\n\t\tthis.gammaOutput = false;\n\n\t\t// physical lights\n\n\t\tthis.physicallyCorrectLights = false;\n\n\t\t// tone mapping\n\n\t\tthis.toneMapping = LinearToneMapping;\n\t\tthis.toneMappingExposure = 1.0;\n\t\tthis.toneMappingWhitePoint = 1.0;\n\n\t\t// morphs\n\n\t\tthis.maxMorphTargets = 8;\n\t\tthis.maxMorphNormals = 4;\n\n\t\t// internal properties\n\n\t\tvar _this = this,\n\n\t\t// internal state cache\n\n\t\t_currentProgram = null,\n\t\t_currentRenderTarget = null,\n\t\t_currentFramebuffer = null,\n\t\t_currentMaterialId = - 1,\n\t\t_currentGeometryProgram = '',\n\t\t_currentCamera = null,\n\n\t\t_currentScissor = new Vector4(),\n\t\t_currentScissorTest = null,\n\n\t\t_currentViewport = new Vector4(),\n\n\t\t//\n\n\t\t_usedTextureUnits = 0,\n\n\t\t//\n\n\t\t_clearColor = new Color( 0x000000 ),\n\t\t_clearAlpha = 0,\n\n\t\t_width = _canvas.width,\n\t\t_height = _canvas.height,\n\n\t\t_pixelRatio = 1,\n\n\t\t_scissor = new Vector4( 0, 0, _width, _height ),\n\t\t_scissorTest = false,\n\n\t\t_viewport = new Vector4( 0, 0, _width, _height ),\n\n\t\t// frustum\n\n\t\t_frustum = new Frustum(),\n\n\t\t// clipping\n\n\t\t_clipping = new WebGLClipping(),\n\t\t_clippingEnabled = false,\n\t\t_localClippingEnabled = false,\n\n\t\t_sphere = new Sphere(),\n\n\t\t// camera matrices cache\n\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_vector3 = new Vector3(),\n\n\t\t// light arrays cache\n\n\t\t_lights = {\n\n\t\t\thash: '',\n\n\t\t\tambient: [ 0, 0, 0 ],\n\t\t\tdirectional: [],\n\t\t\tdirectionalShadowMap: [],\n\t\t\tdirectionalShadowMatrix: [],\n\t\t\tspot: [],\n\t\t\tspotShadowMap: [],\n\t\t\tspotShadowMatrix: [],\n\t\t\tpoint: [],\n\t\t\tpointShadowMap: [],\n\t\t\tpointShadowMatrix: [],\n\t\t\themi: [],\n\n\t\t\tshadows: []\n\n\t\t},\n\n\t\t// info\n\n\t\t_infoRender = {\n\n\t\t\tcalls: 0,\n\t\t\tvertices: 0,\n\t\t\tfaces: 0,\n\t\t\tpoints: 0\n\n\t\t};\n\n\t\tthis.info = {\n\n\t\t\trender: _infoRender,\n\t\t\tmemory: {\n\n\t\t\t\tgeometries: 0,\n\t\t\t\ttextures: 0\n\n\t\t\t},\n\t\t\tprograms: null\n\n\t\t};\n\n\n\t\t// initialize\n\n\t\tvar _gl;\n\n\t\ttry {\n\n\t\t\tvar attributes = {\n\t\t\t\talpha: _alpha,\n\t\t\t\tdepth: _depth,\n\t\t\t\tstencil: _stencil,\n\t\t\t\tantialias: _antialias,\n\t\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer\n\t\t\t};\n\n\t\t\t_gl = _context || _canvas.getContext( 'webgl', attributes ) || _canvas.getContext( 'experimental-webgl', attributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( _canvas.getContext( 'webgl' ) !== null ) {\n\n\t\t\t\t\tthrow 'Error creating WebGL context with your selected attributes.';\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow 'Error creating WebGL context.';\n\n\t\t\t\t}\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\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: ' + error );\n\n\t\t}\n\n\t\tvar extensions = new WebGLExtensions( _gl );\n\n\t\textensions.get( 'WEBGL_depth_texture' );\n\t\textensions.get( 'OES_texture_float' );\n\t\textensions.get( 'OES_texture_float_linear' );\n\t\textensions.get( 'OES_texture_half_float' );\n\t\textensions.get( 'OES_texture_half_float_linear' );\n\t\textensions.get( 'OES_standard_derivatives' );\n\t\textensions.get( 'ANGLE_instanced_arrays' );\n\n\t\tif ( extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\tBufferGeometry.MaxIndex = 4294967296;\n\n\t\t}\n\n\t\tvar capabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\tvar state = new WebGLState( _gl, extensions, paramThreeToGL );\n\t\tvar properties = new WebGLProperties();\n\t\tvar textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, paramThreeToGL, this.info );\n\t\tvar objects = new WebGLObjects( _gl, properties, this.info );\n\t\tvar programCache = new WebGLPrograms( this, capabilities );\n\t\tvar lightCache = new WebGLLights();\n\n\t\tthis.info.programs = programCache.programs;\n\n\t\tvar bufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender );\n\t\tvar indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );\n\n\t\t//\n\n\t\tvar backgroundCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\t\tvar backgroundCamera2 = new PerspectiveCamera();\n\t\tvar backgroundPlaneMesh = new Mesh(\n\t\t\tnew PlaneBufferGeometry( 2, 2 ),\n\t\t\tnew MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } )\n\t\t);\n\t\tvar backgroundBoxShader = ShaderLib[ 'cube' ];\n\t\tvar backgroundBoxMesh = new Mesh(\n\t\t\tnew BoxBufferGeometry( 5, 5, 5 ),\n\t\t\tnew ShaderMaterial( {\n\t\t\t\tuniforms: backgroundBoxShader.uniforms,\n\t\t\t\tvertexShader: backgroundBoxShader.vertexShader,\n\t\t\t\tfragmentShader: backgroundBoxShader.fragmentShader,\n\t\t\t\tside: BackSide,\n\t\t\t\tdepthTest: false,\n\t\t\t\tdepthWrite: false,\n\t\t\t\tfog: false\n\t\t\t} )\n\t\t);\n\n\t\t//\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\tfunction glClearColor( r, g, b, a ) {\n\n\t\t\tif ( _premultipliedAlpha === true ) {\n\n\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t}\n\n\t\t\tstate.clearColor( r, g, b, a );\n\n\t\t}\n\n\t\tfunction setDefaultGLState() {\n\n\t\t\tstate.init();\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );\n\n\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t}\n\n\t\tfunction resetGLState() {\n\n\t\t\t_currentProgram = null;\n\t\t\t_currentCamera = null;\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\n\t\t\tstate.reset();\n\n\t\t}\n\n\t\tsetDefaultGLState();\n\n\t\tthis.context = _gl;\n\t\tthis.capabilities = capabilities;\n\t\tthis.extensions = extensions;\n\t\tthis.properties = properties;\n\t\tthis.state = state;\n\n\t\t// shadow map\n\n\t\tvar shadowMap = new WebGLShadowMap( this, _lights, objects, capabilities );\n\n\t\tthis.shadowMap = shadowMap;\n\n\n\t\t// Plugins\n\n\t\tvar spritePlugin = new SpritePlugin( this, sprites );\n\t\tvar lensFlarePlugin = new LensFlarePlugin( this, lensFlares );\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\textensions.get( 'WEBGL_lose_context' ).loseContext();\n\n\t\t};\n\n\t\tthis.getMaxAnisotropy = function () {\n\n\t\t\treturn capabilities.getMaxAnisotropy();\n\n\t\t};\n\n\t\tthis.getPrecision = function () {\n\n\t\t\treturn capabilities.precision;\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( _viewport.z, _viewport.w, false );\n\n\t\t};\n\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_canvas.width = width * _pixelRatio;\n\t\t\t_canvas.height = height * _pixelRatio;\n\n\t\t\tif ( updateStyle !== false ) {\n\n\t\t\t\t_canvas.style.width = width + 'px';\n\t\t\t\t_canvas.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.setViewport = function ( x, y, width, height ) {\n\n\t\t\tstate.viewport( _viewport.set( x, y, width, height ) );\n\n\t\t};\n\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tstate.scissor( _scissor.set( x, y, width, height ) );\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\t// Clearing\n\n\t\tthis.getClearColor = function () {\n\n\t\t\treturn _clearColor;\n\n\t\t};\n\n\t\tthis.setClearColor = function ( color, alpha ) {\n\n\t\t\t_clearColor.set( color );\n\n\t\t\t_clearAlpha = alpha !== undefined ? alpha : 1;\n\n\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t};\n\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn _clearAlpha;\n\n\t\t};\n\n\t\tthis.setClearAlpha = function ( alpha ) {\n\n\t\t\t_clearAlpha = alpha;\n\n\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t};\n\n\t\tthis.clear = function ( color, depth, stencil ) {\n\n\t\t\tvar bits = 0;\n\n\t\t\tif ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;\n\t\t\tif ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\t\tif ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;\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\tthis.clearTarget = function ( renderTarget, color, depth, stencil ) {\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\t\t\tthis.clear( color, depth, stencil );\n\n\t\t};\n\n\t\t// Reset\n\n\t\tthis.resetGLState = resetGLState;\n\n\t\tthis.dispose = function() {\n\n\t\t\ttransparentObjects = [];\n\t\t\ttransparentObjectsLastIndex = -1;\n\t\t\topaqueObjects = [];\n\t\t\topaqueObjectsLastIndex = -1;\n\n\t\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\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\tresetGLState();\n\t\t\tsetDefaultGLState();\n\n\t\t\tproperties.clear();\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tvar 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\treleaseMaterialProgramReference( material );\n\n\t\t\tproperties.delete( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReference( material ) {\n\n\t\t\tvar programInfo = properties.get( material ).program;\n\n\t\t\tmaterial.program = undefined;\n\n\t\t\tif ( programInfo !== undefined ) {\n\n\t\t\t\tprogramCache.releaseProgram( programInfo );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferImmediate = function ( object, program, material ) {\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar buffers = properties.get( object );\n\n\t\t\tif ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();\n\t\t\tif ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();\n\t\t\tif ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();\n\t\t\tif ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( object.hasPositions ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.position );\n\t\t\t\t_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasNormals ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal );\n\n\t\t\t\tif ( ! material.isMeshPhongMaterial &&\n\t\t\t\t ! material.isMeshStandardMaterial &&\n\t\t\t\t material.shading === FlatShading ) {\n\n\t\t\t\t\tfor ( var i = 0, l = object.count * 3; i < l; i += 9 ) {\n\n\t\t\t\t\t\tvar array = object.normalArray;\n\n\t\t\t\t\t\tvar nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3;\n\t\t\t\t\t\tvar ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3;\n\t\t\t\t\t\tvar nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3;\n\n\t\t\t\t\t\tarray[ i + 0 ] = nx;\n\t\t\t\t\t\tarray[ i + 1 ] = ny;\n\t\t\t\t\t\tarray[ i + 2 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 3 ] = nx;\n\t\t\t\t\t\tarray[ i + 4 ] = ny;\n\t\t\t\t\t\tarray[ i + 5 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 6 ] = nx;\n\t\t\t\t\t\tarray[ i + 7 ] = ny;\n\t\t\t\t\t\tarray[ i + 8 ] = nz;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.normal );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasUvs && material.map ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.uv );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasColors && material.vertexColors !== NoColors ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( attributes.color );\n\n\t\t\t\t_gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t_gl.drawArrays( _gl.TRIANGLES, 0, object.count );\n\n\t\t\tobject.count = 0;\n\n\t\t};\n\n\t\tthis.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {\n\n\t\t\tsetMaterial( material );\n\n\t\t\tvar program = setProgram( camera, fog, material, object );\n\n\t\t\tvar updateBuffers = false;\n\t\t\tvar geometryProgram = geometry.id + '_' + program.id + '_' + material.wireframe;\n\n\t\t\tif ( geometryProgram !== _currentGeometryProgram ) {\n\n\t\t\t\t_currentGeometryProgram = geometryProgram;\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphTargetInfluences = object.morphTargetInfluences;\n\n\t\t\tif ( morphTargetInfluences !== undefined ) {\n\n\t\t\t\tvar activeInfluences = [];\n\n\t\t\t\tfor ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = morphTargetInfluences[ i ];\n\t\t\t\t\tactiveInfluences.push( [ influence, i ] );\n\n\t\t\t\t}\n\n\t\t\t\tactiveInfluences.sort( absNumericalSort );\n\n\t\t\t\tif ( activeInfluences.length > 8 ) {\n\n\t\t\t\t\tactiveInfluences.length = 8;\n\n\t\t\t\t}\n\n\t\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\t\tfor ( var i = 0, l = activeInfluences.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar influence = activeInfluences[ i ];\n\t\t\t\t\tmorphInfluences[ i ] = influence[ 0 ];\n\n\t\t\t\t\tif ( influence[ 0 ] !== 0 ) {\n\n\t\t\t\t\t\tvar index = influence[ 1 ];\n\n\t\t\t\t\t\tif ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] );\n\t\t\t\t\t\tif ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i );\n\t\t\t\t\t\tif ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) {\n\n\t\t\t\t\tmorphInfluences[ i ] = 0.0;\n\n\t\t\t\t}\n\n\t\t\t\tprogram.getUniforms().setValue(\n\t\t\t\t\t\t_gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar position = geometry.attributes.position;\n\t\t\tvar rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = objects.getWireframeAttribute( geometry );\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\tvar renderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( index );\n\n\t\t\t} else {\n\n\t\t\t\trenderer = bufferRenderer;\n\n\t\t\t}\n\n\t\t\tif ( updateBuffers ) {\n\n\t\t\t\tsetupVertexAttributes( material, program, geometry );\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, objects.getAttributeBuffer( index ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar dataCount = 0;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdataCount = index.count;\n\n\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\tdataCount = position.count;\n\n\t\t\t}\n\n\t\t\tvar rangeStart = geometry.drawRange.start * rangeFactor;\n\t\t\tvar rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\t\tvar groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\t\tvar groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\t\tvar drawStart = Math.max( rangeStart, groupStart );\n\t\t\tvar drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\t\tvar drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\t\tif ( drawCount === 0 ) return;\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\tswitch ( object.drawMode ) {\n\n\t\t\t\t\t\tcase TrianglesDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleStripDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_STRIP );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleFanDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_FAN );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tvar 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 {\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}\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tif ( geometry.maxInstancedCount > 0 ) {\n\n\t\t\t\t\trenderer.renderInstances( geometry, drawStart, drawCount );\n\n\t\t\t\t}\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\tfunction setupVertexAttributes( material, program, geometry, startIndex ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( startIndex === undefined ) startIndex = 0;\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar geometryAttributes = geometry.attributes;\n\n\t\t\tvar programAttributes = program.getAttributes();\n\n\t\t\tvar materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\t\tfor ( var name in programAttributes ) {\n\n\t\t\t\tvar programAttribute = programAttributes[ name ];\n\n\t\t\t\tif ( programAttribute >= 0 ) {\n\n\t\t\t\t\tvar geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\t\tvar type = _gl.FLOAT;\n\t\t\t\t\t\tvar array = geometryAttribute.array;\n\t\t\t\t\t\tvar normalized = geometryAttribute.normalized;\n\n\t\t\t\t\t\tif ( array instanceof Float32Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.FLOAT;\n\n\t\t\t\t\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\t\t\t\t\tconsole.warn( \"Unsupported data buffer format: Float64Array\" );\n\n\t\t\t\t\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.UNSIGNED_SHORT;\n\n\t\t\t\t\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.SHORT;\n\n\t\t\t\t\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.UNSIGNED_INT;\n\n\t\t\t\t\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.INT;\n\n\t\t\t\t\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.BYTE;\n\n\t\t\t\t\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\t\t\t\t\ttype = _gl.UNSIGNED_BYTE;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar size = geometryAttribute.itemSize;\n\t\t\t\t\t\tvar buffer = objects.getAttributeBuffer( geometryAttribute );\n\n\t\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\t\tvar data = geometryAttribute.data;\n\t\t\t\t\t\t\tvar stride = data.stride;\n\t\t\t\t\t\t\tvar offset = geometryAttribute.offset;\n\n\t\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * data.array.BYTES_PER_ELEMENT, ( startIndex * stride + offset ) * data.array.BYTES_PER_ELEMENT );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute, extension );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * geometryAttribute.array.BYTES_PER_ELEMENT );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\t\tvar value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib2fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib3fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib4fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib1fv( programAttribute, value );\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\tstate.disableUnusedAttributes();\n\n\t\t}\n\n\t\t// Sorting\n\n\t\tfunction absNumericalSort( a, b ) {\n\n\t\t\treturn Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] );\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} else if ( a.material.program && b.material.program && a.material.program !== b.material.program ) {\n\n\t\t\t\treturn a.material.program.id - b.material.program.id;\n\n\t\t\t} else if ( a.material.id !== b.material.id ) {\n\n\t\t\t\treturn a.material.id - b.material.id;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn a.z - b.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction reversePainterSortStable( a, b ) {\n\n\t\t\tif ( a.object.renderOrder !== b.object.renderOrder ) {\n\n\t\t\t\treturn a.object.renderOrder - b.object.renderOrder;\n\n\t\t\t} if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Rendering\n\n\t\tthis.render = function ( scene, camera, renderTarget, forceClear ) {\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\t// reset caching for this frame\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\t\t\t_currentCamera = null;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\tlights.length = 0;\n\n\t\t\topaqueObjectsLastIndex = - 1;\n\t\t\ttransparentObjectsLastIndex = - 1;\n\n\t\t\tsprites.length = 0;\n\t\t\tlensFlares.length = 0;\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\t\tprojectObject( scene, camera );\n\n\t\t\topaqueObjects.length = opaqueObjectsLastIndex + 1;\n\t\t\ttransparentObjects.length = transparentObjectsLastIndex + 1;\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\topaqueObjects.sort( painterSortStable );\n\t\t\t\ttransparentObjects.sort( reversePainterSortStable );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _clippingEnabled ) _clipping.beginShadows();\n\n\t\t\tsetupShadows( lights );\n\n\t\t\tshadowMap.render( scene, camera );\n\n\t\t\tsetupLights( lights, camera );\n\n\t\t\tif ( _clippingEnabled ) _clipping.endShadows();\n\n\t\t\t//\n\n\t\t\t_infoRender.calls = 0;\n\t\t\t_infoRender.vertices = 0;\n\t\t\t_infoRender.faces = 0;\n\t\t\t_infoRender.points = 0;\n\n\t\t\tif ( renderTarget === undefined ) {\n\n\t\t\t\trenderTarget = null;\n\n\t\t\t}\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\n\t\t\t//\n\n\t\t\tvar background = scene.background;\n\n\t\t\tif ( background === null ) {\n\n\t\t\t\tglClearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\n\n\t\t\t} else if ( background && background.isColor ) {\n\n\t\t\t\tglClearColor( background.r, background.g, background.b, 1 );\n\t\t\t\tforceClear = true;\n\n\t\t\t}\n\n\t\t\tif ( this.autoClear || forceClear ) {\n\n\t\t\t\tthis.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil );\n\n\t\t\t}\n\n\t\t\tif ( background && background.isCubeTexture ) {\n\n\t\t\t\tbackgroundCamera2.projectionMatrix.copy( camera.projectionMatrix );\n\n\t\t\t\tbackgroundCamera2.matrixWorld.extractRotation( camera.matrixWorld );\n\t\t\t\tbackgroundCamera2.matrixWorldInverse.getInverse( backgroundCamera2.matrixWorld );\n\n\t\t\t\tbackgroundBoxMesh.material.uniforms[ \"tCube\" ].value = background;\n\t\t\t\tbackgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundCamera2.matrixWorldInverse, backgroundBoxMesh.matrixWorld );\n\n\t\t\t\tobjects.update( backgroundBoxMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundCamera2, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null );\n\n\t\t\t} else if ( background && background.isTexture ) {\n\n\t\t\t\tbackgroundPlaneMesh.material.map = background;\n\n\t\t\t\tobjects.update( backgroundPlaneMesh );\n\n\t\t\t\t_this.renderBufferDirect( backgroundCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.overrideMaterial ) {\n\n\t\t\t\tvar overrideMaterial = scene.overrideMaterial;\n\n\t\t\t\trenderObjects( opaqueObjects, scene, camera, overrideMaterial );\n\t\t\t\trenderObjects( transparentObjects, scene, camera, overrideMaterial );\n\n\t\t\t} else {\n\n\t\t\t\t// opaque pass (front-to-back order)\n\n\t\t\t\tstate.setBlending( NoBlending );\n\t\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\t\t// transparent pass (back-to-front order)\n\n\t\t\t\trenderObjects( transparentObjects, scene, camera );\n\n\t\t\t}\n\n\t\t\t// custom render plugins (post pass)\n\n\t\t\tspritePlugin.render( scene, camera );\n\t\t\tlensFlarePlugin.render( scene, camera, _currentViewport );\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\ttextures.updateRenderTargetMipmap( renderTarget );\n\n\t\t\t}\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.setDepthTest( true );\n\t\t\tstate.setDepthWrite( true );\n\t\t\tstate.setColorWrite( true );\n\n\t\t\t// _gl.finish();\n\n\t\t};\n\n\t\tfunction pushRenderItem( object, geometry, material, z, group ) {\n\n\t\t\tvar array, index;\n\n\t\t\t// allocate the next position in the appropriate array\n\n\t\t\tif ( material.transparent ) {\n\n\t\t\t\tarray = transparentObjects;\n\t\t\t\tindex = ++ transparentObjectsLastIndex;\n\n\t\t\t} else {\n\n\t\t\t\tarray = opaqueObjects;\n\t\t\t\tindex = ++ opaqueObjectsLastIndex;\n\n\t\t\t}\n\n\t\t\t// recycle existing render item or grow the array\n\n\t\t\tvar renderItem = array[ index ];\n\n\t\t\tif ( renderItem !== undefined ) {\n\n\t\t\t\trenderItem.id = object.id;\n\t\t\t\trenderItem.object = object;\n\t\t\t\trenderItem.geometry = geometry;\n\t\t\t\trenderItem.material = material;\n\t\t\t\trenderItem.z = _vector3.z;\n\t\t\t\trenderItem.group = group;\n\n\t\t\t} else {\n\n\t\t\t\trenderItem = {\n\t\t\t\t\tid: object.id,\n\t\t\t\t\tobject: object,\n\t\t\t\t\tgeometry: geometry,\n\t\t\t\t\tmaterial: material,\n\t\t\t\t\tz: _vector3.z,\n\t\t\t\t\tgroup: group\n\t\t\t\t};\n\n\t\t\t\t// assert( index === array.length );\n\t\t\t\tarray.push( renderItem );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// TODO Duplicated code (Frustum)\n\n\t\tfunction isObjectViewable( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t_sphere.copy( geometry.boundingSphere ).\n\t\t\t\tapplyMatrix4( object.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSpriteViewable( sprite ) {\n\n\t\t\t_sphere.center.set( 0, 0, 0 );\n\t\t\t_sphere.radius = 0.7071067811865476;\n\t\t\t_sphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSphereViewable( sphere ) {\n\n\t\t\tif ( ! _frustum.intersectsSphere( sphere ) ) return false;\n\n\t\t\tvar numPlanes = _clipping.numPlanes;\n\n\t\t\tif ( numPlanes === 0 ) return true;\n\n\t\t\tvar planes = _this.clippingPlanes,\n\n\t\t\t\tcenter = sphere.center,\n\t\t\t\tnegRad = - sphere.radius,\n\t\t\t\ti = 0;\n\n\t\t\tdo {\n\n\t\t\t\t// out when deeper than radius in the negative halfspace\n\t\t\t\tif ( planes[ i ].distanceToPoint( center ) < negRad ) return false;\n\n\t\t\t} while ( ++ i !== numPlanes );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction projectObject( object, camera ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = ( object.layers.mask & camera.layers.mask ) !== 0;\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isLight ) {\n\n\t\t\t\t\tlights.push( object );\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( object.frustumCulled === false || isSpriteViewable( object ) === true ) {\n\n\t\t\t\t\t\tsprites.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isLensFlare ) {\n\n\t\t\t\t\tlensFlares.push( object );\n\n\t\t\t\t} else if ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t_vector3.applyProjection( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpushRenderItem( object, null, object.material, _vector3.z, null );\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( object.frustumCulled === false || isObjectViewable( object ) === true ) {\n\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( material.visible === true ) {\n\n\t\t\t\t\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t\t\t\t_vector3.applyProjection( _projScreenMatrix );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar geometry = objects.update( object );\n\n\t\t\t\t\t\t\tif ( material.isMultiMaterial ) {\n\n\t\t\t\t\t\t\t\tvar groups = geometry.groups;\n\t\t\t\t\t\t\t\tvar materials = material.materials;\n\n\t\t\t\t\t\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tvar group = groups[ i ];\n\t\t\t\t\t\t\t\t\tvar groupMaterial = materials[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\t\tif ( groupMaterial.visible === true ) {\n\n\t\t\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, groupMaterial, _vector3.z, group );\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} else {\n\n\t\t\t\t\t\t\t\tpushRenderItem( object, geometry, material, _vector3.z, null );\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\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera, overrideMaterial ) {\n\n\t\t\tfor ( var i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tvar renderItem = renderList[ i ];\n\n\t\t\t\tvar object = renderItem.object;\n\t\t\t\tvar geometry = renderItem.geometry;\n\t\t\t\tvar material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;\n\t\t\t\tvar group = renderItem.group;\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\t\tif ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tsetMaterial( material );\n\n\t\t\t\t\tvar program = setProgram( camera, scene.fog, material, object );\n\n\t\t\t\t\t_currentGeometryProgram = '';\n\n\t\t\t\t\tobject.render( function ( object ) {\n\n\t\t\t\t\t\t_this.renderBufferImmediate( object, program, material );\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );\n\n\t\t\t\t}\n\n\t\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction initMaterial( material, fog, object ) {\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tvar parameters = programCache.getParameters(\n\t\t\t\t\tmaterial, _lights, fog, _clipping.numPlanes, _clipping.numIntersection, object );\n\n\t\t\tvar code = programCache.getProgramCode( material, parameters );\n\n\t\t\tvar program = materialProperties.program;\n\t\t\tvar programChange = true;\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\t// new material\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t} else if ( program.code !== code ) {\n\n\t\t\t\t// changed glsl or parameters\n\t\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\t} else if ( parameters.shaderID !== undefined ) {\n\n\t\t\t\t// same glsl and uniform list\n\t\t\t\treturn;\n\n\t\t\t} else {\n\n\t\t\t\t// only rebuild uniform list\n\t\t\t\tprogramChange = false;\n\n\t\t\t}\n\n\t\t\tif ( programChange ) {\n\n\t\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\t\tvar shader = ShaderLib[ parameters.shaderID ];\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\t\t\tfragmentShader: shader.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterialProperties.__webglShader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: material.uniforms,\n\t\t\t\t\t\tvertexShader: material.vertexShader,\n\t\t\t\t\t\tfragmentShader: material.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.__webglShader = materialProperties.__webglShader;\n\n\t\t\t\tprogram = programCache.acquireProgram( material, parameters, code );\n\n\t\t\t\tmaterialProperties.program = program;\n\t\t\t\tmaterial.program = program;\n\n\t\t\t}\n\n\t\t\tvar attributes = program.getAttributes();\n\n\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\tmaterial.numSupportedMorphTargets = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphTargets; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphTarget' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphTargets ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.morphNormals ) {\n\n\t\t\t\tmaterial.numSupportedMorphNormals = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphNormals; i ++ ) {\n\n\t\t\t\t\tif ( attributes[ 'morphNormal' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphNormals ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( ! material.isShaderMaterial &&\n\t\t\t ! material.isRawShaderMaterial ||\n\t\t\t material.clipping === true ) {\n\n\t\t\t\tmaterialProperties.numClippingPlanes = _clipping.numPlanes;\n\t\t\t\tmaterialProperties.numIntersection = _clipping.numIntersection;\n\t\t\t\tuniforms.clippingPlanes = _clipping.uniform;\n\n\t\t\t}\n\n\t\t\tmaterialProperties.fog = fog;\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.lightsHash = _lights.hash;\n\n\t\t\tif ( material.lights ) {\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.ambient;\n\t\t\t\tuniforms.directionalLights.value = _lights.directional;\n\t\t\t\tuniforms.spotLights.value = _lights.spot;\n\t\t\t\tuniforms.pointLights.value = _lights.point;\n\t\t\t\tuniforms.hemisphereLights.value = _lights.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = _lights.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = _lights.spotShadowMap;\n\t\t\t\tuniforms.spotShadowMatrix.value = _lights.spotShadowMatrix;\n\t\t\t\tuniforms.pointShadowMap.value = _lights.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = _lights.pointShadowMatrix;\n\n\t\t\t}\n\n\t\t\tvar progUniforms = materialProperties.program.getUniforms(),\n\t\t\t\tuniformsList =\n\t\t\t\t\t\tWebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t\t}\n\n\t\tfunction setMaterial( material ) {\n\n\t\t\tmaterial.side === DoubleSide\n\t\t\t\t? state.disable( _gl.CULL_FACE )\n\t\t\t\t: state.enable( _gl.CULL_FACE );\n\n\t\t\tstate.setFlipSided( material.side === BackSide );\n\n\t\t\tmaterial.transparent === true\n\t\t\t\t? state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )\n\t\t\t\t: state.setBlending( NoBlending );\n\n\t\t\tstate.setDepthFunc( material.depthFunc );\n\t\t\tstate.setDepthTest( material.depthTest );\n\t\t\tstate.setDepthWrite( material.depthWrite );\n\t\t\tstate.setColorWrite( material.colorWrite );\n\t\t\tstate.setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\t}\n\n\t\tfunction setProgram( camera, fog, material, object ) {\n\n\t\t\t_usedTextureUnits = 0;\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tif ( _clippingEnabled ) {\n\n\t\t\t\tif ( _localClippingEnabled || camera !== _currentCamera ) {\n\n\t\t\t\t\tvar useCache =\n\t\t\t\t\t\t\tcamera === _currentCamera &&\n\t\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\t_clipping.setState(\n\t\t\t\t\t\t\tmaterial.clippingPlanes, material.clipIntersection, material.clipShadows,\n\t\t\t\t\t\t\tcamera, materialProperties, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate === false ) {\n\n\t\t\t\tif ( materialProperties.program === undefined ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.lights && materialProperties.lightsHash !== _lights.hash ) {\n\n\t\t\t\t\tmaterial.needsUpdate = 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\t materialProperties.numIntersection !== _clipping.numIntersection ) ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate ) {\n\n\t\t\t\tinitMaterial( material, fog, object );\n\t\t\t\tmaterial.needsUpdate = false;\n\n\t\t\t}\n\n\t\t\tvar refreshProgram = false;\n\t\t\tvar refreshMaterial = false;\n\t\t\tvar refreshLights = false;\n\n\t\t\tvar program = materialProperties.program,\n\t\t\t\tp_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.__webglShader.uniforms;\n\n\t\t\tif ( program.id !== _currentProgram ) {\n\n\t\t\t\t_gl.useProgram( program.program );\n\t\t\t\t_currentProgram = program.id;\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 || camera !== _currentCamera ) {\n\n\t\t\t\tp_uniforms.set( _gl, camera, 'projectionMatrix' );\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\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( camera !== _currentCamera ) {\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\t// load material specific uniforms\n\t\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\t material.isMeshPhongMaterial ||\n\t\t\t\t material.isMeshStandardMaterial ||\n\t\t\t\t material.envMap ) {\n\n\t\t\t\t\tvar uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t material.isMeshLambertMaterial ||\n\t\t\t\t material.isMeshBasicMaterial ||\n\t\t\t\t material.isMeshStandardMaterial ||\n\t\t\t\t material.isShaderMaterial ||\n\t\t\t\t material.skinning ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingExposure' );\n\t\t\t\tp_uniforms.set( _gl, _this, 'toneMappingWhitePoint' );\n\n\t\t\t}\n\n\t\t\t// skinning uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone texture must go before other textures\n\t\t\t// not sure why, but otherwise weird things happen\n\n\t\t\tif ( material.skinning ) {\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\tvar skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( capabilities.floatVertexTextures && skeleton.useVertexTexture ) {\n\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTexture' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureWidth' );\n\t\t\t\t\t\tp_uniforms.set( _gl, skeleton, 'boneTextureHeight' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tif ( material.lights ) {\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 ) {\n\n\t\t\t\t\trefreshUniformsFog( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshBasicMaterial ||\n\t\t\t\t material.isMeshLambertMaterial ||\n\t\t\t\t material.isMeshPhongMaterial ||\n\t\t\t\t material.isMeshStandardMaterial ||\n\t\t\t\t material.isMeshDepthMaterial ) {\n\n\t\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh single material specific uniforms\n\n\t\t\t\tif ( material.isLineBasicMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isLineDashedMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\t\t\t\t\trefreshUniformsDash( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\t\t\trefreshUniformsPoints( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\t\t\trefreshUniformsLambert( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhong( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhysical( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\t\t\trefreshUniformsStandard( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\t\t\tm_uniforms.displacementMap.value = material.displacementMap;\n\t\t\t\t\t\tm_uniforms.displacementScale.value = material.displacementScale;\n\t\t\t\t\t\tm_uniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\t\t\tm_uniforms.opacity.value = material.opacity;\n\n\t\t\t\t}\n\n\t\t\t\tWebGLUniforms.upload(\n\t\t\t\t\t\t_gl, materialProperties.uniformsList, m_uniforms, _this );\n\n\t\t\t}\n\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.set( _gl, object, 'modelViewMatrix' );\n\t\t\tp_uniforms.set( _gl, object, 'normalMatrix' );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// Uniforms (refresh uniforms objects)\n\n\t\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t\tuniforms.diffuse.value = material.color;\n\n\t\t\tif ( material.emissive ) {\n\n\t\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t\t}\n\n\t\t\tuniforms.map.value = material.map;\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\tif ( material.aoMap ) {\n\n\t\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\t}\n\n\t\t\t// uv repeat and offset setting priorities\n\t\t\t// 1. color map\n\t\t\t// 2. specular map\n\t\t\t// 3. normal map\n\t\t\t// 4. bump map\n\t\t\t// 5. alpha map\n\t\t\t// 6. emissive map\n\n\t\t\tvar uvScaleMap;\n\n\t\t\tif ( material.map ) {\n\n\t\t\t\tuvScaleMap = material.map;\n\n\t\t\t} else if ( material.specularMap ) {\n\n\t\t\t\tuvScaleMap = material.specularMap;\n\n\t\t\t} else if ( material.displacementMap ) {\n\n\t\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t\t} else if ( material.normalMap ) {\n\n\t\t\t\tuvScaleMap = material.normalMap;\n\n\t\t\t} else if ( material.bumpMap ) {\n\n\t\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t\t} else if ( material.roughnessMap ) {\n\n\t\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t\t} else if ( material.metalnessMap ) {\n\n\t\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t\t} else if ( material.alphaMap ) {\n\n\t\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t\t} else if ( material.emissiveMap ) {\n\n\t\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t\t// backwards compatibility\n\t\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t\t}\n\n\t\t\t\tvar offset = uvScaleMap.offset;\n\t\t\t\tvar repeat = uvScaleMap.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t\tuniforms.envMap.value = material.envMap;\n\n\t\t\t// don't flip CubeTexture envMaps, flip everything else:\n\t\t\t// WebGLRenderTargetCube will be flipped for backwards compatibility\n\t\t\t// WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture\n\t\t\t// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future\n\t\t\tuniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t}\n\n\t\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\t\tuniforms.dashSize.value = material.dashSize;\n\t\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\t\tuniforms.scale.value = material.scale;\n\n\t\t}\n\n\t\tfunction refreshUniformsPoints( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\t\t\tuniforms.size.value = material.size * _pixelRatio;\n\t\t\tuniforms.scale.value = _height * 0.5;\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\tif ( material.map !== null ) {\n\n\t\t\t\tvar offset = material.map.offset;\n\t\t\t\tvar repeat = material.map.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsFog( uniforms, fog ) {\n\n\t\t\tuniforms.fogColor.value = fog.color;\n\n\t\t\tif ( fog.isFog ) {\n\n\t\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\t\tuniforms.specular.value = material.specular;\n\t\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\t\tuniforms.roughness.value = material.roughness;\n\t\t\tuniforms.metalness.value = material.metalness;\n\n\t\t\tif ( material.roughnessMap ) {\n\n\t\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.metalnessMap ) {\n\n\t\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t\tif ( material.envMap ) {\n\n\t\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhysical( uniforms, material ) {\n\n\t\t\tuniforms.clearCoat.value = material.clearCoat;\n\t\t\tuniforms.clearCoatRoughness.value = material.clearCoatRoughness;\n\n\t\t\trefreshUniformsStandard( uniforms, material );\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\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\t// Lighting\n\n\t\tfunction setupShadows( lights ) {\n\n\t\t\tvar lightShadowsLength = 0;\n\n\t\t\tfor ( var i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\t\tvar light = lights[ i ];\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t_lights.shadows[ lightShadowsLength ++ ] = light;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.shadows.length = lightShadowsLength;\n\n\t\t}\n\n\t\tfunction setupLights( lights, camera ) {\n\n\t\t\tvar l, ll, light,\n\t\t\tr = 0, g = 0, b = 0,\n\t\t\tcolor,\n\t\t\tintensity,\n\t\t\tdistance,\n\t\t\tshadowMap,\n\n\t\t\tviewMatrix = camera.matrixWorldInverse,\n\n\t\t\tdirectionalLength = 0,\n\t\t\tpointLength = 0,\n\t\t\tspotLength = 0,\n\t\t\themiLength = 0;\n\n\t\t\tfor ( l = 0, ll = lights.length; l < ll; l ++ ) {\n\n\t\t\t\tlight = lights[ l ];\n\n\t\t\t\tcolor = light.color;\n\t\t\t\tintensity = light.intensity;\n\t\t\t\tdistance = light.distance;\n\n\t\t\t\tshadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\t\tr += color.r * intensity;\n\t\t\t\t\tg += color.g * intensity;\n\t\t\t\t\tb += color.b * intensity;\n\n\t\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\t_lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.directional[ directionalLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( _vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\t_lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\t\t\t\t\t_lights.spot[ spotLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tuniforms.shadowBias = light.shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = light.shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = light.shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lights.pointShadowMap[ pointLength ] = shadowMap;\n\n\t\t\t\t\tif ( _lights.pointShadowMatrix[ pointLength ] === undefined ) {\n\n\t\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ] = new Matrix4();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// for point lights we set the shadow matrix to be a translation-only matrix\n\t\t\t\t\t// equal to inverse of the light's position\n\t\t\t\t\t_vector3.setFromMatrixPosition( light.matrixWorld ).negate();\n\t\t\t\t\t_lights.pointShadowMatrix[ pointLength ].identity().setPosition( _vector3 );\n\n\t\t\t\t\t_lights.point[ pointLength ++ ] = uniforms;\n\n\t\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\t\tvar uniforms = lightCache.get( light );\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\t\t_lights.hemi[ hemiLength ++ ] = uniforms;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_lights.ambient[ 0 ] = r;\n\t\t\t_lights.ambient[ 1 ] = g;\n\t\t\t_lights.ambient[ 2 ] = b;\n\n\t\t\t_lights.directional.length = directionalLength;\n\t\t\t_lights.spot.length = spotLength;\n\t\t\t_lights.point.length = pointLength;\n\t\t\t_lights.hemi.length = hemiLength;\n\n\t\t\t_lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + hemiLength + ',' + _lights.shadows.length;\n\n\t\t}\n\n\t\t// GL state setting\n\n\t\tthis.setFaceCulling = function ( cullFace, frontFaceDirection ) {\n\n\t\t\tstate.setCullFace( cullFace );\n\t\t\tstate.setFlipSided( frontFaceDirection === FrontFaceDirectionCW );\n\n\t\t};\n\n\t\t// Textures\n\n\t\tfunction allocTextureUnit() {\n\n\t\t\tvar textureUnit = _usedTextureUnits;\n\n\t\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\t\tconsole.warn( 'WebGLRenderer: trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t\t}\n\n\t\t\t_usedTextureUnits += 1;\n\n\t\t\treturn textureUnit;\n\n\t\t}\n\n\t\tthis.allocTextureUnit = allocTextureUnit;\n\n\t\t// this.setTexture2D = setTexture2D;\n\t\tthis.setTexture2D = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\t// backwards compatibility: peel texture.texture\n\t\t\treturn function setTexture2D( texture, slot ) {\n\n\t\t\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTexture = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTexture( texture, slot ) {\n\n\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.\" );\n\t\t\t\t\twarned = true;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTextureCube = ( function() {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTextureCube( texture, slot ) {\n\n\t\t\t\t// backwards compatibility: peel texture.texture\n\t\t\t\tif ( texture && texture.isWebGLRenderTargetCube ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\t// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture\n\t\t\t\t// TODO: unify these code paths\n\t\t\t\tif ( ( texture && texture.isCubeTexture ) ||\n\t\t\t\t\t ( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {\n\n\t\t\t\t\t// CompressedTexture can have Array in image :/\n\n\t\t\t\t\t// this function alone should take care of cube textures\n\t\t\t\t\ttextures.setTextureCube( texture, slot );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assumed: texture property of THREE.WebGLRenderTargetCube\n\n\t\t\t\t\ttextures.setTextureCubeDynamic( texture, slot );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.getCurrentRenderTarget = function() {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTarget = function ( renderTarget ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\n\t\t\tif ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t}\n\n\t\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\t\tvar framebuffer;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tframebuffer = renderTargetProperties.__webglFramebuffer;\n\n\t\t\t\t}\n\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = null;\n\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );\n\n\t\t\t}\n\n\t\t\tif ( _currentFramebuffer !== framebuffer ) {\n\n\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t\t_currentFramebuffer = framebuffer;\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tstate.viewport( _currentViewport );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) {\n\n\t\t\tif ( ( renderTarget && renderTarget.isWebGLRenderTarget ) === false ) {\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\tvar framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tvar restore = false;\n\n\t\t\t\tif ( framebuffer !== _currentFramebuffer ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\trestore = true;\n\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar texture = renderTarget.texture;\n\t\t\t\t\tvar textureFormat = texture.format;\n\t\t\t\t\tvar textureType = texture.type;\n\n\t\t\t\t\tif ( textureFormat !== RGBAFormat && paramThreeToGL( 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\tif ( textureType !== UnsignedByteType && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t ! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t ! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) {\n\n\t\t\t\t\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\tif ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {\n\n\t\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\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t\t_gl.readPixels( x, y, width, height, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\tif ( restore ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );\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// Map three.js constants to WebGL constants\n\n\t\tfunction paramThreeToGL( p ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( p === RepeatWrapping ) return _gl.REPEAT;\n\t\t\tif ( p === ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE;\n\t\t\tif ( p === MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT;\n\n\t\t\tif ( p === NearestFilter ) return _gl.NEAREST;\n\t\t\tif ( p === NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST;\n\t\t\tif ( p === NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR;\n\n\t\t\tif ( p === LinearFilter ) return _gl.LINEAR;\n\t\t\tif ( p === LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST;\n\t\t\tif ( p === LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR;\n\n\t\t\tif ( p === UnsignedByteType ) return _gl.UNSIGNED_BYTE;\n\t\t\tif ( p === UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4;\n\t\t\tif ( p === UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1;\n\t\t\tif ( p === UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5;\n\n\t\t\tif ( p === ByteType ) return _gl.BYTE;\n\t\t\tif ( p === ShortType ) return _gl.SHORT;\n\t\t\tif ( p === UnsignedShortType ) return _gl.UNSIGNED_SHORT;\n\t\t\tif ( p === IntType ) return _gl.INT;\n\t\t\tif ( p === UnsignedIntType ) return _gl.UNSIGNED_INT;\n\t\t\tif ( p === FloatType ) return _gl.FLOAT;\n\n\t\t\tif ( p === HalfFloatType ) {\n\n\t\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\t\tif ( extension !== null ) return extension.HALF_FLOAT_OES;\n\n\t\t\t}\n\n\t\t\tif ( p === AlphaFormat ) return _gl.ALPHA;\n\t\t\tif ( p === RGBFormat ) return _gl.RGB;\n\t\t\tif ( p === RGBAFormat ) return _gl.RGBA;\n\t\t\tif ( p === LuminanceFormat ) return _gl.LUMINANCE;\n\t\t\tif ( p === LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA;\n\t\t\tif ( p === DepthFormat ) return _gl.DEPTH_COMPONENT;\n\t\t\tif ( p === DepthStencilFormat ) return _gl.DEPTH_STENCIL;\n\n\t\t\tif ( p === AddEquation ) return _gl.FUNC_ADD;\n\t\t\tif ( p === SubtractEquation ) return _gl.FUNC_SUBTRACT;\n\t\t\tif ( p === ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT;\n\n\t\t\tif ( p === ZeroFactor ) return _gl.ZERO;\n\t\t\tif ( p === OneFactor ) return _gl.ONE;\n\t\t\tif ( p === SrcColorFactor ) return _gl.SRC_COLOR;\n\t\t\tif ( p === OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR;\n\t\t\tif ( p === SrcAlphaFactor ) return _gl.SRC_ALPHA;\n\t\t\tif ( p === OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA;\n\t\t\tif ( p === DstAlphaFactor ) return _gl.DST_ALPHA;\n\t\t\tif ( p === OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA;\n\n\t\t\tif ( p === DstColorFactor ) return _gl.DST_COLOR;\n\t\t\tif ( p === OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR;\n\t\t\tif ( p === SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE;\n\n\t\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||\n\t\t\t\tp === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\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}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||\n\t\t\t\t p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\t\tif ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t}\n\n\t\t\tif ( p === MinEquation || p === MaxEquation ) {\n\n\t\t\t\textension = extensions.get( 'EXT_blend_minmax' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === MinEquation ) return extension.MIN_EXT;\n\t\t\t\t\tif ( p === MaxEquation ) return extension.MAX_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\t\tif ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t}\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction FogExp2 ( color, density ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = ( density !== undefined ) ? density : 0.00025;\n\n\t}\n\n\tFogExp2.prototype.isFogExp2 = true;\n\n\tFogExp2.prototype.clone = function () {\n\n\t\treturn new FogExp2( this.color.getHex(), this.density );\n\n\t};\n\n\tFogExp2.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Fog ( color, near, far ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = ( near !== undefined ) ? near : 1;\n\t\tthis.far = ( far !== undefined ) ? far : 1000;\n\n\t}\n\n\tFog.prototype.isFog = true;\n\n\tFog.prototype.clone = function () {\n\n\t\treturn new Fog( this.color.getHex(), this.near, this.far );\n\n\t};\n\n\tFog.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\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\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Scene () {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.fog = null;\n\t\tthis.overrideMaterial = null;\n\n\t\tthis.autoUpdate = true; // checked by the renderer\n\n\t}\n\n\tScene.prototype = Object.create( Object3D.prototype );\n\n\tScene.prototype.constructor = Scene;\n\n\tScene.prototype.copy = function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t};\n\n\tScene.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tif ( this.background !== null ) data.object.background = this.background.toJSON( meta );\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlare( texture, size, distance, blending, color ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.lensFlares = [];\n\n\t\tthis.positionScreen = new Vector3();\n\t\tthis.customUpdateCallback = undefined;\n\n\t\tif ( texture !== undefined ) {\n\n\t\t\tthis.add( texture, size, distance, blending, color );\n\n\t\t}\n\n\t}\n\n\tLensFlare.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LensFlare,\n\n\t\tisLensFlare: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.positionScreen.copy( source.positionScreen );\n\t\t\tthis.customUpdateCallback = source.customUpdateCallback;\n\n\t\t\tfor ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lensFlares.push( source.lensFlares[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( texture, size, distance, blending, color, opacity ) {\n\n\t\t\tif ( size === undefined ) size = - 1;\n\t\t\tif ( distance === undefined ) distance = 0;\n\t\t\tif ( opacity === undefined ) opacity = 1;\n\t\t\tif ( color === undefined ) color = new Color( 0xffffff );\n\t\t\tif ( blending === undefined ) blending = NormalBlending;\n\n\t\t\tdistance = Math.min( distance, Math.max( 0, distance ) );\n\n\t\t\tthis.lensFlares.push( {\n\t\t\t\ttexture: texture,\t// THREE.Texture\n\t\t\t\tsize: size, \t\t// size in pixels (-1 = use texture.width)\n\t\t\t\tdistance: distance, \t// distance (0-1) from light source (0=at light source)\n\t\t\t\tx: 0, y: 0, z: 0,\t// screen position (-1 => 1) z = 0 is in front z = 1 is back\n\t\t\t\tscale: 1, \t\t// scale\n\t\t\t\trotation: 0, \t\t// rotation\n\t\t\t\topacity: opacity,\t// opacity\n\t\t\t\tcolor: color,\t\t// color\n\t\t\t\tblending: blending\t// blending\n\t\t\t} );\n\n\t\t},\n\n\t\t/*\n\t\t * Update lens flares update positions on all flares based on the screen position\n\t\t * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way.\n\t\t */\n\n\t\tupdateLensFlares: function () {\n\n\t\t\tvar f, fl = this.lensFlares.length;\n\t\t\tvar flare;\n\t\t\tvar vecX = - this.positionScreen.x * 2;\n\t\t\tvar vecY = - this.positionScreen.y * 2;\n\n\t\t\tfor ( f = 0; f < fl; f ++ ) {\n\n\t\t\t\tflare = this.lensFlares[ f ];\n\n\t\t\t\tflare.x = this.positionScreen.x + vecX * flare.distance;\n\t\t\t\tflare.y = this.positionScreen.y + vecY * flare.distance;\n\n\t\t\t\tflare.wantedRotation = flare.x * Math.PI * 0.25;\n\t\t\t\tflare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t *\tuvOffset: new THREE.Vector2(),\n\t *\tuvScale: new THREE.Vector2()\n\t * }\n\t */\n\n\tfunction SpriteMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\t\tthis.map = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tSpriteMaterial.prototype = Object.create( Material.prototype );\n\tSpriteMaterial.prototype.constructor = SpriteMaterial;\n\n\tSpriteMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.map = source.map;\n\n\t\tthis.rotation = source.rotation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Sprite( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Sprite';\n\n\t\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\t}\n\n\tSprite.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Sprite,\n\n\t\tisSprite: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distanceSq = raycaster.ray.distanceSqToPoint( matrixPosition );\n\t\t\t\tvar guessSizeSq = this.scale.x * this.scale.y / 4;\n\n\t\t\t\tif ( distanceSq > guessSizeSq ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: Math.sqrt( distanceSq ),\n\t\t\t\t\tpoint: this.position,\n\t\t\t\t\tface: 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\tclone: function () {\n\n\t\t\treturn new this.constructor( this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LOD() {\n\n\t\tObject3D.call( this );\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} );\n\n\t}\n\n\n\tLOD.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LOD,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source, false );\n\n\t\t\tvar levels = source.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddLevel: function ( object, distance ) {\n\n\t\t\tif ( distance === undefined ) distance = 0;\n\n\t\t\tdistance = Math.abs( distance );\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\t\tthis.add( object );\n\n\t\t},\n\n\t\tgetObjectForDistance: function ( distance ) {\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance < levels[ i ].distance ) {\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\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( matrixPosition );\n\n\t\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tupdate: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar levels = this.levels;\n\n\t\t\t\tif ( levels.length > 1 ) {\n\n\t\t\t\t\tv1.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\t\tv2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\t\tvar distance = v1.distanceTo( v2 );\n\n\t\t\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t\t\t} else {\n\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\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\t\t\tlevels[ i ].object.visible = 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\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.levels = [];\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tdata.object.levels.push( {\n\t\t\t\t\tobject: level.object.uuid,\n\t\t\t\t\tdistance: level.distance\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { data: data, 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.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n\tDataTexture.prototype = Object.create( Texture.prototype );\n\tDataTexture.prototype.constructor = DataTexture;\n\n\tDataTexture.prototype.isDataTexture = true;\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author michael guerrero / http://realitymeltdown.com\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Skeleton( bones, boneInverses, useVertexTexture ) {\n\n\t\tthis.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true;\n\n\t\tthis.identityMatrix = new Matrix4();\n\n\t\t// copy the bone array\n\n\t\tbones = bones || [];\n\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t// create a bone texture or an array of floats\n\n\t\tif ( this.useVertexTexture ) {\n\n\t\t\t// layout (1 matrix = 4 pixels)\n\t\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\n\t\t\tvar size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\t\tsize = _Math.nextPowerOfTwo( Math.ceil( size ) );\n\t\t\tsize = Math.max( size, 4 );\n\n\t\t\tthis.boneTextureWidth = size;\n\t\t\tthis.boneTextureHeight = size;\n\n\t\t\tthis.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel\n\t\t\tthis.boneTexture = new DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, RGBAFormat, FloatType );\n\n\t\t} else {\n\n\t\t\tthis.boneMatrices = new Float32Array( 16 * this.bones.length );\n\n\t\t}\n\n\t\t// use the supplied bone inverses or calculate the inverses\n\n\t\tif ( boneInverses === undefined ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\tif ( this.bones.length === boneInverses.length ) {\n\n\t\t\t\tthis.boneInverses = boneInverses.slice( 0 );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton bonInverses is the wrong length.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\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\tObject.assign( Skeleton.prototype, {\n\n\t\tcalculateInverses: function () {\n\n\t\t\tthis.boneInverses = [];\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tvar inverse = new Matrix4();\n\n\t\t\t\tif ( this.bones[ b ] ) {\n\n\t\t\t\t\tinverse.getInverse( this.bones[ b ].matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tthis.boneInverses.push( inverse );\n\n\t\t\t}\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tvar bone;\n\n\t\t\t// recover the bind-time world matrices\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tbone.matrixWorld.getInverse( this.boneInverses[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// compute the local matrices, positions, rotations and scales\n\n\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\tbone = this.bones[ b ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tif ( (bone.parent && bone.parent.isBone) ) {\n\n\t\t\t\t\t\tbone.matrix.getInverse( bone.parent.matrixWorld );\n\t\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdate: ( function () {\n\n\t\t\tvar offsetMatrix = new Matrix4();\n\n\t\t\treturn function update() {\n\n\t\t\t\t// flatten bone matrices to array\n\n\t\t\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\n\n\t\t\t\t\t// compute the offset between the current and the original transform\n\n\t\t\t\t\tvar matrix = this.bones[ b ] ? this.bones[ b ].matrixWorld : this.identityMatrix;\n\n\t\t\t\t\toffsetMatrix.multiplyMatrices( matrix, this.boneInverses[ b ] );\n\t\t\t\t\toffsetMatrix.toArray( this.boneMatrices, b * 16 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.useVertexTexture ) {\n\n\t\t\t\t\tthis.boneTexture.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tclone: function () {\n\n\t\t\treturn new Skeleton( this.bones, this.boneInverses, this.useVertexTexture );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Bone( skin ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Bone';\n\n\t\tthis.skin = skin;\n\n\t}\n\n\tBone.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Bone,\n\n\t\tisBone: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.skin = source.skin;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction SkinnedMesh( geometry, material, useVertexTexture ) {\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\tthis.bindMode = \"attached\";\n\t\tthis.bindMatrix = new Matrix4();\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t// init bones\n\n\t\t// TODO: remove bone creation as there is no reason (other than\n\t\t// convenience) for THREE.SkinnedMesh to do this.\n\n\t\tvar bones = [];\n\n\t\tif ( this.geometry && this.geometry.bones !== undefined ) {\n\n\t\t\tvar bone, gbone;\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tbone = new Bone( this );\n\t\t\t\tbones.push( bone );\n\n\t\t\t\tbone.name = gbone.name;\n\t\t\t\tbone.position.fromArray( gbone.pos );\n\t\t\t\tbone.quaternion.fromArray( gbone.rotq );\n\t\t\t\tif ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );\n\n\t\t\t}\n\n\t\t\tfor ( var b = 0, bl = this.geometry.bones.length; b < bl; ++ b ) {\n\n\t\t\t\tgbone = this.geometry.bones[ b ];\n\n\t\t\t\tif ( gbone.parent !== - 1 && gbone.parent !== null &&\n\t\t\t\t\t\tbones[ gbone.parent ] !== undefined ) {\n\n\t\t\t\t\tbones[ gbone.parent ].add( bones[ b ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.add( bones[ b ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.normalizeSkinWeights();\n\n\t\tthis.updateMatrixWorld( true );\n\t\tthis.bind( new Skeleton( bones, undefined, useVertexTexture ), this.matrixWorld );\n\n\t}\n\n\n\tSkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\t\tconstructor: SkinnedMesh,\n\n\t\tisSkinnedMesh: true,\n\n\t\tbind: function( skeleton, bindMatrix ) {\n\n\t\t\tthis.skeleton = skeleton;\n\n\t\t\tif ( bindMatrix === undefined ) {\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t\t}\n\n\t\t\tthis.bindMatrix.copy( bindMatrix );\n\t\t\tthis.bindMatrixInverse.getInverse( bindMatrix );\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tthis.skeleton.pose();\n\n\t\t},\n\n\t\tnormalizeSkinWeights: function () {\n\n\t\t\tif ( (this.geometry && this.geometry.isGeometry) ) {\n\n\t\t\t\tfor ( var i = 0; i < this.geometry.skinWeights.length; i ++ ) {\n\n\t\t\t\t\tvar sw = this.geometry.skinWeights[ i ];\n\n\t\t\t\t\tvar scale = 1.0 / sw.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tsw.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tsw.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( (this.geometry && this.geometry.isBufferGeometry) ) {\n\n\t\t\t\tvar vec = new Vector4();\n\n\t\t\t\tvar skinWeight = this.geometry.attributes.skinWeight;\n\n\t\t\t\tfor ( var i = 0; i < skinWeight.count; i ++ ) {\n\n\t\t\t\t\tvec.x = skinWeight.getX( i );\n\t\t\t\t\tvec.y = skinWeight.getY( i );\n\t\t\t\t\tvec.z = skinWeight.getZ( i );\n\t\t\t\t\tvec.w = skinWeight.getW( i );\n\n\t\t\t\t\tvar scale = 1.0 / vec.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tvec.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvec.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t\tskinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrixWorld: function( force ) {\n\n\t\t\tMesh.prototype.updateMatrixWorld.call( this, true );\n\n\t\t\tif ( this.bindMode === \"attached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.matrixWorld );\n\n\t\t\t} else if ( this.bindMode === \"detached\" ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.bindMatrix );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.SkinnedMesh unrecognized bindMode: ' + this.bindMode );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function() {\n\n\t\t\treturn new this.constructor( this.geometry, this.material, this.skeleton.useVertexTexture ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t * linecap: \"round\",\n\t * linejoin: \"round\"\n\t * }\n\t */\n\n\tfunction LineBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\t\tthis.linecap = 'round';\n\t\tthis.linejoin = 'round';\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineBasicMaterial.prototype = Object.create( Material.prototype );\n\tLineBasicMaterial.prototype.constructor = LineBasicMaterial;\n\n\tLineBasicMaterial.prototype.isLineBasicMaterial = true;\n\n\tLineBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Line( geometry, material, mode ) {\n\n\t\tif ( mode === 1 ) {\n\n\t\t\tconsole.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' );\n\t\t\treturn new LineSegments( geometry, material );\n\n\t\t}\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tLine.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Line,\n\n\t\tisLine: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar precision = raycaster.linePrecision;\n\t\t\t\tvar precisionSq = precision * precision;\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar vStart = new Vector3();\n\t\t\t\tvar vEnd = new Vector3();\n\t\t\t\tvar interSegment = new Vector3();\n\t\t\t\tvar interRay = new Vector3();\n\t\t\t\tvar step = (this && this.isLineSegments) ? 2 : 1;\n\n\t\t\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, l = indices.length - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\t\t\t\t\t\t\tvar b = indices[ i + 1 ];\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, a * 3 );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, b * 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\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\tfor ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, 3 * i );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, 3 * i + 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\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 if ( (geometry && geometry.isGeometry) ) {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar nbVertices = vertices.length;\n\n\t\t\t\t\tfor ( var i = 0; i < nbVertices - 1; i += step ) {\n\n\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );\n\n\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LineSegments( geometry, material ) {\n\n\t\tLine.call( this, geometry, material );\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tLineSegments.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\t\tconstructor: LineSegments,\n\n\t\tisLineSegments: true\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t * map: new THREE.Texture( ),\n\t *\n\t * size: ,\n\t * sizeAttenuation: \n\t * }\n\t */\n\n\tfunction PointsMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tPointsMaterial.prototype = Object.create( Material.prototype );\n\tPointsMaterial.prototype.constructor = PointsMaterial;\n\n\tPointsMaterial.prototype.isPointsMaterial = true;\n\n\tPointsMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Points( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tPoints.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Points,\n\n\t\tisPoints: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar object = this;\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\t\t\t\tvar threshold = raycaster.params.Points.threshold;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\t\t\tvar localThresholdSq = localThreshold * localThreshold;\n\t\t\t\tvar position = new Vector3();\n\n\t\t\t\tfunction testPoint( point, index ) {\n\n\t\t\t\t\tvar rayPointDistanceSq = ray.distanceSqToPoint( point );\n\n\t\t\t\t\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\t\t\t\t\tvar intersectPoint = ray.closestPointToPoint( point );\n\t\t\t\t\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\t\t\t\t\tpoint: intersectPoint.clone(),\n\t\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tobject: 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\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, il = indices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\n\t\t\t\t\t\t\tposition.fromArray( positions, a * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, a );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tposition.fromArray( positions, i * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, i );\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\tvar vertices = geometry.vertices;\n\n\t\t\t\t\tfor ( var i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\ttestPoint( vertices[ i ], i );\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\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Group() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Group';\n\n\t}\n\n\tGroup.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Group\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.generateMipmaps = false;\n\n\t\tvar scope = this;\n\n\t\tfunction update() {\n\n\t\t\trequestAnimationFrame( update );\n\n\t\t\tif ( video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\t\tscope.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tupdate();\n\n\t}\n\n\tVideoTexture.prototype = Object.create( Texture.prototype );\n\tVideoTexture.prototype.constructor = VideoTexture;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\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\tCompressedTexture.prototype = Object.create( Texture.prototype );\n\tCompressedTexture.prototype.constructor = CompressedTexture;\n\n\tCompressedTexture.prototype.isCompressedTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tCanvasTexture.prototype = Object.create( Texture.prototype );\n\tCanvasTexture.prototype.constructor = CanvasTexture;\n\n\t/**\n\t * @author Matt DesLauriers / @mattdesl\n\t * @author atix / arthursilber.de\n\t */\n\n\tfunction DepthTexture( 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\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.type = type !== undefined ? type : UnsignedShortType;\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\t= false;\n\n\t}\n\n\tDepthTexture.prototype = Object.create( Texture.prototype );\n\tDepthTexture.prototype.constructor = DepthTexture;\n\tDepthTexture.prototype.isDepthTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WireframeGeometry( geometry ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tvar edge = [ 0, 0 ], hash = {};\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\tif ( (geometry && geometry.isGeometry) ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\t\t\tvar faces = geometry.faces;\n\t\t\tvar numEdges = 0;\n\n\t\t\t// allocate maximal size\n\t\t\tvar edges = new Uint32Array( 6 * faces.length );\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\t\tvar key = edge.toString();\n\n\t\t\t\t\tif ( hash[ key ] === undefined ) {\n\n\t\t\t\t\t\tedges[ 2 * numEdges ] = edge[ 0 ];\n\t\t\t\t\t\tedges[ 2 * numEdges + 1 ] = edge[ 1 ];\n\t\t\t\t\t\thash[ key ] = true;\n\t\t\t\t\t\tnumEdges ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar coords = new Float32Array( numEdges * 2 * 3 );\n\n\t\t\tfor ( var i = 0, l = numEdges; i < l; i ++ ) {\n\n\t\t\t\tfor ( var j = 0; j < 2; j ++ ) {\n\n\t\t\t\t\tvar vertex = vertices[ edges [ 2 * i + j ] ];\n\n\t\t\t\t\tvar index = 6 * i + 3 * j;\n\t\t\t\t\tcoords[ index + 0 ] = vertex.x;\n\t\t\t\t\tcoords[ index + 1 ] = vertex.y;\n\t\t\t\t\tcoords[ index + 2 ] = vertex.z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.addAttribute( 'position', new BufferAttribute( coords, 3 ) );\n\n\t\t} else if ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// Indexed BufferGeometry\n\n\t\t\t\tvar indices = geometry.index.array;\n\t\t\t\tvar vertices = geometry.attributes.position;\n\t\t\t\tvar groups = geometry.groups;\n\t\t\t\tvar numEdges = 0;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgeometry.addGroup( 0, indices.length );\n\n\t\t\t\t}\n\n\t\t\t\t// allocate maximal size\n\t\t\t\tvar edges = new Uint32Array( 2 * indices.length );\n\n\t\t\t\tfor ( var o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tvar group = groups[ o ];\n\n\t\t\t\t\tvar start = group.start;\n\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tedge[ 0 ] = indices[ i + j ];\n\t\t\t\t\t\t\tedge[ 1 ] = indices[ i + ( j + 1 ) % 3 ];\n\t\t\t\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\t\t\t\tvar key = edge.toString();\n\n\t\t\t\t\t\t\tif ( hash[ key ] === undefined ) {\n\n\t\t\t\t\t\t\t\tedges[ 2 * numEdges ] = edge[ 0 ];\n\t\t\t\t\t\t\t\tedges[ 2 * numEdges + 1 ] = edge[ 1 ];\n\t\t\t\t\t\t\t\thash[ key ] = true;\n\t\t\t\t\t\t\t\tnumEdges ++;\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\tvar coords = new Float32Array( numEdges * 2 * 3 );\n\n\t\t\t\tfor ( var i = 0, l = numEdges; i < l; i ++ ) {\n\n\t\t\t\t\tfor ( var j = 0; j < 2; j ++ ) {\n\n\t\t\t\t\t\tvar index = 6 * i + 3 * j;\n\t\t\t\t\t\tvar index2 = edges[ 2 * i + j ];\n\n\t\t\t\t\t\tcoords[ index + 0 ] = vertices.getX( index2 );\n\t\t\t\t\t\tcoords[ index + 1 ] = vertices.getY( index2 );\n\t\t\t\t\t\tcoords[ index + 2 ] = vertices.getZ( index2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.addAttribute( 'position', new BufferAttribute( coords, 3 ) );\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tvar vertices = geometry.attributes.position.array;\n\t\t\t\tvar numEdges = vertices.length / 3;\n\t\t\t\tvar numTris = numEdges / 3;\n\n\t\t\t\tvar coords = new Float32Array( numEdges * 2 * 3 );\n\n\t\t\t\tfor ( var i = 0, l = numTris; i < l; i ++ ) {\n\n\t\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\tvar index = 18 * i + 6 * j;\n\n\t\t\t\t\t\tvar index1 = 9 * i + 3 * j;\n\t\t\t\t\t\tcoords[ index + 0 ] = vertices[ index1 ];\n\t\t\t\t\t\tcoords[ index + 1 ] = vertices[ index1 + 1 ];\n\t\t\t\t\t\tcoords[ index + 2 ] = vertices[ index1 + 2 ];\n\n\t\t\t\t\t\tvar index2 = 9 * i + 3 * ( ( j + 1 ) % 3 );\n\t\t\t\t\t\tcoords[ index + 3 ] = vertices[ index2 ];\n\t\t\t\t\t\tcoords[ index + 4 ] = vertices[ index2 + 1 ];\n\t\t\t\t\t\tcoords[ index + 5 ] = vertices[ index2 + 2 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.addAttribute( 'position', new BufferAttribute( coords, 3 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tWireframeGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tWireframeGeometry.prototype.constructor = WireframeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricBufferGeometry( func, slices, stacks ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ParametricBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\t// generate vertices and uvs\n\n\t\tvar vertices = [];\n\t\tvar uvs = [];\n\n\t\tvar i, j, p;\n\t\tvar u, v;\n\n\t\tvar sliceCount = slices + 1;\n\n\t\tfor ( i = 0; i <= stacks; i ++ ) {\n\n\t\t\tv = i / stacks;\n\n\t\t\tfor ( j = 0; j <= slices; j ++ ) {\n\n\t\t\t\tu = j / slices;\n\n\t\t\t\tp = func( u, v );\n\t\t\t\tvertices.push( p.x, p.y, p.z );\n\n\t\t\t\tuvs.push( u, v );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tvar indices = [];\n\t\tvar a, b, c, d;\n\n\t\tfor ( i = 0; i < stacks; i ++ ) {\n\n\t\t\tfor ( j = 0; j < slices; j ++ ) {\n\n\t\t\t\ta = i * sliceCount + j;\n\t\t\t\tb = i * sliceCount + j + 1;\n\t\t\t\tc = ( i + 1 ) * sliceCount + j + 1;\n\t\t\t\td = ( i + 1 ) * sliceCount + j;\n\n\t\t\t\t// faces one and two\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.length > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) );\n\t\tthis.addAttribute( 'position', Float32Attribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'uv', Float32Attribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t}\n\n\tParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;\n\n\t/**\n\t * @author zz85 / https://github.com/zz85\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\tfunction ParametricGeometry( func, slices, stacks ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ParametricGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tParametricGeometry.prototype = Object.create( Geometry.prototype );\n\tParametricGeometry.prototype.constructor = ParametricGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction PolyhedronBufferGeometry( vertices, indices, radius, detail ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronBufferGeometry';\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\tradius = radius || 1;\n\t\tdetail = detail || 0;\n\n\t\t// default buffer data\n\n\t\tvar vertexBuffer = [];\n\t\tvar 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\tappplyRadius( 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.addAttribute( 'position', Float32Attribute( vertexBuffer, 3 ) );\n\t\tthis.addAttribute( 'normal', Float32Attribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.addAttribute( 'uv', Float32Attribute( uvBuffer, 2 ) );\n\t\tthis.normalizeNormals();\n\n\t\tthis.boundingSphere = new Sphere( new Vector3(), radius );\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\t\tfor ( var 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\tvar cols = Math.pow( 2, detail );\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tvar v = [];\n\n\t\t\tvar i, j;\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( i = 0 ; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tvar aj = a.clone().lerp( c, i / cols );\n\t\t\t\tvar bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tvar rows = cols - i;\n\n\t\t\t\tfor ( 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 ( i = 0; i < cols ; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tvar 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 appplyRadius( radius ) {\n\n\t\t\tvar 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 ( var 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\tvar vertex = new Vector3();\n\n\t\t\tfor ( var 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\tvar u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tvar 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 ( var i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tvar x0 = uvBuffer[ i + 0 ];\n\t\t\t\tvar x1 = uvBuffer[ i + 2 ];\n\t\t\t\tvar x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tvar max = Math.max( x0, x1, x2 );\n\t\t\t\tvar 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\tvar 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\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\tvar centroid = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tfor ( var 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\tvar 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\tPolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TetrahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tTetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tTetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction TetrahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTetrahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tTetrahedronGeometry.prototype.constructor = TetrahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction OctahedronBufferGeometry( radius,detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 1, 0, 0, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tOctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tOctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction OctahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tOctahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tOctahedronGeometry.prototype.constructor = OctahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction IcosahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tvar vertices = [\n\t\t\t- 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0,\n\t\t\t 0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t,\n\t\t\t t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11,\n\t\t\t 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8,\n\t\t\t 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9,\n\t\t\t 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tIcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tIcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t */\n\n\tfunction IcosahedronGeometry( radius, detail ) {\n\n\t \tGeometry.call( this );\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\tthis.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tIcosahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tIcosahedronGeometry.prototype.constructor = IcosahedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction DodecahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tvar r = 1 / t;\n\n\t\tvar vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1, - 1, - 1, 1,\n\t\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t\t 1, - 1, - 1, 1, - 1, 1,\n\t\t\t 1, 1, - 1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t 0, - r, - t, 0, - r, t,\n\t\t\t 0, 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\t r, - 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\tvar indices = [\n\t\t\t 3, 11, 7, 3, 7, 15, 3, 15, 13,\n\t\t\t 7, 19, 17, 7, 17, 6, 7, 6, 15,\n\t\t\t17, 4, 8, 17, 8, 10, 17, 10, 6,\n\t\t\t 8, 0, 16, 8, 16, 2, 8, 2, 10,\n\t\t\t 0, 12, 1, 0, 1, 18, 0, 18, 16,\n\t\t\t 6, 10, 2, 6, 2, 13, 6, 13, 15,\n\t\t\t 2, 16, 18, 2, 18, 3, 2, 3, 13,\n\t\t\t18, 1, 9, 18, 9, 11, 18, 11, 3,\n\t\t\t 4, 14, 12, 4, 12, 0, 4, 0, 8,\n\t\t\t11, 9, 5, 11, 5, 19, 11, 19, 7,\n\t\t\t19, 5, 14, 19, 14, 4, 19, 4, 17,\n\t\t\t 1, 12, 14, 1, 14, 5, 1, 5, 9\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tDodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tDodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;\n\n\t/**\n\t * @author Abe Pazos / https://hamoid.com\n\t */\n\n\tfunction DodecahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tDodecahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tDodecahedronGeometry.prototype.constructor = DodecahedronGeometry;\n\n\t/**\n\t * @author clockworkgeek / https://github.com/clockworkgeek\n\t * @author timothypratley / https://github.com/timothypratley\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction PolyhedronGeometry( vertices, indices, radius, detail ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tPolyhedronGeometry.prototype = Object.create( Geometry.prototype );\n\tPolyhedronGeometry.prototype.constructor = PolyhedronGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Creates a tube which extrudes along a 3d spline.\n\t *\n\t */\n\n\tfunction TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TubeBufferGeometry';\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\ttubularSegments = tubularSegments || 64;\n\t\tradius = radius || 1;\n\t\tradialSegments = radialSegments || 8;\n\t\tclosed = closed || false;\n\n\t\tvar 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\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar i, j;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\t\tvar indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( ( indices.length > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) );\n\t\tthis.addAttribute( 'position', Float32Attribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', Float32Attribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', Float32Attribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( 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\tvar P = path.getPointAt( i / tubularSegments );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tvar N = frames.normals[ i ];\n\t\t\tvar B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tvar sin = Math.sin( v );\n\t\t\t\tvar 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 ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tvar 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 ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( 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\tTubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTubeBufferGeometry.prototype.constructor = TubeBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode / https://github.com/oosmoxiecode\n\t * @author WestLangley / https://github.com/WestLangley\n\t * @author zz85 / https://github.com/zz85\n\t * @author miningold / https://github.com/miningold\n\t * @author jonobr1 / https://github.com/jonobr1\n\t *\n\t * Creates a tube which extrudes along a 3d spline.\n\t */\n\n\tfunction TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) {\n\n\t\tGeometry.call( this );\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\tif ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );\n\n\t\tvar bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = bufferGeometry.tangents;\n\t\tthis.normals = bufferGeometry.normals;\n\t\tthis.binormals = bufferGeometry.binormals;\n\n\t\t// create geometry\n\n\t\tthis.fromBufferGeometry( bufferGeometry );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTubeGeometry.prototype = Object.create( Geometry.prototype );\n\tTubeGeometry.prototype.constructor = TubeGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * see: http://www.blackpawn.com/texts/pqtorus/\n\t */\n\tfunction TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotBufferGeometry';\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\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 64;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\tp = p || 2;\n\t\tq = q || 3;\n\n\t\t// used to calculate buffer length\n\t\tvar vertexCount = ( ( radialSegments + 1 ) * ( tubularSegments + 1 ) );\n\t\tvar indexCount = radialSegments * tubularSegments * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// helper variables\n\t\tvar i, j, index = 0, indexOffset = 0;\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar P1 = new Vector3();\n\t\tvar P2 = new Vector3();\n\n\t\tvar B = new Vector3();\n\t\tvar T = new Vector3();\n\t\tvar N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( 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 segement\n\n\t\t\tvar 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 ( 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\tvar v = j / radialSegments * Math.PI * 2;\n\t\t\t\tvar cx = - tube * Math.cos( v );\n\t\t\t\tvar 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 vectos, 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\t// vertex\n\t\t\t\tvertices.setXYZ( index, 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\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\t\t\t\tnormals.setXYZ( index, normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\tuv.y = j / radialSegments;\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// face one\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t\t// face two\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\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\tvar cu = Math.cos( u );\n\t\t\tvar su = Math.sin( u );\n\t\t\tvar quOverP = q / p * u;\n\t\t\tvar 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\tTorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t */\n\n\tfunction TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {\n\n\t\tGeometry.call( this );\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\tif( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );\n\n\t\tthis.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTorusKnotGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusKnotGeometry.prototype.constructor = TorusKnotGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusBufferGeometry';\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\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 6;\n\t\tarc = arc || Math.PI * 2;\n\n\t\t// used to calculate buffer length\n\t\tvar vertexCount = ( ( radialSegments + 1 ) * ( tubularSegments + 1 ) );\n\t\tvar indexCount = radialSegments * tubularSegments * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount );\n\t\tvar vertices = new Float32Array( vertexCount * 3 );\n\t\tvar normals = new Float32Array( vertexCount * 3 );\n\t\tvar uvs = new Float32Array( vertexCount * 2 );\n\n\t\t// offset variables\n\t\tvar vertexBufferOffset = 0;\n\t\tvar uvBufferOffset = 0;\n\t\tvar indexBufferOffset = 0;\n\n\t\t// helper variables\n\t\tvar center = new Vector3();\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tvar u = i / tubularSegments * arc;\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\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[ vertexBufferOffset ] = vertex.x;\n\t\t\t\tvertices[ vertexBufferOffset + 1 ] = vertex.y;\n\t\t\t\tvertices[ vertexBufferOffset + 2 ] = vertex.z;\n\n\t\t\t\t// this vector is used to calculate the normal\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\n\t\t\t\t// normal\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals[ vertexBufferOffset ] = normal.x;\n\t\t\t\tnormals[ vertexBufferOffset + 1 ] = normal.y;\n\t\t\t\tnormals[ vertexBufferOffset + 2 ] = normal.z;\n\n\t\t\t\t// uv\n\t\t\t\tuvs[ uvBufferOffset ] = i / tubularSegments;\n\t\t\t\tuvs[ uvBufferOffset + 1 ] = j / radialSegments;\n\n\t\t\t\t// update offsets\n\t\t\t\tvertexBufferOffset += 3;\n\t\t\t\tuvBufferOffset += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\t\t\t\tvar a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tvar b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tvar c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tvar d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// face one\n\t\t\t\tindices[ indexBufferOffset ] = a;\n\t\t\t\tindices[ indexBufferOffset + 1 ] = b;\n\t\t\t\tindices[ indexBufferOffset + 2 ] = d;\n\n\t\t\t\t// face two\n\t\t\t\tindices[ indexBufferOffset + 3 ] = b;\n\t\t\t\tindices[ indexBufferOffset + 4 ] = c;\n\t\t\t\tindices[ indexBufferOffset + 5 ] = d;\n\n\t\t\t\t// update offset\n\t\t\t\tindexBufferOffset += 6;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\t\tthis.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tTorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusBufferGeometry.prototype.constructor = TorusBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888\n\t */\n\n\tfunction TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );\n\n\t}\n\n\tTorusGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusGeometry.prototype.constructor = TorusGeometry;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tvar ShapeUtils = {\n\n\t\t// calculate area of the contour polygon\n\n\t\tarea: function ( contour ) {\n\n\t\t\tvar n = contour.length;\n\t\t\tvar a = 0.0;\n\n\t\t\tfor ( var p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t\t}\n\n\t\t\treturn a * 0.5;\n\n\t\t},\n\n\t\ttriangulate: ( function () {\n\n\t\t\t/**\n\t\t\t * This code is a quick port of code written in C++ which was submitted to\n\t\t\t * flipcode.com by John W. Ratcliff // July 22, 2000\n\t\t\t * See original code and more information here:\n\t\t\t * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml\n\t\t\t *\n\t\t\t * ported to actionscript by Zevan Rosser\n\t\t\t * www.actionsnippet.com\n\t\t\t *\n\t\t\t * ported to javascript by Joshua Koo\n\t\t\t * http://www.lab4games.net/zz85/blog\n\t\t\t *\n\t\t\t */\n\n\t\t\tfunction snip( contour, u, v, w, n, verts ) {\n\n\t\t\t\tvar p;\n\t\t\t\tvar ax, ay, bx, by;\n\t\t\t\tvar cx, cy, px, py;\n\n\t\t\t\tax = contour[ verts[ u ] ].x;\n\t\t\t\tay = contour[ verts[ u ] ].y;\n\n\t\t\t\tbx = contour[ verts[ v ] ].x;\n\t\t\t\tby = contour[ verts[ v ] ].y;\n\n\t\t\t\tcx = contour[ verts[ w ] ].x;\n\t\t\t\tcy = contour[ verts[ w ] ].y;\n\n\t\t\t\tif ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false;\n\n\t\t\t\tvar aX, aY, bX, bY, cX, cY;\n\t\t\t\tvar apx, apy, bpx, bpy, cpx, cpy;\n\t\t\t\tvar cCROSSap, bCROSScp, aCROSSbp;\n\n\t\t\t\taX = cx - bx; aY = cy - by;\n\t\t\t\tbX = ax - cx; bY = ay - cy;\n\t\t\t\tcX = bx - ax; cY = by - ay;\n\n\t\t\t\tfor ( p = 0; p < n; p ++ ) {\n\n\t\t\t\t\tpx = contour[ verts[ p ] ].x;\n\t\t\t\t\tpy = contour[ verts[ p ] ].y;\n\n\t\t\t\t\tif ( ( ( px === ax ) && ( py === ay ) ) ||\n\t\t\t\t\t\t ( ( px === bx ) && ( py === by ) ) ||\n\t\t\t\t\t\t ( ( px === cx ) && ( py === cy ) ) )\tcontinue;\n\n\t\t\t\t\tapx = px - ax; apy = py - ay;\n\t\t\t\t\tbpx = px - bx; bpy = py - by;\n\t\t\t\t\tcpx = px - cx; cpy = py - cy;\n\n\t\t\t\t\t// see if p is inside triangle abc\n\n\t\t\t\t\taCROSSbp = aX * bpy - aY * bpx;\n\t\t\t\t\tcCROSSap = cX * apy - cY * apx;\n\t\t\t\t\tbCROSScp = bX * cpy - bY * cpx;\n\n\t\t\t\t\tif ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false;\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// takes in an contour array and returns\n\n\t\t\treturn function triangulate( contour, indices ) {\n\n\t\t\t\tvar n = contour.length;\n\n\t\t\t\tif ( n < 3 ) return null;\n\n\t\t\t\tvar result = [],\n\t\t\t\t\tverts = [],\n\t\t\t\t\tvertIndices = [];\n\n\t\t\t\t/* we want a counter-clockwise polygon in verts */\n\n\t\t\t\tvar u, v, w;\n\n\t\t\t\tif ( ShapeUtils.area( contour ) > 0.0 ) {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = v;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v;\n\n\t\t\t\t}\n\n\t\t\t\tvar nv = n;\n\n\t\t\t\t/* remove nv - 2 vertices, creating 1 triangle every time */\n\n\t\t\t\tvar count = 2 * nv; /* error detection */\n\n\t\t\t\tfor ( v = nv - 1; nv > 2; ) {\n\n\t\t\t\t\t/* if we loop, it is probably a non-simple polygon */\n\n\t\t\t\t\tif ( ( count -- ) <= 0 ) {\n\n\t\t\t\t\t\t//** Triangulate: ERROR - probable bad polygon!\n\n\t\t\t\t\t\t//throw ( \"Warning, unable to triangulate polygon!\" );\n\t\t\t\t\t\t//return null;\n\t\t\t\t\t\t// Sometimes warning is fine, especially polygons are triangulated in reverse.\n\t\t\t\t\t\tconsole.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' );\n\n\t\t\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t/* three consecutive vertices in current polygon, */\n\n\t\t\t\t\tu = v; \t \tif ( nv <= u ) u = 0; /* previous */\n\t\t\t\t\tv = u + 1; if ( nv <= v ) v = 0; /* new v */\n\t\t\t\t\tw = v + 1; if ( nv <= w ) w = 0; /* next */\n\n\t\t\t\t\tif ( snip( contour, u, v, w, nv, verts ) ) {\n\n\t\t\t\t\t\tvar a, b, c, s, t;\n\n\t\t\t\t\t\t/* true names of the vertices */\n\n\t\t\t\t\t\ta = verts[ u ];\n\t\t\t\t\t\tb = verts[ v ];\n\t\t\t\t\t\tc = verts[ w ];\n\n\t\t\t\t\t\t/* output Triangle */\n\n\t\t\t\t\t\tresult.push( [ contour[ a ],\n\t\t\t\t\t\t\tcontour[ b ],\n\t\t\t\t\t\t\tcontour[ c ] ] );\n\n\n\t\t\t\t\t\tvertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] );\n\n\t\t\t\t\t\t/* remove v from the remaining polygon */\n\n\t\t\t\t\t\tfor ( s = v, t = v + 1; t < nv; s ++, t ++ ) {\n\n\t\t\t\t\t\t\tverts[ s ] = verts[ t ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnv --;\n\n\t\t\t\t\t\t/* reset error detection counter */\n\n\t\t\t\t\t\tcount = 2 * nv;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\treturn result;\n\n\t\t\t}\n\n\t\t} )(),\n\n\t\ttriangulateShape: function ( contour, holes ) {\n\n\t\t\tfunction removeDupEndPts(points) {\n\n\t\t\t\tvar l = points.length;\n\n\t\t\t\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\t\tpoints.pop();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tremoveDupEndPts( contour );\n\t\t\tholes.forEach( removeDupEndPts );\n\n\t\t\tfunction point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) {\n\n\t\t\t\t// inOtherPt needs to be collinear to the inSegment\n\t\t\t\tif ( inSegPt1.x !== inSegPt2.x ) {\n\n\t\t\t\t\tif ( inSegPt1.x < inSegPt2.x ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( inSegPt1.y < inSegPt2.y ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) {\n\n\t\t\t\tvar seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y;\n\t\t\t\tvar seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y;\n\n\t\t\t\tvar seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x;\n\t\t\t\tvar seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y;\n\n\t\t\t\tvar limit\t\t= seg1dy * seg2dx - seg1dx * seg2dy;\n\t\t\t\tvar perpSeg1\t= seg1dy * seg1seg2dx - seg1dx * seg1seg2dy;\n\n\t\t\t\tif ( Math.abs( limit ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\n\t\t\t\t\tvar perpSeg2;\n\t\t\t\t\tif ( limit > 0 ) {\n\n\t\t\t\t\t\tif ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) \t\treturn [];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) \t\treturn [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// i.e. to reduce rounding errors\n\t\t\t\t\t// intersection at endpoint of segment#1?\n\t\t\t\t\tif ( perpSeg2 === 0 ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( perpSeg2 === limit ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt2 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// intersection at endpoint of segment#2?\n\t\t\t\t\tif ( perpSeg1 === 0 )\t\treturn [ inSeg2Pt1 ];\n\t\t\t\t\tif ( perpSeg1 === limit )\treturn [ inSeg2Pt2 ];\n\n\t\t\t\t\t// return real intersection point\n\t\t\t\t\tvar factorSeg1 = perpSeg2 / limit;\n\t\t\t\t\treturn\t[ { x: inSeg1Pt1.x + factorSeg1 * seg1dx,\n\t\t\t\t\t\t\t\ty: inSeg1Pt1.y + factorSeg1 * seg1dy } ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( ( perpSeg1 !== 0 ) ||\n\t\t\t\t\t\t ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) \t\t\treturn [];\n\n\t\t\t\t\t// they are collinear or degenerate\n\t\t\t\t\tvar seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) );\t// segment1 is just a point?\n\t\t\t\t\tvar seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) );\t// segment2 is just a point?\n\t\t\t\t\t// both segments are points\n\t\t\t\t\tif ( seg1Pt && seg2Pt ) {\n\n\t\t\t\t\t\tif ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) ||\n\t\t\t\t\t\t\t ( inSeg1Pt1.y !== inSeg2Pt1.y ) )\t\treturn [];\t// they are distinct points\n\t\t\t\t\t\treturn [ inSeg1Pt1 ]; \t\t\t\t\t\t// they are the same point\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#1 is a single point\n\t\t\t\t\tif ( seg1Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) )\t\treturn [];\t\t// but not in segment#2\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#2 is a single point\n\t\t\t\t\tif ( seg2Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) )\t\treturn [];\t\t// but not in segment#1\n\t\t\t\t\t\treturn [ inSeg2Pt1 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// they are collinear segments, which might overlap\n\t\t\t\t\tvar seg1min, seg1max, seg1minVal, seg1maxVal;\n\t\t\t\t\tvar seg2min, seg2max, seg2minVal, seg2maxVal;\n\t\t\t\t\tif ( seg1dx !== 0 ) {\n\n\t\t\t\t\t\t// the segments are NOT on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.x < inSeg1Pt2.x ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.x < inSeg2Pt2.x ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// the segments are on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.y < inSeg1Pt2.y ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.y < inSeg2Pt2.y ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( seg1minVal <= seg2minVal ) {\n\n\t\t\t\t\t\tif ( seg1maxVal < seg2minVal )\treturn [];\n\t\t\t\t\t\tif ( seg1maxVal === seg2minVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg2min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg2min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg2min, seg2max ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( seg1minVal > seg2maxVal )\treturn [];\n\t\t\t\t\t\tif ( seg1minVal === seg2maxVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg1min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg1min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg1min, seg2max ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) {\n\n\t\t\t\t// The order of legs is important\n\n\t\t\t\t// translation of all points, so that Vertex is at (0,0)\n\t\t\t\tvar legFromPtX\t= inLegFromPt.x - inVertex.x, legFromPtY\t= inLegFromPt.y - inVertex.y;\n\t\t\t\tvar legToPtX\t= inLegToPt.x\t- inVertex.x, legToPtY\t\t= inLegToPt.y\t- inVertex.y;\n\t\t\t\tvar otherPtX\t= inOtherPt.x\t- inVertex.x, otherPtY\t\t= inOtherPt.y\t- inVertex.y;\n\n\t\t\t\t// main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg.\n\t\t\t\tvar from2toAngle\t= legFromPtX * legToPtY - legFromPtY * legToPtX;\n\t\t\t\tvar from2otherAngle\t= legFromPtX * otherPtY - legFromPtY * otherPtX;\n\n\t\t\t\tif ( Math.abs( from2toAngle ) > Number.EPSILON ) {\n\n\t\t\t\t\t// angle != 180 deg.\n\n\t\t\t\t\tvar other2toAngle\t\t= otherPtX * legToPtY - otherPtY * legToPtX;\n\t\t\t\t\t// console.log( \"from2to: \" + from2toAngle + \", from2other: \" + from2otherAngle + \", other2to: \" + other2toAngle );\n\n\t\t\t\t\tif ( from2toAngle > 0 ) {\n\n\t\t\t\t\t\t// main angle < 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// main angle > 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// angle == 180 deg.\n\t\t\t\t\t// console.log( \"from2to: 180 deg., from2other: \" + from2otherAngle );\n\t\t\t\t\treturn\t( from2otherAngle > 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tfunction removeHoles( contour, holes ) {\n\n\t\t\t\tvar shape = contour.concat(); // work on this shape\n\t\t\t\tvar hole;\n\n\t\t\t\tfunction isCutLineInsideAngles( inShapeIdx, inHoleIdx ) {\n\n\t\t\t\t\t// Check if hole point lies within angle around shape point\n\t\t\t\t\tvar lastShapeIdx = shape.length - 1;\n\n\t\t\t\t\tvar prevShapeIdx = inShapeIdx - 1;\n\t\t\t\t\tif ( prevShapeIdx < 0 )\t\t\tprevShapeIdx = lastShapeIdx;\n\n\t\t\t\t\tvar nextShapeIdx = inShapeIdx + 1;\n\t\t\t\t\tif ( nextShapeIdx > lastShapeIdx )\tnextShapeIdx = 0;\n\n\t\t\t\t\tvar insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Shape): \" + inShapeIdx + \", Point: \" + hole[inHoleIdx].x + \"/\" + hole[inHoleIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check if shape point lies within angle around hole point\n\t\t\t\t\tvar lastHoleIdx = hole.length - 1;\n\n\t\t\t\t\tvar prevHoleIdx = inHoleIdx - 1;\n\t\t\t\t\tif ( prevHoleIdx < 0 )\t\t\tprevHoleIdx = lastHoleIdx;\n\n\t\t\t\t\tvar nextHoleIdx = inHoleIdx + 1;\n\t\t\t\t\tif ( nextHoleIdx > lastHoleIdx )\tnextHoleIdx = 0;\n\n\t\t\t\t\tinsideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Hole): \" + inHoleIdx + \", Point: \" + shape[inShapeIdx].x + \"/\" + shape[inShapeIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\ttrue;\n\n\t\t\t\t}\n\n\t\t\t\tfunction intersectsShapeEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with shape edges\n\t\t\t\t\tvar sIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( sIdx = 0; sIdx < shape.length; sIdx ++ ) {\n\n\t\t\t\t\t\tnextIdx = sIdx + 1; nextIdx %= shape.length;\n\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true );\n\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar indepHoles = [];\n\n\t\t\t\tfunction intersectsHoleEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with hole edges\n\t\t\t\t\tvar ihIdx, chkHole,\n\t\t\t\t\t\thIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) {\n\n\t\t\t\t\t\tchkHole = holes[ indepHoles[ ihIdx ]];\n\t\t\t\t\t\tfor ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) {\n\n\t\t\t\t\t\t\tnextIdx = hIdx + 1; nextIdx %= chkHole.length;\n\t\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true );\n\t\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar holeIndex, shapeIndex,\n\t\t\t\t\tshapePt, holePt,\n\t\t\t\t\tholeIdx, cutKey, failedCuts = [],\n\t\t\t\t\ttmpShape1, tmpShape2,\n\t\t\t\t\ttmpHole1, tmpHole2;\n\n\t\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tindepHoles.push( h );\n\n\t\t\t\t}\n\n\t\t\t\tvar minShapeIndex = 0;\n\t\t\t\tvar counter = indepHoles.length * 2;\n\t\t\t\twhile ( indepHoles.length > 0 ) {\n\n\t\t\t\t\tcounter --;\n\t\t\t\t\tif ( counter < 0 ) {\n\n\t\t\t\t\t\tconsole.log( \"Infinite Loop! Holes left:\" + indepHoles.length + \", Probably Hole outside Shape!\" );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// search for shape-vertex and hole-vertex,\n\t\t\t\t\t// which can be connected without intersections\n\t\t\t\t\tfor ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) {\n\n\t\t\t\t\t\tshapePt = shape[ shapeIndex ];\n\t\t\t\t\t\tholeIndex\t= - 1;\n\n\t\t\t\t\t\t// search for hole which can be reached without intersections\n\t\t\t\t\t\tfor ( var h = 0; h < indepHoles.length; h ++ ) {\n\n\t\t\t\t\t\t\tholeIdx = indepHoles[ h ];\n\n\t\t\t\t\t\t\t// prevent multiple checks\n\t\t\t\t\t\t\tcutKey = shapePt.x + \":\" + shapePt.y + \":\" + holeIdx;\n\t\t\t\t\t\t\tif ( failedCuts[ cutKey ] !== undefined )\t\t\tcontinue;\n\n\t\t\t\t\t\t\thole = holes[ holeIdx ];\n\t\t\t\t\t\t\tfor ( var h2 = 0; h2 < hole.length; h2 ++ ) {\n\n\t\t\t\t\t\t\t\tholePt = hole[ h2 ];\n\t\t\t\t\t\t\t\tif ( ! isCutLineInsideAngles( shapeIndex, h2 ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsShapeEdge( shapePt, holePt ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsHoleEdge( shapePt, holePt ) )\t\tcontinue;\n\n\t\t\t\t\t\t\t\tholeIndex = h2;\n\t\t\t\t\t\t\t\tindepHoles.splice( h, 1 );\n\n\t\t\t\t\t\t\t\ttmpShape1 = shape.slice( 0, shapeIndex + 1 );\n\t\t\t\t\t\t\t\ttmpShape2 = shape.slice( shapeIndex );\n\t\t\t\t\t\t\t\ttmpHole1 = hole.slice( holeIndex );\n\t\t\t\t\t\t\t\ttmpHole2 = hole.slice( 0, holeIndex + 1 );\n\n\t\t\t\t\t\t\t\tshape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 );\n\n\t\t\t\t\t\t\t\tminShapeIndex = shapeIndex;\n\n\t\t\t\t\t\t\t\t// Debug only, to show the selected cuts\n\t\t\t\t\t\t\t\t// glob_CutLines.push( [ shapePt, holePt ] );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t\t\tfailedCuts[ cutKey ] = true;\t\t\t// remember failure\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn shape; \t\t\t/* shape with no holes */\n\n\t\t\t}\n\n\n\t\t\tvar i, il, f, face,\n\t\t\t\tkey, index,\n\t\t\t\tallPointsMap = {};\n\n\t\t\t// To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first.\n\n\t\t\tvar allpoints = contour.concat();\n\n\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( allpoints, holes[ h ] );\n\n\t\t\t}\n\n\t\t\t//console.log( \"allpoints\",allpoints, allpoints.length );\n\n\t\t\t// prepare all points map\n\n\t\t\tfor ( i = 0, il = allpoints.length; i < il; i ++ ) {\n\n\t\t\t\tkey = allpoints[ i ].x + \":\" + allpoints[ i ].y;\n\n\t\t\t\tif ( allPointsMap[ key ] !== undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.ShapeUtils: Duplicate point\", key, i );\n\n\t\t\t\t}\n\n\t\t\t\tallPointsMap[ key ] = i;\n\n\t\t\t}\n\n\t\t\t// remove holes by cutting paths to holes and adding them to the shape\n\t\t\tvar shapeWithoutHoles = removeHoles( contour, holes );\n\n\t\t\tvar triangles = ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape\n\t\t\t//console.log( \"triangles\",triangles, triangles.length );\n\n\t\t\t// check all face vertices against all points map\n\n\t\t\tfor ( i = 0, il = triangles.length; i < il; i ++ ) {\n\n\t\t\t\tface = triangles[ i ];\n\n\t\t\t\tfor ( f = 0; f < 3; f ++ ) {\n\n\t\t\t\t\tkey = face[ f ].x + \":\" + face[ f ].y;\n\n\t\t\t\t\tindex = allPointsMap[ key ];\n\n\t\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\t\tface[ f ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn triangles.concat();\n\n\t\t},\n\n\t\tisClockWise: function ( pts ) {\n\n\t\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t\t},\n\n\t\t// Bezier Curves formulas obtained from\n\t\t// http://en.wikipedia.org/wiki/B%C3%A9zier_curve\n\n\t\t// Quad Bezier Functions\n\n\t\tb2: ( function () {\n\n\t\t\tfunction b2p0( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn k * k * p;\n\n\t\t\t}\n\n\t\t\tfunction b2p1( t, p ) {\n\n\t\t\t\treturn 2 * ( 1 - t ) * t * p;\n\n\t\t\t}\n\n\t\t\tfunction b2p2( t, p ) {\n\n\t\t\t\treturn t * t * p;\n\n\t\t\t}\n\n\t\t\treturn function b2( t, p0, p1, p2 ) {\n\n\t\t\t\treturn b2p0( t, p0 ) + b2p1( t, p1 ) + b2p2( t, p2 );\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\t// Cubic Bezier Functions\n\n\t\tb3: ( function () {\n\n\t\t\tfunction b3p0( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn k * k * k * p;\n\n\t\t\t}\n\n\t\t\tfunction b3p1( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn 3 * k * k * t * p;\n\n\t\t\t}\n\n\t\t\tfunction b3p2( t, p ) {\n\n\t\t\t\tvar k = 1 - t;\n\t\t\t\treturn 3 * k * t * t * p;\n\n\t\t\t}\n\n\t\t\tfunction b3p3( t, p ) {\n\n\t\t\t\treturn t * t * t * p;\n\n\t\t\t}\n\n\t\t\treturn function b3( t, p0, p1, p2, p3 ) {\n\n\t\t\t\treturn b3p0( t, p0 ) + b3p1( t, p1 ) + b3p2( t, p2 ) + b3p3( t, p3 );\n\n\t\t\t};\n\n\t\t} )()\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Creates extruded geometry from a path shape.\n\t *\n\t * parameters = {\n\t *\n\t * curveSegments: , // number of points on the curves\n\t * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n\t * amount: , // Depth to extrude the shape\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into the original shape bevel goes\n\t * bevelSize: , // how far from shape outline is bevel\n\t * bevelSegments: , // number of bevel layers\n\t *\n\t * extrudePath: // 3d spline path to extrude shape along. (creates Frames if .frames aren't defined)\n\t * frames: // containing arrays of tangents, normals, binormals\n\t *\n\t * uvGenerator: // object that provides UV generator functions\n\t *\n\t * }\n\t **/\n\n\tfunction ExtrudeGeometry( shapes, options ) {\n\n\t\tif ( typeof( shapes ) === \"undefined\" ) {\n\n\t\t\tshapes = [];\n\t\t\treturn;\n\n\t\t}\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tthis.addShapeList( shapes, options );\n\n\t\tthis.computeFaceNormals();\n\n\t\t// can't really use automatic vertex normals\n\t\t// as then front and back sides get smoothed too\n\t\t// should do separate smoothing just for sides\n\n\t\t//this.computeVertexNormals();\n\n\t\t//console.log( \"took\", ( Date.now() - startTime ) );\n\n\t}\n\n\tExtrudeGeometry.prototype = Object.create( Geometry.prototype );\n\tExtrudeGeometry.prototype.constructor = ExtrudeGeometry;\n\n\tExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) {\n\n\t\tvar sl = shapes.length;\n\n\t\tfor ( var s = 0; s < sl; s ++ ) {\n\n\t\t\tvar shape = shapes[ s ];\n\t\t\tthis.addShape( shape, options );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.prototype.addShape = function ( shape, options ) {\n\n\t\tvar amount = options.amount !== undefined ? options.amount : 100;\n\n\t\tvar bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10\n\t\tvar bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8\n\t\tvar bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\tvar bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false\n\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\n\t\tvar steps = options.steps !== undefined ? options.steps : 1;\n\n\t\tvar extrudePath = options.extrudePath;\n\t\tvar extrudePts, extrudeByPath = false;\n\n\t\t// Use default WorldUVGenerator if no UV generators are specified.\n\t\tvar uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator;\n\n\t\tvar splineTube, binormal, normal, position2;\n\t\tif ( extrudePath ) {\n\n\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\textrudeByPath = true;\n\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t// SETUP TNB variables\n\n\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\tsplineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\tbinormal = new Vector3();\n\t\t\tnormal = new Vector3();\n\t\t\tposition2 = new Vector3();\n\n\t\t}\n\n\t\t// Safeguards if bevels are not enabled\n\n\t\tif ( ! bevelEnabled ) {\n\n\t\t\tbevelSegments = 0;\n\t\t\tbevelThickness = 0;\n\t\t\tbevelSize = 0;\n\n\t\t}\n\n\t\t// Variables initialization\n\n\t\tvar ahole, h, hl; // looping of holes\n\t\tvar scope = this;\n\n\t\tvar shapesOffset = this.vertices.length;\n\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)!\n\n\t\t}\n\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t/* Vertices */\n\n\t\tvar contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\tvertices = vertices.concat( ahole );\n\n\t\t}\n\n\n\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\tif ( ! vec ) console.error( \"THREE.ExtrudeGeometry: vec does not exist\" );\n\n\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t}\n\n\t\tvar b, bs, t, z,\n\t\t\tvert, vlen = vertices.length,\n\t\t\tface, flen = faces.length;\n\n\n\t\t// Find directions for point movement\n\n\n\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t//\n\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\tvar v_trans_x, v_trans_y, shrink_by = 1;\t\t// resulting translation vector for inPt\n\n\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\tvar v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y;\n\t\t\tvar v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y;\n\n\t\t\tvar v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t// check for collinear edges\n\t\t\tvar collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t// not collinear\n\n\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\tvar v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\tvar v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\tvar ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\tvar ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\tvar ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\tvar ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\tvar sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\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// vector from inPt to intersection point\n\n\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t// but prevent crazy spikes\n\t\t\t\tvar v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\treturn\tnew Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\tvar direction_eq = false;\t\t// assumes: opposite\n\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tnew Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t}\n\n\n\t\tvar contourMovements = [];\n\n\t\tfor ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\tif ( j === il ) j = 0;\n\t\t\tif ( k === il ) k = 0;\n\n\t\t\t// (j)---(i)---(k)\n\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t}\n\n\t\tvar holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\toneHoleMovements = [];\n\n\t\t\tfor ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t}\n\n\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t}\n\n\n\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\tfor ( b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tbs = bevelSize;\n\n\t\t// Back facing vertices\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t} else {\n\n\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add stepped vertices...\n\t\t// Including front facing vertices\n\n\t\tvar s;\n\n\t\tfor ( s = 1; s <= steps; s ++ ) {\n\n\t\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, amount / steps * s );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// Add bevel segments planes\n\n\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\tfor ( b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos ( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/* Faces */\n\n\t\t// Top and bottom faces\n\n\t\tbuildLidFaces();\n\n\t\t// Sides faces\n\n\t\tbuildSideFaces();\n\n\n\t\t///// Internal functions\n\n\t\tfunction buildLidFaces() {\n\n\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\tvar layer = 0; // steps + 1\n\t\t\t\tvar offset = vlen * layer;\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Create faces for the z-sides of the shape\n\n\t\tfunction buildSideFaces() {\n\n\t\t\tvar layeroffset = 0;\n\t\t\tsidewalls( contour, layeroffset );\n\t\t\tlayeroffset += contour.length;\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t//, true\n\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\tvar j, k;\n\t\t\ti = contour.length;\n\n\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\tj = i;\n\t\t\t\tk = i - 1;\n\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\tvar s = 0, sl = steps + bevelSegments * 2;\n\n\t\t\t\tfor ( s = 0; s < sl; s ++ ) {\n\n\t\t\t\t\tvar slen1 = vlen * s;\n\t\t\t\t\tvar slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\tvar a = layeroffset + j + slen1,\n\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\tf4( a, b, c, d, contour, s, sl, j, k );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tfunction v( x, y, z ) {\n\n\t\t\tscope.vertices.push( new Vector3( x, y, z ) );\n\n\t\t}\n\n\t\tfunction f3( a, b, c ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, c, null, null, 0 ) );\n\n\t\t\tvar uvs = uvgen.generateTopUV( scope, a, b, c );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( uvs );\n\n\t\t}\n\n\t\tfunction f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) {\n\n\t\t\ta += shapesOffset;\n\t\t\tb += shapesOffset;\n\t\t\tc += shapesOffset;\n\t\t\td += shapesOffset;\n\n\t\t\tscope.faces.push( new Face3( a, b, d, null, null, 1 ) );\n\t\t\tscope.faces.push( new Face3( b, c, d, null, null, 1 ) );\n\n\t\t\tvar uvs = uvgen.generateSideWallUV( scope, a, b, c, d );\n\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ] );\n\t\t\tscope.faceVertexUvs[ 0 ].push( [ uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ] );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.WorldUVGenerator = {\n\n\t\tgenerateTopUV: function ( geometry, indexA, indexB, indexC ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a.x, a.y ),\n\t\t\t\tnew Vector2( b.x, b.y ),\n\t\t\t\tnew Vector2( c.x, c.y )\n\t\t\t];\n\n\t\t},\n\n\t\tgenerateSideWallUV: function ( geometry, indexA, indexB, indexC, indexD ) {\n\n\t\t\tvar vertices = geometry.vertices;\n\n\t\t\tvar a = vertices[ indexA ];\n\t\t\tvar b = vertices[ indexB ];\n\t\t\tvar c = vertices[ indexC ];\n\t\t\tvar d = vertices[ indexD ];\n\n\t\t\tif ( Math.abs( a.y - b.y ) < 0.01 ) {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.x, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.x, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.x, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.x, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t} else {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a.y, 1 - a.z ),\n\t\t\t\t\tnew Vector2( b.y, 1 - b.z ),\n\t\t\t\t\tnew Vector2( c.y, 1 - c.z ),\n\t\t\t\t\tnew Vector2( d.y, 1 - d.z )\n\t\t\t\t];\n\n\t\t\t}\n\n\t\t}\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * Text = 3D Text\n\t *\n\t * parameters = {\n\t * font: , // font\n\t *\n\t * size: , // size of the text\n\t * height: , // thickness to extrude text\n\t * curveSegments: , // number of points on the curves\n\t *\n\t * bevelEnabled: , // turn on bevel\n\t * bevelThickness: , // how deep into text bevel goes\n\t * bevelSize: // how far from text outline is bevel\n\t * }\n\t */\n\n\tfunction TextGeometry( text, parameters ) {\n\n\t\tparameters = parameters || {};\n\n\t\tvar font = parameters.font;\n\n\t\tif ( (font && font.isFont) === false ) {\n\n\t\t\tconsole.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );\n\t\t\treturn new Geometry();\n\n\t\t}\n\n\t\tvar shapes = font.generateShapes( text, parameters.size, parameters.curveSegments );\n\n\t\t// translate parameters to ExtrudeGeometry API\n\n\t\tparameters.amount = parameters.height !== undefined ? parameters.height : 50;\n\n\t\t// defaults\n\n\t\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\n\t\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\n\t\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\n\n\t\tExtrudeGeometry.call( this, shapes, parameters );\n\n\t\tthis.type = 'TextGeometry';\n\n\t}\n\n\tTextGeometry.prototype = Object.create( ExtrudeGeometry.prototype );\n\tTextGeometry.prototype.constructor = TextGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * based on THREE.SphereGeometry\n\t */\n\n\tfunction SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'SphereBufferGeometry';\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\tradius = radius || 50;\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );\n\n\t\tphiStart = phiStart !== undefined ? phiStart : 0;\n\t\tphiLength = phiLength !== undefined ? phiLength : Math.PI * 2;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI;\n\n\t\tvar thetaEnd = thetaStart + thetaLength;\n\n\t\tvar vertexCount = ( ( widthSegments + 1 ) * ( heightSegments + 1 ) );\n\n\t\tvar positions = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\tvar index = 0, vertices = [], normal = new Vector3();\n\n\t\tfor ( var y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\tvar verticesRow = [];\n\n\t\t\tvar v = y / heightSegments;\n\n\t\t\tfor ( var x = 0; x <= widthSegments; x ++ ) {\n\n\t\t\t\tvar u = x / widthSegments;\n\n\t\t\t\tvar px = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvar py = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvar pz = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tnormal.set( px, py, pz ).normalize();\n\n\t\t\t\tpositions.setXYZ( index, px, py, pz );\n\t\t\t\tnormals.setXYZ( index, normal.x, normal.y, normal.z );\n\t\t\t\tuvs.setXY( index, u, 1 - v );\n\n\t\t\t\tverticesRow.push( index );\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\tvertices.push( verticesRow );\n\n\t\t}\n\n\t\tvar indices = [];\n\n\t\tfor ( var y = 0; y < heightSegments; y ++ ) {\n\n\t\t\tfor ( var x = 0; x < widthSegments; x ++ ) {\n\n\t\t\t\tvar v1 = vertices[ y ][ x + 1 ];\n\t\t\t\tvar v2 = vertices[ y ][ x ];\n\t\t\t\tvar v3 = vertices[ y + 1 ][ x ];\n\t\t\t\tvar v4 = vertices[ y + 1 ][ x + 1 ];\n\n\t\t\t\tif ( y !== 0 || thetaStart > 0 ) indices.push( v1, v2, v4 );\n\t\t\t\tif ( y !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( v2, v3, v4 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( new ( positions.count > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) );\n\t\tthis.addAttribute( 'position', positions );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t\tthis.boundingSphere = new Sphere( new Vector3(), radius );\n\n\t}\n\n\tSphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tSphereBufferGeometry.prototype.constructor = SphereBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );\n\n\t}\n\n\tSphereGeometry.prototype = Object.create( Geometry.prototype );\n\tSphereGeometry.prototype.constructor = SphereGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'RingBufferGeometry';\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\tinnerRadius = innerRadius || 20;\n\t\touterRadius = outerRadius || 50;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\tthetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;\n\t\tphiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;\n\n\t\t// these are used to calculate buffer length\n\t\tvar vertexCount = ( thetaSegments + 1 ) * ( phiSegments + 1 );\n\t\tvar indexCount = thetaSegments * phiSegments * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// some helper variables\n\t\tvar index = 0, indexOffset = 0, segment;\n\t\tvar radius = innerRadius;\n\t\tvar radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\t// values are generate from the inside of the ring to the outside\n\n\t\tfor ( j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\tsegment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\t\t\t\tvertices.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\t\t\t\tnormals.setXYZ( index, 0, 0, 1 );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex++;\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tvar thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tsegment = i + thetaSegmentLevel;\n\n\t\t\t\t// indices\n\t\t\t\tvar a = segment;\n\t\t\t\tvar b = segment + thetaSegments + 1;\n\t\t\t\tvar c = segment + thetaSegments + 2;\n\t\t\t\tvar d = segment + 1;\n\n\t\t\t\t// face one\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\n\t\t\t\t// face two\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t}\n\n\tRingBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tRingBufferGeometry.prototype.constructor = RingBufferGeometry;\n\n\t/**\n\t * @author Kaleb Murphy\n\t */\n\n\tfunction RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );\n\n\t}\n\n\tRingGeometry.prototype = Object.create( Geometry.prototype );\n\tRingGeometry.prototype.constructor = RingGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\n\t */\n\n\tfunction PlaneGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );\n\n\t}\n\n\tPlaneGeometry.prototype = Object.create( Geometry.prototype );\n\tPlaneGeometry.prototype.constructor = PlaneGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\t // points - to create a closed torus, one must use a set of points\n\t // like so: [ a, b, c, d, a ], see first is the same as last.\n\t // segments - the number of circumference segments to create\n\t // phiStart - the starting radian\n\t // phiLength - the radian (0 to 2PI) range of the lathed section\n\t // 2PI is a closed lathe, less than 2PI is a portion.\n\n\tfunction LatheBufferGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'LatheBufferGeometry';\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 ) || 12;\n\t\tphiStart = phiStart || 0;\n\t\tphiLength = phiLength || Math.PI * 2;\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\t\tphiLength = _Math.clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// these are used to calculate buffer length\n\t\tvar vertexCount = ( segments + 1 ) * points.length;\n\t\tvar indexCount = segments * points.length * 2 * 3;\n\n\t\t// buffers\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ) , 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// helper variables\n\t\tvar index = 0, indexOffset = 0, base;\n\t\tvar inverseSegments = 1.0 / segments;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar i, j;\n\n\t\t// generate vertices and uvs\n\n\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\tvar phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tvar sin = Math.sin( phi );\n\t\t\tvar cos = Math.cos( phi );\n\n\t\t\tfor ( j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\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\t\t\t\tvertices.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tbase = j + i * points.length;\n\n\t\t\t\t// indices\n\t\t\t\tvar a = base;\n\t\t\t\tvar b = base + points.length;\n\t\t\t\tvar c = base + points.length + 1;\n\t\t\t\tvar d = base + 1;\n\n\t\t\t\t// face one\n\t\t\t\tindices.setX( indexOffset, a ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t\t// face two\n\t\t\t\tindices.setX( indexOffset, b ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, c ); indexOffset++;\n\t\t\t\tindices.setX( indexOffset, d ); indexOffset++;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t\t// if the geometry is closed, we need to average the normals along the seam.\n\t\t// because the corresponding vertices are identical (but still have different UVs).\n\n\t\tif( phiLength === Math.PI * 2 ) {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\t\t\tvar n1 = new Vector3();\n\t\t\tvar n2 = new Vector3();\n\t\t\tvar n = new Vector3();\n\n\t\t\t// this is the buffer offset for the last line of vertices\n\t\t\tbase = segments * points.length * 3;\n\n\t\t\tfor( i = 0, j = 0; i < points.length; i ++, j += 3 ) {\n\n\t\t\t\t// select the normal of the vertex in the first line\n\t\t\t\tn1.x = normals[ j + 0 ];\n\t\t\t\tn1.y = normals[ j + 1 ];\n\t\t\t\tn1.z = normals[ j + 2 ];\n\n\t\t\t\t// select the normal of the vertex in the last line\n\t\t\t\tn2.x = normals[ base + j + 0 ];\n\t\t\t\tn2.y = normals[ base + j + 1 ];\n\t\t\t\tn2.z = normals[ base + j + 2 ];\n\n\t\t\t\t// average normals\n\t\t\t\tn.addVectors( n1, n2 ).normalize();\n\n\t\t\t\t// assign the new values to both normals\n\t\t\t\tnormals[ j + 0 ] = normals[ base + j + 0 ] = n.x;\n\t\t\t\tnormals[ j + 1 ] = normals[ base + j + 1 ] = n.y;\n\t\t\t\tnormals[ j + 2 ] = normals[ base + j + 2 ] = n.z;\n\n\t\t\t} // next row\n\n\t\t}\n\n\t}\n\n\tLatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tLatheBufferGeometry.prototype.constructor = LatheBufferGeometry;\n\n\t/**\n\t * @author astrodud / http://astrodud.isgreat.org/\n\t * @author zz85 / https://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t */\n\n\t// points - to create a closed torus, one must use a set of points\n\t// like so: [ a, b, c, d, a ], see first is the same as last.\n\t// segments - the number of circumference segments to create\n\t// phiStart - the starting radian\n\t// phiLength - the radian (0 to 2PI) range of the lathed section\n\t// 2PI is a closed lathe, less than 2PI is a portion.\n\n\tfunction LatheGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tLatheGeometry.prototype = Object.create( Geometry.prototype );\n\tLatheGeometry.prototype.constructor = LatheGeometry;\n\n\t/**\n\t * @author jonobr1 / http://jonobr1.com\n\t *\n\t * Creates a one-sided polygonal geometry from a path shape. Similar to\n\t * ExtrudeGeometry.\n\t *\n\t * parameters = {\n\t *\n\t *\tcurveSegments: , // number of points on the curves. NOT USED AT THE MOMENT.\n\t *\n\t *\tmaterial: // material index for front and back faces\n\t *\tuvGenerator: // object that provides UV generator functions\n\t *\n\t * }\n\t **/\n\n\tfunction ShapeGeometry( shapes, options ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tif ( Array.isArray( shapes ) === false ) shapes = [ shapes ];\n\n\t\tthis.addShapeList( shapes, options );\n\n\t\tthis.computeFaceNormals();\n\n\t}\n\n\tShapeGeometry.prototype = Object.create( Geometry.prototype );\n\tShapeGeometry.prototype.constructor = ShapeGeometry;\n\n\t/**\n\t * Add an array of shapes to THREE.ShapeGeometry.\n\t */\n\tShapeGeometry.prototype.addShapeList = function ( shapes, options ) {\n\n\t\tfor ( var i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tthis.addShape( shapes[ i ], options );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * Adds a shape to THREE.ShapeGeometry, based on THREE.ExtrudeGeometry.\n\t */\n\tShapeGeometry.prototype.addShape = function ( shape, options ) {\n\n\t\tif ( options === undefined ) options = {};\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\n\t\tvar material = options.material;\n\t\tvar uvgen = options.UVGenerator === undefined ? ExtrudeGeometry.WorldUVGenerator : options.UVGenerator;\n\n\t\t//\n\n\t\tvar i, l, hole;\n\n\t\tvar shapesOffset = this.vertices.length;\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe...\n\n\t\t\tfor ( i = 0, l = holes.length; i < l; i ++ ) {\n\n\t\t\t\thole = holes[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( hole ) ) {\n\n\t\t\t\t\tholes[ i ] = hole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treverse = false;\n\n\t\t}\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t// Vertices\n\n\t\tfor ( i = 0, l = holes.length; i < l; i ++ ) {\n\n\t\t\thole = holes[ i ];\n\t\t\tvertices = vertices.concat( hole );\n\n\t\t}\n\n\t\t//\n\n\t\tvar vert, vlen = vertices.length;\n\t\tvar face, flen = faces.length;\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = vertices[ i ];\n\n\t\t\tthis.vertices.push( new Vector3( vert.x, vert.y, 0 ) );\n\n\t\t}\n\n\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\tface = faces[ i ];\n\n\t\t\tvar a = face[ 0 ] + shapesOffset;\n\t\t\tvar b = face[ 1 ] + shapesOffset;\n\t\t\tvar c = face[ 2 ] + shapesOffset;\n\n\t\t\tthis.faces.push( new Face3( a, b, c, null, null, material ) );\n\t\t\tthis.faceVertexUvs[ 0 ].push( uvgen.generateTopUV( this, a, b, c ) );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction EdgesGeometry( geometry, thresholdAngle ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;\n\n\t\tvar thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle );\n\n\t\tvar edge = [ 0, 0 ], hash = {};\n\n\t\tfunction sortFunction( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t}\n\n\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\tvar geometry2;\n\n\t\tif ( (geometry && geometry.isBufferGeometry) ) {\n\n\t\t\tgeometry2 = new Geometry();\n\t\t\tgeometry2.fromBufferGeometry( geometry );\n\n\t\t} else {\n\n\t\t\tgeometry2 = geometry.clone();\n\n\t\t}\n\n\t\tgeometry2.mergeVertices();\n\t\tgeometry2.computeFaceNormals();\n\n\t\tvar vertices = geometry2.vertices;\n\t\tvar faces = geometry2.faces;\n\n\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\tedge[ 0 ] = face[ keys[ j ] ];\n\t\t\t\tedge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\tedge.sort( sortFunction );\n\n\t\t\t\tvar key = edge.toString();\n\n\t\t\t\tif ( hash[ key ] === undefined ) {\n\n\t\t\t\t\thash[ key ] = { vert1: edge[ 0 ], vert2: edge[ 1 ], face1: i, face2: undefined };\n\n\t\t\t\t} else {\n\n\t\t\t\t\thash[ key ].face2 = i;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar coords = [];\n\n\t\tfor ( var key in hash ) {\n\n\t\t\tvar h = hash[ key ];\n\n\t\t\tif ( h.face2 === undefined || faces[ h.face1 ].normal.dot( faces[ h.face2 ].normal ) <= thresholdDot ) {\n\n\t\t\t\tvar vertex = vertices[ h.vert1 ];\n\t\t\t\tcoords.push( vertex.x );\n\t\t\t\tcoords.push( vertex.y );\n\t\t\t\tcoords.push( vertex.z );\n\n\t\t\t\tvertex = vertices[ h.vert2 ];\n\t\t\t\tcoords.push( vertex.x );\n\t\t\t\tcoords.push( vertex.y );\n\t\t\t\tcoords.push( vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.addAttribute( 'position', new BufferAttribute( new Float32Array( coords ), 3 ) );\n\n\t}\n\n\tEdgesGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tEdgesGeometry.prototype.constructor = EdgesGeometry;\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CylinderBufferGeometry';\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\tvar scope = this;\n\n\t\tradiusTop = radiusTop !== undefined ? radiusTop : 20;\n\t\tradiusBottom = radiusBottom !== undefined ? radiusBottom : 20;\n\t\theight = height !== undefined ? height : 100;\n\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\n\t\topenEnded = openEnded !== undefined ? openEnded : false;\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0.0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI;\n\n\t\t// used to calculate buffer length\n\n\t\tvar nbCap = 0;\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) nbCap ++;\n\t\t\tif ( radiusBottom > 0 ) nbCap ++;\n\n\t\t}\n\n\t\tvar vertexCount = calculateVertexCount();\n\t\tvar indexCount = calculateIndexCount();\n\n\t\t// buffers\n\n\t\tvar indices = new BufferAttribute( new ( indexCount > 65535 ? Uint32Array : Uint16Array )( indexCount ), 1 );\n\t\tvar vertices = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar normals = new BufferAttribute( new Float32Array( vertexCount * 3 ), 3 );\n\t\tvar uvs = new BufferAttribute( new Float32Array( vertexCount * 2 ), 2 );\n\n\t\t// helper variables\n\n\t\tvar index = 0,\n\t\t indexOffset = 0,\n\t\t indexArray = [],\n\t\t halfHeight = height / 2;\n\n\t\t// group variables\n\t\tvar 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.addAttribute( 'position', vertices );\n\t\tthis.addAttribute( 'normal', normals );\n\t\tthis.addAttribute( 'uv', uvs );\n\n\t\t// helper functions\n\n\t\tfunction calculateVertexCount() {\n\n\t\t\tvar count = ( radialSegments + 1 ) * ( heightSegments + 1 );\n\n\t\t\tif ( openEnded === false ) {\n\n\t\t\t\tcount += ( ( radialSegments + 1 ) * nbCap ) + ( radialSegments * nbCap );\n\n\t\t\t}\n\n\t\t\treturn count;\n\n\t\t}\n\n\t\tfunction calculateIndexCount() {\n\n\t\t\tvar count = radialSegments * heightSegments * 2 * 3;\n\n\t\t\tif ( openEnded === false ) {\n\n\t\t\t\tcount += radialSegments * nbCap * 3;\n\n\t\t\t}\n\n\t\t\treturn count;\n\n\t\t}\n\n\t\tfunction generateTorso() {\n\n\t\t\tvar x, y;\n\t\t\tvar normal = new Vector3();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tvar slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tvar indexRow = [];\n\n\t\t\t\tvar v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\t\t\t\tvar radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tvar u = x / radialSegments;\n\n\t\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tvar sinTheta = Math.sin( theta );\n\t\t\t\t\tvar cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\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.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.setXYZ( index, normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\t\t\t\t\tuvs.setXY( index, u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\t\t\t\t\tindexRow.push( index );\n\n\t\t\t\t\t// increase index\n\t\t\t\t\tindex ++;\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\t\t\t\t\tvar i1 = indexArray[ y ][ x ];\n\t\t\t\t\tvar i2 = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tvar i3 = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tvar i4 = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// face one\n\t\t\t\t\tindices.setX( indexOffset, i1 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i2 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i4 ); indexOffset ++;\n\n\t\t\t\t\t// face two\n\t\t\t\t\tindices.setX( indexOffset, i2 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i3 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i4 ); indexOffset ++;\n\n\t\t\t\t\t// update counters\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\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\tvar x, centerIndexStart, centerIndexEnd;\n\n\t\t\tvar uv = new Vector2();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tvar sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// save the index of the first center vertex\n\t\t\tcenterIndexStart = index;\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 ( x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\t\t\t\tvertices.setXYZ( index, 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\t\t\t\tnormals.setXYZ( index, 0, sign, 0 );\n\n\t\t\t\t// uv\n\t\t\t\tuv.x = 0.5;\n\t\t\t\tuv.y = 0.5;\n\n\t\t\t\tuvs.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\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\tcenterIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tvar u = x / radialSegments;\n\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\tvar cosTheta = Math.cos( theta );\n\t\t\t\tvar sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\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.setXYZ( index, vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\t\t\t\tnormals.setXYZ( index, 0, sign, 0 );\n\n\t\t\t\t// uv\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.setXY( index, uv.x, uv.y );\n\n\t\t\t\t// increase index\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tvar c = centerIndexStart + x;\n\t\t\t\tvar i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\t\t\t\t\tindices.setX( indexOffset, i ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i + 1 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, c ); indexOffset ++;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\t\t\t\t\tindices.setX( indexOffset, i + 1 ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, i ); indexOffset ++;\n\t\t\t\t\tindices.setX( indexOffset, c ); indexOffset ++;\n\n\t\t\t\t}\n\n\t\t\t\t// update counters\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\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tCylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tCylinderGeometry.prototype = Object.create( Geometry.prototype );\n\tCylinderGeometry.prototype.constructor = CylinderGeometry;\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderGeometry.call( this, 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\tConeGeometry.prototype = Object.create( CylinderGeometry.prototype );\n\tConeGeometry.prototype.constructor = ConeGeometry;\n\n\t/**\n\t * @author: abelnation / http://github.com/abelnation\n\t */\n\n\tfunction ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeBufferGeometry';\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\tConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype );\n\tConeBufferGeometry.prototype.constructor = ConeBufferGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CircleBufferGeometry';\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\tradius = radius || 50;\n\t\tsegments = segments !== undefined ? Math.max( 3, segments ) : 8;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\tvar vertices = segments + 2;\n\n\t\tvar positions = new Float32Array( vertices * 3 );\n\t\tvar normals = new Float32Array( vertices * 3 );\n\t\tvar uvs = new Float32Array( vertices * 2 );\n\n\t\t// center data is already zero, but need to set a few extras\n\t\tnormals[ 2 ] = 1.0;\n\t\tuvs[ 0 ] = 0.5;\n\t\tuvs[ 1 ] = 0.5;\n\n\t\tfor ( var s = 0, i = 3, ii = 2 ; s <= segments; s ++, i += 3, ii += 2 ) {\n\n\t\t\tvar segment = thetaStart + s / segments * thetaLength;\n\n\t\t\tpositions[ i ] = radius * Math.cos( segment );\n\t\t\tpositions[ i + 1 ] = radius * Math.sin( segment );\n\n\t\t\tnormals[ i + 2 ] = 1; // normal z\n\n\t\t\tuvs[ ii ] = ( positions[ i ] / radius + 1 ) / 2;\n\t\t\tuvs[ ii + 1 ] = ( positions[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t}\n\n\t\tvar indices = [];\n\n\t\tfor ( var i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\tthis.setIndex( new BufferAttribute( new Uint16Array( indices ), 1 ) );\n\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t\tthis.boundingSphere = new Sphere( new Vector3(), radius );\n\n\t}\n\n\tCircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCircleBufferGeometry.prototype.constructor = CircleBufferGeometry;\n\n\t/**\n\t * @author hughes\n\t */\n\n\tfunction CircleGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );\n\n\t}\n\n\tCircleGeometry.prototype = Object.create( Geometry.prototype );\n\tCircleGeometry.prototype.constructor = CircleGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as\n\t */\n\n\tfunction BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tGeometry.call( this );\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\tthis.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tBoxGeometry.prototype = Object.create( Geometry.prototype );\n\tBoxGeometry.prototype.constructor = BoxGeometry;\n\n\n\n\tvar Geometries = Object.freeze({\n\t\tWireframeGeometry: WireframeGeometry,\n\t\tParametricGeometry: ParametricGeometry,\n\t\tParametricBufferGeometry: ParametricBufferGeometry,\n\t\tTetrahedronGeometry: TetrahedronGeometry,\n\t\tTetrahedronBufferGeometry: TetrahedronBufferGeometry,\n\t\tOctahedronGeometry: OctahedronGeometry,\n\t\tOctahedronBufferGeometry: OctahedronBufferGeometry,\n\t\tIcosahedronGeometry: IcosahedronGeometry,\n\t\tIcosahedronBufferGeometry: IcosahedronBufferGeometry,\n\t\tDodecahedronGeometry: DodecahedronGeometry,\n\t\tDodecahedronBufferGeometry: DodecahedronBufferGeometry,\n\t\tPolyhedronGeometry: PolyhedronGeometry,\n\t\tPolyhedronBufferGeometry: PolyhedronBufferGeometry,\n\t\tTubeGeometry: TubeGeometry,\n\t\tTubeBufferGeometry: TubeBufferGeometry,\n\t\tTorusKnotGeometry: TorusKnotGeometry,\n\t\tTorusKnotBufferGeometry: TorusKnotBufferGeometry,\n\t\tTorusGeometry: TorusGeometry,\n\t\tTorusBufferGeometry: TorusBufferGeometry,\n\t\tTextGeometry: TextGeometry,\n\t\tSphereBufferGeometry: SphereBufferGeometry,\n\t\tSphereGeometry: SphereGeometry,\n\t\tRingGeometry: RingGeometry,\n\t\tRingBufferGeometry: RingBufferGeometry,\n\t\tPlaneBufferGeometry: PlaneBufferGeometry,\n\t\tPlaneGeometry: PlaneGeometry,\n\t\tLatheGeometry: LatheGeometry,\n\t\tLatheBufferGeometry: LatheBufferGeometry,\n\t\tShapeGeometry: ShapeGeometry,\n\t\tExtrudeGeometry: ExtrudeGeometry,\n\t\tEdgesGeometry: EdgesGeometry,\n\t\tConeGeometry: ConeGeometry,\n\t\tConeBufferGeometry: ConeBufferGeometry,\n\t\tCylinderGeometry: CylinderGeometry,\n\t\tCylinderBufferGeometry: CylinderBufferGeometry,\n\t\tCircleBufferGeometry: CircleBufferGeometry,\n\t\tCircleGeometry: CircleGeometry,\n\t\tBoxBufferGeometry: BoxBufferGeometry,\n\t\tBoxGeometry: BoxGeometry\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ShadowMaterial() {\n\n\t\tShaderMaterial.call( this, {\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib[ \"lights\" ],\n\t\t\t\t{\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t}\n\t\t\t] ),\n\t\t\tvertexShader: ShaderChunk[ 'shadow_vert' ],\n\t\t\tfragmentShader: ShaderChunk[ 'shadow_frag' ]\n\t\t} );\n\n\t\tthis.lights = true;\n\t\tthis.transparent = true;\n\n\t\tObject.defineProperties( this, {\n\t\t\topacity: {\n\t\t\t\tenumerable: true,\n\t\t\t\tget: function () {\n\t\t\t\t\treturn this.uniforms.opacity.value;\n\t\t\t\t},\n\t\t\t\tset: function ( value ) {\n\t\t\t\t\tthis.uniforms.opacity.value = value;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tShadowMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tShadowMaterial.prototype.constructor = ShadowMaterial;\n\n\tShadowMaterial.prototype.isShadowMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction RawShaderMaterial( parameters ) {\n\n\t\tShaderMaterial.call( this, parameters );\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n\tRawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tRawShaderMaterial.prototype.constructor = RawShaderMaterial;\n\n\tRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MultiMaterial( materials ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.type = 'MultiMaterial';\n\n\t\tthis.materials = materials instanceof Array ? materials : [];\n\n\t\tthis.visible = true;\n\n\t}\n\n\tMultiMaterial.prototype = {\n\n\t\tconstructor: MultiMaterial,\n\n\t\tisMultiMaterial: true,\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.2,\n\t\t\t\t\ttype: 'material',\n\t\t\t\t\tgenerator: 'MaterialExporter'\n\t\t\t\t},\n\t\t\t\tuuid: this.uuid,\n\t\t\t\ttype: this.type,\n\t\t\t\tmaterials: []\n\t\t\t};\n\n\t\t\tvar materials = this.materials;\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tvar material = materials[ i ].toJSON( meta );\n\t\t\t\tdelete material.metadata;\n\n\t\t\t\toutput.materials.push( material );\n\n\t\t\t}\n\n\t\t\toutput.visible = this.visible;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\tvar material = new this.constructor();\n\n\t\t\tfor ( var i = 0; i < this.materials.length; i ++ ) {\n\n\t\t\t\tmaterial.materials.push( this.materials[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tmaterial.visible = this.visible;\n\n\t\t\treturn material;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * color: ,\n\t * roughness: ,\n\t * metalness: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * roughnessMap: new THREE.Texture( ),\n\t *\n\t * metalnessMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n\t * envMapIntensity: \n\t *\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshStandardMaterial( parameters ) {\n\n\t\tMaterial.call( this );\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 = 0.5;\n\t\tthis.metalness = 0.5;\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.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.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.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshStandardMaterial.prototype = Object.create( Material.prototype );\n\tMeshStandardMaterial.prototype.constructor = MeshStandardMaterial;\n\n\tMeshStandardMaterial.prototype.isMeshStandardMaterial = true;\n\n\tMeshStandardMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, 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.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.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.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t * reflectivity: \n\t * }\n\t */\n\n\tfunction MeshPhysicalMaterial( parameters ) {\n\n\t\tMeshStandardMaterial.call( this );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.reflectivity = 0.5; // maps to F0 = 0.04\n\n\t\tthis.clearCoat = 0.0;\n\t\tthis.clearCoatRoughness = 0.0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );\n\tMeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;\n\n\tMeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;\n\n\tMeshPhysicalMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshStandardMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.reflectivity = source.reflectivity;\n\n\t\tthis.clearCoat = source.clearCoat;\n\t\tthis.clearCoatRoughness = source.clearCoatRoughness;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * specular: ,\n\t * shininess: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * bumpMap: new THREE.Texture( ),\n\t * bumpScale: ,\n\t *\n\t * normalMap: new THREE.Texture( ),\n\t * normalScale: ,\n\t *\n\t * displacementMap: new THREE.Texture( ),\n\t * displacementScale: ,\n\t * displacementBias: ,\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshPhongMaterial( parameters ) {\n\n\t\tMaterial.call( this );\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.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.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhongMaterial.prototype = Object.create( Material.prototype );\n\tMeshPhongMaterial.prototype.constructor = MeshPhongMaterial;\n\n\tMeshPhongMaterial.prototype.isMeshPhongMaterial = true;\n\n\tMeshPhongMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, 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.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.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t *\n\t * parameters = {\n\t * opacity: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: \n\t * }\n\t */\n\n\tfunction MeshNormalMaterial( parameters ) {\n\n\t\tMaterial.call( this, parameters );\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshNormalMaterial.prototype = Object.create( Material.prototype );\n\tMeshNormalMaterial.prototype.constructor = MeshNormalMaterial;\n\n\tMeshNormalMaterial.prototype.isMeshNormalMaterial = true;\n\n\tMeshNormalMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * map: new THREE.Texture( ),\n\t *\n\t * lightMap: new THREE.Texture( ),\n\t * lightMapIntensity: \n\t *\n\t * aoMap: new THREE.Texture( ),\n\t * aoMapIntensity: \n\t *\n\t * emissive: ,\n\t * emissiveIntensity: \n\t * emissiveMap: new THREE.Texture( ),\n\t *\n\t * specularMap: new THREE.Texture( ),\n\t *\n\t * alphaMap: new THREE.Texture( ),\n\t *\n\t * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t * combine: THREE.Multiply,\n\t * reflectivity: ,\n\t * refractionRatio: ,\n\t *\n\t * wireframe: ,\n\t * wireframeLinewidth: ,\n\t *\n\t * skinning: ,\n\t * morphTargets: ,\n\t * morphNormals: \n\t * }\n\t */\n\n\tfunction MeshLambertMaterial( parameters ) {\n\n\t\tMaterial.call( this );\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.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.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshLambertMaterial.prototype = Object.create( Material.prototype );\n\tMeshLambertMaterial.prototype.constructor = MeshLambertMaterial;\n\n\tMeshLambertMaterial.prototype.isMeshLambertMaterial = true;\n\n\tMeshLambertMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, 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.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.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t * color: ,\n\t * opacity: ,\n\t *\n\t * linewidth: ,\n\t *\n\t * scale: ,\n\t * dashSize: ,\n\t * gapSize: \n\t * }\n\t */\n\n\tfunction LineDashedMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineDashedMaterial.prototype = Object.create( Material.prototype );\n\tLineDashedMaterial.prototype.constructor = LineDashedMaterial;\n\n\tLineDashedMaterial.prototype.isLineDashedMaterial = true;\n\n\tLineDashedMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\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\tvar Materials = Object.freeze({\n\t\tShadowMaterial: ShadowMaterial,\n\t\tSpriteMaterial: SpriteMaterial,\n\t\tRawShaderMaterial: RawShaderMaterial,\n\t\tShaderMaterial: ShaderMaterial,\n\t\tPointsMaterial: PointsMaterial,\n\t\tMultiMaterial: MultiMaterial,\n\t\tMeshPhysicalMaterial: MeshPhysicalMaterial,\n\t\tMeshStandardMaterial: MeshStandardMaterial,\n\t\tMeshPhongMaterial: MeshPhongMaterial,\n\t\tMeshNormalMaterial: MeshNormalMaterial,\n\t\tMeshLambertMaterial: MeshLambertMaterial,\n\t\tMeshDepthMaterial: MeshDepthMaterial,\n\t\tMeshBasicMaterial: MeshBasicMaterial,\n\t\tLineDashedMaterial: LineDashedMaterial,\n\t\tLineBasicMaterial: LineBasicMaterial,\n\t\tMaterial: Material\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar Cache = {\n\n\t\tenabled: false,\n\n\t\tfiles: {},\n\n\t\tadd: function ( key, file ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\t\tthis.files[ key ] = file;\n\n\t\t},\n\n\t\tget: function ( key ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\t\treturn this.files[ key ];\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete this.files[ key ];\n\n\t\t},\n\n\t\tclear: function () {\n\n\t\t\tthis.files = {};\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LoadingManager( onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar isLoading = false, itemsLoaded = 0, itemsTotal = 0;\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}\n\n\tvar DefaultLoadingManager = new LoadingManager();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction XHRLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( XHRLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\t// Check for data: URI\n\t\t\tvar dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\t\t\tvar dataUriRegexResult = url.match( dataUriRegex );\n\n\t\t\t// Safari can not handle Data URIs through XMLHttpRequest so process manually\n\t\t\tif ( dataUriRegexResult ) {\n\n\t\t\t\tvar mimeType = dataUriRegexResult[1];\n\t\t\t\tvar isBase64 = !!dataUriRegexResult[2];\n\t\t\t\tvar data = dataUriRegexResult[3];\n\n\t\t\t\tdata = window.decodeURIComponent(data);\n\n\t\t\t\tif( isBase64 ) {\n\t\t\t\t\tdata = window.atob(data);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar response;\n\t\t\t\t\tvar responseType = ( this.responseType || '' ).toLowerCase();\n\n\t\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\t \tresponse = new ArrayBuffer( data.length );\n\t\t\t\t\t\t\tvar view = new Uint8Array( response );\n\t\t\t\t\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tview[ i ] = data.charCodeAt( i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( responseType === 'blob' ) {\n\n\t\t\t\t\t\t\t\tresponse = new Blob( [ response ], { \"type\" : mimeType } );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\t\tvar parser = new DOMParser();\n\t\t\t\t\t\t\tresponse = parser.parseFromString( data, mimeType );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\t\tresponse = JSON.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault: // 'text' or other\n\n\t\t\t\t\t\t\tresponse = data;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function() {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t}, 0);\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function() {\n\n\t\t\t\t\t\tif ( onError ) onError( error );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}, 0);\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar request = new XMLHttpRequest();\n\t\t\t\trequest.open( 'GET', url, true );\n\n\t\t\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\t\t\tvar response = event.target.response;\n\n\t\t\t\t\tCache.add( url, response );\n\n\t\t\t\t\tif ( this.status === 200 ) {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else if ( this.status === 0 ) {\n\n\t\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\t\tconsole.warn( 'THREE.XHRLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( onProgress !== undefined ) {\n\n\t\t\t\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\t\t\tonProgress( event );\n\n\t\t\t\t\t}, false );\n\n\t\t\t\t}\n\n\t\t\t\trequest.addEventListener( 'error', function ( event ) {\n\n\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( this.responseType !== undefined ) request.responseType = this.responseType;\n\t\t\t\tif ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;\n\n\t\t\t\tif ( request.overrideMimeType ) request.overrideMimeType( 'text/plain' );\n\n\t\t\t\trequest.send( null );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn request;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetResponseType: function ( value ) {\n\n\t\t\tthis.responseType = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t *\n\t * Abstract Base class to block based textures loader (dds, pvr, ...)\n\t */\n\n\tfunction CompressedTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( CompressedTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar images = [];\n\n\t\t\tvar texture = new CompressedTexture();\n\t\t\ttexture.image = images;\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\timages[ i ] = {\n\t\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t\t};\n\n\t\t\t\t\tloaded += 1;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\tif ( texDatas.mipmapCount === 1 )\n\t\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\tvar loaded = 0;\n\n\t\t\t\tfor ( var i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\t\tloadTexture( i );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\t\tvar faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\t\tfor ( var f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\t\timages[ f ] = { mipmaps : [] };\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\t\timages[ f ].height = texDatas.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} else {\n\n\t\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author Nikos M. / https://github.com/foo123/\n\t *\n\t * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n\t */\n\n\tvar DataTextureLoader = BinaryTextureLoader;\n\tfunction BinaryTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( BinaryTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texture = new DataTexture();\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar texData = scope._parser( buffer );\n\n\t\t\t\tif ( ! texData ) return;\n\n\t\t\t\tif ( undefined !== texData.image ) {\n\n\t\t\t\t\ttexture.image = texData.image;\n\n\t\t\t\t} else if ( undefined !== texData.data ) {\n\n\t\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\t\ttexture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\t\ttexture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter;\n\t\t\t\ttexture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter;\n\n\t\t\t\ttexture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;\n\n\t\t\t\tif ( undefined !== texData.format ) {\n\n\t\t\t\t\ttexture.format = texData.format;\n\n\t\t\t\t}\n\t\t\t\tif ( undefined !== texData.type ) {\n\n\t\t\t\t\ttexture.type = texData.type;\n\n\t\t\t\t}\n\n\t\t\t\tif ( undefined !== texData.mipmaps ) {\n\n\t\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( 1 === texData.mipmapCount ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t\t}, onProgress, onError );\n\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ImageLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( ImageLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );\n\t\t\timage.onload = function () {\n\n\t\t\t\timage.onload = null;\n\n\t\t\t\tURL.revokeObjectURL( image.src );\n\n\t\t\t\tif ( onLoad ) onLoad( image );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t};\n\t\t\timage.onerror = onError;\n\n\t\t\tif ( url.indexOf( 'data:' ) === 0 ) {\n\n\t\t\t\timage.src = url;\n\n\t\t\t} else {\n\n\t\t\t\tvar loader = new XHRLoader();\n\t\t\t\tloader.setPath( this.path );\n\t\t\t\tloader.setResponseType( 'blob' );\n\t\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\t\tloader.load( url, function ( blob ) {\n\n\t\t\t\t\timage.src = URL.createObjectURL( blob );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn image;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( CubeTextureLoader.prototype, {\n\n\t\tload: function ( urls, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new CubeTexture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\n\t\t\tvar loaded = 0;\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\t\tloaded ++;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, undefined, onError );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < urls.length; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction TextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( TextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new Texture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.load( url, function ( image ) {\n\n\t\t\t\t// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.\n\t\t\t\tvar isJPEG = url.search( /\\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\\:image\\/jpeg/ ) === 0;\n\n\t\t\t\ttexture.format = isJPEG ? RGBFormat : RGBAFormat;\n\t\t\t\ttexture.image = image;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\t\tonLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Light( color, intensity ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Light';\n\n\t\tthis.color = new Color( color );\n\t\tthis.intensity = intensity !== undefined ? intensity : 1;\n\n\t\tthis.receiveShadow = undefined;\n\n\t}\n\n\tLight.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Light,\n\n\t\tisLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.color.copy( source.color );\n\t\t\tthis.intensity = source.intensity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.color = this.color.getHex();\n\t\t\tdata.object.intensity = this.intensity;\n\n\t\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction HemisphereLight( skyColor, groundColor, intensity ) {\n\n\t\tLight.call( this, skyColor, intensity );\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.castShadow = undefined;\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tHemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: HemisphereLight,\n\n\t\tisHemisphereLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.groundColor.copy( source.groundColor );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LightShadow( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.bias = 0;\n\t\tthis.radius = 1;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.matrix = new Matrix4();\n\n\t}\n\n\tObject.assign( LightShadow.prototype, {\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.camera = source.camera.clone();\n\n\t\t\tthis.bias = source.bias;\n\t\t\tthis.radius = source.radius;\n\n\t\t\tthis.mapSize.copy( source.mapSize );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar object = {};\n\n\t\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\t\tdelete object.camera.matrix;\n\n\t\t\treturn object;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SpotLightShadow() {\n\n\t\tLightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t}\n\n\tSpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: SpotLightShadow,\n\n\t\tisSpotLightShadow: true,\n\n\t\tupdate: function ( light ) {\n\n\t\t\tvar fov = _Math.RAD2DEG * 2 * light.angle;\n\t\t\tvar aspect = this.mapSize.width / this.mapSize.height;\n\t\t\tvar far = light.distance || 500;\n\n\t\t\tvar camera = this.camera;\n\n\t\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\t\tcamera.fov = fov;\n\t\t\t\tcamera.aspect = aspect;\n\t\t\t\tcamera.far = far;\n\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpotLight( color, intensity, distance, angle, penumbra, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * Math.PI;\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / Math.PI;\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.angle = ( angle !== undefined ) ? angle : Math.PI / 3;\n\t\tthis.penumbra = ( penumbra !== undefined ) ? penumbra : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\tSpotLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: SpotLight,\n\n\t\tisSpotLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.angle = source.angle;\n\t\t\tthis.penumbra = source.penumbra;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\n\tfunction PointLight( color, intensity, distance, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'PointLight';\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * 4 * Math.PI;\n\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / ( 4 * Math.PI );\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t}\n\n\tPointLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: PointLight,\n\n\t\tisPointLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectionalLightShadow( light ) {\n\n\t\tLightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n\t}\n\n\tDirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: DirectionalLightShadow\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DirectionalLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tDirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: DirectionalLight,\n\n\t\tisDirectionalLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AmbientLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'AmbientLight';\n\n\t\tthis.castShadow = undefined;\n\n\t}\n\n\tAmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: AmbientLight,\n\n\t\tisAmbientLight: true,\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tvar AnimationUtils = {\n\n\t\t// same as Array.prototype.slice, but also works on typed arrays\n\t\tarraySlice: function( array, from, to ) {\n\n\t\t\tif ( AnimationUtils.isTypedArray( array ) ) {\n\n\t\t\t\treturn new array.constructor( array.subarray( from, to ) );\n\n\t\t\t}\n\n\t\t\treturn array.slice( from, to );\n\n\t\t},\n\n\t\t// converts an array to a specific type\n\t\tconvertArray: function( array, type, forceClone ) {\n\n\t\t\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t\t\t\t! forceClone && array.constructor === type ) return array;\n\n\t\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\t\t\treturn new type( array ); // create typed array\n\n\t\t\t}\n\n\t\t\treturn Array.prototype.slice.call( array ); // create Array\n\n\t\t},\n\n\t\tisTypedArray: function( object ) {\n\n\t\t\treturn ArrayBuffer.isView( object ) &&\n\t\t\t\t\t! ( object instanceof DataView );\n\n\t\t},\n\n\t\t// returns an array by which times and values can be sorted\n\t\tgetKeyframeOrder: function( times ) {\n\n\t\t\tfunction compareTime( i, j ) {\n\n\t\t\t\treturn times[ i ] - times[ j ];\n\n\t\t\t}\n\n\t\t\tvar n = times.length;\n\t\t\tvar result = new Array( n );\n\t\t\tfor ( var i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\t\t\tresult.sort( compareTime );\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// uses the array previously returned by 'getKeyframeOrder' to sort data\n\t\tsortedArray: function( values, stride, order ) {\n\n\t\t\tvar nValues = values.length;\n\t\t\tvar result = new values.constructor( nValues );\n\n\t\t\tfor ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\t\t\tvar srcOffset = order[ i ] * stride;\n\n\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// function for parsing AOS keyframe formats\n\t\tflattenJSON: function( jsonKeys, times, values, valuePropertyName ) {\n\n\t\t\tvar i = 1, key = jsonKeys[ 0 ];\n\n\t\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t}\n\n\t\t\tif ( key === undefined ) return; // no data\n\n\t\t\tvar value = key[ valuePropertyName ];\n\t\t\tif ( value === undefined ) return; // no data\n\n\t\t\tif ( Array.isArray( value ) ) {\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else if ( value.toArray !== undefined ) {\n\t\t\t\t// ...assume THREE.Math-ish\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else {\n\t\t\t\t// otherwise push as-is\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push( value );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Abstract base class of interpolants over parametric samples.\n\t *\n\t * The parameter domain is one dimensional, typically the time or a path\n\t * along a curve defined by the data.\n\t *\n\t * The sample values can have any dimensionality and derived classes may\n\t * apply special interpretations to the data.\n\t *\n\t * This class provides the interval seek in a Template Method, deferring\n\t * the actual interpolation to derived classes.\n\t *\n\t * Time complexity is O(1) for linear access crossing at most two points\n\t * and O(log N) for random access, where N is the number of positions.\n\t *\n\t * References:\n\t *\n\t * \t\thttp://www.oodesign.com/template-method-pattern.html\n\t *\n\t * @author tschw\n\t */\n\n\tfunction Interpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tthis.parameterPositions = parameterPositions;\n\t\tthis._cachedIndex = 0;\n\n\t\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\t\tthis.sampleValues = sampleValues;\n\t\tthis.valueSize = sampleSize;\n\n\t}\n\n\tInterpolant.prototype = {\n\n\t\tconstructor: Interpolant,\n\n\t\tevaluate: function( t ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\ti1 = this._cachedIndex,\n\n\t\t\t\tt1 = pp[ i1 ],\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\tvalidate_interval: {\n\n\t\t\t\tseek: {\n\n\t\t\t\t\tvar right;\n\n\t\t\t\t\tlinear_scan: {\n\t//- See http://jsperf.com/comparison-to-undefined/3\n\t//- slower code:\n\t//-\n\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 + 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\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\t// prepare binary search on the right side of the index\n\t\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t//- slower code:\n\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\t\tvar t1global = pp[ 1 ];\n\n\t\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 - 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\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\t// prepare binary search on the left side of the index\n\t\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t\t} // linear scan\n\n\t\t\t\t\t// binary search\n\n\t\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\t\tvar mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t\t// check boundary cases, again\n\n\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\n\n\t\t\t\t\t}\n\n\t\t\t\t} // seek\n\n\t\t\t\tthis._cachedIndex = i1;\n\n\t\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t\t} // validate_interval\n\n\t\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t\t},\n\n\t\tsettings: null, // optional, subclass-specific settings structure\n\t\t// Note: The indirection allows central control of many interpolants.\n\n\t\t// --- Protected interface\n\n\t\tDefaultSettings_: {},\n\n\t\tgetSettings_: function() {\n\n\t\t\treturn this.settings || this.DefaultSettings_;\n\n\t\t},\n\n\t\tcopySampleValue_: function( index ) {\n\n\t\t\t// copies a sample value to the result buffer\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = index * stride;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// Template methods for derived classes:\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tthrow new Error( \"call to abstract method\" );\n\t\t\t// implementations shall return this.resultBuffer\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\t// empty\n\n\t\t}\n\n\t};\n\n\tObject.assign( Interpolant.prototype, {\n\n\t\tbeforeStart_: //( 0, t, t0 ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_,\n\n\t\tafterEnd_: //( N-1, tN-1, t ), returns this.resultBuffer\n\t\t\tInterpolant.prototype.copySampleValue_\n\n\t} );\n\n\t/**\n\t * Fast and simple cubic spline interpolant.\n\t *\n\t * It was derived from a Hermitian construction setting the first derivative\n\t * at each sample position to the linear slope between neighboring positions\n\t * over their parameter interval.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction CubicInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, 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}\n\n\tCubicInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: CubicInterpolant,\n\n\t\tDefaultSettings_: {\n\n\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\tiPrev = i1 - 2,\n\t\t\t\tiNext = i1 + 1,\n\n\t\t\t\ttPrev = pp[ iPrev ],\n\t\t\t\ttNext = pp[ iNext ];\n\n\t\t\tif ( tPrev === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = t1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tNext === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\t\tiNext = i1;\n\t\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiNext = 1;\n\t\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\t\ttNext = t0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar halfDt = ( t1 - t0 ) * 0.5,\n\t\t\t\tstride = this.valueSize;\n\n\t\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\t\tthis._offsetPrev = iPrev * stride;\n\t\t\tthis._offsetNext = iNext * stride;\n\n\t\t},\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tpp = p * p,\n\t\t\t\tppp = pp * p;\n\n\t\t\t// evaluate polynomials\n\n\t\t\tvar sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\t\tvar s0 = ( 1 + wP ) * ppp + (-1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\t\tvar s1 = (-1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\t\tvar sN = wN * ppp - wN * pp;\n\n\t\t\t// combine data linearly\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction LinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: LinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset1 = i1 * stride,\n\t\t\t\toffset0 = offset1 - stride,\n\n\t\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tweight0 = 1 - weight1;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Interpolant that evaluates to the sample value at the position preceeding\n\t * the parameter.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction DiscreteInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tDiscreteInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: DiscreteInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t}\n\n\t} );\n\n\tvar KeyframeTrackPrototype;\n\n\tKeyframeTrackPrototype = {\n\n\t\tTimeBufferType: Float32Array,\n\t\tValueBufferType: Float32Array,\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodDiscrete: function( result ) {\n\n\t\t\treturn new DiscreteInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodLinear: function( result ) {\n\n\t\t\treturn new LinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: function( result ) {\n\n\t\t\treturn new CubicInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tsetInterpolation: function( interpolation ) {\n\n\t\t\tvar factoryMethod;\n\n\t\t\tswitch ( interpolation ) {\n\n\t\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateLinear:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateSmooth:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( factoryMethod === undefined ) {\n\n\t\t\t\tvar message = \"unsupported interpolation for \" +\n\t\t\t\t\t\tthis.ValueTypeName + \" keyframe track named \" + this.name;\n\n\t\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( message );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.createInterpolant = factoryMethod;\n\n\t\t},\n\n\t\tgetInterpolation: function() {\n\n\t\t\tswitch ( this.createInterpolant ) {\n\n\t\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\t\treturn InterpolateLinear;\n\n\t\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\t\treturn InterpolateSmooth;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetValueSize: function() {\n\n\t\t\treturn this.values.length / this.times.length;\n\n\t\t},\n\n\t\t// move all keyframes either forwards or backwards in time\n\t\tshift: function( timeOffset ) {\n\n\t\t\tif( timeOffset !== 0.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\t\tscale: function( timeScale ) {\n\n\t\t\tif( timeScale !== 1.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t\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\t\ttrim: function( startTime, endTime ) {\n\n\t\t\tvar times = this.times,\n\t\t\t\tnKeys = times.length,\n\t\t\t\tfrom = 0,\n\t\t\t\tto = nKeys - 1;\n\n\t\t\twhile ( from !== nKeys && times[ from ] < startTime ) ++ from;\n\t\t\twhile ( to !== -1 && times[ to ] > endTime ) -- to;\n\n\t\t\t++ to; // inclusive -> exclusive bound\n\n\t\t\tif( from !== 0 || to !== nKeys ) {\n\n\t\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\t\tif ( from >= to ) to = Math.max( to , 1 ), from = to - 1;\n\n\t\t\t\tvar stride = this.getValueSize();\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, from, to );\n\t\t\t\tthis.values = AnimationUtils.\n\t\t\t\t\t\tarraySlice( this.values, from * stride, to * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\t\tvalidate: function() {\n\n\t\t\tvar valid = true;\n\n\t\t\tvar valueSize = this.getValueSize();\n\t\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\t\tconsole.error( \"invalid value size in track\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\n\t\t\t\tnKeys = times.length;\n\n\t\t\tif( nKeys === 0 ) {\n\n\t\t\t\tconsole.error( \"track is empty\", this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar prevTime = null;\n\n\t\t\tfor( var i = 0; i !== nKeys; i ++ ) {\n\n\t\t\t\tvar currTime = times[ i ];\n\n\t\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\t\tconsole.error( \"time is not a valid number\", this, i, currTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\t\tconsole.error( \"out of order keys\", this, i, currTime, prevTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tprevTime = currTime;\n\n\t\t\t}\n\n\t\t\tif ( values !== undefined ) {\n\n\t\t\t\tif ( AnimationUtils.isTypedArray( values ) ) {\n\n\t\t\t\t\tfor ( var i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tvar value = values[ i ];\n\n\t\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\t\tconsole.error( \"value is not a valid number\", this, i, value );\n\t\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn valid;\n\n\t\t},\n\n\t\t// removes equivalent sequential keys as common in morph target sequences\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\t\toptimize: function() {\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\t\t\t\tstride = this.getValueSize(),\n\n\t\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\t\twriteIndex = 1,\n\t\t\t\tlastIndex = times.length - 1;\n\n\t\t\tfor( var i = 1; i < lastIndex; ++ i ) {\n\n\t\t\t\tvar keep = false;\n\n\t\t\t\tvar time = times[ i ];\n\t\t\t\tvar timeNext = times[ i + 1 ];\n\n\t\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\t\tif ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {\n\n\t\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\t\tvar offset = i * stride,\n\t\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\t\tvar value = values[ offset + j ];\n\n\t\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\t\tbreak;\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 keep = true;\n\n\t\t\t\t}\n\n\t\t\t\t// in-place compaction\n\n\t\t\t\tif ( keep ) {\n\n\t\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\t\tvar readOffset = i * stride,\n\t\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j )\n\n\t\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t++ writeIndex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// flush last keyframe (compaction looks ahead)\n\n\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\t\tfor ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j )\n\n\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t\tif ( writeIndex !== times.length ) {\n\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, 0, writeIndex );\n\t\t\t\tthis.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\tfunction KeyframeTrackConstructor( name, times, values, interpolation ) {\n\n\t\tif( name === undefined ) throw new Error( \"track name is undefined\" );\n\n\t\tif( times === undefined || times.length === 0 ) {\n\n\t\t\tthrow new Error( \"no keyframes in track named \" + name );\n\n\t\t}\n\n\t\tthis.name = name;\n\n\t\tthis.times = AnimationUtils.convertArray( times, this.TimeBufferType );\n\t\tthis.values = AnimationUtils.convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t\tthis.validate();\n\t\tthis.optimize();\n\n\t}\n\n\t/**\n\t *\n\t * A Track of vectored keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction VectorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tVectorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: VectorKeyframeTrack,\n\n\t\tValueTypeName: 'vector'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t * Spherical linear unit quaternion interpolant.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction QuaternionLinearInterpolant(\n\t\t\tparameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tQuaternionLinearInterpolant.prototype =\n\t\t\tObject.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: QuaternionLinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset = i1 * stride,\n\n\t\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\t\tfor ( var end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\t\tQuaternion.slerpFlat( result, 0,\n\t\t\t\t\t\tvalues, offset - stride, values, offset, alpha );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of quaternion keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction QuaternionKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tQuaternionKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: QuaternionKeyframeTrack,\n\n\t\tValueTypeName: 'quaternion',\n\n\t\t// ValueBufferType is inherited\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodLinear: function( result ) {\n\n\t\t\treturn new QuaternionLinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: undefined // not yet implemented\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of numeric keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction NumberKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tNumberKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: NumberKeyframeTrack,\n\n\t\tValueTypeName: 'number',\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t *\n\t * A Track that interpolates Strings\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction StringKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tStringKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: StringKeyframeTrack,\n\n\t\tValueTypeName: 'string',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of Boolean keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction BooleanKeyframeTrack( name, times, values ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values );\n\n\t}\n\n\tBooleanKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: BooleanKeyframeTrack,\n\n\t\tValueTypeName: 'bool',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t\t// Note: Actually this track could have a optimized / compressed\n\t\t// representation of a single value and a custom interpolant that\n\t\t// computes \"firstValue ^ isOdd( index )\".\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of keyframe values that represent color.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction ColorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tColorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: ColorKeyframeTrack,\n\n\t\tValueTypeName: 'color'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\n\t\t// Note: Very basic implementation and nothing special yet.\n\t\t// However, this is the place for color space parameterization.\n\n\t} );\n\n\t/**\n\t *\n\t * A timed sequence of keyframes for a specific property.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction KeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.apply( this, arguments );\n\n\t}\n\n\tKeyframeTrack.prototype = KeyframeTrackPrototype;\n\tKeyframeTrackPrototype.constructor = KeyframeTrack;\n\n\t// Static methods:\n\n\tObject.assign( KeyframeTrack, {\n\n\t\t// Serialization (in static context, because of constructor invocation\n\t\t// and automatic invocation of .toJSON):\n\n\t\tparse: function( json ) {\n\n\t\t\tif( json.type === undefined ) {\n\n\t\t\t\tthrow new Error( \"track type undefined, can not parse\" );\n\n\t\t\t}\n\n\t\t\tvar trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type );\n\n\t\t\tif ( json.times === undefined ) {\n\n\t\t\t\tvar times = [], values = [];\n\n\t\t\t\tAnimationUtils.flattenJSON( json.keys, times, values, 'value' );\n\n\t\t\t\tjson.times = times;\n\t\t\t\tjson.values = values;\n\n\t\t\t}\n\n\t\t\t// derived classes can define a static parse method\n\t\t\tif ( trackType.parse !== undefined ) {\n\n\t\t\t\treturn trackType.parse( json );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we asssume a constructor compatible with the base\n\t\t\t\treturn new trackType(\n\t\t\t\t\t\tjson.name, json.times, json.values, json.interpolation );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function( track ) {\n\n\t\t\tvar trackType = track.constructor;\n\n\t\t\tvar json;\n\n\t\t\t// derived classes can define a static toJSON method\n\t\t\tif ( trackType.toJSON !== undefined ) {\n\n\t\t\t\tjson = trackType.toJSON( track );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\t\tjson = {\n\n\t\t\t\t\t'name': track.name,\n\t\t\t\t\t'times': AnimationUtils.convertArray( track.times, Array ),\n\t\t\t\t\t'values': AnimationUtils.convertArray( track.values, Array )\n\n\t\t\t\t};\n\n\t\t\t\tvar interpolation = track.getInterpolation();\n\n\t\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\t\treturn json;\n\n\t\t},\n\n\t\t_getTrackTypeForValueTypeName: function( typeName ) {\n\n\t\t\tswitch( typeName.toLowerCase() ) {\n\n\t\t\t\tcase \"scalar\":\n\t\t\t\tcase \"double\":\n\t\t\t\tcase \"float\":\n\t\t\t\tcase \"number\":\n\t\t\t\tcase \"integer\":\n\n\t\t\t\t\treturn NumberKeyframeTrack;\n\n\t\t\t\tcase \"vector\":\n\t\t\t\tcase \"vector2\":\n\t\t\t\tcase \"vector3\":\n\t\t\t\tcase \"vector4\":\n\n\t\t\t\t\treturn VectorKeyframeTrack;\n\n\t\t\t\tcase \"color\":\n\n\t\t\t\t\treturn ColorKeyframeTrack;\n\n\t\t\t\tcase \"quaternion\":\n\n\t\t\t\t\treturn QuaternionKeyframeTrack;\n\n\t\t\t\tcase \"bool\":\n\t\t\t\tcase \"boolean\":\n\n\t\t\t\t\treturn BooleanKeyframeTrack;\n\n\t\t\t\tcase \"string\":\n\n\t\t\t\t\treturn StringKeyframeTrack;\n\n\t\t\t}\n\n\t\t\tthrow new Error( \"Unsupported typeName: \" + typeName );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Reusable set of Tracks that represent an animation.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tfunction AnimationClip( name, duration, tracks ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = ( duration !== undefined ) ? duration : -1;\n\n\t\tthis.uuid = _Math.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\tthis.optimize();\n\n\t}\n\n\tAnimationClip.prototype = {\n\n\t\tconstructor: AnimationClip,\n\n\t\tresetDuration: function() {\n\n\t\t\tvar tracks = this.tracks,\n\t\t\t\tduration = 0;\n\n\t\t\tfor ( var i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\t\tvar track = this.tracks[ i ];\n\n\t\t\t\tduration = Math.max(\n\t\t\t\t\t\tduration, track.times[ track.times.length - 1 ] );\n\n\t\t\t}\n\n\t\t\tthis.duration = duration;\n\n\t\t},\n\n\t\ttrim: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\toptimize: function() {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].optimize();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t// Static methods:\n\n\tObject.assign( AnimationClip, {\n\n\t\tparse: function( json ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tjsonTracks = json.tracks,\n\t\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\t\tfor ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( json.name, json.duration, tracks );\n\n\t\t},\n\n\n\t\ttoJSON: function( clip ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tclipTracks = clip.tracks;\n\n\t\t\tvar json = {\n\n\t\t\t\t'name': clip.name,\n\t\t\t\t'duration': clip.duration,\n\t\t\t\t'tracks': tracks\n\n\t\t\t};\n\n\t\t\tfor ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn json;\n\n\t\t},\n\n\n\t\tCreateFromMorphTargetSequence: function( name, morphTargetSequence, fps, noLoop ) {\n\n\t\t\tvar numMorphTargets = morphTargetSequence.length;\n\t\t\tvar tracks = [];\n\n\t\t\tfor ( var i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\t\tvar times = [];\n\t\t\t\tvar values = [];\n\n\t\t\t\ttimes.push(\n\t\t\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\t\t\ti,\n\t\t\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\t\tvar order = AnimationUtils.getKeyframeOrder( times );\n\t\t\t\ttimes = AnimationUtils.sortedArray( times, 1, order );\n\t\t\t\tvalues = AnimationUtils.sortedArray( values, 1, order );\n\n\t\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t\t// last frame as well for perfect loop.\n\t\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\ttracks.push(\n\t\t\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\t\t\ttimes, values\n\t\t\t\t\t\t).scale( 1.0 / fps ) );\n\t\t\t}\n\n\t\t\treturn new AnimationClip( name, -1, tracks );\n\n\t\t},\n\n\t\tfindByName: function( objectOrClipArray, name ) {\n\n\t\t\tvar clipArray = objectOrClipArray;\n\n\t\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\t\tvar o = objectOrClipArray;\n\t\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\t\treturn clipArray[ i ];\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\tCreateClipsFromMorphTargetSequences: function( morphTargets, fps, noLoop ) {\n\n\t\t\tvar animationToMorphTargets = {};\n\n\t\t\t// tested with https://regex101.com/ on trick sequences\n\t\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\t\tvar pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t\t// sort morph target names into animation groups based\n\t\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\t\tfor ( var i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = morphTargets[ i ];\n\t\t\t\tvar parts = morphTarget.name.match( pattern );\n\n\t\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\t\tvar name = parts[ 1 ];\n\n\t\t\t\t\tvar animationMorphTargets = animationToMorphTargets[ name ];\n\t\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar clips = [];\n\n\t\t\tfor ( var name in animationToMorphTargets ) {\n\n\t\t\t\tclips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t\t}\n\n\t\t\treturn clips;\n\n\t\t},\n\n\t\t// parse the animation.hierarchy format\n\t\tparseAnimation: function( animation, bones ) {\n\n\t\t\tif ( ! animation ) {\n\n\t\t\t\tconsole.error( \" no animation in JSONLoader data\" );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar addNonemptyTrack = function(\n\t\t\t\t\ttrackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t\t// only return track if there are actually keys.\n\t\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\t\tvar times = [];\n\t\t\t\t\tvar values = [];\n\n\t\t\t\t\tAnimationUtils.flattenJSON(\n\t\t\t\t\t\t\tanimationKeys, times, values, propertyName );\n\n\t\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tvar tracks = [];\n\n\t\t\tvar clipName = animation.name || 'default';\n\t\t\t// automatic length determination in AnimationClip.\n\t\t\tvar duration = animation.length || -1;\n\t\t\tvar fps = animation.fps || 30;\n\n\t\t\tvar hierarchyTracks = animation.hierarchy || [];\n\n\t\t\tfor ( var h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\t\tvar animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t\t// skip empty tracks\n\t\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t\t// process morph targets in a way exactly compatible\n\t\t\t\t// with AnimationHandler.init( animation )\n\t\t\t\tif ( animationKeys[0].morphTargets ) {\n\n\t\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\t\tvar morphTargetNames = {};\n\t\t\t\t\tfor ( var k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\t\tif ( animationKeys[k].morphTargets ) {\n\n\t\t\t\t\t\t\tfor ( var m = 0; m < animationKeys[k].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[k].morphTargets[m] ] = -1;\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\t// create a track for each morph target with all zero\n\t\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t\t// the morphTarget is named.\n\t\t\t\t\tfor ( var morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\t\tvar times = [];\n\t\t\t\t\t\tvar values = [];\n\n\t\t\t\t\t\tfor ( var m = 0;\n\t\t\t\t\t\t\t\tm !== animationKeys[k].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\t\tvar animationKey = animationKeys[k];\n\n\t\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttracks.push( new NumberKeyframeTrack(\n\t\t\t\t\t\t\t\t'.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tduration = morphTargetNames.length * ( fps || 1.0 );\n\n\t\t\t\t} else {\n\t\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\t\tvar boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tracks.length === 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar clip = new AnimationClip( clipName, duration, tracks );\n\n\t\t\treturn clip;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MaterialLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.textures = {};\n\n\t}\n\n\tObject.assign( MaterialLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTextures: function ( value ) {\n\n\t\t\tthis.textures = value;\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar textures = this.textures;\n\n\t\t\tfunction getTexture( name ) {\n\n\t\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t\t}\n\n\t\t\t\treturn textures[ name ];\n\n\t\t\t}\n\n\t\t\tvar material = new Materials[ json.type ]();\n\n\t\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\t\tif ( json.color !== undefined ) material.color.setHex( json.color );\n\t\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\t\tif ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\t\tif ( json.specular !== undefined ) material.specular.setHex( json.specular );\n\t\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\t\tif ( json.uniforms !== undefined ) material.uniforms = json.uniforms;\n\t\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\t\tif ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;\n\t\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\t\tif ( json.shading !== undefined ) material.shading = json.shading;\n\t\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\t\t\tif ( json.skinning !== undefined ) material.skinning = json.skinning;\n\t\t\tif ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;\n\n\t\t\t// for PointsMaterial\n\n\t\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t\t// maps\n\n\t\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\n\t\t\tif ( json.alphaMap !== undefined ) {\n\n\t\t\t\tmaterial.alphaMap = getTexture( json.alphaMap );\n\t\t\t\tmaterial.transparent = true;\n\n\t\t\t}\n\n\t\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\t\tvar normalScale = json.normalScale;\n\n\t\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t\t}\n\n\t\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\n\t\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\n\t\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\n\t\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\t\t// MultiMaterial\n\n\t\t\tif ( json.materials !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.materials.length; i < l; i ++ ) {\n\n\t\t\t\t\tmaterial.materials.push( this.parse( json.materials[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn material;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometryLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( BufferGeometryLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar geometry = new BufferGeometry();\n\n\t\t\tvar index = json.data.index;\n\n\t\t\tvar TYPED_ARRAYS = {\n\t\t\t\t'Int8Array': Int8Array,\n\t\t\t\t'Uint8Array': Uint8Array,\n\t\t\t\t'Uint8ClampedArray': Uint8ClampedArray,\n\t\t\t\t'Int16Array': Int16Array,\n\t\t\t\t'Uint16Array': Uint16Array,\n\t\t\t\t'Int32Array': Int32Array,\n\t\t\t\t'Uint32Array': Uint32Array,\n\t\t\t\t'Float32Array': Float32Array,\n\t\t\t\t'Float64Array': Float64Array\n\t\t\t};\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ index.type ]( index.array );\n\t\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tvar attributes = json.data.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );\n\n\t\t\t\tgeometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) );\n\n\t\t\t}\n\n\t\t\tvar groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\t\tif ( groups !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = json.data.boundingSphere;\n\n\t\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\t\tvar center = new Vector3();\n\n\t\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Loader() {\n\n\t\tthis.onLoadStart = function () {};\n\t\tthis.onLoadProgress = function () {};\n\t\tthis.onLoadComplete = function () {};\n\n\t}\n\n\tLoader.prototype = {\n\n\t\tconstructor: Loader,\n\n\t\tcrossOrigin: undefined,\n\n\t\textractUrlBase: function ( url ) {\n\n\t\t\tvar parts = url.split( '/' );\n\n\t\t\tif ( parts.length === 1 ) return './';\n\n\t\t\tparts.pop();\n\n\t\t\treturn parts.join( '/' ) + '/';\n\n\t\t},\n\n\t\tinitMaterials: function ( materials, texturePath, crossOrigin ) {\n\n\t\t\tvar array = [];\n\n\t\t\tfor ( var i = 0; i < materials.length; ++ i ) {\n\n\t\t\t\tarray[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tcreateMaterial: ( function () {\n\n\t\t\tvar color, textureLoader, materialLoader;\n\n\t\t\treturn function createMaterial( m, texturePath, crossOrigin ) {\n\n\t\t\t\tif ( color === undefined ) color = new Color();\n\t\t\t\tif ( textureLoader === undefined ) textureLoader = new TextureLoader();\n\t\t\t\tif ( materialLoader === undefined ) materialLoader = new MaterialLoader();\n\n\t\t\t\t// convert from old material format\n\n\t\t\t\tvar textures = {};\n\n\t\t\t\tfunction loadTexture( path, repeat, offset, wrap, anisotropy ) {\n\n\t\t\t\t\tvar fullPath = texturePath + path;\n\t\t\t\t\tvar loader = Loader.Handlers.get( fullPath );\n\n\t\t\t\t\tvar texture;\n\n\t\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\t\ttexture = loader.load( fullPath );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttextureLoader.setCrossOrigin( crossOrigin );\n\t\t\t\t\t\ttexture = textureLoader.load( fullPath );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( repeat !== undefined ) {\n\n\t\t\t\t\t\ttexture.repeat.fromArray( repeat );\n\n\t\t\t\t\t\tif ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\t\t\ttexture.offset.fromArray( offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( wrap !== undefined ) {\n\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;\n\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( anisotropy !== undefined ) {\n\n\t\t\t\t\t\ttexture.anisotropy = anisotropy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar uuid = _Math.generateUUID();\n\n\t\t\t\t\ttextures[ uuid ] = texture;\n\n\t\t\t\t\treturn uuid;\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tvar json = {\n\t\t\t\t\tuuid: _Math.generateUUID(),\n\t\t\t\t\ttype: 'MeshLambertMaterial'\n\t\t\t\t};\n\n\t\t\t\tfor ( var name in m ) {\n\n\t\t\t\t\tvar value = m[ name ];\n\n\t\t\t\t\tswitch ( name ) {\n\t\t\t\t\t\tcase 'DbgColor':\n\t\t\t\t\t\tcase 'DbgIndex':\n\t\t\t\t\t\tcase 'opticalDensity':\n\t\t\t\t\t\tcase 'illumination':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'DbgName':\n\t\t\t\t\t\t\tjson.name = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'blending':\n\t\t\t\t\t\t\tjson.blending = BlendingMode[ value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorAmbient':\n\t\t\t\t\t\tcase 'mapAmbient':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorDiffuse':\n\t\t\t\t\t\t\tjson.color = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorSpecular':\n\t\t\t\t\t\t\tjson.specular = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorEmissive':\n\t\t\t\t\t\t\tjson.emissive = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'specularCoef':\n\t\t\t\t\t\t\tjson.shininess = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'shading':\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuse':\n\t\t\t\t\t\t\tjson.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuseRepeat':\n\t\t\t\t\t\tcase 'mapDiffuseOffset':\n\t\t\t\t\t\tcase 'mapDiffuseWrap':\n\t\t\t\t\t\tcase 'mapDiffuseAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissive':\n\t\t\t\t\t\t\tjson.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissiveRepeat':\n\t\t\t\t\t\tcase 'mapEmissiveOffset':\n\t\t\t\t\t\tcase 'mapEmissiveWrap':\n\t\t\t\t\t\tcase 'mapEmissiveAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLight':\n\t\t\t\t\t\t\tjson.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLightRepeat':\n\t\t\t\t\t\tcase 'mapLightOffset':\n\t\t\t\t\t\tcase 'mapLightWrap':\n\t\t\t\t\t\tcase 'mapLightAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAO':\n\t\t\t\t\t\t\tjson.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAORepeat':\n\t\t\t\t\t\tcase 'mapAOOffset':\n\t\t\t\t\t\tcase 'mapAOWrap':\n\t\t\t\t\t\tcase 'mapAOAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBump':\n\t\t\t\t\t\t\tjson.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpScale':\n\t\t\t\t\t\t\tjson.bumpScale = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpRepeat':\n\t\t\t\t\t\tcase 'mapBumpOffset':\n\t\t\t\t\t\tcase 'mapBumpWrap':\n\t\t\t\t\t\tcase 'mapBumpAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormal':\n\t\t\t\t\t\t\tjson.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalFactor':\n\t\t\t\t\t\t\tjson.normalScale = [ value, value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalRepeat':\n\t\t\t\t\t\tcase 'mapNormalOffset':\n\t\t\t\t\t\tcase 'mapNormalWrap':\n\t\t\t\t\t\tcase 'mapNormalAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecular':\n\t\t\t\t\t\t\tjson.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecularRepeat':\n\t\t\t\t\t\tcase 'mapSpecularOffset':\n\t\t\t\t\t\tcase 'mapSpecularWrap':\n\t\t\t\t\t\tcase 'mapSpecularAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalness':\n\t\t\t\t\t\t\tjson.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalnessRepeat':\n\t\t\t\t\t\tcase 'mapMetalnessOffset':\n\t\t\t\t\t\tcase 'mapMetalnessWrap':\n\t\t\t\t\t\tcase 'mapMetalnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughness':\n\t\t\t\t\t\t\tjson.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughnessRepeat':\n\t\t\t\t\t\tcase 'mapRoughnessOffset':\n\t\t\t\t\t\tcase 'mapRoughnessWrap':\n\t\t\t\t\t\tcase 'mapRoughnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlpha':\n\t\t\t\t\t\t\tjson.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlphaRepeat':\n\t\t\t\t\t\tcase 'mapAlphaOffset':\n\t\t\t\t\t\tcase 'mapAlphaWrap':\n\t\t\t\t\t\tcase 'mapAlphaAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'flipSided':\n\t\t\t\t\t\t\tjson.side = BackSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'doubleSided':\n\t\t\t\t\t\t\tjson.side = DoubleSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );\n\t\t\t\t\t\t\tjson.opacity = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'depthTest':\n\t\t\t\t\t\tcase 'depthWrite':\n\t\t\t\t\t\tcase 'colorWrite':\n\t\t\t\t\t\tcase 'opacity':\n\t\t\t\t\t\tcase 'reflectivity':\n\t\t\t\t\t\tcase 'transparent':\n\t\t\t\t\t\tcase 'visible':\n\t\t\t\t\t\tcase 'wireframe':\n\t\t\t\t\t\t\tjson[ name ] = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'vertexColors':\n\t\t\t\t\t\t\tif ( value === true ) json.vertexColors = VertexColors;\n\t\t\t\t\t\t\tif ( value === 'face' ) json.vertexColors = FaceColors;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.Loader.createMaterial: Unsupported', name, value );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.type === 'MeshBasicMaterial' ) delete json.emissive;\n\t\t\t\tif ( json.type !== 'MeshPhongMaterial' ) delete json.specular;\n\n\t\t\t\tif ( json.opacity < 1 ) json.transparent = true;\n\n\t\t\t\tmaterialLoader.setTextures( textures );\n\n\t\t\t\treturn materialLoader.parse( json );\n\n\t\t\t};\n\n\t\t} )()\n\n\t};\n\n\tLoader.Handlers = {\n\n\t\thandlers: [],\n\n\t\tadd: function ( regex, loader ) {\n\n\t\t\tthis.handlers.push( regex, loader );\n\n\t\t},\n\n\t\tget: function ( file ) {\n\n\t\t\tvar handlers = this.handlers;\n\n\t\t\tfor ( var i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tvar regex = handlers[ i ];\n\t\t\t\tvar loader = handlers[ i + 1 ];\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\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction JSONLoader( manager ) {\n\n\t\tif ( typeof manager === 'boolean' ) {\n\n\t\t\tconsole.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );\n\t\t\tmanager = undefined;\n\n\t\t}\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\tthis.withCredentials = false;\n\n\t}\n\n\tObject.assign( JSONLoader.prototype, {\n\n\t\tload: function( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texturePath = this.texturePath && ( typeof this.texturePath === \"string\" ) ? this.texturePath : Loader.prototype.extractUrlBase( url );\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = JSON.parse( text );\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata !== undefined ) {\n\n\t\t\t\t\tvar type = metadata.type;\n\n\t\t\t\t\tif ( type !== undefined ) {\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'object' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'scene' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' );\n\t\t\t\t\t\t\treturn;\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\tvar object = scope.parse( json, texturePath );\n\t\t\t\tonLoad( object.geometry, object.materials );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tparse: function ( json, texturePath ) {\n\n\t\t\tvar geometry = new Geometry(),\n\t\t\tscale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0;\n\n\t\t\tparseModel( scale );\n\n\t\t\tparseSkin();\n\t\t\tparseMorphing( scale );\n\t\t\tparseAnimations();\n\n\t\t\tgeometry.computeFaceNormals();\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\tfunction parseModel( scale ) {\n\n\t\t\t\tfunction isBitSet( value, position ) {\n\n\t\t\t\t\treturn value & ( 1 << position );\n\n\t\t\t\t}\n\n\t\t\t\tvar i, j, fi,\n\n\t\t\t\toffset, zLength,\n\n\t\t\tcolorIndex, normalIndex, uvIndex, materialIndex,\n\n\t\t\t\ttype,\n\t\t\t\tisQuad,\n\t\t\t\thasMaterial,\n\t\t\t\thasFaceVertexUv,\n\t\t\t\thasFaceNormal, hasFaceVertexNormal,\n\t\t\t\thasFaceColor, hasFaceVertexColor,\n\n\t\t\tvertex, face, faceA, faceB, hex, normal,\n\n\t\t\t\tuvLayer, uv, u, v,\n\n\t\t\t\tfaces = json.faces,\n\t\t\t\tvertices = json.vertices,\n\t\t\t\tnormals = json.normals,\n\t\t\t\tcolors = json.colors,\n\n\t\t\t\tnUvLayers = 0;\n\n\t\t\t\tif ( json.uvs !== undefined ) {\n\n\t\t\t\t\t// disregard empty arrays\n\n\t\t\t\t\tfor ( i = 0; i < json.uvs.length; i ++ ) {\n\n\t\t\t\t\t\tif ( json.uvs[ i ].length ) nUvLayers ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\tgeometry.faceVertexUvs[ i ] = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = vertices.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\tvertex = new Vector3();\n\n\t\t\t\t\tvertex.x = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.y = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.z = vertices[ offset ++ ] * scale;\n\n\t\t\t\t\tgeometry.vertices.push( vertex );\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = faces.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\ttype = faces[ offset ++ ];\n\n\n\t\t\t\t\tisQuad = isBitSet( type, 0 );\n\t\t\t\t\thasMaterial = isBitSet( type, 1 );\n\t\t\t\t\thasFaceVertexUv = isBitSet( type, 3 );\n\t\t\t\t\thasFaceNormal = isBitSet( type, 4 );\n\t\t\t\t\thasFaceVertexNormal = isBitSet( type, 5 );\n\t\t\t\t\thasFaceColor\t = isBitSet( type, 6 );\n\t\t\t\t\thasFaceVertexColor = isBitSet( type, 7 );\n\n\t\t\t\t\t// console.log(\"type\", type, \"bits\", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);\n\n\t\t\t\t\tif ( isQuad ) {\n\n\t\t\t\t\t\tfaceA = new Face3();\n\t\t\t\t\t\tfaceA.a = faces[ offset ];\n\t\t\t\t\t\tfaceA.b = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceA.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\tfaceB = new Face3();\n\t\t\t\t\t\tfaceB.a = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceB.b = faces[ offset + 2 ];\n\t\t\t\t\t\tfaceB.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tfaceA.materialIndex = materialIndex;\n\t\t\t\t\t\t\tfaceB.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi + 1 ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tif ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );\n\t\t\t\t\t\t\t\t\tif ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );\n\n\t\t\t\t\t\t\t\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\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tfaceA.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tfaceB.normal.copy( faceA.normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexNormals.push( normal );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\tfaceA.color.setHex( hex );\n\t\t\t\t\t\t\tfaceB.color.setHex( hex );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( faceA );\n\t\t\t\t\t\tgeometry.faces.push( faceB );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface = new Face3();\n\t\t\t\t\t\tface.a = faces[ offset ++ ];\n\t\t\t\t\t\tface.b = faces[ offset ++ ];\n\t\t\t\t\t\tface.c = faces[ offset ++ ];\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ].push( uv );\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\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tface.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tface.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.color.setHex( colors[ colorIndex ] );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\tface.vertexColors.push( new Color( colors[ colorIndex ] ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( face );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseSkin() {\n\n\t\t\t\tvar influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;\n\n\t\t\t\tif ( json.skinWeights ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar x = json.skinWeights[ i ];\n\t\t\t\t\t\tvar y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;\n\t\t\t\t\t\tvar z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;\n\t\t\t\t\t\tvar w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinWeights.push( new Vector4( x, y, z, w ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.skinIndices ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar a = json.skinIndices[ i ];\n\t\t\t\t\t\tvar b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;\n\t\t\t\t\t\tvar c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;\n\t\t\t\t\t\tvar d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinIndices.push( new Vector4( a, b, c, d ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.bones = json.bones;\n\n\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {\n\n\t\t\t\t\tconsole.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +\n\t\t\t\t\t\tgeometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseMorphing( scale ) {\n\n\t\t\t\tif ( json.morphTargets !== undefined ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tgeometry.morphTargets[ i ] = {};\n\t\t\t\t\t\tgeometry.morphTargets[ i ].name = json.morphTargets[ i ].name;\n\t\t\t\t\t\tgeometry.morphTargets[ i ].vertices = [];\n\n\t\t\t\t\t\tvar dstVertices = geometry.morphTargets[ i ].vertices;\n\t\t\t\t\t\tvar srcVertices = json.morphTargets[ i ].vertices;\n\n\t\t\t\t\t\tfor ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {\n\n\t\t\t\t\t\t\tvar vertex = new Vector3();\n\t\t\t\t\t\t\tvertex.x = srcVertices[ v ] * scale;\n\t\t\t\t\t\t\tvertex.y = srcVertices[ v + 1 ] * scale;\n\t\t\t\t\t\t\tvertex.z = srcVertices[ v + 2 ] * scale;\n\n\t\t\t\t\t\t\tdstVertices.push( vertex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.morphColors !== undefined && json.morphColors.length > 0 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.JSONLoader: \"morphColors\" no longer supported. Using them as face colors.' );\n\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar morphColors = json.morphColors[ 0 ].colors;\n\n\t\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tfaces[ i ].color.fromArray( morphColors, i * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseAnimations() {\n\n\t\t\t\tvar outputAnimations = [];\n\n\t\t\t\t// parse old style Bone/Hierarchy animations\n\t\t\t\tvar animations = [];\n\n\t\t\t\tif ( json.animation !== undefined ) {\n\n\t\t\t\t\tanimations.push( json.animation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.animations !== undefined ) {\n\n\t\t\t\t\tif ( json.animations.length ) {\n\n\t\t\t\t\t\tanimations = animations.concat( json.animations );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tanimations.push( json.animations );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0; i < animations.length; i ++ ) {\n\n\t\t\t\t\tvar clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones );\n\t\t\t\t\tif ( clip ) outputAnimations.push( clip );\n\n\t\t\t\t}\n\n\t\t\t\t// parse implicit morph animations\n\t\t\t\tif ( geometry.morphTargets ) {\n\n\t\t\t\t\t// TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary.\n\t\t\t\t\tvar morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );\n\t\t\t\t\toutputAnimations = outputAnimations.concat( morphAnimationClips );\n\n\t\t\t\t}\n\n\t\t\t\tif ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;\n\n\t\t\t}\n\n\t\t\tif ( json.materials === undefined || json.materials.length === 0 ) {\n\n\t\t\t\treturn { geometry: geometry };\n\n\t\t\t} else {\n\n\t\t\t\tvar materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin );\n\n\t\t\t\treturn { geometry: geometry, materials: materials };\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ObjectLoader ( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.texturePath = '';\n\n\t}\n\n\tObject.assign( ObjectLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( this.texturePath === '' ) {\n\n\t\t\t\tthis.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );\n\n\t\t\t}\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tscope.parse( JSON.parse( text ), onLoad );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\n\t\t},\n\n\t\tparse: function ( json, onLoad ) {\n\n\t\t\tvar geometries = this.parseGeometries( json.geometries );\n\n\t\t\tvar images = this.parseImages( json.images, function () {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t} );\n\n\t\t\tvar textures = this.parseTextures( json.textures, images );\n\t\t\tvar materials = this.parseMaterials( json.materials, textures );\n\n\t\t\tvar object = this.parseObject( json.object, geometries, materials );\n\n\t\t\tif ( json.animations ) {\n\n\t\t\t\tobject.animations = this.parseAnimations( json.animations );\n\n\t\t\t}\n\n\t\t\tif ( json.images === undefined || json.images.length === 0 ) {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t}\n\n\t\t\treturn object;\n\n\t\t},\n\n\t\tparseGeometries: function ( json ) {\n\n\t\t\tvar geometries = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar geometryLoader = new JSONLoader();\n\t\t\t\tvar bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar geometry;\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\t\tcase 'PlaneGeometry':\n\t\t\t\t\t\tcase 'PlaneBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BoxGeometry':\n\t\t\t\t\t\tcase 'BoxBufferGeometry':\n\t\t\t\t\t\tcase 'CubeGeometry': // backwards compatible\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.depth,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.depthSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CircleGeometry':\n\t\t\t\t\t\tcase 'CircleBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CylinderGeometry':\n\t\t\t\t\t\tcase 'CylinderBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radiusTop,\n\t\t\t\t\t\t\t\tdata.radiusBottom,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'ConeGeometry':\n\t\t\t\t\t\tcase 'ConeBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'SphereGeometry':\n\t\t\t\t\t\tcase 'SphereBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'DodecahedronGeometry':\n\t\t\t\t\t\tcase 'IcosahedronGeometry':\n\t\t\t\t\t\tcase 'OctahedronGeometry':\n\t\t\t\t\t\tcase 'TetrahedronGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.detail\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'RingGeometry':\n\t\t\t\t\t\tcase 'RingBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.innerRadius,\n\t\t\t\t\t\t\t\tdata.outerRadius,\n\t\t\t\t\t\t\t\tdata.thetaSegments,\n\t\t\t\t\t\t\t\tdata.phiSegments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusGeometry':\n\t\t\t\t\t\tcase 'TorusBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.arc\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusKnotGeometry':\n\t\t\t\t\t\tcase 'TorusKnotBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.p,\n\t\t\t\t\t\t\t\tdata.q\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'LatheGeometry':\n\t\t\t\t\t\tcase 'LatheBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.points,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\t\tgeometry = geometryLoader.parse( data.data, this.texturePath ).geometry;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\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\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\n\t\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometries;\n\n\t\t},\n\n\t\tparseMaterials: function ( json, textures ) {\n\n\t\t\tvar materials = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar loader = new MaterialLoader();\n\t\t\t\tloader.setTextures( textures );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar material = loader.parse( json[ i ] );\n\t\t\t\t\tmaterials[ material.uuid ] = material;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn materials;\n\n\t\t},\n\n\t\tparseAnimations: function ( json ) {\n\n\t\t\tvar animations = [];\n\n\t\t\tfor ( var i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tvar clip = AnimationClip.parse( json[ i ] );\n\n\t\t\t\tanimations.push( clip );\n\n\t\t\t}\n\n\t\t\treturn animations;\n\n\t\t},\n\n\t\tparseImages: function ( json, onLoad ) {\n\n\t\t\tvar scope = this;\n\t\t\tvar images = {};\n\n\t\t\tfunction loadImage( url ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\treturn loader.load( url, function () {\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, undefined, function () {\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\t\tvar manager = new LoadingManager( onLoad );\n\n\t\t\t\tvar loader = new ImageLoader( manager );\n\t\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar image = json[ i ];\n\t\t\t\t\tvar path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url;\n\n\t\t\t\t\timages[ image.uuid ] = loadImage( path );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn images;\n\n\t\t},\n\n\t\tparseTextures: function ( json, images ) {\n\n\t\t\tfunction parseConstant( value, type ) {\n\n\t\t\t\tif ( typeof( value ) === 'number' ) return value;\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\t\treturn type[ value ];\n\n\t\t\t}\n\n\t\t\tvar textures = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar texture = new Texture( images[ data.image ] );\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TextureMapping );\n\n\t\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TextureWrapping );\n\t\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TextureWrapping );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TextureFilter );\n\t\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TextureFilter );\n\t\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn textures;\n\n\t\t},\n\n\t\tparseObject: function () {\n\n\t\t\tvar matrix = new Matrix4();\n\n\t\t\treturn function parseObject( data, geometries, materials ) {\n\n\t\t\t\tvar object;\n\n\t\t\t\tfunction getGeometry( name ) {\n\n\t\t\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn geometries[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tfunction getMaterial( name ) {\n\n\t\t\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn materials[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'Scene':\n\n\t\t\t\t\t\tobject = new Scene();\n\n\t\t\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\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\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'AmbientLight':\n\n\t\t\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'DirectionalLight':\n\n\t\t\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\n\t\t\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\n\t\t\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\n\t\t\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Mesh':\n\n\t\t\t\t\t\tvar geometry = getGeometry( data.geometry );\n\t\t\t\t\t\tvar material = getMaterial( data.material );\n\n\t\t\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 ) {\n\n\t\t\t\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LOD':\n\n\t\t\t\t\t\tobject = new LOD();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Line':\n\n\t\t\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LineSegments':\n\n\t\t\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointCloud':\n\t\t\t\t\tcase 'Points':\n\n\t\t\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Sprite':\n\n\t\t\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Group':\n\n\t\t\t\t\t\tobject = new Group();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tobject = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t\tobject.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) object.name = data.name;\n\t\t\t\tif ( data.matrix !== undefined ) {\n\n\t\t\t\t\tmatrix.fromArray( data.matrix );\n\t\t\t\t\tmatrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\t\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\t\t\tif ( data.shadow ) {\n\n\t\t\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\t\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\n\t\t\t\tif ( data.children !== undefined ) {\n\n\t\t\t\t\tfor ( var child in data.children ) {\n\n\t\t\t\t\t\tobject.add( this.parseObject( data.children[ child ], geometries, materials ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.type === 'LOD' ) {\n\n\t\t\t\t\tvar levels = data.levels;\n\n\t\t\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\t\t\tvar level = levels[ l ];\n\t\t\t\t\t\tvar child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn object;\n\n\t\t\t};\n\n\t\t}()\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Extensible curve object\n\t *\n\t * Some common of Curve methods\n\t * .getPoint(t), getTangent(t)\n\t * .getPointAt(u), getTangentAt(u)\n\t * .getPoints(), .getSpacedPoints()\n\t * .getLength()\n\t * .updateArcLengths()\n\t *\n\t * This following classes subclasses THREE.Curve:\n\t *\n\t * -- 2d classes --\n\t * THREE.LineCurve\n\t * THREE.QuadraticBezierCurve\n\t * THREE.CubicBezierCurve\n\t * THREE.SplineCurve\n\t * THREE.ArcCurve\n\t * THREE.EllipseCurve\n\t *\n\t * -- 3d classes --\n\t * THREE.LineCurve3\n\t * THREE.QuadraticBezierCurve3\n\t * THREE.CubicBezierCurve3\n\t * THREE.SplineCurve3\n\t *\n\t * A series of curves can be represented as a THREE.CurvePath\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tAbstract Curve base class\n\t **************************************************************/\n\n\tfunction Curve() {}\n\n\tCurve.prototype = {\n\n\t\tconstructor: Curve,\n\n\t\t// Virtual base class method to overwrite and implement in subclasses\n\t\t//\t- t [0 .. 1]\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tconsole.warn( \"THREE.Curve: Warning, getPoint() not implemented!\" );\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// Get point at relative position in curve according to arc length\n\t\t// - u [0 .. 1]\n\n\t\tgetPointAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getPoint( t );\n\n\t\t},\n\n\t\t// Get sequence of points using getPoint( t )\n\n\t\tgetPoints: function ( divisions ) {\n\n\t\t\tif ( ! divisions ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get sequence of points using getPointAt( u )\n\n\t\tgetSpacedPoints: function ( divisions ) {\n\n\t\t\tif ( ! divisions ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get total curve arc length\n\n\t\tgetLength: function () {\n\n\t\t\tvar lengths = this.getLengths();\n\t\t\treturn lengths[ lengths.length - 1 ];\n\n\t\t},\n\n\t\t// Get list of cumulative segment lengths\n\n\t\tgetLengths: function ( divisions ) {\n\n\t\t\tif ( ! divisions ) divisions = ( this.__arcLengthDivisions ) ? ( this.__arcLengthDivisions ) : 200;\n\n\t\t\tif ( this.cacheArcLengths\n\t\t\t\t&& ( this.cacheArcLengths.length === divisions + 1 )\n\t\t\t\t&& ! this.needsUpdate ) {\n\n\t\t\t\t//console.log( \"cached\", this.cacheArcLengths );\n\t\t\t\treturn this.cacheArcLengths;\n\n\t\t\t}\n\n\t\t\tthis.needsUpdate = false;\n\n\t\t\tvar cache = [];\n\t\t\tvar current, last = this.getPoint( 0 );\n\t\t\tvar p, sum = 0;\n\n\t\t\tcache.push( 0 );\n\n\t\t\tfor ( p = 1; p <= divisions; p ++ ) {\n\n\t\t\t\tcurrent = this.getPoint ( p / divisions );\n\t\t\t\tsum += current.distanceTo( last );\n\t\t\t\tcache.push( sum );\n\t\t\t\tlast = current;\n\n\t\t\t}\n\n\t\t\tthis.cacheArcLengths = cache;\n\n\t\t\treturn cache; // { sums: cache, sum:sum }; Sum is in the last element.\n\n\t\t},\n\n\t\tupdateArcLengths: function() {\n\n\t\t\tthis.needsUpdate = true;\n\t\t\tthis.getLengths();\n\n\t\t},\n\n\t\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\t\tgetUtoTmapping: function ( u, distance ) {\n\n\t\t\tvar arcLengths = this.getLengths();\n\n\t\t\tvar i = 0, il = arcLengths.length;\n\n\t\t\tvar targetArcLength; // The targeted u distance value to get\n\n\t\t\tif ( distance ) {\n\n\t\t\t\ttargetArcLength = distance;\n\n\t\t\t} else {\n\n\t\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t\t}\n\n\t\t\t//var time = Date.now();\n\n\t\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\t\tvar low = 0, high = il - 1, comparison;\n\n\t\t\twhile ( low <= high ) {\n\n\t\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\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\t\tlow = i + 1;\n\n\t\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\t\thigh = i - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thigh = i;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// DONE\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ti = high;\n\n\t\t\t//console.log('b' , i, low, high, Date.now()- time);\n\n\t\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\t\tvar t = i / ( il - 1 );\n\t\t\t\treturn t;\n\n\t\t\t}\n\n\t\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\t\tvar lengthBefore = arcLengths[ i ];\n\t\t\tvar lengthAfter = arcLengths[ i + 1 ];\n\n\t\t\tvar segmentLength = lengthAfter - lengthBefore;\n\n\t\t\t// determine where we are between the 'before' and 'after' points\n\n\t\t\tvar segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t\t// add that fractional amount to t\n\n\t\t\tvar t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\t\treturn t;\n\n\t\t},\n\n\t\t// Returns a unit vector tangent at t\n\t\t// In case any sub curve does not implement its tangent derivation,\n\t\t// 2 points a small delta apart will be used to find its gradient\n\t\t// which seems to give a reasonable approximation\n\n\t\tgetTangent: function( t ) {\n\n\t\t\tvar delta = 0.0001;\n\t\t\tvar t1 = t - delta;\n\t\t\tvar t2 = t + delta;\n\n\t\t\t// Capping in case of danger\n\n\t\t\tif ( t1 < 0 ) t1 = 0;\n\t\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\t\tvar pt1 = this.getPoint( t1 );\n\t\t\tvar pt2 = this.getPoint( t2 );\n\n\t\t\tvar vec = pt2.clone().sub( pt1 );\n\t\t\treturn vec.normalize();\n\n\t\t},\n\n\t\tgetTangentAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getTangent( t );\n\n\t\t},\n\n\t\tcomputeFrenetFrames: function ( segments, closed ) {\n\n\t\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\t\tvar normal = new Vector3();\n\n\t\t\tvar tangents = [];\n\t\t\tvar normals = [];\n\t\t\tvar binormals = [];\n\n\t\t\tvar vec = new Vector3();\n\t\t\tvar mat = new Matrix4();\n\n\t\t\tvar i, u, theta;\n\n\t\t\t// compute the tangent vectors for each segment on the curve\n\n\t\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\t\tu = i / segments;\n\n\t\t\t\ttangents[ i ] = this.getTangentAt( u );\n\t\t\t\ttangents[ i ].normalize();\n\n\t\t\t}\n\n\t\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t\t// and in the direction of the minimum tangent xyz component\n\n\t\t\tnormals[ 0 ] = new Vector3();\n\t\t\tbinormals[ 0 ] = new Vector3();\n\t\t\tvar min = Number.MAX_VALUE;\n\t\t\tvar tx = Math.abs( tangents[ 0 ].x );\n\t\t\tvar ty = Math.abs( tangents[ 0 ].y );\n\t\t\tvar tz = Math.abs( tangents[ 0 ].z );\n\n\t\t\tif ( tx <= min ) {\n\n\t\t\t\tmin = tx;\n\t\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( ty <= min ) {\n\n\t\t\t\tmin = ty;\n\t\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t\t}\n\n\t\t\tif ( tz <= min ) {\n\n\t\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t\t}\n\n\t\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\t\tvec.normalize();\n\n\t\t\t\t\ttheta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t\t}\n\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\t\tif ( closed === true ) {\n\n\t\t\t\ttheta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\t\ttheta /= segments;\n\n\t\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\t\ttheta = - theta;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t\t// twist a little...\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttangents: tangents,\n\t\t\t\tnormals: normals,\n\t\t\t\tbinormals: binormals\n\t\t\t};\n\n\t\t}\n\n\t};\n\n\t// TODO: Transformation for Curves?\n\n\t/**************************************************************\n\t *\t3D Curves\n\t **************************************************************/\n\n\t// A Factory method for creating new curve subclasses\n\n\tCurve.create = function ( constructor, getPointFunc ) {\n\n\t\tconstructor.prototype = Object.create( Curve.prototype );\n\t\tconstructor.prototype.constructor = constructor;\n\t\tconstructor.prototype.getPoint = getPointFunc;\n\n\t\treturn constructor;\n\n\t};\n\n\t/**************************************************************\n\t *\tLine\n\t **************************************************************/\n\n\tfunction LineCurve( v1, v2 ) {\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve.prototype = Object.create( Curve.prototype );\n\tLineCurve.prototype.constructor = LineCurve;\n\n\tLineCurve.prototype.isLineCurve = true;\n\n\tLineCurve.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar point = this.v2.clone().sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\treturn point;\n\n\t};\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\n\tLineCurve.prototype.getPointAt = function ( u ) {\n\n\t\treturn this.getPoint( u );\n\n\t};\n\n\tLineCurve.prototype.getTangent = function( t ) {\n\n\t\tvar tangent = this.v2.clone().sub( this.v1 );\n\n\t\treturn tangent.normalize();\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tCurved Path - a curve path is simply a array of connected\n\t * curves, but retains the api of a curve\n\t **************************************************************/\n\n\tfunction CurvePath() {\n\n\t\tthis.curves = [];\n\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tCurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {\n\n\t\tconstructor: CurvePath,\n\n\t\tadd: function ( curve ) {\n\n\t\t\tthis.curves.push( curve );\n\n\t\t},\n\n\t\tclosePath: function () {\n\n\t\t\t// Add a line curve if start and end of lines are not connected\n\t\t\tvar startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\t\tvar endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tvar d = t * this.getLength();\n\t\t\tvar curveLengths = this.getCurveLengths();\n\t\t\tvar i = 0;\n\n\t\t\t// To think about boundaries points.\n\n\t\t\twhile ( i < curveLengths.length ) {\n\n\t\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\t\tvar diff = curveLengths[ i ] - d;\n\t\t\t\t\tvar curve = this.curves[ i ];\n\n\t\t\t\t\tvar segmentLength = curve.getLength();\n\t\t\t\t\tvar u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\t\treturn curve.getPointAt( u );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t\t// loop where sum != 0, sum > d , sum+1 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\tpoints.push( points[ 0 ] );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t/**************************************************************\n\t\t *\tCreate Geometries Helpers\n\t\t **************************************************************/\n\n\t\t/// Generate geometry from path points (for Line or Points objects)\n\n\t\tcreatePointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\t// Generate geometry from equidistant sampling along the path\n\n\t\tcreateSpacedPointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getSpacedPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\tcreateGeometry: function ( points ) {\n\n\t\t\tvar geometry = new Geometry();\n\n\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tvar point = points[ i ];\n\t\t\t\tgeometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\t/**************************************************************\n\t *\tEllipse curve\n\t **************************************************************/\n\n\tfunction EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\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 || 0;\n\n\t}\n\n\tEllipseCurve.prototype = Object.create( Curve.prototype );\n\tEllipseCurve.prototype.constructor = EllipseCurve;\n\n\tEllipseCurve.prototype.isEllipseCurve = true;\n\n\tEllipseCurve.prototype.getPoint = function( t ) {\n\n\t\tvar twoPi = Math.PI * 2;\n\t\tvar deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tvar 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\tvar angle = this.aStartAngle + t * deltaAngle;\n\t\tvar x = this.aX + this.xRadius * Math.cos( angle );\n\t\tvar y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tvar cos = Math.cos( this.aRotation );\n\t\t\tvar sin = Math.sin( this.aRotation );\n\n\t\t\tvar tx = x - this.aX;\n\t\t\tvar 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 new Vector2( x, y );\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tvar CurveUtils = {\n\n\t\ttangentQuadraticBezier: function ( t, p0, p1, p2 ) {\n\n\t\t\treturn 2 * ( 1 - t ) * ( p1 - p0 ) + 2 * t * ( p2 - p1 );\n\n\t\t},\n\n\t\t// Puay Bing, thanks for helping with this derivative!\n\n\t\ttangentCubicBezier: function ( t, p0, p1, p2, p3 ) {\n\n\t\t\treturn - 3 * p0 * ( 1 - t ) * ( 1 - t ) +\n\t\t\t\t3 * p1 * ( 1 - t ) * ( 1 - t ) - 6 * t * p1 * ( 1 - t ) +\n\t\t\t\t6 * t * p2 * ( 1 - t ) - 3 * t * t * p2 +\n\t\t\t\t3 * t * t * p3;\n\n\t\t},\n\n\t\ttangentSpline: function ( t, p0, p1, p2, p3 ) {\n\n\t\t\t// To check if my formulas are correct\n\n\t\t\tvar h00 = 6 * t * t - 6 * t; \t// derived from 2t^3 − 3t^2 + 1\n\t\t\tvar h10 = 3 * t * t - 4 * t + 1; // t^3 − 2t^2 + t\n\t\t\tvar h01 = - 6 * t * t + 6 * t; \t// − 2t3 + 3t2\n\t\t\tvar h11 = 3 * t * t - 2 * t;\t// t3 − t2\n\n\t\t\treturn h00 + h10 + h01 + h11;\n\n\t\t},\n\n\t\t// Catmull-Rom\n\n\t\tinterpolate: function( p0, p1, p2, p3, t ) {\n\n\t\t\tvar v0 = ( p2 - p0 ) * 0.5;\n\t\t\tvar v1 = ( p3 - p1 ) * 0.5;\n\t\t\tvar t2 = t * t;\n\t\t\tvar t3 = t * t2;\n\t\t\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t\t}\n\n\t};\n\n\t/**************************************************************\n\t *\tSpline curve\n\t **************************************************************/\n\n\tfunction SplineCurve( points /* array of Vector2 */ ) {\n\n\t\tthis.points = ( points === undefined ) ? [] : points;\n\n\t}\n\n\tSplineCurve.prototype = Object.create( Curve.prototype );\n\tSplineCurve.prototype.constructor = SplineCurve;\n\n\tSplineCurve.prototype.isSplineCurve = true;\n\n\tSplineCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar point = ( points.length - 1 ) * t;\n\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tvar point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tvar point1 = points[ intPoint ];\n\t\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tvar interpolate = CurveUtils.interpolate;\n\n\t\treturn new Vector2(\n\t\t\tinterpolate( point0.x, point1.x, point2.x, point3.x, weight ),\n\t\t\tinterpolate( point0.y, point1.y, point2.y, point3.y, weight )\n\t\t);\n\n\t};\n\n\t/**************************************************************\n\t *\tCubic Bezier curve\n\t **************************************************************/\n\n\tfunction CubicBezierCurve( v0, v1, v2, v3 ) {\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\tCubicBezierCurve.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve.prototype.constructor = CubicBezierCurve;\n\n\tCubicBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar b3 = ShapeUtils.b3;\n\n\t\treturn new Vector2(\n\t\t\tb3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ),\n\t\t\tb3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y )\n\t\t);\n\n\t};\n\n\tCubicBezierCurve.prototype.getTangent = function( t ) {\n\n\t\tvar tangentCubicBezier = CurveUtils.tangentCubicBezier;\n\n\t\treturn new Vector2(\n\t\t\ttangentCubicBezier( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ),\n\t\t\ttangentCubicBezier( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y )\n\t\t).normalize();\n\n\t};\n\n\t/**************************************************************\n\t *\tQuadratic Bezier curve\n\t **************************************************************/\n\n\n\tfunction QuadraticBezierCurve( v0, v1, v2 ) {\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;\n\n\n\tQuadraticBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar b2 = ShapeUtils.b2;\n\n\t\treturn new Vector2(\n\t\t\tb2( t, this.v0.x, this.v1.x, this.v2.x ),\n\t\t\tb2( t, this.v0.y, this.v1.y, this.v2.y )\n\t\t);\n\n\t};\n\n\n\tQuadraticBezierCurve.prototype.getTangent = function( t ) {\n\n\t\tvar tangentQuadraticBezier = CurveUtils.tangentQuadraticBezier;\n\n\t\treturn new Vector2(\n\t\t\ttangentQuadraticBezier( t, this.v0.x, this.v1.x, this.v2.x ),\n\t\t\ttangentQuadraticBezier( t, this.v0.y, this.v1.y, this.v2.y )\n\t\t).normalize();\n\n\t};\n\n\tvar PathPrototype = Object.assign( Object.create( CurvePath.prototype ), {\n\n\t\tfromPoints: function ( vectors ) {\n\n\t\t\tthis.moveTo( vectors[ 0 ].x, vectors[ 0 ].y );\n\n\t\t\tfor ( var i = 1, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lineTo( vectors[ i ].x, vectors[ i ].y );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tvar curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tvar curve = new QuadraticBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tvar curve = new CubicBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts /*Array of Vector*/ ) {\n\n\t\t\tvar npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\t\tvar curve = new SplineCurve( npts );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\t},\n\n\t\tarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tabsarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t},\n\n\t\tabsellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t\t// if a previous curve is present, attempt to join\n\t\t\t\tvar firstPoint = curve.getPoint( 0 );\n\n\t\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tvar lastPoint = curve.getPoint( 1 );\n\t\t\tthis.currentPoint.copy( lastPoint );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Defines a 2d shape plane using paths.\n\t **/\n\n\t// STEP 1 Create a path.\n\t// STEP 2 Turn path into shape.\n\t// STEP 3 ExtrudeGeometry takes in Shape/Shapes\n\t// STEP 3a - Extract points from each shape, turn to vertices\n\t// STEP 3b - Triangulate each shape, add faces.\n\n\tfunction Shape() {\n\n\t\tPath.apply( this, arguments );\n\n\t\tthis.holes = [];\n\n\t}\n\n\tShape.prototype = Object.assign( Object.create( PathPrototype ), {\n\n\t\tconstructor: Shape,\n\n\t\tgetPointsHoles: function ( divisions ) {\n\n\t\t\tvar holesPts = [];\n\n\t\t\tfor ( var i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t\t}\n\n\t\t\treturn holesPts;\n\n\t\t},\n\n\t\t// Get points of shape and holes (keypoints based on segments parameter)\n\n\t\textractAllPoints: function ( divisions ) {\n\n\t\t\treturn {\n\n\t\t\t\tshape: this.getPoints( divisions ),\n\t\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t\t};\n\n\t\t},\n\n\t\textractPoints: function ( divisions ) {\n\n\t\t\treturn this.extractAllPoints( divisions );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Creates free form 2d path using series of points, lines or curves.\n\t *\n\t **/\n\n\tfunction Path( points ) {\n\n\t\tCurvePath.call( this );\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.fromPoints( points );\n\n\t\t}\n\n\t}\n\n\tPath.prototype = PathPrototype;\n\tPathPrototype.constructor = Path;\n\n\n\t// minimal class for proxing functions to Path. Replaces old \"extractSubpaths()\"\n\tfunction ShapePath() {\n\t\tthis.subPaths = [];\n\t\tthis.currentPath = null;\n\t}\n\n\tShapePath.prototype = {\n\t\tmoveTo: function ( x, y ) {\n\t\t\tthis.currentPath = new Path();\n\t\t\tthis.subPaths.push(this.currentPath);\n\t\t\tthis.currentPath.moveTo( x, y );\n\t\t},\n\t\tlineTo: function ( x, y ) {\n\t\t\tthis.currentPath.lineTo( x, y );\n\t\t},\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\t\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\t\t},\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\t\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\t\t},\n\t\tsplineThru: function ( pts ) {\n\t\t\tthis.currentPath.splineThru( pts );\n\t\t},\n\n\t\ttoShapes: function ( isCCW, noHoles ) {\n\n\t\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\t\tvar shapes = [];\n\n\t\t\t\tfor ( var i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar tmpPath = inSubpaths[ i ];\n\n\t\t\t\t\tvar tmpShape = new Shape();\n\t\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t\t}\n\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\t\tvar polyLen = inPolygon.length;\n\n\t\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\t\tvar inside = false;\n\t\t\t\tfor ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\t\tvar edgeLowPt = inPolygon[ p ];\n\t\t\t\t\tvar edgeHighPt = inPolygon[ q ];\n\n\t\t\t\t\tvar edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\t\tvar edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t\t// not parallel\n\t\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\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\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\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\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// parallel or collinear\n\t\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\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\t// continue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn\tinside;\n\n\t\t\t}\n\n\t\t\tvar isClockWise = ShapeUtils.isClockWise;\n\n\t\t\tvar subPaths = this.subPaths;\n\t\t\tif ( subPaths.length === 0 ) return [];\n\n\t\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tvar solid, tmpPath, tmpShape, shapes = [];\n\n\t\t\tif ( subPaths.length === 1 ) {\n\n\t\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\t\ttmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tvar holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\t\tvar betterShapeHoles = [];\n\t\t\tvar newShapes = [];\n\t\t\tvar newShapeHoles = [];\n\t\t\tvar mainIdx = 0;\n\t\t\tvar tmpPoints;\n\n\t\t\tnewShapes[ mainIdx ] = undefined;\n\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\tfor ( var i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\t\ttmpPath = subPaths[ i ];\n\t\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\t\tif ( solid ) {\n\n\t\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t\t//console.log('cw', i);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t\t//console.log('ccw', i);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tif ( newShapes.length > 1 ) {\n\n\t\t\t\tvar ambiguous = false;\n\t\t\t\tvar toChange = [];\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tvar sho = newShapeHoles[ sIdx ];\n\n\t\t\t\t\tfor ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\t\tvar ho = sho[ hIdx ];\n\t\t\t\t\t\tvar hole_unassigned = true;\n\n\t\t\t\t\t\tfor ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );\n\t\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\t// console.log(\"ambiguous: \", ambiguous);\n\t\t\t\tif ( toChange.length > 0 ) {\n\n\t\t\t\t\t// console.log(\"to change: \", toChange);\n\t\t\t\t\tif ( ! ambiguous )\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar tmpHoles;\n\n\t\t\tfor ( var i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\t\tfor ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//console.log(\"shape\", shapes);\n\n\t\t\treturn shapes;\n\n\t\t}\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Font( data ) {\n\n\t\tthis.data = data;\n\n\t}\n\n\tObject.assign( Font.prototype, {\n\n\t\tisFont: true,\n\n\t\tgenerateShapes: function ( text, size, divisions ) {\n\n\t\t\tfunction createPaths( text ) {\n\n\t\t\t\tvar chars = String( text ).split( '' );\n\t\t\t\tvar scale = size / data.resolution;\n\t\t\t\tvar offset = 0;\n\n\t\t\t\tvar paths = [];\n\n\t\t\t\tfor ( var i = 0; i < chars.length; i ++ ) {\n\n\t\t\t\t\tvar ret = createPath( chars[ i ], scale, offset );\n\t\t\t\t\toffset += ret.offset;\n\n\t\t\t\t\tpaths.push( ret.path );\n\n\t\t\t\t}\n\n\t\t\t\treturn paths;\n\n\t\t\t}\n\n\t\t\tfunction createPath( c, scale, offset ) {\n\n\t\t\t\tvar glyph = data.glyphs[ c ] || data.glyphs[ '?' ];\n\n\t\t\t\tif ( ! glyph ) return;\n\n\t\t\t\tvar path = new ShapePath();\n\n\t\t\t\tvar pts = [], b2 = ShapeUtils.b2, b3 = ShapeUtils.b3;\n\t\t\t\tvar x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste;\n\n\t\t\t\tif ( glyph.o ) {\n\n\t\t\t\t\tvar outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\t\t\t\tfor ( var i = 0, l = outline.length; i < l; ) {\n\n\t\t\t\t\t\tvar action = outline[ i ++ ];\n\n\t\t\t\t\t\tswitch ( action ) {\n\n\t\t\t\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tb2( t, cpx0, cpx1, cpx );\n\t\t\t\t\t\t\t\t\t\tb2( t, cpy0, cpy1, cpy );\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\tbreak;\n\n\t\t\t\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\t\t\t\tcpx = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy = outline[ i ++ ] * scale;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale;\n\t\t\t\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offset;\n\t\t\t\t\t\t\t\tcpy2 = outline[ i ++ ] * scale;\n\n\t\t\t\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tb3( t, cpx0, cpx1, cpx2, cpx );\n\t\t\t\t\t\t\t\t\t\tb3( t, cpy0, cpy1, cpy2, cpy );\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\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn { offset: glyph.ha * scale, path: path };\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( size === undefined ) size = 100;\n\t\t\tif ( divisions === undefined ) divisions = 4;\n\n\t\t\tvar data = this.data;\n\n\t\t\tvar paths = createPaths( text );\n\t\t\tvar shapes = [];\n\n\t\t\tfor ( var p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FontLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FontLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\t\t\t\tjson = JSON.parse( text.substring( 65, text.length - 2 ) );\n\n\t\t\t\t}\n\n\t\t\t\tvar font = scope.parse( json );\n\n\t\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\treturn new Font( json );\n\n\t\t}\n\n\t} );\n\n\tvar context;\n\n\tfunction getAudioContext() {\n\n\t\tif ( context === undefined ) {\n\n\t\t\tcontext = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn context;\n\n\t}\n\n\t/**\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction AudioLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( AudioLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar loader = new XHRLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar context = getAudioContext();\n\n\t\t\t\tcontext.decodeAudioData( buffer, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction StereoCamera() {\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}\n\n\tObject.assign( StereoCamera.prototype, {\n\n\t\tupdate: ( function () {\n\n\t\t\tvar instance, focus, fov, aspect, near, far, zoom;\n\n\t\t\tvar eyeRight = new Matrix4();\n\t\t\tvar eyeLeft = new Matrix4();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov ||\n\t\t\t\t\t\t\t\t\t\t\t\t\taspect !== camera.aspect * this.aspect || near !== camera.near ||\n\t\t\t\t\t\t\t\t\t\t\t\t\tfar !== camera.far || zoom !== camera.zoom;\n\n\t\t\t\tif ( needsUpdate ) {\n\n\t\t\t\t\tinstance = this;\n\t\t\t\t\tfocus = camera.focus;\n\t\t\t\t\tfov = camera.fov;\n\t\t\t\t\taspect = camera.aspect * this.aspect;\n\t\t\t\t\tnear = camera.near;\n\t\t\t\t\tfar = camera.far;\n\t\t\t\t\tzoom = camera.zoom;\n\n\t\t\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t\t\tvar projectionMatrix = camera.projectionMatrix.clone();\n\t\t\t\t\tvar eyeSep = this.eyeSep / 2;\n\t\t\t\t\tvar eyeSepOnProjection = eyeSep * near / focus;\n\t\t\t\t\tvar ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom;\n\t\t\t\t\tvar xmin, xmax;\n\n\t\t\t\t\t// translate xOffset\n\n\t\t\t\t\teyeLeft.elements[ 12 ] = - eyeSep;\n\t\t\t\t\teyeRight.elements[ 12 ] = eyeSep;\n\n\t\t\t\t\t// for left eye\n\n\t\t\t\t\txmin = - ymax * aspect + eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect + eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t\t// for right eye\n\n\t\t\t\t\txmin = - ymax * aspect - eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect - eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\n\t\t\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * Camera for rendering cube maps\n\t *\t- renders scene into axis-aligned cube\n\t *\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CubeCamera( near, far, cubeResolution ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tvar fov = 90, aspect = 1;\n\n\t\tvar cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.up.set( 0, - 1, 0 );\n\t\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\t\tthis.add( cameraPX );\n\n\t\tvar cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.up.set( 0, - 1, 0 );\n\t\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\t\tthis.add( cameraNX );\n\n\t\tvar cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.up.set( 0, 0, 1 );\n\t\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\t\tthis.add( cameraPY );\n\n\t\tvar cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.up.set( 0, 0, - 1 );\n\t\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\t\tthis.add( cameraNY );\n\n\t\tvar cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.up.set( 0, - 1, 0 );\n\t\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\t\tthis.add( cameraPZ );\n\n\t\tvar cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.up.set( 0, - 1, 0 );\n\t\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\t\tthis.add( cameraNZ );\n\n\t\tvar options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };\n\n\t\tthis.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );\n\n\t\tthis.updateCubeMap = function ( renderer, scene ) {\n\n\t\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\t\tvar renderTarget = this.renderTarget;\n\t\t\tvar generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\t\trenderTarget.activeCubeFace = 0;\n\t\t\trenderer.render( scene, cameraPX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 1;\n\t\t\trenderer.render( scene, cameraNX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 2;\n\t\t\trenderer.render( scene, cameraPY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 3;\n\t\t\trenderer.render( scene, cameraNY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 4;\n\t\t\trenderer.render( scene, cameraPZ, renderTarget );\n\n\t\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\t\trenderTarget.activeCubeFace = 5;\n\t\t\trenderer.render( scene, cameraNZ, renderTarget );\n\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t};\n\n\t}\n\n\tCubeCamera.prototype = Object.create( Object3D.prototype );\n\tCubeCamera.prototype.constructor = CubeCamera;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioListener() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = getAudioContext();\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}\n\n\tAudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: AudioListener,\n\n\t\tgetInput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tremoveFilter: function ( ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\t\tthis.gain.connect( this.context.destination );\n\t\t\t\tthis.filter = null;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.filter;\n\n\t\t},\n\n\t\tsetFilter: function ( value ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t\t} else {\n\n\t\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t\t}\n\n\t\t\tthis.filter = value;\n\t\t\tthis.gain.connect( this.filter );\n\t\t\tthis.filter.connect( this.context.destination );\n\n\t\t},\n\n\t\tgetMasterVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\t\tsetMasterVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\t\t\tvar scale = new Vector3();\n\n\t\t\tvar orientation = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tvar listener = this.context.listener;\n\t\t\t\tvar up = this.up;\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, scale );\n\n\t\t\t\torientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t\t\tlistener.setPosition( position.x, position.y, position.z );\n\t\t\t\tlistener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z );\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction Audio( listener ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.context = listener.context;\n\t\tthis.source = this.context.createBufferSource();\n\t\tthis.source.onended = this.onEnded.bind( this );\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.startTime = 0;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis.filters = [];\n\n\t}\n\n\tAudio.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Audio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tsetNodeSource: function ( audioNode ) {\n\n\t\t\tthis.hasPlaybackControl = false;\n\t\t\tthis.sourceType = 'audioNode';\n\t\t\tthis.source = audioNode;\n\t\t\tthis.connect();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetBuffer: function ( audioBuffer ) {\n\n\t\t\tthis.source.buffer = audioBuffer;\n\t\t\tthis.sourceType = 'buffer';\n\n\t\t\tif ( this.autoplay ) this.play();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tplay: function () {\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar source = this.context.createBufferSource();\n\n\t\t\tsource.buffer = this.source.buffer;\n\t\t\tsource.loop = this.source.loop;\n\t\t\tsource.onended = this.source.onended;\n\t\t\tsource.start( 0, this.startTime );\n\t\t\tsource.playbackRate.value = this.playbackRate;\n\n\t\t\tthis.isPlaying = true;\n\n\t\t\tthis.source = source;\n\n\t\t\treturn this.connect();\n\n\t\t},\n\n\t\tpause: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = this.context.currentTime;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = 0;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdisconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilters: function () {\n\n\t\t\treturn this.filters;\n\n\t\t},\n\n\t\tsetFilters: function ( value ) {\n\n\t\t\tif ( ! value ) value = [];\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.disconnect();\n\t\t\t\tthis.filters = value;\n\t\t\t\tthis.connect();\n\n\t\t\t} else {\n\n\t\t\t\tthis.filters = value;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.getFilters()[ 0 ];\n\n\t\t},\n\n\t\tsetFilter: function ( filter ) {\n\n\t\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t\t},\n\n\t\tsetPlaybackRate: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.playbackRate = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.playbackRate.value = this.playbackRate;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetPlaybackRate: function () {\n\n\t\t\treturn this.playbackRate;\n\n\t\t},\n\n\t\tonEnded: function () {\n\n\t\t\tthis.isPlaying = false;\n\n\t\t},\n\n\t\tgetLoop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn this.source.loop;\n\n\t\t},\n\n\t\tsetLoop: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.loop = value;\n\n\t\t},\n\n\t\tgetVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\n\t\tsetVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PositionalAudio( listener ) {\n\n\t\tAudio.call( this, listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tPositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {\n\n\t\tconstructor: PositionalAudio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.panner;\n\n\t\t},\n\n\t\tgetRefDistance: function () {\n\n\t\t\treturn this.panner.refDistance;\n\n\t\t},\n\n\t\tsetRefDistance: function ( value ) {\n\n\t\t\tthis.panner.refDistance = value;\n\n\t\t},\n\n\t\tgetRolloffFactor: function () {\n\n\t\t\treturn this.panner.rolloffFactor;\n\n\t\t},\n\n\t\tsetRolloffFactor: function ( value ) {\n\n\t\t\tthis.panner.rolloffFactor = value;\n\n\t\t},\n\n\t\tgetDistanceModel: function () {\n\n\t\t\treturn this.panner.distanceModel;\n\n\t\t},\n\n\t\tsetDistanceModel: function ( value ) {\n\n\t\t\tthis.panner.distanceModel = value;\n\n\t\t},\n\n\t\tgetMaxDistance: function () {\n\n\t\t\treturn this.panner.maxDistance;\n\n\t\t},\n\n\t\tsetMaxDistance: function ( value ) {\n\n\t\t\tthis.panner.maxDistance = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tposition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tthis.panner.setPosition( position.x, position.y, position.z );\n\n\t\t\t};\n\n\t\t} )()\n\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioAnalyser( audio, fftSize ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\tObject.assign( AudioAnalyser.prototype, {\n\n\t\tgetFrequencyData: function () {\n\n\t\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\t\treturn this.data;\n\n\t\t},\n\n\t\tgetAverageFrequency: function () {\n\n\t\t\tvar value = 0, data = this.getFrequencyData();\n\n\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tvalue += data[ i ];\n\n\t\t\t}\n\n\t\t\treturn value / data.length;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Buffered scene graph property that allows weighted accumulation.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyMixer( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tvar bufferType = Float64Array,\n\t\t\tmixFunction;\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\t\t\tmixFunction = this._slerp;\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\n\t\t\t\tbufferType = Array,\t\tmixFunction = this._select;\t\tbreak;\n\n\t\t\tdefault:\t\t\t\t\tmixFunction = this._lerp;\n\n\t\t}\n\n\t\tthis.buffer = new bufferType( valueSize * 4 );\n\t\t// layout: [ incoming | accu0 | accu1 | orig ]\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\n\t\tthis._mixBufferRegion = mixFunction;\n\n\t\tthis.cumulativeWeight = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\tPropertyMixer.prototype = {\n\n\t\tconstructor: PropertyMixer,\n\n\t\t// accumulate data in the 'incoming' region into 'accu'\n\t\taccumulate: function( accuIndex, weight ) {\n\n\t\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t\t// the weight and shouldn't have made the call in the first place\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tcurrentWeight = this.cumulativeWeight;\n\n\t\t\tif ( currentWeight === 0 ) {\n\n\t\t\t\t// accuN := incoming * weight\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcurrentWeight = weight;\n\n\t\t\t} else {\n\n\t\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\t\tcurrentWeight += weight;\n\t\t\t\tvar mix = weight / currentWeight;\n\t\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = currentWeight;\n\n\t\t},\n\n\t\t// apply the state of 'accu' to the binding when accus differ\n\t\tapply: function( accuIndex ) {\n\n\t\t\tvar stride = this.valueSize,\n\t\t\t\tbuffer = this.buffer,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tweight = this.cumulativeWeight,\n\n\t\t\t\tbinding = this.binding;\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t\tif ( weight < 1 ) {\n\n\t\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\t\tvar originalValueOffset = stride * 3;\n\n\t\t\t\tthis._mixBufferRegion(\n\t\t\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t\t}\n\n\t\t\tfor ( var i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remember the state of the bound property and copy it to both accus\n\t\tsaveOriginalState: function() {\n\n\t\t\tvar binding = this.binding;\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toriginalValueOffset = stride * 3;\n\n\t\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\t\tfor ( var i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t},\n\n\t\t// apply the state previously taken via 'saveOriginalState' to the binding\n\t\trestoreOriginalState: function() {\n\n\t\t\tvar originalValueOffset = this.valueSize * 3;\n\t\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t\t},\n\n\n\t\t// mix functions\n\n\t\t_select: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tif ( t >= 0.5 ) {\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_slerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tQuaternion.slerpFlat( buffer, dstOffset,\n\t\t\t\t\tbuffer, dstOffset, buffer, srcOffset, t );\n\n\t\t},\n\n\t\t_lerp: function( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tvar s = 1 - t;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tvar j = dstOffset + i;\n\n\t\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * A reference to a real property in the scene graph.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyBinding( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode(\n\t\t\t\trootNode, this.parsedPath.nodeName ) || rootNode;\n\n\t\tthis.rootNode = rootNode;\n\n\t}\n\n\tPropertyBinding.prototype = {\n\n\t\tconstructor: PropertyBinding,\n\n\t\tgetValue: function getValue_unbound( targetArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.getValue( targetArray, offset );\n\n\t\t\t// Note: This class uses a State pattern on a per-method basis:\n\t\t\t// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n\t\t\t// prototype version of these methods with one that represents\n\t\t\t// the bound state. When the property is not found, the methods\n\t\t\t// become no-ops.\n\n\t\t},\n\n\t\tsetValue: function getValue_unbound( sourceArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.setValue( sourceArray, offset );\n\n\t\t},\n\n\t\t// create getter / setter pair for a property in the scene graph\n\t\tbind: function() {\n\n\t\t\tvar targetObject = this.node,\n\t\t\t\tparsedPath = this.parsedPath,\n\n\t\t\t\tobjectName = parsedPath.objectName,\n\t\t\t\tpropertyName = parsedPath.propertyName,\n\t\t\t\tpropertyIndex = parsedPath.propertyIndex;\n\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\ttargetObject = PropertyBinding.findNode(\n\t\t\t\t\t\tthis.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\t\tthis.node = targetObject;\n\n\t\t\t}\n\n\t\t\t// set fail state so we can just 'return' on error\n\t\t\tthis.getValue = this._getValue_unavailable;\n\t\t\tthis.setValue = this._setValue_unavailable;\n\n\t \t\t// ensure there is a value node\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\tconsole.error( \" trying to update node for track: \" + this.path + \" but it wasn't found.\" );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( objectName ) {\n\n\t\t\t\tvar objectIndex = parsedPath.objectIndex;\n\n\t\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\t\tswitch ( objectName ) {\n\n\t\t\t\t\tcase 'materials':\n\n\t\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material as node does not have a material', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to material.materials as node.material does not have a materials array', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bones':\n\n\t\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to bones as node does not have a skeleton', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\t\tfor ( var i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.error( ' can not bind to objectName of node, undefined', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( \" trying to bind to objectIndex of objectName, but is undefined:\", this, targetObject );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// resolve property\n\t\t\tvar nodeProperty = targetObject[ propertyName ];\n\n\t\t\tif ( nodeProperty === undefined ) {\n\n\t\t\t\tvar nodeName = parsedPath.nodeName;\n\n\t\t\t\tconsole.error( \" trying to update property for track: \" + nodeName +\n\t\t\t\t\t\t'.' + propertyName + \" but it wasn't found.\", targetObject );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// determine versioning scheme\n\t\t\tvar versioning = this.Versioning.None;\n\n\t\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\t\tversioning = this.Versioning.NeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t}\n\n\t\t\t// determine how the property gets bound\n\t\t\tvar bindingType = this.BindingType.Direct;\n\n\t\t\tif ( propertyIndex !== undefined ) {\n\t\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\t\tif ( propertyName === \"morphTargetInfluences\" ) {\n\t\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\t// support resolving morphTarget names into indices.\n\t\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphTargets ) {\n\n\t\t\t\t\t\tconsole.error( ' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) {\n\n\t\t\t\t\t\t\tpropertyIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\t\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else if ( nodeProperty.length !== undefined ) {\n\n\t\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else {\n\n\t\t\t\tthis.propertyName = propertyName;\n\n\t\t\t}\n\n\t\t\t// select getter / setter\n\t\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tthis.node = null;\n\n\t\t\t// back to the prototype version of getValue / setValue\n\t\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\t\tthis.getValue = this._getValue_unbound;\n\t\t\tthis.setValue = this._setValue_unbound;\n\n\t\t}\n\n\t};\n\n\tObject.assign( PropertyBinding.prototype, { // prototype, continued\n\n\t\t// these are used to \"bind\" a nonexistent property\n\t\t_getValue_unavailable: function() {},\n\t\t_setValue_unavailable: function() {},\n\n\t\t// initial state of these methods that calls 'bind'\n\t\t_getValue_unbound: PropertyBinding.prototype.getValue,\n\t\t_setValue_unbound: PropertyBinding.prototype.setValue,\n\n\t\tBindingType: {\n\t\t\tDirect: 0,\n\t\t\tEntireArray: 1,\n\t\t\tArrayElement: 2,\n\t\t\tHasFromToArray: 3\n\t\t},\n\n\t\tVersioning: {\n\t\t\tNone: 0,\n\t\t\tNeedsUpdate: 1,\n\t\t\tMatrixWorldNeedsUpdate: 2\n\t\t},\n\n\t\tGetterByBindingType: [\n\n\t\t\tfunction getValue_direct( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.node[ this.propertyName ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_array( buffer, offset ) {\n\n\t\t\t\tvar source = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tfunction getValue_arrayElement( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_toArray( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t\t\t}\n\n\t\t],\n\n\t\tSetterByBindingTypeAndVersioning: [\n\n\t\t\t[\n\t\t\t\t// Direct\n\n\t\t\t\tfunction setValue_direct( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// EntireArray\n\n\t\t\t\tfunction setValue_array( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// ArrayElement\n\n\t\t\t\tfunction setValue_arrayElement( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// HasToFromArray\n\n\t\t\t\tfunction setValue_fromArray( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t]\n\n\t\t]\n\n\t} );\n\n\tPropertyBinding.Composite =\n\t\t\tfunction( targetGroup, path, optionalParsedPath ) {\n\n\t\tvar parsedPath = optionalParsedPath ||\n\t\t\t\tPropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t};\n\n\tPropertyBinding.Composite.prototype = {\n\n\t\tconstructor: PropertyBinding.Composite,\n\n\t\tgetValue: function( array, offset ) {\n\n\t\t\tthis.bind(); // bind all binding\n\n\t\t\tvar firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t\t// and only call .getValue on the first\n\t\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t\t},\n\n\t\tsetValue: function( array, offset ) {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t\t}\n\n\t\t},\n\n\t\tbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].bind();\n\n\t\t\t}\n\n\t\t},\n\n\t\tunbind: function() {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\tn = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].unbind();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.create = function( root, path, parsedPath ) {\n\n\t\tif ( ! ( (root && root.isAnimationObjectGroup) ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t};\n\n\tPropertyBinding.parseTrackName = function( trackName ) {\n\n\t\t// matches strings in the form of:\n\t\t// nodeName.property\n\t\t// nodeName.property[accessor]\n\t\t// nodeName.material.property[accessor]\n\t\t// uuid.property[accessor]\n\t\t// uuid.objectName[objectIndex].propertyName[propertyIndex]\n\t\t// parentName/nodeName.property\n\t\t// parentName/parentName/nodeName.property[index]\n\t\t// .bone[Armature.DEF_cog].position\n\t\t// scene:helium_balloon_model:helium_balloon_model.position\n\t\t// created and tested via https://regex101.com/#javascript\n\n\t\tvar re = /^((?:\\w+[\\/:])*)(\\w+)?(?:\\.(\\w+)(?:\\[(.+)\\])?)?\\.(\\w+)(?:\\[(.+)\\])?$/;\n\t\tvar matches = re.exec( trackName );\n\n\t\tif ( ! matches ) {\n\n\t\t\tthrow new Error( \"cannot parse trackName at all: \" + trackName );\n\n\t\t}\n\n\t\tvar results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ], \t// allowed to be null, specified root node.\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ],\n\t\t\tpropertyIndex: matches[ 6 ]\t// allowed to be null, specifies that the whole property is set.\n\t\t};\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( \"can not parse propertyName from trackName: \" + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t};\n\n\tPropertyBinding.findNode = function( root, nodeName ) {\n\n\t\tif ( ! nodeName || nodeName === \"\" || nodeName === \"root\" || nodeName === \".\" || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tvar searchSkeleton = function( skeleton ) {\n\n\t\t\t\tfor( var i = 0; i < skeleton.bones.length; i ++ ) {\n\n\t\t\t\t\tvar bone = skeleton.bones[ i ];\n\n\t\t\t\t\tif ( bone.name === nodeName ) {\n\n\t\t\t\t\t\treturn bone;\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar bone = searchSkeleton( root.skeleton );\n\n\t\t\tif ( bone ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tvar searchNodeSubtree = function( children ) {\n\n\t\t\t\tfor( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tvar childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\t/**\n\t *\n\t * A group of objects that receives a shared animation state.\n\t *\n\t * Usage:\n\t *\n\t * \t-\tAdd objects you would otherwise pass as 'root' to the\n\t * \t\tconstructor or the .clipAction method of AnimationMixer.\n\t *\n\t * \t-\tInstead pass this object as 'root'.\n\t *\n\t * \t-\tYou can also add and remove objects later when the mixer\n\t * \t\tis running.\n\t *\n\t * Note:\n\t *\n\t * \tObjects of this class appear as one object to the mixer,\n\t * \tso cache control of the individual objects must be done\n\t * \ton the group.\n\t *\n\t * Limitation:\n\t *\n\t * \t- \tThe animated properties must be compatible among the\n\t * \t\tall objects in the group.\n\t *\n\t * -\tA single property can either be controlled through a\n\t * \ttarget group or directly, but not both.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction AnimationObjectGroup( var_args ) {\n\n\t\tthis.uuid = _Math.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;\t\t\t// threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tvar indices = {};\n\t\tthis._indicesByUUID = indices;\t\t// for bookkeeping\n\n\t\tfor ( var 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 = [];\t\t\t\t\t// inside: string\n\t\tthis._parsedPaths = [];\t\t\t\t// inside: { we don't care, here }\n\t\tthis._bindings = []; \t\t\t\t// inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; \t// inside: indices in these arrays\n\n\t\tvar scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() { return scope._objects.length; },\n\t\t\t\tget inUse() { return this.total - scope.nCachedObjects_; }\n\t\t\t},\n\n\t\t\tget bindingsPerObject() { return scope._bindings.length; }\n\n\t\t};\n\n\t}\n\n\tAnimationObjectGroup.prototype = {\n\n\t\tconstructor: AnimationObjectGroup,\n\n\t\tisAnimationObjectGroup: true,\n\n\t\tadd: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tpaths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index === undefined ) {\n\n\t\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\t\tindex = nObjects ++;\n\t\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\t\tobjects.push( object );\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tbindings[ j ].push(\n\t\t\t\t\t\t\t\tnew PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\t\tvar knownObject = objects[ index ];\n\n\t\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\t\tbinding = new PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( objects[ index ] !== knownObject) {\n\n\t\t\t\t\tconsole.error( \"Different objects with the same UUID \" +\n\t\t\t\t\t\t\t\"detected. Clean the caches or recreate your \" +\n\t\t\t\t\t\t\t\"infrastructure when reloading scenes...\" );\n\n\t\t\t\t} // else the object is already where we want it to be\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\tremove: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\t\tvar lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// remove & forget\n\t\tuncache: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\t\tvar lastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} // cached or active\n\n\t\t\t\t} // if object is known\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\t\tsubscribe_: function( path, parsedPath ) {\n\t\t\t// returns an array of bindings for the given path that is changed\n\t\t\t// according to the contained objects in the group\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ],\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\t\tvar paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tobjects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\t\tindex = bindings.length;\n\n\t\t\tindicesByPath[ path ] = index;\n\n\t\t\tpaths.push( path );\n\t\t\tparsedPaths.push( parsedPath );\n\t\t\tbindings.push( bindingsForPath );\n\n\t\t\tfor ( var i = nCachedObjects,\n\t\t\t\t\tn = objects.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = objects[ i ];\n\n\t\t\t\tbindingsForPath[ i ] =\n\t\t\t\t\t\tnew PropertyBinding( object, path, parsedPath );\n\n\t\t\t}\n\n\t\t\treturn bindingsForPath;\n\n\t\t},\n\n\t\tunsubscribe_: function( path ) {\n\t\t\t// tells the group to forget about a property path and no longer\n\t\t\t// update the array previously obtained with 'subscribe_'\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar paths = this._paths,\n\t\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\t\tbindings = this._bindings,\n\t\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\t\tbindings[ index ] = lastBindings;\n\t\t\t\tbindings.pop();\n\n\t\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\t\tparsedPaths.pop();\n\n\t\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\t\tpaths.pop();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Action provided by AnimationMixer for scheduling clip playback on specific\n\t * objects.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t *\n\t */\n\n\tfunction AnimationAction( mixer, clip, localRoot ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot || null;\n\n\t\tvar tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tvar interpolantSettings = {\n\t\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tvar 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;\t// 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;\t\t\t// for the memory manager\n\t\tthis._byClipCacheIndex = null;\t\t// 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; \t\t// no. of repetitions when looping\n\n\t\tthis.paused = false;\t\t\t\t// false -> zero effective time scale\n\t\tthis.enabled = true;\t\t\t\t// true -> zero effective weight\n\n\t\tthis.clampWhenFinished \t= false;\t// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart \t= true;\t\t// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd\t\t= true;\t\t// clips for start, loop and end\n\n\t}\n\n\tAnimationAction.prototype = {\n\n\t\tconstructor: AnimationAction,\n\n\t\t// State & Scheduling\n\n\t\tplay: function() {\n\n\t\t\tthis._mixer._activateAction( this );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function() {\n\n\t\t\tthis._mixer._deactivateAction( this );\n\n\t\t\treturn this.reset();\n\n\t\t},\n\n\t\treset: function() {\n\n\t\t\tthis.paused = false;\n\t\t\tthis.enabled = true;\n\n\t\t\tthis.time = 0;\t\t\t// restart clip\n\t\t\tthis._loopCount = -1;\t// forget previous loops\n\t\t\tthis._startTime = null;\t// forget scheduling\n\n\t\t\treturn this.stopFading().stopWarping();\n\n\t\t},\n\n\t\tisRunning: function() {\n\n\t\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\t// return true when play has been called\n\t\tisScheduled: function() {\n\n\t\t\treturn this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\tstartAt: function( time ) {\n\n\t\t\tthis._startTime = time;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetLoop: function( mode, repetitions ) {\n\n\t\t\tthis.loop = mode;\n\t\t\tthis.repetitions = repetitions;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Weight\n\n\t\t// set the weight stopping any scheduled fading\n\t\t// although .enabled = false yields an effective weight of zero, this\n\t\t// method does *not* change .enabled, because it would be confusing\n\t\tsetEffectiveWeight: function( weight ) {\n\n\t\t\tthis.weight = weight;\n\n\t\t\t// note: same logic as when updated at runtime\n\t\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\t\treturn this.stopFading();\n\n\t\t},\n\n\t\t// return the weight considering fading and .enabled\n\t\tgetEffectiveWeight: function() {\n\n\t\t\treturn this._effectiveWeight;\n\n\t\t},\n\n\t\tfadeIn: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t\t},\n\n\t\tfadeOut: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t\t},\n\n\t\tcrossFadeFrom: function( fadeOutAction, duration, warp ) {\n\n\t\t\tfadeOutAction.fadeOut( duration );\n\t\t\tthis.fadeIn( duration );\n\n\t\t\tif( warp ) {\n\n\t\t\t\tvar fadeInDuration = this._clip.duration,\n\t\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossFadeTo: function( fadeInAction, duration, warp ) {\n\n\t\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t\t},\n\n\t\tstopFading: function() {\n\n\t\t\tvar weightInterpolant = this._weightInterpolant;\n\n\t\t\tif ( weightInterpolant !== null ) {\n\n\t\t\t\tthis._weightInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Time Scale Control\n\n\t\t// set the weight stopping any scheduled warping\n\t\t// although .paused = true yields an effective time scale of zero, this\n\t\t// method does *not* change .paused, because it would be confusing\n\t\tsetEffectiveTimeScale: function( timeScale ) {\n\n\t\t\tthis.timeScale = timeScale;\n\t\t\tthis._effectiveTimeScale = this.paused ? 0 :timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\t// return the time scale considering warping and .paused\n\t\tgetEffectiveTimeScale: function() {\n\n\t\t\treturn this._effectiveTimeScale;\n\n\t\t},\n\n\t\tsetDuration: function( duration ) {\n\n\t\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\tsyncWith: function( action ) {\n\n\t\t\tthis.time = action.time;\n\t\t\tthis.timeScale = action.timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\thalt: function( duration ) {\n\n\t\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t\t},\n\n\t\twarp: function( startTimeScale, endTimeScale, duration ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._timeScaleInterpolant,\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant(),\n\t\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now;\n\t\t\ttimes[ 1 ] = now + duration;\n\n\t\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstopWarping: function() {\n\n\t\t\tvar timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\t\tthis._timeScaleInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Object Accessors\n\n\t\tgetMixer: function() {\n\n\t\t\treturn this._mixer;\n\n\t\t},\n\n\t\tgetClip: function() {\n\n\t\t\treturn this._clip;\n\n\t\t},\n\n\t\tgetRoot: function() {\n\n\t\t\treturn this._localRoot || this._mixer._root;\n\n\t\t},\n\n\t\t// Interna\n\n\t\t_update: function( time, deltaTime, timeDirection, accuIndex ) {\n\t\t\t// called by the mixer\n\n\t\t\tvar startTime = this._startTime;\n\n\t\t\tif ( startTime !== null ) {\n\n\t\t\t\t// check for scheduled start of action\n\n\t\t\t\tvar timeRunning = ( time - startTime ) * timeDirection;\n\t\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t\t}\n\n\t\t\t\t// start\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\t// apply time scale and advance time\n\n\t\t\tdeltaTime *= this._updateTimeScale( time );\n\t\t\tvar clipTime = this._updateTime( deltaTime );\n\n\t\t\t// note: _updateTime may disable the action resulting in\n\t\t\t// an effective weight of 0\n\n\t\t\tvar weight = this._updateWeight( time );\n\n\t\t\tif ( weight > 0 ) {\n\n\t\t\t\tvar interpolants = this._interpolants;\n\t\t\t\tvar propertyMixers = this._propertyBindings;\n\n\t\t\t\tfor ( var j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_updateWeight: function( time ) {\n\n\t\t\tvar weight = 0;\n\n\t\t\tif ( this.enabled ) {\n\n\t\t\t\tweight = this.weight;\n\t\t\t\tvar interpolant = this._weightInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\t\tthis.enabled = 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\tthis._effectiveWeight = weight;\n\t\t\treturn weight;\n\n\t\t},\n\n\t\t_updateTimeScale: function( time ) {\n\n\t\t\tvar timeScale = 0;\n\n\t\t\tif ( ! this.paused ) {\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\t\tvar interpolant = this._timeScaleInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\t\tthis.timeScale = timeScale;\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\tthis._effectiveTimeScale = timeScale;\n\t\t\treturn timeScale;\n\n\t\t},\n\n\t\t_updateTime: function( deltaTime ) {\n\n\t\t\tvar time = this.time + deltaTime;\n\n\t\t\tif ( deltaTime === 0 ) return time;\n\n\t\t\tvar duration = this._clip.duration,\n\n\t\t\t\tloop = this.loop,\n\t\t\t\tloopCount = this._loopCount;\n\n\t\t\tif ( loop === LoopOnce ) {\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tthis.loopCount = 0;\n\t\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t\t}\n\n\t\t\t\thandle_stop: {\n\n\t\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\t\ttime = duration;\n\n\t\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\t\ttime = 0;\n\n\t\t\t\t\t} else break handle_stop;\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\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}\n\n\t\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\t\tvar pingPong = ( loop === LoopPingPong );\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\ttrue, this.repetitions === 0, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\tthis.repetitions === 0, true, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( time >= duration || time < 0 ) {\n\t\t\t\t\t// wrap around\n\n\t\t\t\t\tvar loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\t\tvar pending = this.repetitions - loopCount;\n\n\t\t\t\t\tif ( pending < 0 ) {\n\t\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// keep running\n\n\t\t\t\t\t\tif ( pending === 0 ) {\n\t\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\t\tvar atStart = deltaTime < 0;\n\t\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\t\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\t\tthis.time = time;\n\t\t\t\t\treturn duration - time;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.time = time;\n\t\t\treturn time;\n\n\t\t},\n\n\t\t_setEndings: function( atStart, atEnd, pingPong ) {\n\n\t\t\tvar settings = this._interpolantSettings;\n\n\t\t\tif ( pingPong ) {\n\n\t\t\t\tsettings.endingStart \t= ZeroSlopeEnding;\n\t\t\t\tsettings.endingEnd\t\t= ZeroSlopeEnding;\n\n\t\t\t} else {\n\n\t\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\t\tif ( atStart ) {\n\n\t\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t\tif ( atEnd ) {\n\n\t\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_scheduleFading: function( duration, weightNow, weightThen ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant(),\n\t\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now; \t\t\t\tvalues[ 0 ] = weightNow;\n\t\t\ttimes[ 1 ] = now + duration;\tvalues[ 1 ] = weightThen;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t *\n\t * Player for AnimationClips.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction AnimationMixer( root ) {\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\tObject.assign( AnimationMixer.prototype, EventDispatcher.prototype, {\n\n\t\t// return an action for a clip optionally using a custom root target\n\t\t// object (this method allocates a lot of dynamic memory in case a\n\t\t// previously unknown clip/root combination is specified)\n\t\tclipAction: function( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject !== null ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ],\n\t\t\t\tprototypeAction = null;\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\tvar existingAction =\n\t\t\t\t\t\tactionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( existingAction !== undefined ) {\n\n\t\t\t\t\treturn existingAction;\n\n\t\t\t\t}\n\n\t\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t\t// the bindings again but can just copy\n\t\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t\t// also, take the clip from the prototype action\n\t\t\t\tif ( clipObject === null )\n\t\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t\t}\n\n\t\t\t// clip must be known when specified via string\n\t\t\tif ( clipObject === null ) return null;\n\n\t\t\t// allocate all resources required to run it\n\t\t\tvar newAction = new AnimationAction( this, clipObject, optionalRoot );\n\n\t\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t\t// and make the action known to the memory manager\n\t\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\t\treturn newAction;\n\n\t\t},\n\n\t\t// get an existing action\n\t\texistingAction: function( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// deactivates all previously scheduled actions\n\t\tstopAllAction: function() {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tthis._nActiveActions = 0;\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tactions[ i ].reset();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].useCount = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// advance the time and update apply the animation\n\t\tupdate: function( deltaTime ) {\n\n\t\t\tdeltaTime *= this.timeScale;\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\n\t\t\t\ttime = this.time += deltaTime,\n\t\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t\t// run active actions\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tvar action = actions[ i ];\n\n\t\t\t\tif ( action.enabled ) {\n\n\t\t\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// update scene graph\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// return this mixer's root target object\n\t\tgetRoot: function() {\n\n\t\t\treturn this._root;\n\n\t\t},\n\n\t\t// free all resources specific to a particular clip\n\t\tuncacheClip: function( clip ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tclipUuid = clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t\t// iteration state and also require updating the state we can\n\t\t\t\t// just throw away\n\n\t\t\t\tvar actionsToRemove = actionsForClip.knownActions;\n\n\t\t\t\tfor ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar action = actionsToRemove[ i ];\n\n\t\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\t\tvar cacheIndex = action._cacheIndex,\n\t\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\t\taction._cacheIndex = null;\n\t\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\t\tactions.pop();\n\n\t\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t\t}\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t// free all resources specific to a particular root target object\n\t\tuncacheRoot: function( root ) {\n\n\t\t\tvar rootUuid = root.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip;\n\n\t\t\tfor ( var clipUuid in actionsByClip ) {\n\n\t\t\t\tvar actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( action !== undefined ) {\n\n\t\t\t\t\tthis._deactivateAction( action );\n\t\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingByName !== undefined ) {\n\n\t\t\t\tfor ( var trackName in bindingByName ) {\n\n\t\t\t\t\tvar binding = bindingByName[ trackName ];\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remove a targeted clip from the cache\n\t\tuncacheAction: function( clip, optionalRoot ) {\n\n\t\t\tvar action = this.existingAction( clip, optionalRoot );\n\n\t\t\tif ( action !== null ) {\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} );\n\n\t// Implementation details:\n\n\tObject.assign( AnimationMixer.prototype, {\n\n\t\t_bindAction: function( action, prototypeAction ) {\n\n\t\t\tvar root = action._localRoot || this._root,\n\t\t\t\ttracks = action._clip.tracks,\n\t\t\t\tnTracks = tracks.length,\n\t\t\t\tbindings = action._propertyBindings,\n\t\t\t\tinterpolants = action._interpolants,\n\t\t\t\trootUuid = root.uuid,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingsByName === undefined ) {\n\n\t\t\t\tbindingsByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\t\tvar track = tracks[ i ],\n\t\t\t\t\ttrackName = track.name,\n\t\t\t\t\tbinding = bindingsByName[ trackName ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar path = prototypeAction && prototypeAction.\n\t\t\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t}\n\n\t\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t\t}\n\n\t\t},\n\n\t\t_activateAction: function( action ) {\n\n\t\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\t\tvar rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\t\tthis._bindAction( action,\n\t\t\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t\t}\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// increment reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._lendAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t_deactivateAction: function( action ) {\n\n\t\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// decrement reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._takeBackAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// Memory manager\n\n\t\t_initMemoryManager: function() {\n\n\t\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\t\tthis._nActiveActions = 0;\n\n\t\t\tthis._actionsByClip = {};\n\t\t\t// inside:\n\t\t\t// {\n\t\t\t// \t\tknownActions: Array< AnimationAction >\t- used as prototypes\n\t\t\t// \t\tactionByRoot: AnimationAction\t\t\t- lookup\n\t\t\t// }\n\n\n\t\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\t\tthis._controlInterpolants = []; // same game as above\n\t\t\tthis._nActiveControlInterpolants = 0;\n\n\t\t\tvar scope = this;\n\n\t\t\tthis.stats = {\n\n\t\t\t\tactions: {\n\t\t\t\t\tget total() { return scope._actions.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveActions; }\n\t\t\t\t},\n\t\t\t\tbindings: {\n\t\t\t\t\tget total() { return scope._bindings.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveBindings; }\n\t\t\t\t},\n\t\t\t\tcontrolInterpolants: {\n\t\t\t\t\tget total() { return scope._controlInterpolants.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveControlInterpolants; }\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t},\n\n\t\t// Memory management for AnimationAction objects\n\n\t\t_isActiveAction: function( action ) {\n\n\t\t\tvar index = action._cacheIndex;\n\t\t\treturn index !== null && index < this._nActiveActions;\n\n\t\t},\n\n\t\t_addInactiveAction: function( action, clipUuid, rootUuid ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip === undefined ) {\n\n\t\t\t\tactionsForClip = {\n\n\t\t\t\t\tknownActions: [ action ],\n\t\t\t\t\tactionByRoot: {}\n\n\t\t\t\t};\n\n\t\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t\t} else {\n\n\t\t\t\tvar knownActions = actionsForClip.knownActions;\n\n\t\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\t\tknownActions.push( action );\n\n\t\t\t}\n\n\t\t\taction._cacheIndex = actions.length;\n\t\t\tactions.push( action );\n\n\t\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t\t},\n\n\t\t_removeInactiveAction: function( action ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\t\tcacheIndex = action._cacheIndex;\n\n\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\tactions.pop();\n\n\t\t\taction._cacheIndex = null;\n\n\n\t\t\tvar clipUuid = action._clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\t\tlastKnownAction =\n\t\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\t\tknownActionsForClip.pop();\n\n\t\t\taction._byClipCacheIndex = null;\n\n\n\t\t\tvar actionByRoot = actionsForClip.actionByRoot,\n\t\t\t\trootUuid = ( actions._localRoot || this._root ).uuid;\n\n\t\t\tdelete actionByRoot[ rootUuid ];\n\n\t\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t},\n\n\t\t_removeInactiveBindingsForAction: function( action ) {\n\n\t\t\tvar bindings = action._propertyBindings;\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendAction: function( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions >| inactive actions ]\n\t\t\t// s a\n\t\t\t// <-swap->\n\t\t\t// a s\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\t\taction._cacheIndex = lastActiveIndex;\n\t\t\tactions[ lastActiveIndex ] = action;\n\n\t\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t\t},\n\n\t\t_takeBackAction: function( action ) {\n\n\t\t\t// [ active actions | inactive actions ]\n\t\t\t// [ active actions |< inactive actions ]\n\t\t\t// a s\n\t\t\t// <-swap->\n\t\t\t// s a\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\t\taction._cacheIndex = firstInactiveIndex;\n\t\t\tactions[ firstInactiveIndex ] = action;\n\n\t\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t\t},\n\n\t\t// Memory management for PropertyMixer objects\n\n\t\t_addInactiveBinding: function( binding, rootUuid, trackName ) {\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( bindingByName === undefined ) {\n\n\t\t\t\tbindingByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t\t}\n\n\t\t\tbindingByName[ trackName ] = binding;\n\n\t\t\tbinding._cacheIndex = bindings.length;\n\t\t\tbindings.push( binding );\n\n\t\t},\n\n\t\t_removeInactiveBinding: function( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tpropBinding = binding.binding,\n\t\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\t\ttrackName = propBinding.path,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\t\tbindings.pop();\n\n\t\t\tdelete bindingByName[ trackName ];\n\n\t\t\tremove_empty_map: {\n\n\t\t\t\tfor ( var _ in bindingByName ) break remove_empty_map;\n\n\t\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendBinding: function( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\t\tbinding._cacheIndex = lastActiveIndex;\n\t\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t\t},\n\n\t\t_takeBackBinding: function( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t\t},\n\n\n\t\t// Memory management of Interpolants for weight and time scale\n\n\t\t_lendControlInterpolant: function() {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++,\n\t\t\t\tinterpolant = interpolants[ lastActiveIndex ];\n\n\t\t\tif ( interpolant === undefined ) {\n\n\t\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t\t\t\t1, this._controlInterpolantsResultBuffer );\n\n\t\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t\t}\n\n\t\t\treturn interpolant;\n\n\t\t},\n\n\t\t_takeBackControlInterpolant: function( interpolant ) {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t\t},\n\n\t\t_controlInterpolantsResultBuffer: new Float32Array( 1 )\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Uniform( value ) {\n\n\t\tif ( typeof value === 'string' ) {\n\n\t\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\n\t\t\tvalue = arguments[ 1 ];\n\n\t\t}\n\n\t\tthis.value = value;\n\n\t}\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferGeometry() {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.maxInstancedCount = undefined;\n\n\t}\n\n\tInstancedBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tInstancedBufferGeometry.prototype.constructor = InstancedBufferGeometry;\n\n\tInstancedBufferGeometry.prototype.isInstancedBufferGeometry = true;\n\n\tInstancedBufferGeometry.prototype.addGroup = function ( start, count, materialIndex ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t};\n\n\tInstancedBufferGeometry.prototype.copy = function ( source ) {\n\n\t\tvar index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\tvar attributes = source.attributes;\n\n\t\tfor ( var name in attributes ) {\n\n\t\t\tvar attribute = attributes[ name ];\n\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t}\n\n\t\tvar groups = source.groups;\n\n\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tvar group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.data = interleavedBuffer;\n\t\tthis.itemSize = itemSize;\n\t\tthis.offset = offset;\n\n\t\tthis.normalized = normalized === true;\n\n\t}\n\n\n\tInterleavedBufferAttribute.prototype = {\n\n\t\tconstructor: InterleavedBufferAttribute,\n\n\t\tisInterleavedBufferAttribute: true,\n\n\t\tget count() {\n\n\t\t\treturn this.data.count;\n\n\t\t},\n\n\t\tget array() {\n\n\t\t\treturn this.data.array;\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\t\t\tthis.data.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBuffer( array, stride ) {\n\n\t\tthis.uuid = _Math.generateUUID();\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.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t}\n\n\tInterleavedBuffer.prototype = {\n\n\t\tconstructor: InterleavedBuffer,\n\n\t\tisInterleavedBuffer: true,\n\n\t\tset needsUpdate( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t},\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.stride : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.count = source.count;\n\t\t\tthis.stride = source.stride;\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.stride;\n\t\t\tindex2 *= attribute.stride;\n\n\t\t\tfor ( var i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {\n\n\t\tInterleavedBuffer.call( this, array, stride );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedInterleavedBuffer.prototype = Object.create( InterleavedBuffer.prototype );\n\tInstancedInterleavedBuffer.prototype.constructor = InstancedInterleavedBuffer;\n\n\tInstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true;\n\n\tInstancedInterleavedBuffer.prototype.copy = function ( source ) {\n\n\t\tInterleavedBuffer.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferAttribute( array, itemSize, meshPerAttribute ) {\n\n\t\tBufferAttribute.call( this, array, itemSize );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInstancedBufferAttribute.prototype.constructor = InstancedBufferAttribute;\n\n\tInstancedBufferAttribute.prototype.isInstancedBufferAttribute = true;\n\n\tInstancedBufferAttribute.prototype.copy = function ( source ) {\n\n\t\tBufferAttribute.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author bhouston / http://clara.io/\n\t * @author stephomi / http://stephaneginier.com/\n\t */\n\n\tfunction Raycaster( origin, direction, near, far ) {\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 || 0;\n\t\tthis.far = far || Infinity;\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: {},\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t\tObject.defineProperties( this.params, {\n\t\t\tPointCloud: {\n\t\t\t\tget: function () {\n\t\t\t\t\tconsole.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );\n\t\t\t\t\treturn this.Points;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tfunction ascSort( a, b ) {\n\n\t\treturn a.distance - b.distance;\n\n\t}\n\n\tfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t//\n\n\tRaycaster.prototype = {\n\n\t\tconstructor: Raycaster,\n\n\t\tlinePrecision: 1,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\t\tthis.ray.set( origin, direction );\n\n\t\t},\n\n\t\tsetFromCamera: function ( coords, camera ) {\n\n\t\t\tif ( (camera && camera.isPerspectiveCamera) ) {\n\n\t\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\n\t\t\t} else if ( (camera && camera.isOrthographicCamera) ) {\n\n\t\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\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type.' );\n\n\t\t\t}\n\n\t\t},\n\n\t\tintersectObject: function ( object, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tintersectObject( object, this, intersects, recursive );\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t},\n\n\t\tintersectObjects: function ( objects, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tif ( Array.isArray( objects ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );\n\t\t\t\treturn intersects;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t\t}\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Clock( autoStart ) {\n\n\t\tthis.autoStart = ( autoStart !== undefined ) ? autoStart : true;\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\tClock.prototype = {\n\n\t\tconstructor: Clock,\n\n\t\tstart: function () {\n\n\t\t\tthis.startTime = ( performance || Date ).now();\n\n\t\t\tthis.oldTime = this.startTime;\n\t\t\tthis.elapsedTime = 0;\n\t\t\tthis.running = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tthis.getElapsedTime();\n\t\t\tthis.running = false;\n\n\t\t},\n\n\t\tgetElapsedTime: function () {\n\n\t\t\tthis.getDelta();\n\t\t\treturn this.elapsedTime;\n\n\t\t},\n\n\t\tgetDelta: function () {\n\n\t\t\tvar diff = 0;\n\n\t\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\t\tthis.start();\n\n\t\t\t}\n\n\t\t\tif ( this.running ) {\n\n\t\t\t\tvar newTime = ( performance || Date ).now();\n\n\t\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\t\tthis.oldTime = newTime;\n\n\t\t\t\tthis.elapsedTime += diff;\n\n\t\t\t}\n\n\t\t\treturn diff;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Spline from Tween.js, slightly optimized (and trashed)\n\t * http://sole.github.com/tween.js/examples/05_spline.html\n\t *\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Spline( points ) {\n\n\t\tthis.points = points;\n\n\t\tvar c = [], v3 = { x: 0, y: 0, z: 0 },\n\t\tpoint, intPoint, weight, w2, w3,\n\t\tpa, pb, pc, pd;\n\n\t\tthis.initFromArray = function ( a ) {\n\n\t\t\tthis.points = [];\n\n\t\t\tfor ( var i = 0; i < a.length; i ++ ) {\n\n\t\t\t\tthis.points[ i ] = { x: a[ i ][ 0 ], y: a[ i ][ 1 ], z: a[ i ][ 2 ] };\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getPoint = function ( k ) {\n\n\t\t\tpoint = ( this.points.length - 1 ) * k;\n\t\t\tintPoint = Math.floor( point );\n\t\t\tweight = point - intPoint;\n\n\t\t\tc[ 0 ] = intPoint === 0 ? intPoint : intPoint - 1;\n\t\t\tc[ 1 ] = intPoint;\n\t\t\tc[ 2 ] = intPoint > this.points.length - 2 ? this.points.length - 1 : intPoint + 1;\n\t\t\tc[ 3 ] = intPoint > this.points.length - 3 ? this.points.length - 1 : intPoint + 2;\n\n\t\t\tpa = this.points[ c[ 0 ] ];\n\t\t\tpb = this.points[ c[ 1 ] ];\n\t\t\tpc = this.points[ c[ 2 ] ];\n\t\t\tpd = this.points[ c[ 3 ] ];\n\n\t\t\tw2 = weight * weight;\n\t\t\tw3 = weight * w2;\n\n\t\t\tv3.x = interpolate( pa.x, pb.x, pc.x, pd.x, weight, w2, w3 );\n\t\t\tv3.y = interpolate( pa.y, pb.y, pc.y, pd.y, weight, w2, w3 );\n\t\t\tv3.z = interpolate( pa.z, pb.z, pc.z, pd.z, weight, w2, w3 );\n\n\t\t\treturn v3;\n\n\t\t};\n\n\t\tthis.getControlPointsArray = function () {\n\n\t\t\tvar i, p, l = this.points.length,\n\t\t\t\tcoords = [];\n\n\t\t\tfor ( i = 0; i < l; i ++ ) {\n\n\t\t\t\tp = this.points[ i ];\n\t\t\t\tcoords[ i ] = [ p.x, p.y, p.z ];\n\n\t\t\t}\n\n\t\t\treturn coords;\n\n\t\t};\n\n\t\t// approximate length by summing linear segments\n\n\t\tthis.getLength = function ( nSubDivisions ) {\n\n\t\t\tvar i, index, nSamples, position,\n\t\t\t\tpoint = 0, intPoint = 0, oldIntPoint = 0,\n\t\t\t\toldPosition = new Vector3(),\n\t\t\t\ttmpVec = new Vector3(),\n\t\t\t\tchunkLengths = [],\n\t\t\t\ttotalLength = 0;\n\n\t\t\t// first point has 0 length\n\n\t\t\tchunkLengths[ 0 ] = 0;\n\n\t\t\tif ( ! nSubDivisions ) nSubDivisions = 100;\n\n\t\t\tnSamples = this.points.length * nSubDivisions;\n\n\t\t\toldPosition.copy( this.points[ 0 ] );\n\n\t\t\tfor ( i = 1; i < nSamples; i ++ ) {\n\n\t\t\t\tindex = i / nSamples;\n\n\t\t\t\tposition = this.getPoint( index );\n\t\t\t\ttmpVec.copy( position );\n\n\t\t\t\ttotalLength += tmpVec.distanceTo( oldPosition );\n\n\t\t\t\toldPosition.copy( position );\n\n\t\t\t\tpoint = ( this.points.length - 1 ) * index;\n\t\t\t\tintPoint = Math.floor( point );\n\n\t\t\t\tif ( intPoint !== oldIntPoint ) {\n\n\t\t\t\t\tchunkLengths[ intPoint ] = totalLength;\n\t\t\t\t\toldIntPoint = intPoint;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// last point ends with total length\n\n\t\t\tchunkLengths[ chunkLengths.length ] = totalLength;\n\n\t\t\treturn { chunks: chunkLengths, total: totalLength };\n\n\t\t};\n\n\t\tthis.reparametrizeByArcLength = function ( samplingCoef ) {\n\n\t\t\tvar i, j,\n\t\t\t\tindex, indexCurrent, indexNext,\n\t\t\t\trealDistance,\n\t\t\t\tsampling, position,\n\t\t\t\tnewpoints = [],\n\t\t\t\ttmpVec = new Vector3(),\n\t\t\t\tsl = this.getLength();\n\n\t\t\tnewpoints.push( tmpVec.copy( this.points[ 0 ] ).clone() );\n\n\t\t\tfor ( i = 1; i < this.points.length; i ++ ) {\n\n\t\t\t\t//tmpVec.copy( this.points[ i - 1 ] );\n\t\t\t\t//linearDistance = tmpVec.distanceTo( this.points[ i ] );\n\n\t\t\t\trealDistance = sl.chunks[ i ] - sl.chunks[ i - 1 ];\n\n\t\t\t\tsampling = Math.ceil( samplingCoef * realDistance / sl.total );\n\n\t\t\t\tindexCurrent = ( i - 1 ) / ( this.points.length - 1 );\n\t\t\t\tindexNext = i / ( this.points.length - 1 );\n\n\t\t\t\tfor ( j = 1; j < sampling - 1; j ++ ) {\n\n\t\t\t\t\tindex = indexCurrent + j * ( 1 / sampling ) * ( indexNext - indexCurrent );\n\n\t\t\t\t\tposition = this.getPoint( index );\n\t\t\t\t\tnewpoints.push( tmpVec.copy( position ).clone() );\n\n\t\t\t\t}\n\n\t\t\t\tnewpoints.push( tmpVec.copy( this.points[ i ] ).clone() );\n\n\t\t\t}\n\n\t\t\tthis.points = newpoints;\n\n\t\t};\n\n\t\t// Catmull-Rom\n\n\t\tfunction interpolate( p0, p1, p2, p3, t, t2, t3 ) {\n\n\t\t\tvar v0 = ( p2 - p0 ) * 0.5,\n\t\t\t\tv1 = ( p3 - p1 ) * 0.5;\n\n\t\t\treturn ( 2 * ( p1 - p2 ) + v0 + v1 ) * t3 + ( - 3 * ( p1 - p2 ) - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n\t *\n\t * The poles (phi) are at the positive and negative y axis.\n\t * The equator starts at positive z.\n\t */\n\n\tfunction Spherical( radius, phi, theta ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0;\n\t\tthis.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere\n\n\t\treturn this;\n\n\t}\n\n\tSpherical.prototype = {\n\n\t\tconstructor: Spherical,\n\n\t\tset: function ( radius, phi, theta ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.phi = phi;\n\t\t\tthis.theta = theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.phi = other.phi;\n\t\t\tthis.theta = other.theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\tmakeSafe: function() {\n\n\t\t\tvar EPS = 0.000001;\n\t\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = vec3.length();\n\n\t\t\tif ( this.radius === 0 ) {\n\n\t\t\t\tthis.theta = 0;\n\t\t\t\tthis.phi = 0;\n\n\t\t\t} else {\n\n\t\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis\n\t\t\t\tthis.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t};\n\n\t/**\r\n\t * @author alteredq / http://alteredqualia.com/\r\n\t */\r\n\r\n\tfunction MorphBlendMesh( geometry, material ) {\n\r\n\t\tMesh.call( this, geometry, material );\r\n\r\n\t\tthis.animationsMap = {};\r\n\t\tthis.animationsList = [];\r\n\r\n\t\t// prepare default animation\r\n\t\t// (all frames played together in 1 second)\r\n\r\n\t\tvar numFrames = this.geometry.morphTargets.length;\r\n\r\n\t\tvar name = \"__default\";\r\n\r\n\t\tvar startFrame = 0;\r\n\t\tvar endFrame = numFrames - 1;\r\n\r\n\t\tvar fps = numFrames / 1;\r\n\r\n\t\tthis.createAnimation( name, startFrame, endFrame, fps );\r\n\t\tthis.setAnimationWeight( name, 1 );\r\n\r\n\t}\r\n\r\n\tMorphBlendMesh.prototype = Object.create( Mesh.prototype );\r\n\tMorphBlendMesh.prototype.constructor = MorphBlendMesh;\r\n\r\n\tMorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) {\r\n\r\n\t\tvar animation = {\r\n\r\n\t\t\tstart: start,\r\n\t\t\tend: end,\r\n\r\n\t\t\tlength: end - start + 1,\r\n\r\n\t\t\tfps: fps,\r\n\t\t\tduration: ( end - start ) / fps,\r\n\r\n\t\t\tlastFrame: 0,\r\n\t\t\tcurrentFrame: 0,\r\n\r\n\t\t\tactive: false,\r\n\r\n\t\t\ttime: 0,\r\n\t\t\tdirection: 1,\r\n\t\t\tweight: 1,\r\n\r\n\t\t\tdirectionBackwards: false,\r\n\t\t\tmirroredLoop: false\r\n\r\n\t\t};\r\n\r\n\t\tthis.animationsMap[ name ] = animation;\r\n\t\tthis.animationsList.push( animation );\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) {\r\n\r\n\t\tvar pattern = /([a-z]+)_?(\\d+)/i;\r\n\r\n\t\tvar firstAnimation, frameRanges = {};\r\n\r\n\t\tvar geometry = this.geometry;\r\n\r\n\t\tfor ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar morph = geometry.morphTargets[ i ];\r\n\t\t\tvar chunks = morph.name.match( pattern );\r\n\r\n\t\t\tif ( chunks && chunks.length > 1 ) {\r\n\r\n\t\t\t\tvar name = chunks[ 1 ];\r\n\r\n\t\t\t\tif ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity };\r\n\r\n\t\t\t\tvar range = frameRanges[ name ];\r\n\r\n\t\t\t\tif ( i < range.start ) range.start = i;\r\n\t\t\t\tif ( i > range.end ) range.end = i;\r\n\r\n\t\t\t\tif ( ! firstAnimation ) firstAnimation = name;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var name in frameRanges ) {\r\n\r\n\t\t\tvar range = frameRanges[ name ];\r\n\t\t\tthis.createAnimation( name, range.start, range.end, fps );\r\n\r\n\t\t}\r\n\r\n\t\tthis.firstAnimation = firstAnimation;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = 1;\r\n\t\t\tanimation.directionBackwards = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.direction = - 1;\r\n\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.fps = fps;\r\n\t\t\tanimation.duration = ( animation.end - animation.start ) / animation.fps;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.duration = duration;\r\n\t\t\tanimation.fps = ( animation.end - animation.start ) / animation.duration;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.weight = weight;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.setAnimationTime = function ( name, time ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = time;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationTime = function ( name ) {\r\n\r\n\t\tvar time = 0;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\ttime = animation.time;\r\n\r\n\t\t}\r\n\r\n\t\treturn time;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.getAnimationDuration = function ( name ) {\r\n\r\n\t\tvar duration = - 1;\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tduration = animation.duration;\r\n\r\n\t\t}\r\n\r\n\t\treturn duration;\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.playAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.time = 0;\r\n\t\t\tanimation.active = true;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconsole.warn( \"THREE.MorphBlendMesh: animation[\" + name + \"] undefined in .playAnimation()\" );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.stopAnimation = function ( name ) {\r\n\r\n\t\tvar animation = this.animationsMap[ name ];\r\n\r\n\t\tif ( animation ) {\r\n\r\n\t\t\tanimation.active = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tMorphBlendMesh.prototype.update = function ( delta ) {\r\n\r\n\t\tfor ( var i = 0, il = this.animationsList.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar animation = this.animationsList[ i ];\r\n\r\n\t\t\tif ( ! animation.active ) continue;\r\n\r\n\t\t\tvar frameTime = animation.duration / animation.length;\r\n\r\n\t\t\tanimation.time += animation.direction * delta;\r\n\r\n\t\t\tif ( animation.mirroredLoop ) {\r\n\r\n\t\t\t\tif ( animation.time > animation.duration || animation.time < 0 ) {\r\n\r\n\t\t\t\t\tanimation.direction *= - 1;\r\n\r\n\t\t\t\t\tif ( animation.time > animation.duration ) {\r\n\r\n\t\t\t\t\t\tanimation.time = animation.duration;\r\n\t\t\t\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( animation.time < 0 ) {\r\n\r\n\t\t\t\t\t\tanimation.time = 0;\r\n\t\t\t\t\t\tanimation.directionBackwards = false;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tanimation.time = animation.time % animation.duration;\r\n\r\n\t\t\t\tif ( animation.time < 0 ) animation.time += animation.duration;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar keyframe = animation.start + _Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 );\r\n\t\t\tvar weight = animation.weight;\r\n\r\n\t\t\tif ( keyframe !== animation.currentFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = 0;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = 1 * weight;\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ keyframe ] = 0;\r\n\r\n\t\t\t\tanimation.lastFrame = animation.currentFrame;\r\n\t\t\t\tanimation.currentFrame = keyframe;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar mix = ( animation.time % frameTime ) / frameTime;\r\n\r\n\t\t\tif ( animation.directionBackwards ) mix = 1 - mix;\r\n\r\n\t\t\tif ( animation.currentFrame !== animation.lastFrame ) {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = mix * weight;\r\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = weight;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction ImmediateRenderObject( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.material = material;\n\t\tthis.render = function ( renderCallback ) {};\n\n\t}\n\n\tImmediateRenderObject.prototype = Object.create( Object3D.prototype );\n\tImmediateRenderObject.prototype.constructor = ImmediateRenderObject;\n\n\tImmediateRenderObject.prototype.isImmediateRenderObject = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction VertexNormalsHelper( object, size, hex, linewidth ) {\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xff0000;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( (objGeometry && objGeometry.isGeometry) ) {\n\n\t\t\tnNormals = objGeometry.faces.length * 3;\n\n\t\t} else if ( (objGeometry && objGeometry.isBufferGeometry) ) {\n\n\t\t\tnNormals = objGeometry.attributes.normal.count;\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32Attribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tVertexNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tVertexNormalsHelper.prototype.constructor = VertexNormalsHelper;\n\n\tVertexNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tif ( (objGeometry && objGeometry.isGeometry) ) {\n\n\t\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\t\tvar faces = objGeometry.faces;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar vertex = vertices[ face[ keys[ j ] ] ];\n\n\t\t\t\t\t\tvar normal = face.vertexNormals[ j ];\n\n\t\t\t\t\t\tv1.copy( vertex ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( (objGeometry && objGeometry.isBufferGeometry) ) {\n\n\t\t\t\tvar objPos = objGeometry.attributes.position;\n\n\t\t\t\tvar objNorm = objGeometry.attributes.normal;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\t// for simplicity, ignore index and drawcalls, and render every normal\n\n\t\t\t\tfor ( var j = 0, jl = objPos.count; j < jl; j ++ ) {\n\n\t\t\t\t\tv1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\tv2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) );\n\n\t\t\t\t\tv2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction SpotLightHelper( light ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = [\n\t\t\t0, 0, 0, 0, 0, 1,\n\t\t\t0, 0, 0, 1, 0, 1,\n\t\t\t0, 0, 0, - 1, 0, 1,\n\t\t\t0, 0, 0, 0, 1, 1,\n\t\t\t0, 0, 0, 0, - 1, 1\n\t\t];\n\n\t\tfor ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tvar p1 = ( i / l ) * Math.PI * 2;\n\t\t\tvar 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.addAttribute( 'position', new Float32Attribute( positions, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: 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\tSpotLightHelper.prototype = Object.create( Object3D.prototype );\n\tSpotLightHelper.prototype.constructor = SpotLightHelper;\n\n\tSpotLightHelper.prototype.dispose = function () {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t};\n\n\tSpotLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\t\tvar vector2 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tvar coneLength = this.light.distance ? this.light.distance : 1000;\n\t\t\tvar coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t\tvector.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\t\tthis.cone.lookAt( vector2.sub( vector ) );\n\n\t\t\tthis.cone.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author Sean Griffin / http://twitter.com/sgrif\n\t * @author Michael Guerrero / http://realitymeltdown.com\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction SkeletonHelper( object ) {\n\n\t\tthis.bones = this.getBoneList( object );\n\n\t\tvar geometry = new Geometry();\n\n\t\tfor ( var i = 0; i < this.bones.length; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( (bone.parent && bone.parent.isBone) ) {\n\n\t\t\t\tgeometry.vertices.push( new Vector3() );\n\t\t\t\tgeometry.vertices.push( new Vector3() );\n\t\t\t\tgeometry.colors.push( new Color( 0, 0, 1 ) );\n\t\t\t\tgeometry.colors.push( new Color( 0, 1, 0 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.dynamic = true;\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.root = object;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\n\tSkeletonHelper.prototype = Object.create( LineSegments.prototype );\n\tSkeletonHelper.prototype.constructor = SkeletonHelper;\n\n\tSkeletonHelper.prototype.getBoneList = function( object ) {\n\n\t\tvar boneList = [];\n\n\t\tif ( (object && object.isBone) ) {\n\n\t\t\tboneList.push( object );\n\n\t\t}\n\n\t\tfor ( var i = 0; i < object.children.length; i ++ ) {\n\n\t\t\tboneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) );\n\n\t\t}\n\n\t\treturn boneList;\n\n\t};\n\n\tSkeletonHelper.prototype.update = function () {\n\n\t\tvar geometry = this.geometry;\n\n\t\tvar matrixWorldInv = new Matrix4().getInverse( this.root.matrixWorld );\n\n\t\tvar boneMatrix = new Matrix4();\n\n\t\tvar j = 0;\n\n\t\tfor ( var i = 0; i < this.bones.length; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( (bone.parent && bone.parent.isBone) ) {\n\n\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );\n\t\t\t\tgeometry.vertices[ j ].setFromMatrixPosition( boneMatrix );\n\n\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\tgeometry.vertices[ j + 1 ].setFromMatrixPosition( boneMatrix );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.verticesNeedUpdate = true;\n\n\t\tgeometry.computeBoundingSphere();\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PointLightHelper( light, sphereSize ) {\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar geometry = new SphereBufferGeometry( sphereSize, 4, 2 );\n\t\tvar material = new MeshBasicMaterial( { wireframe: true, fog: false } );\n\t\tmaterial.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/*\n\t\tvar distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\t\tvar distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\t\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\t\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\t\tvar d = 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.scale.set( d, d, d );\n\n\t\t}\n\n\t\tthis.add( this.lightDistance );\n\t\t*/\n\n\t}\n\n\tPointLightHelper.prototype = Object.create( Mesh.prototype );\n\tPointLightHelper.prototype.constructor = PointLightHelper;\n\n\tPointLightHelper.prototype.dispose = function () {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t};\n\n\tPointLightHelper.prototype.update = function () {\n\n\t\tthis.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t/*\n\t\tvar 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\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction HemisphereLightHelper( light, sphereSize ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.colors = [ new Color(), new Color() ];\n\n\t\tvar geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tgeometry.rotateX( - Math.PI / 2 );\n\n\t\tfor ( var i = 0, il = 8; i < il; i ++ ) {\n\n\t\t\tgeometry.faces[ i ].color = this.colors[ i < 4 ? 0 : 1 ];\n\n\t\t}\n\n\t\tvar material = new MeshBasicMaterial( { vertexColors: FaceColors, wireframe: true } );\n\n\t\tthis.lightSphere = new Mesh( geometry, material );\n\t\tthis.add( this.lightSphere );\n\n\t\tthis.update();\n\n\t}\n\n\tHemisphereLightHelper.prototype = Object.create( Object3D.prototype );\n\tHemisphereLightHelper.prototype.constructor = HemisphereLightHelper;\n\n\tHemisphereLightHelper.prototype.dispose = function () {\n\n\t\tthis.lightSphere.geometry.dispose();\n\t\tthis.lightSphere.material.dispose();\n\n\t};\n\n\tHemisphereLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tthis.colors[ 0 ].copy( this.light.color ).multiplyScalar( this.light.intensity );\n\t\t\tthis.colors[ 1 ].copy( this.light.groundColor ).multiplyScalar( this.light.intensity );\n\n\t\t\tthis.lightSphere.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\t\t\tthis.lightSphere.geometry.colorsNeedUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction GridHelper( size, divisions, color1, color2 ) {\n\n\t\tdivisions = divisions || 1;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar center = divisions / 2;\n\t\tvar step = ( size * 2 ) / divisions;\n\t\tvar vertices = [], colors = [];\n\n\t\tfor ( var i = 0, j = 0, k = - size; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - size, 0, k, size, 0, k );\n\t\t\tvertices.push( k, 0, - size, k, 0, size );\n\n\t\t\tvar 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\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32Attribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32Attribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tGridHelper.prototype = Object.create( LineSegments.prototype );\n\tGridHelper.prototype.constructor = GridHelper;\n\n\tGridHelper.prototype.setColors = function () {\n\n\t\tconsole.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction FaceNormalsHelper( object, size, hex, linewidth ) {\n\n\t\t// FaceNormalsHelper only supports THREE.Geometry\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( (objGeometry && objGeometry.isGeometry) ) {\n\n\t\t\tnNormals = objGeometry.faces.length;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' );\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32Attribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\t\tthis.update();\n\n\t}\n\n\tFaceNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tFaceNormalsHelper.prototype.constructor = FaceNormalsHelper;\n\n\tFaceNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\tvar faces = objGeometry.faces;\n\n\t\t\tvar idx = 0;\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar normal = face.normal;\n\n\t\t\t\tv1.copy( vertices[ face.a ] )\n\t\t\t\t\t.add( vertices[ face.b ] )\n\t\t\t\t\t.add( vertices[ face.c ] )\n\t\t\t\t\t.divideScalar( 3 )\n\t\t\t\t\t.applyMatrix4( matrixWorld );\n\n\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction DirectionalLightHelper( light, size ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32Attribute( [\n\t\t\t- size, size, 0,\n\t\t\t size, size, 0,\n\t\t\t size, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.add( new Line( geometry, material ) );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32Attribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.add( new Line( geometry, material ));\n\n\t\tthis.update();\n\n\t}\n\n\tDirectionalLightHelper.prototype = Object.create( Object3D.prototype );\n\tDirectionalLightHelper.prototype.constructor = DirectionalLightHelper;\n\n\tDirectionalLightHelper.prototype.dispose = function () {\n\n\t\tvar lightPlane = this.children[ 0 ];\n\t\tvar targetLine = this.children[ 1 ];\n\n\t\tlightPlane.geometry.dispose();\n\t\tlightPlane.material.dispose();\n\t\ttargetLine.geometry.dispose();\n\t\ttargetLine.material.dispose();\n\n\t};\n\n\tDirectionalLightHelper.prototype.update = function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar v3 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tv1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tv2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t\tv3.subVectors( v2, v1 );\n\n\t\t\tvar lightPlane = this.children[ 0 ];\n\t\t\tvar targetLine = this.children[ 1 ];\n\n\t\t\tlightPlane.lookAt( v3 );\n\t\t\tlightPlane.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\ttargetLine.lookAt( v3 );\n\t\t\ttargetLine.scale.z = v3.length();\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t *\t- shows frustum, line of sight and up of the camera\n\t *\t- suitable for fast updates\n\t * \t- based on frustum visualization in lightgl.js shadowmap example\n\t *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\n\t */\n\n\tfunction CameraHelper( camera ) {\n\n\t\tvar geometry = new Geometry();\n\t\tvar material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } );\n\n\t\tvar pointMap = {};\n\n\t\t// colors\n\n\t\tvar hexFrustum = 0xffaa00;\n\t\tvar hexCone = 0xff0000;\n\t\tvar hexUp = 0x00aaff;\n\t\tvar hexTarget = 0xffffff;\n\t\tvar hexCross = 0x333333;\n\n\t\t// near\n\n\t\taddLine( \"n1\", \"n2\", hexFrustum );\n\t\taddLine( \"n2\", \"n4\", hexFrustum );\n\t\taddLine( \"n4\", \"n3\", hexFrustum );\n\t\taddLine( \"n3\", \"n1\", hexFrustum );\n\n\t\t// far\n\n\t\taddLine( \"f1\", \"f2\", hexFrustum );\n\t\taddLine( \"f2\", \"f4\", hexFrustum );\n\t\taddLine( \"f4\", \"f3\", hexFrustum );\n\t\taddLine( \"f3\", \"f1\", hexFrustum );\n\n\t\t// sides\n\n\t\taddLine( \"n1\", \"f1\", hexFrustum );\n\t\taddLine( \"n2\", \"f2\", hexFrustum );\n\t\taddLine( \"n3\", \"f3\", hexFrustum );\n\t\taddLine( \"n4\", \"f4\", hexFrustum );\n\n\t\t// cone\n\n\t\taddLine( \"p\", \"n1\", hexCone );\n\t\taddLine( \"p\", \"n2\", hexCone );\n\t\taddLine( \"p\", \"n3\", hexCone );\n\t\taddLine( \"p\", \"n4\", hexCone );\n\n\t\t// up\n\n\t\taddLine( \"u1\", \"u2\", hexUp );\n\t\taddLine( \"u2\", \"u3\", hexUp );\n\t\taddLine( \"u3\", \"u1\", hexUp );\n\n\t\t// target\n\n\t\taddLine( \"c\", \"t\", hexTarget );\n\t\taddLine( \"p\", \"c\", hexCross );\n\n\t\t// cross\n\n\t\taddLine( \"cn1\", \"cn2\", hexCross );\n\t\taddLine( \"cn3\", \"cn4\", hexCross );\n\n\t\taddLine( \"cf1\", \"cf2\", hexCross );\n\t\taddLine( \"cf3\", \"cf4\", hexCross );\n\n\t\tfunction addLine( a, b, hex ) {\n\n\t\t\taddPoint( a, hex );\n\t\t\taddPoint( b, hex );\n\n\t\t}\n\n\t\tfunction addPoint( id, hex ) {\n\n\t\t\tgeometry.vertices.push( new Vector3() );\n\t\t\tgeometry.colors.push( new Color( hex ) );\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( geometry.vertices.length - 1 );\n\n\t\t}\n\n\t\tLineSegments.call( this, geometry, material );\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}\n\n\tCameraHelper.prototype = Object.create( LineSegments.prototype );\n\tCameraHelper.prototype.constructor = CameraHelper;\n\n\tCameraHelper.prototype.update = function () {\n\n\t\tvar geometry, pointMap;\n\n\t\tvar vector = new Vector3();\n\t\tvar camera = new Camera();\n\n\t\tfunction setPoint( point, x, y, z ) {\n\n\t\t\tvector.set( x, y, z ).unproject( camera );\n\n\t\t\tvar points = pointMap[ point ];\n\n\t\t\tif ( points !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\t\tgeometry.vertices[ points[ i ] ].copy( vector );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn function update() {\n\n\t\t\tgeometry = this.geometry;\n\t\t\tpointMap = this.pointMap;\n\n\t\t\tvar w = 1, h = 1;\n\n\t\t\t// we need just camera projection matrix\n\t\t\t// world matrix must be identity\n\n\t\t\tcamera.projectionMatrix.copy( this.camera.projectionMatrix );\n\n\t\t\t// center / target\n\n\t\t\tsetPoint( \"c\", 0, 0, - 1 );\n\t\t\tsetPoint( \"t\", 0, 0, 1 );\n\n\t\t\t// near\n\n\t\t\tsetPoint( \"n1\", - w, - h, - 1 );\n\t\t\tsetPoint( \"n2\", w, - h, - 1 );\n\t\t\tsetPoint( \"n3\", - w, h, - 1 );\n\t\t\tsetPoint( \"n4\", w, h, - 1 );\n\n\t\t\t// far\n\n\t\t\tsetPoint( \"f1\", - w, - h, 1 );\n\t\t\tsetPoint( \"f2\", w, - h, 1 );\n\t\t\tsetPoint( \"f3\", - w, h, 1 );\n\t\t\tsetPoint( \"f4\", w, h, 1 );\n\n\t\t\t// up\n\n\t\t\tsetPoint( \"u1\", w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u2\", - w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u3\", 0, h * 2, - 1 );\n\n\t\t\t// cross\n\n\t\t\tsetPoint( \"cf1\", - w, 0, 1 );\n\t\t\tsetPoint( \"cf2\", w, 0, 1 );\n\t\t\tsetPoint( \"cf3\", 0, - h, 1 );\n\t\t\tsetPoint( \"cf4\", 0, h, 1 );\n\n\t\t\tsetPoint( \"cn1\", - w, 0, - 1 );\n\t\t\tsetPoint( \"cn2\", w, 0, - 1 );\n\t\t\tsetPoint( \"cn3\", 0, - h, - 1 );\n\t\t\tsetPoint( \"cn4\", 0, h, - 1 );\n\n\t\t\tgeometry.verticesNeedUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\t// a helper to show the world-axis-aligned bounding box for an object\n\n\tfunction BoundingBoxHelper( object, hex ) {\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0x888888;\n\n\t\tthis.object = object;\n\n\t\tthis.box = new Box3();\n\n\t\tMesh.call( this, new BoxGeometry( 1, 1, 1 ), new MeshBasicMaterial( { color: color, wireframe: true } ) );\n\n\t}\n\n\tBoundingBoxHelper.prototype = Object.create( Mesh.prototype );\n\tBoundingBoxHelper.prototype.constructor = BoundingBoxHelper;\n\n\tBoundingBoxHelper.prototype.update = function () {\n\n\t\tthis.box.setFromObject( this.object );\n\n\t\tthis.box.getSize( this.scale );\n\n\t\tthis.box.getCenter( this.position );\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BoxHelper( object, color ) {\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\n\t\tvar indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\t\tvar positions = new Float32Array( 8 * 3 );\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tthis.update( object );\n\n\t\t}\n\n\t}\n\n\tBoxHelper.prototype = Object.create( LineSegments.prototype );\n\tBoxHelper.prototype.constructor = BoxHelper;\n\n\tBoxHelper.prototype.update = ( function () {\n\n\t\tvar box = new Box3();\n\n\t\treturn function update( object ) {\n\n\t\t\tif ( (object && object.isBox3) ) {\n\n\t\t\t\tbox.copy( object );\n\n\t\t\t} else {\n\n\t\t\t\tbox.setFromObject( object );\n\n\t\t\t}\n\n\t\t\tif ( box.isEmpty() ) return;\n\n\t\t\tvar min = box.min;\n\t\t\tvar max = box.max;\n\n\t\t\t/*\n\t\t\t 5____4\n\t\t\t1/___0/|\n\t\t\t| 6__|_7\n\t\t\t2/___3/\n\n\t\t\t0: max.x, max.y, max.z\n\t\t\t1: min.x, max.y, max.z\n\t\t\t2: min.x, min.y, max.z\n\t\t\t3: max.x, min.y, max.z\n\t\t\t4: max.x, max.y, min.z\n\t\t\t5: min.x, max.y, min.z\n\t\t\t6: min.x, min.y, min.z\n\t\t\t7: max.x, min.y, min.z\n\t\t\t*/\n\n\t\t\tvar position = this.geometry.attributes.position;\n\t\t\tvar array = position.array;\n\n\t\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\tthis.geometry.computeBoundingSphere();\n\n\t\t};\n\n\t} )();\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author zz85 / http://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t *\n\t * Creates an arrow for visualizing directions\n\t *\n\t * Parameters:\n\t * dir - Vector3\n\t * origin - Vector3\n\t * length - Number\n\t * color - color in hex value\n\t * headLength - Number\n\t * headWidth - Number\n\t */\n\n\tvar lineGeometry = new BufferGeometry();\n\tlineGeometry.addAttribute( 'position', new Float32Attribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\tvar coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );\n\tconeGeometry.translate( 0, - 0.5, 0 );\n\n\tfunction ArrowHelper( dir, origin, length, color, headLength, headWidth ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tObject3D.call( this );\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\t\tif ( length === undefined ) length = 1;\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) );\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\tArrowHelper.prototype = Object.create( Object3D.prototype );\n\tArrowHelper.prototype.constructor = ArrowHelper;\n\n\tArrowHelper.prototype.setDirection = ( function () {\n\n\t\tvar axis = new Vector3();\n\t\tvar radians;\n\n\t\treturn function setDirection( dir ) {\n\n\t\t\t// dir is assumed to be normalized\n\n\t\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\taxis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\t\tradians = Math.acos( dir.y );\n\n\t\t\t\tthis.quaternion.setFromAxisAngle( axis, radians );\n\n\t\t\t}\n\n\t\t};\n\n\t}() );\n\n\tArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {\n\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tthis.line.scale.set( 1, Math.max( 0, length - headLength ), 1 );\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\tArrowHelper.prototype.setColor = function ( color ) {\n\n\t\tthis.line.material.color.copy( color );\n\t\tthis.cone.material.color.copy( color );\n\n\t};\n\n\t/**\n\t * @author sroucheray / http://sroucheray.org/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AxisHelper( size ) {\n\n\t\tsize = size || 1;\n\n\t\tvar vertices = new Float32Array( [\n\t\t\t0, 0, 0, size, 0, 0,\n\t\t\t0, 0, 0, 0, size, 0,\n\t\t\t0, 0, 0, 0, 0, size\n\t\t] );\n\n\t\tvar colors = new Float32Array( [\n\t\t\t1, 0, 0, 1, 0.6, 0,\n\t\t\t0, 1, 0, 0.6, 1, 0,\n\t\t\t0, 0, 1, 0, 0.6, 1\n\t\t] );\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tAxisHelper.prototype = Object.create( LineSegments.prototype );\n\tAxisHelper.prototype.constructor = AxisHelper;\n\n\t/**\n\t * @author zz85 https://github.com/zz85\n\t *\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t * cusps and self-intersections in non-uniform catmull rom curves.\n\t * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t *\n\t * curve.type accepts centripetal(default), chordal and catmullrom\n\t * curve.tension is used for catmullrom which defaults to 0.5\n\t */\n\n\tvar CatmullRomCurve3 = ( function() {\n\n\t\tvar\n\t\t\ttmp = new Vector3(),\n\t\t\tpx = new CubicPoly(),\n\t\t\tpy = new CubicPoly(),\n\t\t\tpz = new CubicPoly();\n\n\t\t/*\n\t\tBased on an optimized c++ solution in\n\t\t - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t\t - http://ideone.com/NoEbVM\n\n\t\tThis CubicPoly class could be used for reusing some variables and calculations,\n\t\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\t\twhich can be placed in CurveUtils.\n\t\t*/\n\n\t\tfunction CubicPoly() {}\n\n\t\t/*\n\t\t * Compute coefficients for a cubic polynomial\n\t\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t\t * such that\n\t\t * p(0) = x0, p(1) = x1\n\t\t * and\n\t\t * p'(0) = t0, p'(1) = t1.\n\t\t */\n\t\tCubicPoly.prototype.init = function( x0, x1, t0, t1 ) {\n\n\t\t\tthis.c0 = x0;\n\t\t\tthis.c1 = t0;\n\t\t\tthis.c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\t\tthis.c3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t\t};\n\n\t\tCubicPoly.prototype.initNonuniformCatmullRom = function( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tvar t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tvar t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\t// initCubicPoly\n\t\t\tthis.init( x1, x2, t1, t2 );\n\n\t\t};\n\n\t\t// standard Catmull-Rom spline: interpolate between x1 and x2 with previous/following points x1/x4\n\t\tCubicPoly.prototype.initCatmullRom = function( x0, x1, x2, x3, tension ) {\n\n\t\t\tthis.init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t};\n\n\t\tCubicPoly.prototype.calc = function( t ) {\n\n\t\t\tvar t2 = t * t;\n\t\t\tvar t3 = t2 * t;\n\t\t\treturn this.c0 + this.c1 * t + this.c2 * t2 + this.c3 * t3;\n\n\t\t};\n\n\t\t// Subclass Three.js curve\n\t\treturn Curve.create(\n\n\t\t\tfunction ( p /* array of Vector3 */ ) {\n\n\t\t\t\tthis.points = p || [];\n\t\t\t\tthis.closed = false;\n\n\t\t\t},\n\n\t\t\tfunction ( t ) {\n\n\t\t\t\tvar points = this.points,\n\t\t\t\t\tpoint, intPoint, weight, l;\n\n\t\t\t\tl = points.length;\n\n\t\t\t\tif ( l < 2 ) console.log( 'duh, you need at least 2 points' );\n\n\t\t\t\tpoint = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\t\t\tintPoint = Math.floor( point );\n\t\t\t\tweight = point - intPoint;\n\n\t\t\t\tif ( this.closed ) {\n\n\t\t\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length;\n\n\t\t\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\t\t\tintPoint = l - 2;\n\t\t\t\t\tweight = 1;\n\n\t\t\t\t}\n\n\t\t\t\tvar p0, p1, p2, p3; // 4 points\n\n\t\t\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// extrapolate first point\n\t\t\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\t\t\tp0 = tmp;\n\n\t\t\t\t}\n\n\t\t\t\tp1 = points[ intPoint % l ];\n\t\t\t\tp2 = points[ ( intPoint + 1 ) % l ];\n\n\t\t\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// extrapolate last point\n\t\t\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\t\t\tp3 = tmp;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) {\n\n\t\t\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\t\t\tvar pow = this.type === 'chordal' ? 0.5 : 0.25;\n\t\t\t\t\tvar dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\t\t\tvar dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\t\t\tvar dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t\t\t// safety check for repeated points\n\t\t\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t\t\t} else if ( this.type === 'catmullrom' ) {\n\n\t\t\t\t\tvar tension = this.tension !== undefined ? this.tension : 0.5;\n\t\t\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension );\n\t\t\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension );\n\t\t\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension );\n\n\t\t\t\t}\n\n\t\t\t\tvar v = new Vector3(\n\t\t\t\t\tpx.calc( weight ),\n\t\t\t\t\tpy.calc( weight ),\n\t\t\t\t\tpz.calc( weight )\n\t\t\t\t);\n\n\t\t\t\treturn v;\n\n\t\t\t}\n\n\t\t);\n\n\t} )();\n\n\t/**************************************************************\n\t *\tClosed Spline 3D curve\n\t **************************************************************/\n\n\n\tfunction ClosedSplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Please use THREE.CatmullRomCurve3.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\t\tthis.closed = true;\n\n\t}\n\n\tClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t/**************************************************************\n\t *\tSpline 3D curve\n\t **************************************************************/\n\n\n\tvar SplineCurve3 = Curve.create(\n\n\t\tfunction ( points /* array of Vector3 */ ) {\n\n\t\t\tconsole.warn( 'THREE.SplineCurve3 will be deprecated. Please use THREE.CatmullRomCurve3' );\n\t\t\tthis.points = ( points === undefined ) ? [] : points;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tvar points = this.points;\n\t\t\tvar point = ( points.length - 1 ) * t;\n\n\t\t\tvar intPoint = Math.floor( point );\n\t\t\tvar weight = point - intPoint;\n\n\t\t\tvar point0 = points[ intPoint == 0 ? intPoint : intPoint - 1 ];\n\t\t\tvar point1 = points[ intPoint ];\n\t\t\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\t\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\t\tvar interpolate = CurveUtils.interpolate;\n\n\t\t\treturn new Vector3(\n\t\t\t\tinterpolate( point0.x, point1.x, point2.x, point3.x, weight ),\n\t\t\t\tinterpolate( point0.y, point1.y, point2.y, point3.y, weight ),\n\t\t\t\tinterpolate( point0.z, point1.z, point2.z, point3.z, weight )\n\t\t\t);\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tCubic Bezier 3D curve\n\t **************************************************************/\n\n\tvar CubicBezierCurve3 = Curve.create(\n\n\t\tfunction ( v0, v1, v2, v3 ) {\n\n\t\t\tthis.v0 = v0;\n\t\t\tthis.v1 = v1;\n\t\t\tthis.v2 = v2;\n\t\t\tthis.v3 = v3;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tvar b3 = ShapeUtils.b3;\n\n\t\t\treturn new Vector3(\n\t\t\t\tb3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ),\n\t\t\t\tb3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ),\n\t\t\t\tb3( t, this.v0.z, this.v1.z, this.v2.z, this.v3.z )\n\t\t\t);\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tQuadratic Bezier 3D curve\n\t **************************************************************/\n\n\tvar QuadraticBezierCurve3 = Curve.create(\n\n\t\tfunction ( v0, v1, v2 ) {\n\n\t\t\tthis.v0 = v0;\n\t\t\tthis.v1 = v1;\n\t\t\tthis.v2 = v2;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tvar b2 = ShapeUtils.b2;\n\n\t\t\treturn new Vector3(\n\t\t\t\tb2( t, this.v0.x, this.v1.x, this.v2.x ),\n\t\t\t\tb2( t, this.v0.y, this.v1.y, this.v2.y ),\n\t\t\t\tb2( t, this.v0.z, this.v1.z, this.v2.z )\n\t\t\t);\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tLine3D\n\t **************************************************************/\n\n\tvar LineCurve3 = Curve.create(\n\n\t\tfunction ( v1, v2 ) {\n\n\t\t\tthis.v1 = v1;\n\t\t\tthis.v2 = v2;\n\n\t\t},\n\n\t\tfunction ( t ) {\n\n\t\t\tif ( t === 1 ) {\n\n\t\t\t\treturn this.v2.clone();\n\n\t\t\t}\n\n\t\t\tvar vector = new Vector3();\n\n\t\t\tvector.subVectors( this.v2, this.v1 ); // diff\n\t\t\tvector.multiplyScalar( t );\n\t\t\tvector.add( this.v1 );\n\n\t\t\treturn vector;\n\n\t\t}\n\n\t);\n\n\t/**************************************************************\n\t *\tArc curve\n\t **************************************************************/\n\n\tfunction ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tEllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t}\n\n\tArcCurve.prototype = Object.create( EllipseCurve.prototype );\n\tArcCurve.prototype.constructor = ArcCurve;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar SceneUtils = {\n\n\t\tcreateMultiMaterialObject: function ( geometry, materials ) {\n\n\t\t\tvar group = new Group();\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tgroup.add( new Mesh( geometry, materials[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t},\n\n\t\tdetach: function ( child, parent, scene ) {\n\n\t\t\tchild.applyMatrix( parent.matrixWorld );\n\t\t\tparent.remove( child );\n\t\t\tscene.add( child );\n\n\t\t},\n\n\t\tattach: function ( child, scene, parent ) {\n\n\t\t\tvar matrixWorldInverse = new Matrix4();\n\t\t\tmatrixWorldInverse.getInverse( parent.matrixWorld );\n\t\t\tchild.applyMatrix( matrixWorldInverse );\n\n\t\t\tscene.remove( child );\n\t\t\tparent.add( child );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Face4 ( a, b, c, d, normal, color, materialIndex ) {\n\t\tconsole.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' );\n\t\treturn new Face3( a, b, c, normal, color, materialIndex );\n\t}\n\n\tvar LineStrip = 0;\n\n\tvar LinePieces = 1;\n\n\tfunction PointCloud ( geometry, material ) {\n\t\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\t}\n\n\tfunction ParticleSystem ( geometry, material ) {\n\t\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\t}\n\n\tfunction PointCloudMaterial ( parameters ) {\n\t\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\t}\n\n\tfunction ParticleBasicMaterial ( parameters ) {\n\t\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\t}\n\n\tfunction ParticleSystemMaterial ( parameters ) {\n\t\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\t}\n\n\tfunction Vertex ( x, y, z ) {\n\t\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\n\t\treturn new Vector3( x, y, z );\n\t}\n\n\t//\n\n\tfunction EdgesHelper( object, hex ) {\n\t\tconsole.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );\n\t\treturn new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\t}\n\n\tfunction WireframeHelper( object, hex ) {\n\t\tconsole.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );\n\t\treturn new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\t}\n\n\t//\n\n\tObject.assign( Box2.prototype, {\n\t\tcenter: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\t\t},\n\t\tempty: function () {\n\t\t\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\t\t\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\t\t}\n\t} );\n\n\tObject.assign( Box3.prototype, {\n\t\tcenter: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\t\t},\n\t\tempty: function () {\n\t\t\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\t\t}\n\t} );\n\n\tObject.assign( Line3.prototype, {\n\t\tcenter: function ( optionalTarget ) {\n\t\t\tconsole.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\t\t}\n\t} );\n\n\tObject.assign( Matrix3.prototype, {\n\t\tmultiplyVector3: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix3( this );\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\t\t}\n\t} );\n\n\tObject.assign( Matrix4.prototype, {\n\t\textractPosition: function ( m ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\n\t\t\treturn this.copyPosition( m );\n\t\t},\n\t\tsetRotationFromQuaternion: function ( q ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\n\t\t\treturn this.makeRotationFromQuaternion( q );\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.' );\n\t\t\treturn vector.applyProjection( this );\n\t\t},\n\t\tmultiplyVector4: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' );\n\t\t\treturn this.applyToVector3Array( a );\n\t\t},\n\t\trotateAxis: function ( v ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\n\t\t\tv.transformDirection( this );\n\t\t},\n\t\tcrossVector: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\t\t},\n\t\ttranslate: function ( v ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\n\t\t},\n\t\trotateX: function ( angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\n\t\t},\n\t\trotateY: function ( angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\n\t\t},\n\t\trotateZ: function ( angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\n\t\t},\n\t\trotateByAxis: function ( axis, angle ) {\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\n\t\t}\n\t} );\n\n\tObject.assign( Plane.prototype, {\n\t\tisIntersectionLine: function ( line ) {\n\t\t\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\n\t\t\treturn this.intersectsLine( line );\n\t\t}\n\t} );\n\n\tObject.assign( Quaternion.prototype, {\n\t\tmultiplyVector3: function ( vector ) {\n\t\t\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\n\t\t\treturn vector.applyQuaternion( this );\n\t\t}\n\t} );\n\n\tObject.assign( Ray.prototype, {\n\t\tisIntersectionBox: function ( box ) {\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\t\t},\n\t\tisIntersectionPlane: function ( plane ) {\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\n\t\t\treturn this.intersectsPlane( plane );\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\t\t}\n\t} );\n\n\tObject.assign( Shape.prototype, {\n\t\textrude: function ( options ) {\n\t\t\tconsole.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );\n\t\t\treturn new ExtrudeGeometry( this, options );\n\t\t},\n\t\tmakeGeometry: function ( options ) {\n\t\t\tconsole.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );\n\t\t\treturn new ShapeGeometry( this, options );\n\t\t}\n\t} );\n\n\tObject.assign( Vector3.prototype, {\n\t\tsetEulerFromRotationMatrix: function () {\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\n\t\t},\n\t\tsetEulerFromQuaternion: function () {\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\n\t\t},\n\t\tgetPositionFromMatrix: function ( m ) {\n\t\t\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\n\t\t\treturn this.setFromMatrixPosition( m );\n\t\t},\n\t\tgetScaleFromMatrix: function ( m ) {\n\t\t\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\n\t\t\treturn this.setFromMatrixScale( m );\n\t\t},\n\t\tgetColumnFromMatrix: function ( index, matrix ) {\n\t\t\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\n\t\t\treturn this.setFromMatrixColumn( matrix, index );\n\t\t}\n\t} );\n\n\t//\n\n\tObject.assign( Object3D.prototype, {\n\t\tgetChildByName: function ( name ) {\n\t\t\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\n\t\t\treturn this.getObjectByName( name );\n\t\t},\n\t\trenderDepth: function ( value ) {\n\t\t\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\n\t\t},\n\t\ttranslate: function ( distance, axis ) {\n\t\t\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\n\t\t\treturn this.translateOnAxis( axis, distance );\n\t\t}\n\t} );\n\n\tObject.defineProperties( Object3D.prototype, {\n\t\teulerOrder: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\treturn this.rotation.order;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\tthis.rotation.order = value;\n\t\t\t}\n\t\t},\n\t\tuseQuaternion: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( LOD.prototype, {\n\t\tobjects: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.LOD: .objects has been renamed to .levels.' );\n\t\t\t\treturn this.levels;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tPerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {\n\n\t\tconsole.warn( \"THREE.PerspectiveCamera.setLens is deprecated. \" +\n\t\t\t\t\"Use .setFocalLength and .filmGauge for a photographic setup.\" );\n\n\t\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\n\t\tthis.setFocalLength( focalLength );\n\n\t};\n\n\t//\n\n\tObject.defineProperties( Light.prototype, {\n\t\tonlyShadow: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\n\t\t\t}\n\t\t},\n\t\tshadowCameraFov: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\n\t\t\t\tthis.shadow.camera.fov = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraLeft: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\n\t\t\t\tthis.shadow.camera.left = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraRight: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\n\t\t\t\tthis.shadow.camera.right = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraTop: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\n\t\t\t\tthis.shadow.camera.top = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraBottom: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\n\t\t\t\tthis.shadow.camera.bottom = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraNear: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\n\t\t\t\tthis.shadow.camera.near = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraFar: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\n\t\t\t\tthis.shadow.camera.far = value;\n\t\t\t}\n\t\t},\n\t\tshadowCameraVisible: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\n\t\t\t}\n\t\t},\n\t\tshadowBias: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\n\t\t\t\tthis.shadow.bias = value;\n\t\t\t}\n\t\t},\n\t\tshadowDarkness: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\n\t\t\t}\n\t\t},\n\t\tshadowMapWidth: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\n\t\t\t\tthis.shadow.mapSize.width = value;\n\t\t\t}\n\t\t},\n\t\tshadowMapHeight: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\n\t\t\t\tthis.shadow.mapSize.height = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( BufferAttribute.prototype, {\n\t\tlength: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Please use .count.' );\n\t\t\t\treturn this.array.length;\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.assign( BufferGeometry.prototype, {\n\t\taddIndex: function ( index ) {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\n\t\t\tthis.setIndex( index );\n\t\t},\n\t\taddDrawCall: function ( start, count, indexOffset ) {\n\t\t\tif ( indexOffset !== undefined ) {\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\n\t\t\t}\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\n\t\t\tthis.addGroup( start, count );\n\t\t},\n\t\tclearDrawCalls: function () {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\n\t\t\tthis.clearGroups();\n\t\t},\n\t\tcomputeTangents: function () {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );\n\t\t},\n\t\tcomputeOffsets: function () {\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\n\t\t}\n\t} );\n\n\tObject.defineProperties( BufferGeometry.prototype, {\n\t\tdrawcalls: {\n\t\t\tget: function () {\n\t\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\t\t\t}\n\t\t},\n\t\toffsets: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( Material.prototype, {\n\t\twrapAround: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapAround has been removed.' );\n\t\t\t}\n\t\t},\n\t\twrapRGB: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .wrapRGB has been removed.' );\n\t\t\t\treturn new Color();\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( MeshPhongMaterial.prototype, {\n\t\tmetal: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( ShaderMaterial.prototype, {\n\t\tderivatives: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\treturn this.extensions.derivatives;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\tthis.extensions.derivatives = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tEventDispatcher.prototype = Object.assign( Object.create( {\n\n\t\t// Note: Extra base ensures these properties are not 'assign'ed.\n\n\t\tconstructor: EventDispatcher,\n\n\t\tapply: function ( target ) {\n\n\t\t\tconsole.warn( \"THREE.EventDispatcher: .apply is deprecated, \" +\n\t\t\t\t\t\"just inherit or Object.assign the prototype to mix-in.\" );\n\n\t\t\tObject.assign( target, this );\n\n\t\t}\n\n\t} ), EventDispatcher.prototype );\n\n\t//\n\n\tObject.defineProperties( Uniform.prototype, {\n\t\tdynamic: {\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );\n\t\t\t}\n\t\t},\n\t\tonUpdate: {\n\t\t\tvalue: function () {\n\t\t\t\tconsole.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.assign( WebGLRenderer.prototype, {\n\t\tsupportsFloatTextures: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_float' );\n\t\t},\n\t\tsupportsHalfFloatTextures: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_half_float' );\n\t\t},\n\t\tsupportsStandardDerivatives: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_standard_derivatives' );\n\t\t},\n\t\tsupportsCompressedTextureS3TC: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\t\t},\n\t\tsupportsCompressedTexturePVRTC: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\t\t},\n\t\tsupportsBlendMinMax: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\n\t\t\treturn this.extensions.get( 'EXT_blend_minmax' );\n\t\t},\n\t\tsupportsVertexTextures: function () {\n\t\t\treturn this.capabilities.vertexTextures;\n\t\t},\n\t\tsupportsInstancedArrays: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\n\t\t\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\n\t\t},\n\t\tenableScissorTest: function ( boolean ) {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\n\t\t\tthis.setScissorTest( boolean );\n\t\t},\n\t\tinitMaterial: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\n\t\t},\n\t\taddPrePlugin: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\n\t\t},\n\t\taddPostPlugin: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\n\t\t},\n\t\tupdateShadowMap: function () {\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\n\t\t}\n\t} );\n\n\tObject.defineProperties( WebGLRenderer.prototype, {\n\t\tshadowMapEnabled: {\n\t\t\tget: function () {\n\t\t\t\treturn this.shadowMap.enabled;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\n\t\t\t\tthis.shadowMap.enabled = value;\n\t\t\t}\n\t\t},\n\t\tshadowMapType: {\n\t\t\tget: function () {\n\t\t\t\treturn this.shadowMap.type;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\n\t\t\t\tthis.shadowMap.type = value;\n\t\t\t}\n\t\t},\n\t\tshadowMapCullFace: {\n\t\t\tget: function () {\n\t\t\t\treturn this.shadowMap.cullFace;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' );\n\t\t\t\tthis.shadowMap.cullFace = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( WebGLShadowMap.prototype, {\n\t\tcullFace: {\n\t\t\tget: function () {\n\t\t\t\treturn this.renderReverseSided ? CullFaceFront : CullFaceBack;\n\t\t\t},\n\t\t\tset: function ( cullFace ) {\n\t\t\t\tvar value = ( cullFace !== CullFaceBack );\n\t\t\t\tconsole.warn( \"WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to \" + value + \".\" );\n\t\t\t\tthis.renderReverseSided = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( WebGLRenderTarget.prototype, {\n\t\twrapS: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\treturn this.texture.wrapS;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\tthis.texture.wrapS = value;\n\t\t\t}\n\t\t},\n\t\twrapT: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\treturn this.texture.wrapT;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\tthis.texture.wrapT = value;\n\t\t\t}\n\t\t},\n\t\tmagFilter: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\treturn this.texture.magFilter;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\tthis.texture.magFilter = value;\n\t\t\t}\n\t\t},\n\t\tminFilter: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\treturn this.texture.minFilter;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\tthis.texture.minFilter = value;\n\t\t\t}\n\t\t},\n\t\tanisotropy: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\treturn this.texture.anisotropy;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\tthis.texture.anisotropy = value;\n\t\t\t}\n\t\t},\n\t\toffset: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\treturn this.texture.offset;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\tthis.texture.offset = value;\n\t\t\t}\n\t\t},\n\t\trepeat: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\treturn this.texture.repeat;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\tthis.texture.repeat = value;\n\t\t\t}\n\t\t},\n\t\tformat: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\treturn this.texture.format;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\tthis.texture.format = value;\n\t\t\t}\n\t\t},\n\t\ttype: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\treturn this.texture.type;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\tthis.texture.type = value;\n\t\t\t}\n\t\t},\n\t\tgenerateMipmaps: {\n\t\t\tget: function () {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\treturn this.texture.generateMipmaps;\n\t\t\t},\n\t\t\tset: function ( value ) {\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\tthis.texture.generateMipmaps = value;\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.assign( Audio.prototype, {\n\t\tload: function ( file ) {\n\t\t\tconsole.warn( 'THREE.Audio: .load has been deprecated. Please use THREE.AudioLoader.' );\n\t\t\tvar scope = this;\n\t\t\tvar audioLoader = new AudioLoader();\n\t\t\taudioLoader.load( file, function ( buffer ) {\n\t\t\t\tscope.setBuffer( buffer );\n\t\t\t} );\n\t\t\treturn this;\n\t\t}\n\t} );\n\n\tObject.assign( AudioAnalyser.prototype, {\n\t\tgetData: function ( file ) {\n\t\t\tconsole.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );\n\t\t\treturn this.getFrequencyData();\n\t\t}\n\t} );\n\n\t//\n\n\tvar GeometryUtils = {\n\n\t\tmerge: function ( geometry1, geometry2, materialIndexOffset ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );\n\n\t\t\tvar matrix;\n\n\t\t\tif ( geometry2.isMesh ) {\n\n\t\t\t\tgeometry2.matrixAutoUpdate && geometry2.updateMatrix();\n\n\t\t\t\tmatrix = geometry2.matrix;\n\t\t\t\tgeometry2 = geometry2.geometry;\n\n\t\t\t}\n\n\t\t\tgeometry1.merge( geometry2, matrix, materialIndexOffset );\n\n\t\t},\n\n\t\tcenter: function ( geometry ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );\n\t\t\treturn geometry.center();\n\n\t\t}\n\n\t};\n\n\tvar ImageUtils = {\n\n\t\tcrossOrigin: undefined,\n\n\t\tloadTexture: function ( url, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\n\n\t\t\tvar loader = new TextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( url, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadTextureCube: function ( urls, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\n\n\t\t\tvar loader = new CubeTextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( urls, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadCompressedTexture: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t},\n\n\t\tloadCompressedTextureCube: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Projector () {\n\n\t\tconsole.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' );\n\n\t\tthis.projectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .projectVector() is now vector.project().' );\n\t\t\tvector.project( camera );\n\n\t\t};\n\n\t\tthis.unprojectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' );\n\t\t\tvector.unproject( camera );\n\n\t\t};\n\n\t\tthis.pickingRay = function ( vector, camera ) {\n\n\t\t\tconsole.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' );\n\n\t\t};\n\n\t}\n\n\t//\n\n\tfunction CanvasRenderer () {\n\n\t\tconsole.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' );\n\n\t\tthis.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\tthis.clear = function () {};\n\t\tthis.render = function () {};\n\t\tthis.setClearColor = function () {};\n\t\tthis.setSize = function () {};\n\n\t}\n\n\texports.WebGLRenderTargetCube = WebGLRenderTargetCube;\n\texports.WebGLRenderTarget = WebGLRenderTarget;\n\texports.WebGLRenderer = WebGLRenderer;\n\texports.ShaderLib = ShaderLib;\n\texports.UniformsLib = UniformsLib;\n\texports.UniformsUtils = UniformsUtils;\n\texports.ShaderChunk = ShaderChunk;\n\texports.FogExp2 = FogExp2;\n\texports.Fog = Fog;\n\texports.Scene = Scene;\n\texports.LensFlare = LensFlare;\n\texports.Sprite = Sprite;\n\texports.LOD = LOD;\n\texports.SkinnedMesh = SkinnedMesh;\n\texports.Skeleton = Skeleton;\n\texports.Bone = Bone;\n\texports.Mesh = Mesh;\n\texports.LineSegments = LineSegments;\n\texports.Line = Line;\n\texports.Points = Points;\n\texports.Group = Group;\n\texports.VideoTexture = VideoTexture;\n\texports.DataTexture = DataTexture;\n\texports.CompressedTexture = CompressedTexture;\n\texports.CubeTexture = CubeTexture;\n\texports.CanvasTexture = CanvasTexture;\n\texports.DepthTexture = DepthTexture;\n\texports.TextureIdCount = TextureIdCount;\n\texports.Texture = Texture;\n\texports.MaterialIdCount = MaterialIdCount;\n\texports.CompressedTextureLoader = CompressedTextureLoader;\n\texports.BinaryTextureLoader = BinaryTextureLoader;\n\texports.DataTextureLoader = DataTextureLoader;\n\texports.CubeTextureLoader = CubeTextureLoader;\n\texports.TextureLoader = TextureLoader;\n\texports.ObjectLoader = ObjectLoader;\n\texports.MaterialLoader = MaterialLoader;\n\texports.BufferGeometryLoader = BufferGeometryLoader;\n\texports.DefaultLoadingManager = DefaultLoadingManager;\n\texports.LoadingManager = LoadingManager;\n\texports.JSONLoader = JSONLoader;\n\texports.ImageLoader = ImageLoader;\n\texports.FontLoader = FontLoader;\n\texports.XHRLoader = XHRLoader;\n\texports.Loader = Loader;\n\texports.Cache = Cache;\n\texports.AudioLoader = AudioLoader;\n\texports.SpotLightShadow = SpotLightShadow;\n\texports.SpotLight = SpotLight;\n\texports.PointLight = PointLight;\n\texports.HemisphereLight = HemisphereLight;\n\texports.DirectionalLightShadow = DirectionalLightShadow;\n\texports.DirectionalLight = DirectionalLight;\n\texports.AmbientLight = AmbientLight;\n\texports.LightShadow = LightShadow;\n\texports.Light = Light;\n\texports.StereoCamera = StereoCamera;\n\texports.PerspectiveCamera = PerspectiveCamera;\n\texports.OrthographicCamera = OrthographicCamera;\n\texports.CubeCamera = CubeCamera;\n\texports.Camera = Camera;\n\texports.AudioListener = AudioListener;\n\texports.PositionalAudio = PositionalAudio;\n\texports.getAudioContext = getAudioContext;\n\texports.AudioAnalyser = AudioAnalyser;\n\texports.Audio = Audio;\n\texports.VectorKeyframeTrack = VectorKeyframeTrack;\n\texports.StringKeyframeTrack = StringKeyframeTrack;\n\texports.QuaternionKeyframeTrack = QuaternionKeyframeTrack;\n\texports.NumberKeyframeTrack = NumberKeyframeTrack;\n\texports.ColorKeyframeTrack = ColorKeyframeTrack;\n\texports.BooleanKeyframeTrack = BooleanKeyframeTrack;\n\texports.PropertyMixer = PropertyMixer;\n\texports.PropertyBinding = PropertyBinding;\n\texports.KeyframeTrack = KeyframeTrack;\n\texports.AnimationUtils = AnimationUtils;\n\texports.AnimationObjectGroup = AnimationObjectGroup;\n\texports.AnimationMixer = AnimationMixer;\n\texports.AnimationClip = AnimationClip;\n\texports.Uniform = Uniform;\n\texports.InstancedBufferGeometry = InstancedBufferGeometry;\n\texports.BufferGeometry = BufferGeometry;\n\texports.GeometryIdCount = GeometryIdCount;\n\texports.Geometry = Geometry;\n\texports.InterleavedBufferAttribute = InterleavedBufferAttribute;\n\texports.InstancedInterleavedBuffer = InstancedInterleavedBuffer;\n\texports.InterleavedBuffer = InterleavedBuffer;\n\texports.InstancedBufferAttribute = InstancedBufferAttribute;\n\texports.DynamicBufferAttribute = DynamicBufferAttribute;\n\texports.Float64Attribute = Float64Attribute;\n\texports.Float32Attribute = Float32Attribute;\n\texports.Uint32Attribute = Uint32Attribute;\n\texports.Int32Attribute = Int32Attribute;\n\texports.Uint16Attribute = Uint16Attribute;\n\texports.Int16Attribute = Int16Attribute;\n\texports.Uint8ClampedAttribute = Uint8ClampedAttribute;\n\texports.Uint8Attribute = Uint8Attribute;\n\texports.Int8Attribute = Int8Attribute;\n\texports.BufferAttribute = BufferAttribute;\n\texports.Face3 = Face3;\n\texports.Object3DIdCount = Object3DIdCount;\n\texports.Object3D = Object3D;\n\texports.Raycaster = Raycaster;\n\texports.Layers = Layers;\n\texports.EventDispatcher = EventDispatcher;\n\texports.Clock = Clock;\n\texports.QuaternionLinearInterpolant = QuaternionLinearInterpolant;\n\texports.LinearInterpolant = LinearInterpolant;\n\texports.DiscreteInterpolant = DiscreteInterpolant;\n\texports.CubicInterpolant = CubicInterpolant;\n\texports.Interpolant = Interpolant;\n\texports.Triangle = Triangle;\n\texports.Spline = Spline;\n\texports.Math = _Math;\n\texports.Spherical = Spherical;\n\texports.Plane = Plane;\n\texports.Frustum = Frustum;\n\texports.Sphere = Sphere;\n\texports.Ray = Ray;\n\texports.Matrix4 = Matrix4;\n\texports.Matrix3 = Matrix3;\n\texports.Box3 = Box3;\n\texports.Box2 = Box2;\n\texports.Line3 = Line3;\n\texports.Euler = Euler;\n\texports.Vector4 = Vector4;\n\texports.Vector3 = Vector3;\n\texports.Vector2 = Vector2;\n\texports.Quaternion = Quaternion;\n\texports.ColorKeywords = ColorKeywords;\n\texports.Color = Color;\n\texports.MorphBlendMesh = MorphBlendMesh;\n\texports.ImmediateRenderObject = ImmediateRenderObject;\n\texports.VertexNormalsHelper = VertexNormalsHelper;\n\texports.SpotLightHelper = SpotLightHelper;\n\texports.SkeletonHelper = SkeletonHelper;\n\texports.PointLightHelper = PointLightHelper;\n\texports.HemisphereLightHelper = HemisphereLightHelper;\n\texports.GridHelper = GridHelper;\n\texports.FaceNormalsHelper = FaceNormalsHelper;\n\texports.DirectionalLightHelper = DirectionalLightHelper;\n\texports.CameraHelper = CameraHelper;\n\texports.BoundingBoxHelper = BoundingBoxHelper;\n\texports.BoxHelper = BoxHelper;\n\texports.ArrowHelper = ArrowHelper;\n\texports.AxisHelper = AxisHelper;\n\texports.ClosedSplineCurve3 = ClosedSplineCurve3;\n\texports.CatmullRomCurve3 = CatmullRomCurve3;\n\texports.SplineCurve3 = SplineCurve3;\n\texports.CubicBezierCurve3 = CubicBezierCurve3;\n\texports.QuadraticBezierCurve3 = QuadraticBezierCurve3;\n\texports.LineCurve3 = LineCurve3;\n\texports.ArcCurve = ArcCurve;\n\texports.EllipseCurve = EllipseCurve;\n\texports.SplineCurve = SplineCurve;\n\texports.CubicBezierCurve = CubicBezierCurve;\n\texports.QuadraticBezierCurve = QuadraticBezierCurve;\n\texports.LineCurve = LineCurve;\n\texports.Shape = Shape;\n\texports.ShapePath = ShapePath;\n\texports.Path = Path;\n\texports.Font = Font;\n\texports.CurvePath = CurvePath;\n\texports.Curve = Curve;\n\texports.ShapeUtils = ShapeUtils;\n\texports.SceneUtils = SceneUtils;\n\texports.CurveUtils = CurveUtils;\n\texports.WireframeGeometry = WireframeGeometry;\n\texports.ParametricGeometry = ParametricGeometry;\n\texports.ParametricBufferGeometry = ParametricBufferGeometry;\n\texports.TetrahedronGeometry = TetrahedronGeometry;\n\texports.TetrahedronBufferGeometry = TetrahedronBufferGeometry;\n\texports.OctahedronGeometry = OctahedronGeometry;\n\texports.OctahedronBufferGeometry = OctahedronBufferGeometry;\n\texports.IcosahedronGeometry = IcosahedronGeometry;\n\texports.IcosahedronBufferGeometry = IcosahedronBufferGeometry;\n\texports.DodecahedronGeometry = DodecahedronGeometry;\n\texports.DodecahedronBufferGeometry = DodecahedronBufferGeometry;\n\texports.PolyhedronGeometry = PolyhedronGeometry;\n\texports.PolyhedronBufferGeometry = PolyhedronBufferGeometry;\n\texports.TubeGeometry = TubeGeometry;\n\texports.TubeBufferGeometry = TubeBufferGeometry;\n\texports.TorusKnotGeometry = TorusKnotGeometry;\n\texports.TorusKnotBufferGeometry = TorusKnotBufferGeometry;\n\texports.TorusGeometry = TorusGeometry;\n\texports.TorusBufferGeometry = TorusBufferGeometry;\n\texports.TextGeometry = TextGeometry;\n\texports.SphereBufferGeometry = SphereBufferGeometry;\n\texports.SphereGeometry = SphereGeometry;\n\texports.RingGeometry = RingGeometry;\n\texports.RingBufferGeometry = RingBufferGeometry;\n\texports.PlaneBufferGeometry = PlaneBufferGeometry;\n\texports.PlaneGeometry = PlaneGeometry;\n\texports.LatheGeometry = LatheGeometry;\n\texports.LatheBufferGeometry = LatheBufferGeometry;\n\texports.ShapeGeometry = ShapeGeometry;\n\texports.ExtrudeGeometry = ExtrudeGeometry;\n\texports.EdgesGeometry = EdgesGeometry;\n\texports.ConeGeometry = ConeGeometry;\n\texports.ConeBufferGeometry = ConeBufferGeometry;\n\texports.CylinderGeometry = CylinderGeometry;\n\texports.CylinderBufferGeometry = CylinderBufferGeometry;\n\texports.CircleBufferGeometry = CircleBufferGeometry;\n\texports.CircleGeometry = CircleGeometry;\n\texports.BoxBufferGeometry = BoxBufferGeometry;\n\texports.BoxGeometry = BoxGeometry;\n\texports.ShadowMaterial = ShadowMaterial;\n\texports.SpriteMaterial = SpriteMaterial;\n\texports.RawShaderMaterial = RawShaderMaterial;\n\texports.ShaderMaterial = ShaderMaterial;\n\texports.PointsMaterial = PointsMaterial;\n\texports.MultiMaterial = MultiMaterial;\n\texports.MeshPhysicalMaterial = MeshPhysicalMaterial;\n\texports.MeshStandardMaterial = MeshStandardMaterial;\n\texports.MeshPhongMaterial = MeshPhongMaterial;\n\texports.MeshNormalMaterial = MeshNormalMaterial;\n\texports.MeshLambertMaterial = MeshLambertMaterial;\n\texports.MeshDepthMaterial = MeshDepthMaterial;\n\texports.MeshBasicMaterial = MeshBasicMaterial;\n\texports.LineDashedMaterial = LineDashedMaterial;\n\texports.LineBasicMaterial = LineBasicMaterial;\n\texports.Material = Material;\n\texports.REVISION = REVISION;\n\texports.MOUSE = MOUSE;\n\texports.CullFaceNone = CullFaceNone;\n\texports.CullFaceBack = CullFaceBack;\n\texports.CullFaceFront = CullFaceFront;\n\texports.CullFaceFrontBack = CullFaceFrontBack;\n\texports.FrontFaceDirectionCW = FrontFaceDirectionCW;\n\texports.FrontFaceDirectionCCW = FrontFaceDirectionCCW;\n\texports.BasicShadowMap = BasicShadowMap;\n\texports.PCFShadowMap = PCFShadowMap;\n\texports.PCFSoftShadowMap = PCFSoftShadowMap;\n\texports.FrontSide = FrontSide;\n\texports.BackSide = BackSide;\n\texports.DoubleSide = DoubleSide;\n\texports.FlatShading = FlatShading;\n\texports.SmoothShading = SmoothShading;\n\texports.NoColors = NoColors;\n\texports.FaceColors = FaceColors;\n\texports.VertexColors = VertexColors;\n\texports.NoBlending = NoBlending;\n\texports.NormalBlending = NormalBlending;\n\texports.AdditiveBlending = AdditiveBlending;\n\texports.SubtractiveBlending = SubtractiveBlending;\n\texports.MultiplyBlending = MultiplyBlending;\n\texports.CustomBlending = CustomBlending;\n\texports.BlendingMode = BlendingMode;\n\texports.AddEquation = AddEquation;\n\texports.SubtractEquation = SubtractEquation;\n\texports.ReverseSubtractEquation = ReverseSubtractEquation;\n\texports.MinEquation = MinEquation;\n\texports.MaxEquation = MaxEquation;\n\texports.ZeroFactor = ZeroFactor;\n\texports.OneFactor = OneFactor;\n\texports.SrcColorFactor = SrcColorFactor;\n\texports.OneMinusSrcColorFactor = OneMinusSrcColorFactor;\n\texports.SrcAlphaFactor = SrcAlphaFactor;\n\texports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor;\n\texports.DstAlphaFactor = DstAlphaFactor;\n\texports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor;\n\texports.DstColorFactor = DstColorFactor;\n\texports.OneMinusDstColorFactor = OneMinusDstColorFactor;\n\texports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor;\n\texports.NeverDepth = NeverDepth;\n\texports.AlwaysDepth = AlwaysDepth;\n\texports.LessDepth = LessDepth;\n\texports.LessEqualDepth = LessEqualDepth;\n\texports.EqualDepth = EqualDepth;\n\texports.GreaterEqualDepth = GreaterEqualDepth;\n\texports.GreaterDepth = GreaterDepth;\n\texports.NotEqualDepth = NotEqualDepth;\n\texports.MultiplyOperation = MultiplyOperation;\n\texports.MixOperation = MixOperation;\n\texports.AddOperation = AddOperation;\n\texports.NoToneMapping = NoToneMapping;\n\texports.LinearToneMapping = LinearToneMapping;\n\texports.ReinhardToneMapping = ReinhardToneMapping;\n\texports.Uncharted2ToneMapping = Uncharted2ToneMapping;\n\texports.CineonToneMapping = CineonToneMapping;\n\texports.UVMapping = UVMapping;\n\texports.CubeReflectionMapping = CubeReflectionMapping;\n\texports.CubeRefractionMapping = CubeRefractionMapping;\n\texports.EquirectangularReflectionMapping = EquirectangularReflectionMapping;\n\texports.EquirectangularRefractionMapping = EquirectangularRefractionMapping;\n\texports.SphericalReflectionMapping = SphericalReflectionMapping;\n\texports.CubeUVReflectionMapping = CubeUVReflectionMapping;\n\texports.CubeUVRefractionMapping = CubeUVRefractionMapping;\n\texports.TextureMapping = TextureMapping;\n\texports.RepeatWrapping = RepeatWrapping;\n\texports.ClampToEdgeWrapping = ClampToEdgeWrapping;\n\texports.MirroredRepeatWrapping = MirroredRepeatWrapping;\n\texports.TextureWrapping = TextureWrapping;\n\texports.NearestFilter = NearestFilter;\n\texports.NearestMipMapNearestFilter = NearestMipMapNearestFilter;\n\texports.NearestMipMapLinearFilter = NearestMipMapLinearFilter;\n\texports.LinearFilter = LinearFilter;\n\texports.LinearMipMapNearestFilter = LinearMipMapNearestFilter;\n\texports.LinearMipMapLinearFilter = LinearMipMapLinearFilter;\n\texports.TextureFilter = TextureFilter;\n\texports.UnsignedByteType = UnsignedByteType;\n\texports.ByteType = ByteType;\n\texports.ShortType = ShortType;\n\texports.UnsignedShortType = UnsignedShortType;\n\texports.IntType = IntType;\n\texports.UnsignedIntType = UnsignedIntType;\n\texports.FloatType = FloatType;\n\texports.HalfFloatType = HalfFloatType;\n\texports.UnsignedShort4444Type = UnsignedShort4444Type;\n\texports.UnsignedShort5551Type = UnsignedShort5551Type;\n\texports.UnsignedShort565Type = UnsignedShort565Type;\n\texports.UnsignedInt248Type = UnsignedInt248Type;\n\texports.AlphaFormat = AlphaFormat;\n\texports.RGBFormat = RGBFormat;\n\texports.RGBAFormat = RGBAFormat;\n\texports.LuminanceFormat = LuminanceFormat;\n\texports.LuminanceAlphaFormat = LuminanceAlphaFormat;\n\texports.RGBEFormat = RGBEFormat;\n\texports.DepthFormat = DepthFormat;\n\texports.DepthStencilFormat = DepthStencilFormat;\n\texports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format;\n\texports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format;\n\texports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format;\n\texports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format;\n\texports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format;\n\texports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format;\n\texports.RGB_ETC1_Format = RGB_ETC1_Format;\n\texports.LoopOnce = LoopOnce;\n\texports.LoopRepeat = LoopRepeat;\n\texports.LoopPingPong = LoopPingPong;\n\texports.InterpolateDiscrete = InterpolateDiscrete;\n\texports.InterpolateLinear = InterpolateLinear;\n\texports.InterpolateSmooth = InterpolateSmooth;\n\texports.ZeroCurvatureEnding = ZeroCurvatureEnding;\n\texports.ZeroSlopeEnding = ZeroSlopeEnding;\n\texports.WrapAroundEnding = WrapAroundEnding;\n\texports.TrianglesDrawMode = TrianglesDrawMode;\n\texports.TriangleStripDrawMode = TriangleStripDrawMode;\n\texports.TriangleFanDrawMode = TriangleFanDrawMode;\n\texports.LinearEncoding = LinearEncoding;\n\texports.sRGBEncoding = sRGBEncoding;\n\texports.GammaEncoding = GammaEncoding;\n\texports.RGBEEncoding = RGBEEncoding;\n\texports.LogLuvEncoding = LogLuvEncoding;\n\texports.RGBM7Encoding = RGBM7Encoding;\n\texports.RGBM16Encoding = RGBM16Encoding;\n\texports.RGBDEncoding = RGBDEncoding;\n\texports.BasicDepthPacking = BasicDepthPacking;\n\texports.RGBADepthPacking = RGBADepthPacking;\n\texports.CubeGeometry = BoxGeometry;\n\texports.Face4 = Face4;\n\texports.LineStrip = LineStrip;\n\texports.LinePieces = LinePieces;\n\texports.MeshFaceMaterial = MultiMaterial;\n\texports.PointCloud = PointCloud;\n\texports.Particle = Sprite;\n\texports.ParticleSystem = ParticleSystem;\n\texports.PointCloudMaterial = PointCloudMaterial;\n\texports.ParticleBasicMaterial = ParticleBasicMaterial;\n\texports.ParticleSystemMaterial = ParticleSystemMaterial;\n\texports.Vertex = Vertex;\n\texports.EdgesHelper = EdgesHelper;\n\texports.WireframeHelper = WireframeHelper;\n\texports.GeometryUtils = GeometryUtils;\n\texports.ImageUtils = ImageUtils;\n\texports.Projector = Projector;\n\texports.CanvasRenderer = CanvasRenderer;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n\tObject.defineProperty( exports, 'AudioContext', {\n\t\tget: function () {\n\t\t\treturn exports.getAudioContext();\n\t\t}\n\t});\n\n})));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three/build/three.js\n// module id = 2\n// module chunks = 0","const THREE = require('three');\n\nexport default class Agent {\n constructor(id, pos, vel, goal, size, col) {\n \tthis.id = id;\n this.position = pos;\n this.velocity = vel;\n this.goal = goal\n this.size = size;\n this.markers = [];\n this.color = col;\n this.mesh = null;\n }\n} \n\n\n// WEBPACK FOOTER //\n// ./src/agent.js","export default class Marker {\n\tconstructor(position) {\n\t\tthis.position = position;\n\t\tthis.color = 0xff0000;\n\t\tthis.owned = false;\n\t\tthis.mesh = null;\n\t\tthis.agent = null;\n\t}\n}\n\n\n// WEBPACK FOOTER //\n// ./src/marker.js","const THREE = require('three');\nimport Grid from './grid.js'\nimport Agent from './agent.js'\nimport Marker from './marker.js'\n\nexport default class Crowd {\n constructor(renderengine) {\n \tthis.renderengine = renderengine;\n \tthis.markers = [];\n \tthis.agents = [];\n \tthis.board = new Grid(10.0, 100.0);\n\n \tthis.create_agents();\n \tthis.populate_board();\n \tthis.create_markers();\n \tthis.renderengine.render_plane(100.0);\n \tthis.renderengine.render_agents(this.agents);\n \tthis.renderengine.render_markers(this.markers);\n }\n\n create_agents() {\n // \tvar agent_1_pos = new THREE.Vector3(-49, 1, 49);\n // \tvar agent_2_pos = new THREE.Vector3(49, 1, 49);\n // \tvar agent_1_goal = new THREE.Vector3(49, 0, -49);\n // \tvar agent_2_goal = new THREE.Vector3(-49, 0, -49);\n \tvar zero = new THREE.Vector3(0, 0, 0);\n\n // \tvar agent_1 = new Agent(0, agent_1_pos, zero, agent_1_goal, 2.0, 0x00ff00);\n // \tvar agent_2 = new Agent(1, agent_2_pos, zero, agent_2_goal, 2.0, 0x0000ff);\n\t// this.agents.push(agent_1);\n\t// this.agents.push(agent_2);\n\n\t// top row\n\tfor (var i = 0; i < 10; i ++) {\n\t\tvar pos = new THREE.Vector3(-49 + 10 * i, 1, 49);\n\t\tvar goal = new THREE.Vector3(-49 + 10 * i, 1, -49);\n\t\tvar color = (Math.random()*0xFFFFFF<<0);\n\t\tvar agent = new Agent(i, pos, zero, goal, 2.0, color);\n\t\tthis.agents.push(agent);\n\t}\n\t// bot row\n\tfor (var i = 0; i < 10; i ++) {\n\t\tvar pos = new THREE.Vector3(-49 + 10 * i, 1, -49);\n\t\tvar goal = new THREE.Vector3(-49 + 10 * i, 1, 49);\n\t\tvar color = (Math.random()*0xFFFFFF<<0);\n\t\tvar agent = new Agent(i+10, pos, zero, goal, 2.0, color);\n\t\tthis.agents.push(agent);\n\t}\n }\n\n populate_board() {\n \tfor (var i = 0; i < this.agents.length; i++) {\n \t\tvar agent = this.agents[i];\n \t\tvar gs = this.board.find_absolute_grid(agent.position.x, agent.position.z);\n \t\tthis.board.grid[gs.z][gs.x].add(agent);\n \t}\n }\n\n create_markers() {\n\tfor (var i = 0; i < 2000; i++) {\n\t\tvar x = Math.random() * 98 - 49;\n\t\tvar z = Math.random() * 98 - 49;\n\t\tvar marker = new Marker(new THREE.Vector3(x, 0.5, z));\n\t\tthis.markers.push(marker);\n\t}\n }\n\n /* \n\tupdate() - for each agent in the crowd, the velocity is calculated based off of the markers that belongs to each agent. \n */ \n update() {\n \tthis.update_marker_ownership();\n \tthis.update_agent_velocities();\n \tthis.renderengine.update_agents(this.agents);\n \tthis.renderengine.update_markers(this.markers);\n \tthis.reset_ownership();\n }\n\n reset_ownership() {\n \tfor (var i = 0; i < this.agents.length; i++) {\n \t\tthis.agents[i].markers = [];\n \t}\n\n \tfor (var i = 0; i < this.markers.length; i++) {\n \t\tthis.markers[i].owned = false;\n \t\tthis.markers[i].color = 0xff0000;\n \t\tthis.markers[i].agent = null;\n \t}\n }\n\n update_marker_ownership() {\n \tfor (var i = 0; i < this.markers.length; i++) {\n \t\tvar marker = this.markers[i];\n \t\tif (marker.owned) {\n \t\t\tcontinue;\n \t\t}\n \t\tvar ngs = this.board.find_nearest_grid(marker.position.x, marker.position.z);\n \t\tvar top_left = {x: ngs.x -1, z: ngs.z - 1};\n \t\tvar top = {x: ngs.x, z: ngs.z - 1};\n \t\tvar left = {x: ngs.x - 1, z: ngs.z};\n \t\tvar grid = this.board.grid;\n \t\tvar eligible_agents = [];\n \t\tif (top_left.z > -1 && top_left.x > -1 && grid[top_left.z][top_left.x].size > 0) {\n \t\t\tgrid[top_left.z][top_left.x].forEach(function(agent) {\n \t\t\t\teligible_agents.push(agent);\n \t\t\t});\n \t\t}\n \t\tif (top.z > -1 && top.x > -1 && grid[top.z][top.x].size > 0) {\n \t\t\tgrid[top.z][top.x].forEach(function(agent) {\n \t\t\t\teligible_agents.push(agent);\n \t\t\t});\n\t\t}\n \t\tif (left.z > -1 && left.x > -1 && grid[left.z][left.x].size > 0) {\n \t\t\tgrid[left.z][left.x].forEach(function(agent) {\n \t\t\t\teligible_agents.push(agent);\n \t\t\t});\n \t\t}\n \t\tif (ngs.z > -1 && ngs.x > -1 && grid[ngs.z][ngs.x].size > 0) {\n \t\t\tgrid[ngs.z][ngs.x].forEach(function(agent) {\n \t\t\t\teligible_agents.push(agent);\n \t\t\t});\n \t\t}\n \t\tthis.assign_marker_to_agent(eligible_agents, marker);\n \t}\n }\n\n assign_marker_to_agent(agents, marker) {\n \tif (agents.length === 0) {\n \t\tmarker.color = 0xff0000;\n \t\tmarker.owned = false;\n \t\tmarker.agent = null;\n \t\treturn;\n \t}\n \tvar closest = {dist: marker.position.distanceTo(agents[0].position), agent: agents[0]};\n \tagents.forEach(function(agent) {\n \t\tvar test_dist = marker.position.distanceTo(agent.position);\n \t\tif (test_dist < closest.dist) {\n \t\t\tclosest.dist = test_dist;\n \t\t\tclosest.agent = agent;\n \t\t}\n \t});\n \tmarker.agent = closest.agent;\n \tmarker.color = closest.agent.color;\n \tmarker.owned = true;\n \tclosest.agent.markers.push(marker);\n \treturn;\n }\n\n update_agent_velocities() {\n \tfor (var i = 0; i < this.agents.length; i++) {\n \t\tvar agent = this.agents[i];\n \t\tif (agent.position.distanceTo(agent.goal) > 8.0) {\n\t \t\tvar old_gs = this.board.find_absolute_grid(agent.position.x, agent.position.z);\n\n\t \t\t// computing total marker influence\n\t \t\tvar G = new THREE.Vector3().subVectors(agent.goal, agent.position)\n\t \t\tvar total_weight = 0.0;\n\t \t\tvar total_velocity = new THREE.Vector3(0, 0, 0);\n\t \t\tfor (var j = 0; j < agent.markers.length; j++) {\n\t \t\t\tvar marker = agent.markers[j];\n\t \t\t\tvar m = new THREE.Vector3().subVectors(marker.position, agent.position);\n\t \t\t\tm.y = 0.0;\n\t \t\t\tvar weight = (1.0 + m.dot(G) / (m.length() * G.length())) / (1.0 + m.length());\n\t \t\t\ttotal_weight += weight;\n\t \t\t}\n\t \t\tfor (var j = 0; j < agent.markers.length; j++) {\n\t \t\t\tvar marker = agent.markers[j];\n\t \t\t\tvar m = new THREE.Vector3().subVectors(marker.position, agent.position);\n\t \t\t\tm.y = 0.0;\n\t\t\t\tvar weight = (1.0 + m.dot(G) / (m.length() * G.length())) / (1.0 + m.length());\n\t \t\t\ttotal_velocity.add(m.multiplyScalar(weight / total_weight));\n\t \t\t}\n\t \t\t// agent.velocity = total_velocity.normalize();\n\t \t\tif (total_velocity.x < 0.1 || total_velocity.z < 0.1) {\n\t \t\t\ttotal_velocity.add(new THREE.Vector3(G.x, G.y, G.z).multiplyScalar(0.1));\n\t \t\t}\n\t \t\tagent.position.add(total_velocity.multiplyScalar(0.2));\n\n\t \t\t// agent.position.add(G.divideScalar(100.0));\n\t \t\t// check if the movement of this agent causes it to leave its current grid\n\t\t\tvar agent_gs = this.board.find_absolute_grid(agent.position.x, agent.position.z);\n\t \t\t// if (i === 1) {\n\t \t\t// \tconsole.log(agent_gs);\n\t \t\t// }\n\t\t\tif (old_gs.x !== agent_gs.x || old_gs.z !== agent_gs.z) {\n \t\t\t\tthis.board.grid[old_gs.z][old_gs.x].delete(agent);\n \t\t\t\tthis.board.grid[agent_gs.z][agent_gs.x].add(agent);\n\t\t\t}\n\t \t}\n \t}\n }\n}\n\n\n// WEBPACK FOOTER //\n// ./src/crowd.js","const THREE = require('three');\n\nexport default class RenderEngine {\n\n\tconstructor(scene) {\n\t\tthis.scene = scene;\n \t}\n\n \trender_plane(size) {\n\t \tvar plane_geo = new THREE.PlaneGeometry(size, size);\n\t\tvar plane_mesh = new THREE.Mesh(plane_geo, new THREE.MeshBasicMaterial( {color: 0xcccccc, side: THREE.DoubleSide}));\n\t\tplane_mesh.rotation.x = Math.PI / 2.0;\n\t\tplane_mesh.position.set(0.0, 0.0, 0.0);\n\t\tthis.scene.add(plane_mesh);\n \t}\n\n \trender_agents(agents) {\n\t \tvar cylinder_geo = new THREE.CylinderGeometry(1, 1, 2, 20);\n\t\tvar agent; \n\t\tfor (var i = 0; i < agents.length; i++) {\n\t\t\tagent = new THREE.Mesh(cylinder_geo, new THREE.MeshBasicMaterial( {color: agents[i].color, side: THREE.DoubleSide}));\n\t\t\tagent.position.set(agents[i].position.x, agents[i].position.y, agents[i].position.z);\n\t\t\tagents[i].mesh = agent;\n\t\t\tthis.scene.add(agent);\n\t\t}\n \t}\n \n \trender_markers(markers) {\n\t\tvar cube_geo = new THREE.BoxGeometry(0.5, 0.5, 0.5);\n\t\tvar marker;\n\t\tfor (var i = 0; i < markers.length; i++) {\n\t\t\tmarker = new THREE.Mesh(cube_geo, new THREE.MeshBasicMaterial( {color: markers[i].color, side: THREE.DoubleSide}));\n\t\t\tmarker.position.set(markers[i].position.x, markers[i].position.y, markers[i].position.z);\n\t\t\tmarkers[i].mesh = marker;\n\t\t\tthis.scene.add(marker);\n\t\t}\n \t}\n\n \tupdate_agents(agents) {\n \t\tfor (var i = 0; i < agents.length; i++) {\n \t\t\tvar pos = agents[i].position;\n \t\t\tvar mesh = agents[i].mesh;\n \t\t\tmesh.position.set(pos.x, pos.y, pos.z);\n \t\t\tmesh.geometry.verticesNeedUpdate = true;\n \t\t}\n \t}\n\n \tupdate_markers(markers) {\n \t\tmarkers.forEach(function(marker) {\n \t\t\tmarker.mesh.material.color.setHex(marker.color);\n \t\t});\n \t}\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/renderengine.js","\nconst THREE = require('three');\nconst OrbitControls = require('three-orbit-controls')(THREE)\nimport Stats from 'stats-js'\nimport DAT from 'dat-gui'\n\n// when the scene is done initializing, the function passed as `callback` will be executed\n// then, every frame, the function passed as `update` will be executed\nfunction init(callback, update) {\n var stats = new Stats();\n stats.setMode(1);\n stats.domElement.style.position = 'absolute';\n stats.domElement.style.left = '0px';\n stats.domElement.style.top = '0px';\n document.body.appendChild(stats.domElement);\n\n var gui = new DAT.GUI();\n\n var framework = {\n gui: gui,\n stats: stats\n };\n\n // run this function after the window loads\n window.addEventListener('load', function() {\n\n var scene = new THREE.Scene();\n var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );\n var renderer = new THREE.WebGLRenderer( { antialias: true } );\n renderer.setPixelRatio(window.devicePixelRatio);\n renderer.setSize(window.innerWidth, window.innerHeight);\n renderer.setClearColor(0x020202, 0);\n\n var controls = new OrbitControls(camera, renderer.domElement);\n controls.enableDamping = true;\n controls.enableZoom = true;\n controls.target.set(0, 0, 0);\n controls.rotateSpeed = 0.3;\n controls.zoomSpeed = 1.0;\n controls.panSpeed = 2.0;\n\n document.body.appendChild(renderer.domElement);\n\n // resize the canvas when the window changes\n window.addEventListener('resize', function() {\n camera.aspect = window.innerWidth / window.innerHeight;\n camera.updateProjectionMatrix();\n renderer.setSize(window.innerWidth, window.innerHeight);\n }, false);\n\n // assign THREE.js objects to the object we will return\n framework.scene = scene;\n framework.camera = camera;\n framework.renderer = renderer;\n\n // begin the animation loop\n (function tick() {\n stats.begin();\n update(framework); // perform any requested updates\n renderer.render(scene, camera); // render the scene\n stats.end();\n requestAnimationFrame(tick); // register to call this again when the browser renders a new frame\n })();\n\n // we will pass the scene, gui, renderer, camera, etc... to the callback function\n return callback(framework);\n });\n}\n\nexport default {\n init: init\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/framework.js","// stats.js - http://github.com/mrdoob/stats.js\nvar Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement(\"div\");f.id=\"stats\";f.addEventListener(\"mousedown\",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText=\"width:80px;opacity:0.9;cursor:pointer\";var a=document.createElement(\"div\");a.id=\"fps\";a.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#002\";f.appendChild(a);var i=document.createElement(\"div\");i.id=\"fpsText\";i.style.cssText=\"color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";\ni.innerHTML=\"FPS\";a.appendChild(i);var c=document.createElement(\"div\");c.id=\"fpsGraph\";c.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0ff\";for(a.appendChild(c);74>c.children.length;){var j=document.createElement(\"span\");j.style.cssText=\"width:1px;height:30px;float:left;background-color:#113\";c.appendChild(j)}var d=document.createElement(\"div\");d.id=\"ms\";d.style.cssText=\"padding:0 0 3px 3px;text-align:left;background-color:#020;display:none\";f.appendChild(d);var k=document.createElement(\"div\");\nk.id=\"msText\";k.style.cssText=\"color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px\";k.innerHTML=\"MS\";d.appendChild(k);var e=document.createElement(\"div\");e.id=\"msGraph\";e.style.cssText=\"position:relative;width:74px;height:30px;background-color:#0f0\";for(d.appendChild(e);74>e.children.length;)j=document.createElement(\"span\"),j.style.cssText=\"width:1px;height:30px;float:left;background-color:#131\",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display=\n\"block\";d.style.display=\"none\";break;case 1:a.style.display=\"none\",d.style.display=\"block\"}};return{REVISION:12,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+\" MS (\"+n+\"-\"+o+\")\";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+\"px\";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+\" FPS (\"+p+\"-\"+q+\")\",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height=\na+\"px\",m=b,r=0);return b},update:function(){l=this.end()}}};\"object\"===typeof module&&(module.exports=Stats);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/stats-js/build/stats.min.js\n// module id = 8\n// module chunks = 0","module.exports = require('./vendor/dat.gui')\nmodule.exports.color = require('./vendor/dat.color')\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/index.js\n// module id = 9\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.gui = dat.gui || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\n/** @namespace */\ndat.controllers = dat.controllers || {};\n\n/** @namespace */\ndat.dom = dat.dom || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\ndat.utils.css = (function () {\n return {\n load: function (url, doc) {\n doc = doc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function(css, doc) {\n doc = doc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = css;\n doc.getElementsByTagName('head')[0].appendChild(injected);\n }\n }\n})();\n\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.controllers.Controller = (function (common) {\n\n /**\n * @class An \"abstract\" class that represents a given property of an object.\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var Controller = function(object, property) {\n\n this.initialValue = object[property];\n\n /**\n * Those who extend this class will put their DOM elements in here.\n * @type {DOMElement}\n */\n this.domElement = document.createElement('div');\n\n /**\n * The object to manipulate\n * @type {Object}\n */\n this.object = object;\n\n /**\n * The name of the property to manipulate\n * @type {String}\n */\n this.property = property;\n\n /**\n * The function to be called on change.\n * @type {Function}\n * @ignore\n */\n this.__onChange = undefined;\n\n /**\n * The function to be called on finishing change.\n * @type {Function}\n * @ignore\n */\n this.__onFinishChange = undefined;\n\n };\n\n common.extend(\n\n Controller.prototype,\n\n /** @lends dat.controllers.Controller.prototype */\n {\n\n /**\n * Specify that a function fire every time someone changes the value with\n * this Controller.\n *\n * @param {Function} fnc This function will be called whenever the value\n * is modified via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onChange: function(fnc) {\n this.__onChange = fnc;\n return this;\n },\n\n /**\n * Specify that a function fire every time someone \"finishes\" changing\n * the value wih this Controller. Useful for values that change\n * incrementally like numbers or strings.\n *\n * @param {Function} fnc This function will be called whenever\n * someone \"finishes\" changing the value via this Controller.\n * @returns {dat.controllers.Controller} this\n */\n onFinishChange: function(fnc) {\n this.__onFinishChange = fnc;\n return this;\n },\n\n /**\n * Change the value of object[property]\n *\n * @param {Object} newValue The new value of object[property]\n */\n setValue: function(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n },\n\n /**\n * Gets the value of object[property]\n *\n * @returns {Object} The current value of object[property]\n */\n getValue: function() {\n return this.object[this.property];\n },\n\n /**\n * Refreshes the visual display of a Controller in order to keep sync\n * with the object's current value.\n * @returns {dat.controllers.Controller} this\n */\n updateDisplay: function() {\n return this;\n },\n\n /**\n * @returns {Boolean} true if the value has deviated from initialValue\n */\n isModified: function() {\n return this.initialValue !== this.getValue()\n }\n\n }\n\n );\n\n return Controller;\n\n\n})(dat.utils.common);\n\n\ndat.dom.dom = (function (common) {\n\n var EVENT_MAP = {\n 'HTMLEvents': ['change'],\n 'MouseEvents': ['click','mousemove','mousedown','mouseup', 'mouseover'],\n 'KeyboardEvents': ['keydown']\n };\n\n var EVENT_MAP_INV = {};\n common.each(EVENT_MAP, function(v, k) {\n common.each(v, function(e) {\n EVENT_MAP_INV[e] = k;\n });\n });\n\n var CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\n\n function cssValueToPixels(val) {\n\n if (val === '0' || common.isUndefined(val)) return 0;\n\n var match = val.match(CSS_VALUE_PIXELS);\n\n if (!common.isNull(match)) {\n return parseFloat(match[1]);\n }\n\n // TODO ...ems? %?\n\n return 0;\n\n }\n\n /**\n * @namespace\n * @member dat.dom\n */\n var dom = {\n\n /**\n * \n * @param elem\n * @param selectable\n */\n makeSelectable: function(elem, selectable) {\n\n if (elem === undefined || elem.style === undefined) return;\n\n elem.onselectstart = selectable ? function() {\n return false;\n } : function() {\n };\n\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n\n },\n\n /**\n *\n * @param elem\n * @param horizontal\n * @param vertical\n */\n makeFullscreen: function(elem, horizontal, vertical) {\n\n if (common.isUndefined(horizontal)) horizontal = true;\n if (common.isUndefined(vertical)) vertical = true;\n\n elem.style.position = 'absolute';\n\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n\n },\n\n /**\n *\n * @param elem\n * @param eventType\n * @param params\n */\n fakeEvent: function(elem, eventType, params, aux) {\n params = params || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false,\n params.cancelable || true, window, params.clickCount || 1,\n 0, //screen X\n 0, //screen Y\n clientX, //client X\n clientY, //client Y\n false, false, false, false, 0, null);\n break;\n case 'KeyboardEvents':\n var init = evt.initKeyboardEvent || evt.initKeyEvent; // webkit || moz\n common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false,\n params.cancelable, window,\n params.ctrlKey, params.altKey,\n params.shiftKey, params.metaKey,\n params.keyCode, params.charCode);\n break;\n default:\n evt.initEvent(eventType, params.bubbles || false,\n params.cancelable || true);\n break;\n }\n common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n bind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.addEventListener)\n elem.addEventListener(event, func, bool);\n else if (elem.attachEvent)\n elem.attachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param event\n * @param func\n * @param bool\n */\n unbind: function(elem, event, func, bool) {\n bool = bool || false;\n if (elem.removeEventListener)\n elem.removeEventListener(event, func, bool);\n else if (elem.detachEvent)\n elem.detachEvent('on' + event, func);\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n addClass: function(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) == -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n\n /**\n *\n * @param elem\n * @param className\n */\n removeClass: function(elem, className) {\n if (className) {\n if (elem.className === undefined) {\n // elem.className = className;\n } else if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index != -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n\n hasClass: function(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n\n /**\n *\n * @param elem\n */\n getWidth: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-left-width']) +\n cssValueToPixels(style['border-right-width']) +\n cssValueToPixels(style['padding-left']) +\n cssValueToPixels(style['padding-right']) +\n cssValueToPixels(style['width']);\n },\n\n /**\n *\n * @param elem\n */\n getHeight: function(elem) {\n\n var style = getComputedStyle(elem);\n\n return cssValueToPixels(style['border-top-width']) +\n cssValueToPixels(style['border-bottom-width']) +\n cssValueToPixels(style['padding-top']) +\n cssValueToPixels(style['padding-bottom']) +\n cssValueToPixels(style['height']);\n },\n\n /**\n *\n * @param elem\n */\n getOffset: function(elem) {\n var offset = {left: 0, top:0};\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n } while (elem = elem.offsetParent);\n }\n return offset;\n },\n\n // http://stackoverflow.com/posts/2684561/revisions\n /**\n * \n * @param elem\n */\n isActive: function(elem) {\n return elem === document.activeElement && ( elem.type || elem.href );\n }\n\n };\n\n return dom;\n\n})(dat.utils.common);\n\n\ndat.controllers.OptionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a select input to alter the property of an object, using a\n * list of accepted values.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object|string[]} options A map of labels to acceptable values, or\n * a list of acceptable string values.\n *\n * @member dat.controllers\n */\n var OptionController = function(object, property, options) {\n\n OptionController.superclass.call(this, object, property);\n\n var _this = this;\n\n /**\n * The drop down menu\n * @ignore\n */\n this.__select = document.createElement('select');\n\n if (common.isArray(options)) {\n var map = {};\n common.each(options, function(element) {\n map[element] = element;\n });\n options = map;\n }\n\n common.each(options, function(value, key) {\n\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n\n });\n\n // Acknowledge original value\n this.updateDisplay();\n\n dom.bind(this.__select, 'change', function() {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n\n this.domElement.appendChild(this.__select);\n\n };\n\n OptionController.superclass = Controller;\n\n common.extend(\n\n OptionController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = OptionController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n },\n\n updateDisplay: function() {\n this.__select.value = this.getValue();\n return OptionController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return OptionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberController = (function (Controller, common) {\n\n /**\n * @class Represents a given property of an object that is a number.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberController = function(object, property, params) {\n\n NumberController.superclass.call(this, object, property);\n\n params = params || {};\n\n this.__min = params.min;\n this.__max = params.max;\n this.__step = params.step;\n\n if (common.isUndefined(this.__step)) {\n\n if (this.initialValue == 0) {\n this.__impliedStep = 1; // What are we, psychics?\n } else {\n // Hey Doug, check this out.\n this.__impliedStep = Math.pow(10, Math.floor(Math.log(this.initialValue)/Math.LN10))/10;\n }\n\n } else {\n\n this.__impliedStep = this.__step;\n\n }\n\n this.__precision = numDecimals(this.__impliedStep);\n\n\n };\n\n NumberController.superclass = Controller;\n\n common.extend(\n\n NumberController.prototype,\n Controller.prototype,\n\n /** @lends dat.controllers.NumberController.prototype */\n {\n\n setValue: function(v) {\n\n if (this.__min !== undefined && v < this.__min) {\n v = this.__min;\n } else if (this.__max !== undefined && v > this.__max) {\n v = this.__max;\n }\n\n if (this.__step !== undefined && v % this.__step != 0) {\n v = Math.round(v / this.__step) * this.__step;\n }\n\n return NumberController.superclass.prototype.setValue.call(this, v);\n\n },\n\n /**\n * Specify a minimum value for object[property].\n *\n * @param {Number} minValue The minimum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n min: function(v) {\n this.__min = v;\n return this;\n },\n\n /**\n * Specify a maximum value for object[property].\n *\n * @param {Number} maxValue The maximum value for\n * object[property]\n * @returns {dat.controllers.NumberController} this\n */\n max: function(v) {\n this.__max = v;\n return this;\n },\n\n /**\n * Specify a step value that dat.controllers.NumberController\n * increments by.\n *\n * @param {Number} stepValue The step value for\n * dat.controllers.NumberController\n * @default if minimum and maximum specified increment is 1% of the\n * difference otherwise stepValue is 1\n * @returns {dat.controllers.NumberController} this\n */\n step: function(v) {\n this.__step = v;\n return this;\n }\n\n }\n\n );\n\n function numDecimals(x) {\n x = x.toString();\n if (x.indexOf('.') > -1) {\n return x.length - x.indexOf('.') - 1;\n } else {\n return 0;\n }\n }\n\n return NumberController;\n\n})(dat.controllers.Controller,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerBox = (function (NumberController, dom, common) {\n\n /**\n * @class Represents a given property of an object that is a number and\n * provides an input element with which to manipulate it.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Object} [params] Optional parameters\n * @param {Number} [params.min] Minimum allowed value\n * @param {Number} [params.max] Maximum allowed value\n * @param {Number} [params.step] Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerBox = function(object, property, params) {\n\n this.__truncationSuspended = false;\n\n NumberControllerBox.superclass.call(this, object, property, params);\n\n var _this = this;\n\n /**\n * {Number} Previous mouse y position\n * @ignore\n */\n var prev_y;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n // Makes it so manually specified values are not truncated.\n\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'mousedown', onMouseDown);\n dom.bind(this.__input, 'keydown', function(e) {\n\n // When pressing entire, you can be as precise as you want.\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n }\n\n });\n\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!common.isNaN(attempted)) _this.setValue(attempted);\n }\n\n function onBlur() {\n onChange();\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prev_y = e.clientY;\n }\n\n function onMouseDrag(e) {\n\n var diff = prev_y - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n\n prev_y = e.clientY;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n NumberControllerBox.superclass = NumberController;\n\n common.extend(\n\n NumberControllerBox.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return NumberControllerBox.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n function roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n }\n\n return NumberControllerBox;\n\n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.NumberControllerSlider = (function (NumberController, dom, css, common, styleSheet) {\n\n /**\n * @class Represents a given property of an object that is a number, contains\n * a minimum and maximum, and provides a slider element with which to\n * manipulate it. It should be noted that the slider element is made up of\n * <div> tags, not the html5\n * <slider> element.\n *\n * @extends dat.controllers.Controller\n * @extends dat.controllers.NumberController\n * \n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n * @param {Number} minValue Minimum allowed value\n * @param {Number} maxValue Maximum allowed value\n * @param {Number} stepValue Increment by which to change value\n *\n * @member dat.controllers\n */\n var NumberControllerSlider = function(object, property, min, max, step) {\n\n NumberControllerSlider.superclass.call(this, object, property, { min: min, max: max, step: step });\n\n var _this = this;\n\n this.__background = document.createElement('div');\n this.__foreground = document.createElement('div');\n \n\n\n dom.bind(this.__background, 'mousedown', onMouseDown);\n \n dom.addClass(this.__background, 'slider');\n dom.addClass(this.__foreground, 'slider-fg');\n\n function onMouseDown(e) {\n\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n\n onMouseDrag(e);\n }\n\n function onMouseDrag(e) {\n\n e.preventDefault();\n\n var offset = dom.getOffset(_this.__background);\n var width = dom.getWidth(_this.__background);\n \n _this.setValue(\n map(e.clientX, offset.left, offset.left + width, _this.__min, _this.__max)\n );\n\n return false;\n\n }\n\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.__background.appendChild(this.__foreground);\n this.domElement.appendChild(this.__background);\n\n };\n\n NumberControllerSlider.superclass = NumberController;\n\n /**\n * Injects default stylesheet for slider elements.\n */\n NumberControllerSlider.useDefaultStyles = function() {\n css.inject(styleSheet);\n };\n\n common.extend(\n\n NumberControllerSlider.prototype,\n NumberController.prototype,\n\n {\n\n updateDisplay: function() {\n var pct = (this.getValue() - this.__min)/(this.__max - this.__min);\n this.__foreground.style.width = pct*100+'%';\n return NumberControllerSlider.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n\n\n );\n\n function map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n }\n\n return NumberControllerSlider;\n \n})(dat.controllers.NumberController,\ndat.dom.dom,\ndat.utils.css,\ndat.utils.common,\n\".slider {\\n box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);\\n height: 1em;\\n border-radius: 1em;\\n background-color: #eee;\\n padding: 0 0.5em;\\n overflow: hidden;\\n}\\n\\n.slider-fg {\\n padding: 1px 0 2px 0;\\n background-color: #aaa;\\n height: 1em;\\n margin-left: -0.5em;\\n padding-right: 0.5em;\\n border-radius: 1em 0 0 1em;\\n}\\n\\n.slider-fg:after {\\n display: inline-block;\\n border-radius: 1em;\\n background-color: #fff;\\n border: 1px solid #aaa;\\n content: '';\\n float: right;\\n margin-right: -1em;\\n margin-top: -1px;\\n height: 0.9em;\\n width: 0.9em;\\n}\");\n\n\ndat.controllers.FunctionController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a GUI interface to fire a specified method, a property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var FunctionController = function(object, property, text) {\n\n FunctionController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__button = document.createElement('div');\n this.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(this.__button, 'click', function(e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n\n dom.addClass(this.__button, 'button');\n\n this.domElement.appendChild(this.__button);\n\n\n };\n\n FunctionController.superclass = Controller;\n\n common.extend(\n\n FunctionController.prototype,\n Controller.prototype,\n {\n \n fire: function() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.getValue().call(this.object);\n }\n }\n\n );\n\n return FunctionController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.controllers.BooleanController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a checkbox input to alter the boolean property of an object.\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var BooleanController = function(object, property) {\n\n BooleanController.superclass.call(this, object, property);\n\n var _this = this;\n this.__prev = this.getValue();\n\n this.__checkbox = document.createElement('input');\n this.__checkbox.setAttribute('type', 'checkbox');\n\n\n dom.bind(this.__checkbox, 'change', onChange, false);\n\n this.domElement.appendChild(this.__checkbox);\n\n // Match original value\n this.updateDisplay();\n\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n\n };\n\n BooleanController.superclass = Controller;\n\n common.extend(\n\n BooleanController.prototype,\n Controller.prototype,\n\n {\n\n setValue: function(v) {\n var toReturn = BooleanController.superclass.prototype.setValue.call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n },\n\n updateDisplay: function() {\n \n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true; \n } else {\n this.__checkbox.checked = false;\n }\n\n return BooleanController.superclass.prototype.updateDisplay.call(this);\n\n }\n\n\n }\n\n );\n\n return BooleanController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common);\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common);\n\n\ndat.GUI = dat.gui.GUI = (function (css, saveDialogueContents, styleSheet, controllerFactory, Controller, BooleanController, FunctionController, NumberControllerBox, NumberControllerSlider, OptionController, ColorController, requestAnimationFrame, CenteredDiv, dom, common) {\n\n css.inject(styleSheet);\n\n /** Outer-most className for GUI's */\n var CSS_NAMESPACE = 'dg';\n\n var HIDE_KEY_CODE = 72;\n\n /** The only value shared between the JS and SCSS. Use caution. */\n var CLOSE_BUTTON_HEIGHT = 20;\n\n var DEFAULT_DEFAULT_PRESET_NAME = 'Default';\n\n var SUPPORTS_LOCAL_STORAGE = (function() {\n try {\n return 'localStorage' in window && window['localStorage'] !== null;\n } catch (e) {\n return false;\n }\n })();\n\n var SAVE_DIALOGUE;\n\n /** Have we yet to create an autoPlace GUI? */\n var auto_place_virgin = true;\n\n /** Fixed position div that auto place GUI's go inside */\n var auto_place_container;\n\n /** Are we hiding the GUI's ? */\n var hide = false;\n\n /** GUI's which should be hidden */\n var hideable_guis = [];\n\n /**\n * A lightweight controller library for JavaScript. It allows you to easily\n * manipulate variables and fire functions on the fly.\n * @class\n *\n * @member dat.gui\n *\n * @param {Object} [params]\n * @param {String} [params.name] The name of this GUI.\n * @param {Object} [params.load] JSON object representing the saved state of\n * this GUI.\n * @param {Boolean} [params.auto=true]\n * @param {dat.gui.GUI} [params.parent] The GUI I'm nested in.\n * @param {Boolean} [params.closed] If true, starts closed\n */\n var GUI = function(params) {\n\n var _this = this;\n\n /**\n * Outermost DOM Element\n * @type DOMElement\n */\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n\n dom.addClass(this.domElement, CSS_NAMESPACE);\n\n /**\n * Nested GUI's by name\n * @ignore\n */\n this.__folders = {};\n\n this.__controllers = [];\n\n /**\n * List of objects I'm remembering for save, only used in top level GUI\n * @ignore\n */\n this.__rememberedObjects = [];\n\n /**\n * Maps the index of remembered objects to a map of controllers, only used\n * in top level GUI.\n *\n * @private\n * @ignore\n *\n * @example\n * [\n * {\n * propertyName: Controller,\n * anotherPropertyName: Controller\n * },\n * {\n * propertyName: Controller\n * }\n * ]\n */\n this.__rememberedObjectIndecesToControllers = [];\n\n this.__listening = [];\n\n params = params || {};\n\n // Default parameters\n params = common.defaults(params, {\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n\n params = common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n\n\n if (!common.isUndefined(params.load)) {\n\n // Explicit preset\n if (params.preset) params.load.preset = params.preset;\n\n } else {\n\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n\n }\n\n if (common.isUndefined(params.parent) && params.hideable) {\n hideable_guis.push(this);\n }\n\n // Only root level GUI's are resizable.\n params.resizable = common.isUndefined(params.parent) && params.resizable;\n\n\n if (params.autoPlace && common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n// params.scrollable = common.isUndefined(params.parent) && params.scrollable === true;\n\n // Not part of params because I don't want people passing this in via\n // constructor. Should be a 'remembered' value.\n var use_local_storage =\n SUPPORTS_LOCAL_STORAGE &&\n localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n\n Object.defineProperties(this,\n\n /** @lends dat.gui.GUI.prototype */\n {\n\n /**\n * The parent GUI\n * @type dat.gui.GUI\n */\n parent: {\n get: function() {\n return params.parent;\n }\n },\n\n scrollable: {\n get: function() {\n return params.scrollable;\n }\n },\n\n /**\n * Handles GUI's element placement for you\n * @type Boolean\n */\n autoPlace: {\n get: function() {\n return params.autoPlace;\n }\n },\n\n /**\n * The identifier for a set of saved values\n * @type String\n */\n preset: {\n\n get: function() {\n if (_this.parent) {\n return _this.getRoot().preset;\n } else {\n return params.load.preset;\n }\n },\n\n set: function(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n\n },\n\n /**\n * The width of GUI element\n * @type Number\n */\n width: {\n get: function() {\n return params.width;\n },\n set: function(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n\n /**\n * The name of GUI. Used for folders. i.e\n * a folder's name\n * @type String\n */\n name: {\n get: function() {\n return params.name;\n },\n set: function(v) {\n // TODO Check for collisions among sibling folders\n params.name = v;\n if (title_row_name) {\n title_row_name.innerHTML = params.name;\n }\n }\n },\n\n /**\n * Whether the GUI is collapsed or not\n * @type Boolean\n */\n closed: {\n get: function() {\n return params.closed;\n },\n set: function(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n // For browsers that aren't going to respect the CSS transition,\n // Lets just check our height against the window height right off\n // the bat.\n this.onResize();\n\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n\n /**\n * Contains all presets\n * @type Object\n */\n load: {\n get: function() {\n return params.load;\n }\n },\n\n /**\n * Determines whether or not to use localStorage as the means for\n * remembering\n * @type Boolean\n */\n useLocalStorage: {\n\n get: function() {\n return use_local_storage;\n },\n set: function(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n use_local_storage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n\n }\n\n });\n\n // Are we a root level GUI?\n if (common.isUndefined(params.parent)) {\n\n params.closed = false;\n\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n\n // Are we supposed to be loading locally?\n if (SUPPORTS_LOCAL_STORAGE) {\n\n if (use_local_storage) {\n\n _this.useLocalStorage = true;\n\n var saved_gui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n\n if (saved_gui) {\n params.load = JSON.parse(saved_gui);\n }\n\n }\n\n }\n\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n this.domElement.appendChild(this.__closeButton);\n\n dom.bind(this.__closeButton, 'click', function() {\n\n _this.closed = !_this.closed;\n\n\n });\n\n\n // Oh, you're a nested GUI!\n } else {\n\n if (params.closed === undefined) {\n params.closed = true;\n }\n\n var title_row_name = document.createTextNode(params.name);\n dom.addClass(title_row_name, 'controller-name');\n\n var title_row = addRow(_this, title_row_name);\n\n var on_click_title = function(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n\n dom.addClass(title_row, 'title');\n dom.bind(title_row, 'click', on_click_title);\n\n if (!params.closed) {\n this.closed = false;\n }\n\n }\n\n if (params.autoPlace) {\n\n if (common.isUndefined(params.parent)) {\n\n if (auto_place_virgin) {\n auto_place_container = document.createElement('div');\n dom.addClass(auto_place_container, CSS_NAMESPACE);\n dom.addClass(auto_place_container, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(auto_place_container);\n auto_place_virgin = false;\n }\n\n // Put it in the dom for you.\n auto_place_container.appendChild(this.domElement);\n\n // Apply the auto styles\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n\n }\n\n\n // Make it not elastic.\n if (!this.parent) setWidth(_this, params.width);\n\n }\n\n dom.bind(window, 'resize', function() { _this.onResize() });\n dom.bind(this.__ul, 'webkitTransitionEnd', function() { _this.onResize(); });\n dom.bind(this.__ul, 'transitionend', function() { _this.onResize() });\n dom.bind(this.__ul, 'oTransitionEnd', function() { _this.onResize() });\n this.onResize();\n\n\n if (params.resizable) {\n addResizeHandle(this);\n }\n\n function saveToLocalStorage() {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n\n var root = _this.getRoot();\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n common.defer(function() {\n root.width -= 1;\n });\n }\n\n if (!params.parent) {\n resetWidth();\n }\n\n };\n\n GUI.toggleHide = function() {\n\n hide = !hide;\n common.each(hideable_guis, function(gui) {\n gui.domElement.style.zIndex = hide ? -999 : 999;\n gui.domElement.style.opacity = hide ? 0 : 1;\n });\n };\n\n GUI.CLASS_AUTO_PLACE = 'a';\n GUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\n GUI.CLASS_MAIN = 'main';\n GUI.CLASS_CONTROLLER_ROW = 'cr';\n GUI.CLASS_TOO_TALL = 'taller-than-window';\n GUI.CLASS_CLOSED = 'closed';\n GUI.CLASS_CLOSE_BUTTON = 'close-button';\n GUI.CLASS_DRAG = 'drag';\n\n GUI.DEFAULT_WIDTH = 245;\n GUI.TEXT_CLOSED = 'Close Controls';\n GUI.TEXT_OPEN = 'Open Controls';\n\n dom.bind(window, 'keydown', function(e) {\n\n if (document.activeElement.type !== 'text' &&\n (e.which === HIDE_KEY_CODE || e.keyCode == HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n\n }, false);\n\n common.extend(\n\n GUI.prototype,\n\n /** @lends dat.gui.GUI */\n {\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.Controller} The new controller that was added.\n * @instance\n */\n add: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n }\n );\n\n },\n\n /**\n * @param object\n * @param property\n * @returns {dat.controllers.ColorController} The new controller that was added.\n * @instance\n */\n addColor: function(object, property) {\n\n return add(\n this,\n object,\n property,\n {\n color: true\n }\n );\n\n },\n\n /**\n * @param controller\n * @instance\n */\n remove: function(controller) {\n\n // TODO listening?\n this.__ul.removeChild(controller.__li);\n this.__controllers.slice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n common.defer(function() {\n _this.onResize();\n });\n\n },\n\n destroy: function() {\n\n if (this.autoPlace) {\n auto_place_container.removeChild(this.domElement);\n }\n\n },\n\n /**\n * @param name\n * @returns {dat.gui.GUI} The new folder.\n * @throws {Error} if this GUI already has a folder by the specified\n * name\n * @instance\n */\n addFolder: function(name) {\n\n // We have to prevent collisions on names in order to have a key\n // by which to remember saved values\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' +\n ' name \"' + name + '\"');\n }\n\n var new_gui_params = { name: name, parent: this };\n\n // We need to pass down the autoPlace trait so that we can\n // attach event listeners to open/close folder actions to\n // ensure that a scrollbar appears if the window is too short.\n new_gui_params.autoPlace = this.autoPlace;\n\n // Do we have saved appearance data for this folder?\n\n if (this.load && // Anything loaded?\n this.load.folders && // Was my parent a dead-end?\n this.load.folders[name]) { // Did daddy remember me?\n\n // Start me closed if I was closed\n new_gui_params.closed = this.load.folders[name].closed;\n\n // Pass down the loaded data\n new_gui_params.load = this.load.folders[name];\n\n }\n\n var gui = new GUI(new_gui_params);\n this.__folders[name] = gui;\n\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n\n },\n\n open: function() {\n this.closed = false;\n },\n\n close: function() {\n this.closed = true;\n },\n\n onResize: function() {\n\n var root = this.getRoot();\n\n if (root.scrollable) {\n\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n\n common.each(root.__ul.childNodes, function(node) {\n if (! (root.autoPlace && node === root.__save_row))\n h += dom.getHeight(node);\n });\n\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n\n }\n\n if (root.__resize_handle) {\n common.defer(function() {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n\n },\n\n /**\n * Mark objects for saving. The order of these objects cannot change as\n * the GUI grows. When remembering new objects, append them to the end\n * of the list.\n *\n * @param {Object...} objects\n * @throws {Error} if not called on a top level GUI.\n * @instance\n */\n remember: function() {\n\n if (common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogueContents;\n }\n\n if (this.parent) {\n throw new Error(\"You can only call remember on a top level GUI.\");\n }\n\n var _this = this;\n\n common.each(Array.prototype.slice.call(arguments), function(object) {\n if (_this.__rememberedObjects.length == 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) == -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n\n if (this.autoPlace) {\n // Set save row width\n setWidth(this, this.width);\n }\n\n },\n\n /**\n * @returns {dat.gui.GUI} the topmost parent GUI of a nested GUI.\n * @instance\n */\n getRoot: function() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n\n /**\n * @returns {Object} a JSON object representing the current state of\n * this GUI as well as its remembered properties.\n * @instance\n */\n getSaveObject: function() {\n\n var toReturn = this.load;\n\n toReturn.closed = this.closed;\n\n // Am I remembering any values?\n if (this.__rememberedObjects.length > 0) {\n\n toReturn.preset = this.preset;\n\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n\n }\n\n toReturn.folders = {};\n common.each(this.__folders, function(element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n\n return toReturn;\n\n },\n\n save: function() {\n\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n\n },\n\n saveAs: function(presetName) {\n\n if (!this.load.remembered) {\n\n // Retain default values upon first save\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n\n }\n\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n\n },\n\n revert: function(gui) {\n\n common.each(this.__controllers, function(controller) {\n // Make revert work on Default.\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n }, this);\n\n common.each(this.__folders, function(folder) {\n folder.revert(folder);\n });\n\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n\n\n },\n\n listen: function(controller) {\n\n var init = this.__listening.length == 0;\n this.__listening.push(controller);\n if (init) updateDisplays(this.__listening);\n\n }\n\n }\n\n );\n\n function add(gui, object, property, params) {\n\n if (object[property] === undefined) {\n throw new Error(\"Object \" + object + \" has no property \\\"\" + property + \"\\\"\");\n }\n\n var controller;\n\n if (params.color) {\n\n controller = new ColorController(object, property);\n\n } else {\n\n var factoryArgs = [object,property].concat(params.factoryArgs);\n controller = controllerFactory.apply(gui, factoryArgs);\n\n }\n\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n\n recallSavedValue(gui, controller);\n\n dom.addClass(controller.domElement, 'c');\n\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n\n var li = addRow(gui, container, params.before);\n\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n dom.addClass(li, typeof controller.getValue());\n\n augmentController(gui, li, controller);\n\n gui.__controllers.push(controller);\n\n return controller;\n\n }\n\n /**\n * Add a row to the end of the GUI or before another row.\n *\n * @param gui\n * @param [dom] If specified, inserts the dom content in the new row\n * @param [liBefore] If specified, places the new row before another row\n */\n function addRow(gui, dom, liBefore) {\n var li = document.createElement('li');\n if (dom) li.appendChild(dom);\n if (liBefore) {\n gui.__ul.insertBefore(li, params.before);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n }\n\n function augmentController(gui, li, controller) {\n\n controller.__li = li;\n controller.__gui = gui;\n\n common.extend(controller, {\n\n options: function(options) {\n\n if (arguments.length > 1) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [common.toArray(arguments)]\n }\n );\n\n }\n\n if (common.isArray(options) || common.isObject(options)) {\n controller.remove();\n\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [options]\n }\n );\n\n }\n\n },\n\n name: function(v) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = v;\n return controller;\n },\n\n listen: function() {\n controller.__gui.listen(controller);\n return controller;\n },\n\n remove: function() {\n controller.__gui.remove(controller);\n return controller;\n }\n\n });\n\n // All sliders should be accompanied by a box.\n if (controller instanceof NumberControllerSlider) {\n\n var box = new NumberControllerBox(controller.object, controller.property,\n { min: controller.__min, max: controller.__max, step: controller.__step });\n\n common.each(['updateDisplay', 'onChange', 'onFinishChange'], function(method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function() {\n var args = Array.prototype.slice.call(arguments);\n pc.apply(controller, args);\n return pb.apply(box, args);\n }\n });\n\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n\n }\n else if (controller instanceof NumberControllerBox) {\n\n var r = function(returned) {\n\n // Have we defined both boundaries?\n if (common.isNumber(controller.__min) && common.isNumber(controller.__max)) {\n\n // Well, then lets just replace this with a slider.\n controller.remove();\n return add(\n gui,\n controller.object,\n controller.property,\n {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n\n }\n\n return returned;\n\n };\n\n controller.min = common.compose(r, controller.min);\n controller.max = common.compose(r, controller.max);\n\n }\n else if (controller instanceof BooleanController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n\n dom.bind(controller.__checkbox, 'click', function(e) {\n e.stopPropagation(); // Prevents double-toggle\n })\n\n }\n else if (controller instanceof FunctionController) {\n\n dom.bind(li, 'click', function() {\n dom.fakeEvent(controller.__button, 'click');\n });\n\n dom.bind(li, 'mouseover', function() {\n dom.addClass(controller.__button, 'hover');\n });\n\n dom.bind(li, 'mouseout', function() {\n dom.removeClass(controller.__button, 'hover');\n });\n\n }\n else if (controller instanceof ColorController) {\n\n dom.addClass(li, 'color');\n controller.updateDisplay = common.compose(function(r) {\n li.style.borderLeftColor = controller.__color.toString();\n return r;\n }, controller.updateDisplay);\n\n controller.updateDisplay();\n\n }\n\n controller.setValue = common.compose(function(r) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return r;\n }, controller.setValue);\n\n }\n\n function recallSavedValue(gui, controller) {\n\n // Find the topmost GUI, that's where remembered objects live.\n var root = gui.getRoot();\n\n // Does the object we're controlling match anything we've been told to\n // remember?\n var matched_index = root.__rememberedObjects.indexOf(controller.object);\n\n // Why yes, it does!\n if (matched_index != -1) {\n\n // Let me fetch a map of controllers for thcommon.isObject.\n var controller_map =\n root.__rememberedObjectIndecesToControllers[matched_index];\n\n // Ohp, I believe this is the first controller we've created for this\n // object. Lets make the map fresh.\n if (controller_map === undefined) {\n controller_map = {};\n root.__rememberedObjectIndecesToControllers[matched_index] =\n controller_map;\n }\n\n // Keep track of this controller\n controller_map[controller.property] = controller;\n\n // Okay, now have we saved any values for this controller?\n if (root.load && root.load.remembered) {\n\n var preset_map = root.load.remembered;\n\n // Which preset are we trying to load?\n var preset;\n\n if (preset_map[gui.preset]) {\n\n preset = preset_map[gui.preset];\n\n } else if (preset_map[DEFAULT_DEFAULT_PRESET_NAME]) {\n\n // Uhh, you can have the default instead?\n preset = preset_map[DEFAULT_DEFAULT_PRESET_NAME];\n\n } else {\n\n // Nada.\n\n return;\n\n }\n\n\n // Did the loaded object remember thcommon.isObject?\n if (preset[matched_index] &&\n\n // Did we remember this particular property?\n preset[matched_index][controller.property] !== undefined) {\n\n // We did remember something for this guy ...\n var value = preset[matched_index][controller.property];\n\n // And that's what it is.\n controller.initialValue = value;\n controller.setValue(value);\n\n }\n\n }\n\n }\n\n }\n\n function getLocalStorageHash(gui, key) {\n // TODO how does this deal with multiple GUI's?\n return document.location.href + '.' + key;\n\n }\n\n function addSaveMenu(gui) {\n\n var div = gui.__save_row = document.createElement('li');\n\n dom.addClass(gui.domElement, 'has-save');\n\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n\n dom.addClass(div, 'save-row');\n\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n\n // TODO replace with FunctionController\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n\n var select = gui.__preset_select = document.createElement('select');\n\n if (gui.load && gui.load.remembered) {\n\n common.each(gui.load.remembered, function(value, key) {\n addPresetOption(gui, key, key == gui.preset);\n });\n\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n\n dom.bind(select, 'change', function() {\n\n\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n\n gui.preset = this.value;\n\n });\n\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n\n if (SUPPORTS_LOCAL_STORAGE) {\n\n var saveLocally = document.getElementById('dg-save-locally');\n var explain = document.getElementById('dg-local-explain');\n\n saveLocally.style.display = 'block';\n\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n\n function showHideExplain() {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n }\n\n showHideExplain();\n\n // TODO: Use a boolean controller, fool!\n dom.bind(localStorageCheckBox, 'change', function() {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain();\n });\n\n }\n\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n\n dom.bind(newConstructorTextArea, 'keydown', function(e) {\n if (e.metaKey && (e.which === 67 || e.keyCode == 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n\n dom.bind(gears, 'click', function() {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n\n dom.bind(button, 'click', function() {\n gui.save();\n });\n\n dom.bind(button2, 'click', function() {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) gui.saveAs(presetName);\n });\n\n dom.bind(button3, 'click', function() {\n gui.revert();\n });\n\n// div.appendChild(button2);\n\n }\n\n function addResizeHandle(gui) {\n\n gui.__resize_handle = document.createElement('div');\n\n common.extend(gui.__resize_handle.style, {\n\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n// border: '1px solid blue'\n\n });\n\n var pmouseX;\n\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n\n function dragStart(e) {\n\n e.preventDefault();\n\n pmouseX = e.clientX;\n\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n\n return false;\n\n }\n\n function drag(e) {\n\n e.preventDefault();\n\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n\n return false;\n\n }\n\n function dragStop() {\n\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n\n }\n\n }\n\n function setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n // Auto placed save-rows are position fixed, so we have to\n // set the width manually if we want it to bleed to the edge\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n }\n\n function getCurrentPreset(gui, useInitialValues) {\n\n var toReturn = {};\n\n // For each object I'm remembering\n common.each(gui.__rememberedObjects, function(val, index) {\n\n var saved_values = {};\n\n // The controllers I've made for thcommon.isObject by property\n var controller_map =\n gui.__rememberedObjectIndecesToControllers[index];\n\n // Remember each value for each property\n common.each(controller_map, function(controller, property) {\n saved_values[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n\n // Save the values for thcommon.isObject\n toReturn[index] = saved_values;\n\n });\n\n return toReturn;\n\n }\n\n function addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n }\n\n function setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value == gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n }\n\n function markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n// console.log('mark', modified, opt);\n if (modified) {\n opt.innerHTML = opt.value + \"*\";\n } else {\n opt.innerHTML = opt.value;\n }\n }\n\n function updateDisplays(controllerArray) {\n\n\n if (controllerArray.length != 0) {\n\n requestAnimationFrame(function() {\n updateDisplays(controllerArray);\n });\n\n }\n\n common.each(controllerArray, function(c) {\n c.updateDisplay();\n });\n\n }\n\n return GUI;\n\n})(dat.utils.css,\n\"
\\n\\n Here's the new load parameter for your GUI's constructor:\\n\\n \\n\\n
\\n\\n Automatically save\\n values to localStorage on exit.\\n\\n
The values saved to localStorage will\\n override those passed to dat.GUI's constructor. This makes it\\n easier to work incrementally, but localStorage is fragile,\\n and your friends may not see the same values you do.\\n \\n
\\n \\n
\\n\\n
\",\n\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear;border:0;position:absolute;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save ul{margin-top:27px}.dg.a.has-save ul.closed{margin-top:0}.dg.a .save-row{position:fixed;top:0;z-index:1002}.dg li{-webkit-transition:height 0.1s ease-out;-o-transition:height 0.1s ease-out;-moz-transition:height 0.1s ease-out;transition:height 0.1s ease-out}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:hidden;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li > *{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:9px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\",\ndat.controllers.factory = (function (OptionController, NumberControllerBox, NumberControllerSlider, StringController, FunctionController, BooleanController, common) {\n\n return function(object, property) {\n\n var initialValue = object[property];\n\n // Providing options?\n if (common.isArray(arguments[2]) || common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n\n // Providing a map?\n\n if (common.isNumber(initialValue)) {\n\n if (common.isNumber(arguments[2]) && common.isNumber(arguments[3])) {\n\n // Has min and max.\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n\n } else {\n\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n\n }\n\n }\n\n if (common.isString(initialValue)) {\n return new StringController(object, property);\n }\n\n if (common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n\n if (common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n\n }\n\n })(dat.controllers.OptionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.StringController = (function (Controller, dom, common) {\n\n /**\n * @class Provides a text input to alter the string property of an object.\n *\n * @extends dat.controllers.Controller\n *\n * @param {Object} object The object to be manipulated\n * @param {string} property The name of the property to be manipulated\n *\n * @member dat.controllers\n */\n var StringController = function(object, property) {\n\n StringController.superclass.call(this, object, property);\n\n var _this = this;\n\n this.__input = document.createElement('input');\n this.__input.setAttribute('type', 'text');\n\n dom.bind(this.__input, 'keyup', onChange);\n dom.bind(this.__input, 'change', onChange);\n dom.bind(this.__input, 'blur', onBlur);\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n \n\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n\n this.updateDisplay();\n\n this.domElement.appendChild(this.__input);\n\n };\n\n StringController.superclass = Controller;\n\n common.extend(\n\n StringController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n // Stops the caret from moving on account of:\n // keyup -> setValue -> updateDisplay\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return StringController.superclass.prototype.updateDisplay.call(this);\n }\n\n }\n\n );\n\n return StringController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.utils.common),\ndat.controllers.FunctionController,\ndat.controllers.BooleanController,\ndat.utils.common),\ndat.controllers.Controller,\ndat.controllers.BooleanController,\ndat.controllers.FunctionController,\ndat.controllers.NumberControllerBox,\ndat.controllers.NumberControllerSlider,\ndat.controllers.OptionController,\ndat.controllers.ColorController = (function (Controller, dom, Color, interpret, common) {\n\n var ColorController = function(object, property) {\n\n ColorController.superclass.call(this, object, property);\n\n this.__color = new Color(this.getValue());\n this.__temp = new Color(0);\n\n var _this = this;\n\n this.domElement = document.createElement('div');\n\n dom.makeSelectable(this.domElement, false);\n\n this.__selector = document.createElement('div');\n this.__selector.className = 'selector';\n\n this.__saturation_field = document.createElement('div');\n this.__saturation_field.className = 'saturation-field';\n\n this.__field_knob = document.createElement('div');\n this.__field_knob.className = 'field-knob';\n this.__field_knob_border = '2px solid ';\n\n this.__hue_knob = document.createElement('div');\n this.__hue_knob.className = 'hue-knob';\n\n this.__hue_field = document.createElement('div');\n this.__hue_field.className = 'hue-field';\n\n this.__input = document.createElement('input');\n this.__input.type = 'text';\n this.__input_textShadow = '0 1px 1px ';\n\n dom.bind(this.__input, 'keydown', function(e) {\n if (e.keyCode === 13) { // on enter\n onBlur.call(this);\n }\n });\n\n dom.bind(this.__input, 'blur', onBlur);\n\n dom.bind(this.__selector, 'mousedown', function(e) {\n\n dom\n .addClass(this, 'drag')\n .bind(window, 'mouseup', function(e) {\n dom.removeClass(_this.__selector, 'drag');\n });\n\n });\n\n var value_field = document.createElement('div');\n\n common.extend(this.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n\n common.extend(this.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: this.__field_knob_border + (this.__color.v < .5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n \n common.extend(this.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n\n common.extend(this.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n\n common.extend(value_field.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n \n linearGradient(value_field, 'top', 'rgba(0,0,0,0)', '#000');\n\n common.extend(this.__hue_field.style, {\n width: '15px',\n height: '100px',\n display: 'inline-block',\n border: '1px solid #555',\n cursor: 'ns-resize'\n });\n\n hueGradient(this.__hue_field);\n\n common.extend(this.__input.style, {\n outline: 'none',\n// width: '120px',\n textAlign: 'center',\n// padding: '4px',\n// marginBottom: '6px',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: this.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n\n dom.bind(this.__saturation_field, 'mousedown', fieldDown);\n dom.bind(this.__field_knob, 'mousedown', fieldDown);\n\n dom.bind(this.__hue_field, 'mousedown', function(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'mouseup', unbindH);\n });\n\n function fieldDown(e) {\n setSV(e);\n // document.body.style.cursor = 'none';\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'mouseup', unbindSV);\n }\n\n function unbindSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'mouseup', unbindSV);\n // document.body.style.cursor = 'default';\n }\n\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n\n function unbindH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'mouseup', unbindH);\n }\n\n this.__saturation_field.appendChild(value_field);\n this.__selector.appendChild(this.__field_knob);\n this.__selector.appendChild(this.__saturation_field);\n this.__selector.appendChild(this.__hue_field);\n this.__hue_field.appendChild(this.__hue_knob);\n\n this.domElement.appendChild(this.__input);\n this.domElement.appendChild(this.__selector);\n\n this.updateDisplay();\n\n function setSV(e) {\n\n e.preventDefault();\n\n var w = dom.getWidth(_this.__saturation_field);\n var o = dom.getOffset(_this.__saturation_field);\n var s = (e.clientX - o.left + document.body.scrollLeft) / w;\n var v = 1 - (e.clientY - o.top + document.body.scrollTop) / w;\n\n if (v > 1) v = 1;\n else if (v < 0) v = 0;\n\n if (s > 1) s = 1;\n else if (s < 0) s = 0;\n\n _this.__color.v = v;\n _this.__color.s = s;\n\n _this.setValue(_this.__color.toOriginal());\n\n\n return false;\n\n }\n\n function setH(e) {\n\n e.preventDefault();\n\n var s = dom.getHeight(_this.__hue_field);\n var o = dom.getOffset(_this.__hue_field);\n var h = 1 - (e.clientY - o.top + document.body.scrollTop) / s;\n\n if (h > 1) h = 1;\n else if (h < 0) h = 0;\n\n _this.__color.h = h * 360;\n\n _this.setValue(_this.__color.toOriginal());\n\n return false;\n\n }\n\n };\n\n ColorController.superclass = Controller;\n\n common.extend(\n\n ColorController.prototype,\n Controller.prototype,\n\n {\n\n updateDisplay: function() {\n\n var i = interpret(this.getValue());\n\n if (i !== false) {\n\n var mismatch = false;\n\n // Check for mismatch on the interpreted value.\n\n common.each(Color.COMPONENTS, function(component) {\n if (!common.isUndefined(i[component]) &&\n !common.isUndefined(this.__color.__state[component]) &&\n i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {}; // break\n }\n }, this);\n\n // If nothing diverges, we keep our previous values\n // for statefulness, otherwise we recalculate fresh\n if (mismatch) {\n common.extend(this.__color.__state, i);\n }\n\n }\n\n common.extend(this.__temp.__state, this.__color.__state);\n\n this.__temp.a = 1;\n\n var flip = (this.__color.v < .5 || this.__color.s > .5) ? 255 : 0;\n var _flip = 255 - flip;\n\n common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip +')'\n });\n\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px'\n\n this.__temp.s = 1;\n this.__temp.v = 1;\n\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toString());\n\n common.extend(this.__input.style, {\n backgroundColor: this.__input.value = this.__color.toString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip +')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip +',.7)'\n });\n\n }\n\n }\n\n );\n \n var vendors = ['-moz-','-o-','-webkit-','-ms-',''];\n \n function linearGradient(elem, x, a, b) {\n elem.style.background = '';\n common.each(vendors, function(vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient('+x+', '+a+' 0%, ' + b + ' 100%); ';\n });\n }\n \n function hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);'\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);'\n }\n\n\n return ColorController;\n\n})(dat.controllers.Controller,\ndat.dom.dom,\ndat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret,\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common),\ndat.color.interpret,\ndat.utils.common),\ndat.utils.requestAnimationFrame = (function () {\n\n /**\n * requirejs version of Paul Irish's RequestAnimationFrame\n * http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n */\n\n return window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function(callback, element) {\n\n window.setTimeout(callback, 1000 / 60);\n\n };\n})(),\ndat.dom.CenteredDiv = (function (dom, common) {\n\n\n var CenteredDiv = function() {\n\n this.backgroundElement = document.createElement('div');\n common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear'\n });\n\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n\n this.domElement = document.createElement('div');\n common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear'\n });\n\n\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function() {\n _this.hide();\n });\n\n\n };\n\n CenteredDiv.prototype.show = function() {\n\n var _this = this;\n \n\n\n this.backgroundElement.style.display = 'block';\n\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n// this.domElement.style.top = '52%';\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n this.layout();\n\n common.defer(function() {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n\n };\n\n CenteredDiv.prototype.hide = function() {\n\n var _this = this;\n\n var hide = function() {\n\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n\n };\n\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n\n this.backgroundElement.style.opacity = 0;\n// this.domElement.style.top = '48%';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n\n };\n\n CenteredDiv.prototype.layout = function() {\n this.domElement.style.left = window.innerWidth/2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight/2 - dom.getHeight(this.domElement) / 2 + 'px';\n };\n \n function lockScroll(e) {\n console.log(e);\n }\n\n return CenteredDiv;\n\n})(dat.dom.dom,\ndat.utils.common),\ndat.dom.dom,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.gui.js\n// module id = 10\n// module chunks = 0","/**\n * dat-gui JavaScript Controller Library\n * http://code.google.com/p/dat-gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/** @namespace */\nvar dat = module.exports = dat || {};\n\n/** @namespace */\ndat.color = dat.color || {};\n\n/** @namespace */\ndat.utils = dat.utils || {};\n\ndat.utils.common = (function () {\n \n var ARR_EACH = Array.prototype.forEach;\n var ARR_SLICE = Array.prototype.slice;\n\n /**\n * Band-aid methods for things that should be a lot easier in JavaScript.\n * Implementation and structure inspired by underscore.js\n * http://documentcloud.github.com/underscore/\n */\n\n return { \n \n BREAK: {},\n \n extend: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (!this.isUndefined(obj[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n defaults: function(target) {\n \n this.each(ARR_SLICE.call(arguments, 1), function(obj) {\n \n for (var key in obj)\n if (this.isUndefined(target[key])) \n target[key] = obj[key];\n \n }, this);\n \n return target;\n \n },\n \n compose: function() {\n var toCall = ARR_SLICE.call(arguments);\n return function() {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length -1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n }\n },\n \n each: function(obj, itr, scope) {\n\n \n if (ARR_EACH && obj.forEach === ARR_EACH) { \n \n obj.forEach(itr, scope);\n \n } else if (obj.length === obj.length + 0) { // Is number but not NaN\n \n for (var key = 0, l = obj.length; key < l; key++)\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) \n return;\n \n } else {\n\n for (var key in obj) \n if (itr.call(scope, obj[key], key) === this.BREAK)\n return;\n \n }\n \n },\n \n defer: function(fnc) {\n setTimeout(fnc, 0);\n },\n \n toArray: function(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n\n isUndefined: function(obj) {\n return obj === undefined;\n },\n \n isNull: function(obj) {\n return obj === null;\n },\n \n isNaN: function(obj) {\n return obj !== obj;\n },\n \n isArray: Array.isArray || function(obj) {\n return obj.constructor === Array;\n },\n \n isObject: function(obj) {\n return obj === Object(obj);\n },\n \n isNumber: function(obj) {\n return obj === obj+0;\n },\n \n isString: function(obj) {\n return obj === obj+'';\n },\n \n isBoolean: function(obj) {\n return obj === false || obj === true;\n },\n \n isFunction: function(obj) {\n return Object.prototype.toString.call(obj) === '[object Function]';\n }\n \n };\n \n})();\n\n\ndat.color.toString = (function (common) {\n\n return function(color) {\n\n if (color.a == 1 || common.isUndefined(color.a)) {\n\n var s = color.hex.toString(16);\n while (s.length < 6) {\n s = '0' + s;\n }\n\n return '#' + s;\n\n } else {\n\n return 'rgba(' + Math.round(color.r) + ',' + Math.round(color.g) + ',' + Math.round(color.b) + ',' + color.a + ')';\n\n }\n\n }\n\n})(dat.utils.common);\n\n\ndat.Color = dat.color.Color = (function (interpret, math, toString, common) {\n\n var Color = function() {\n\n this.__state = interpret.apply(this, arguments);\n\n if (this.__state === false) {\n throw 'Failed to interpret color arguments';\n }\n\n this.__state.a = this.__state.a || 1;\n\n\n };\n\n Color.COMPONENTS = ['r','g','b','h','s','v','hex','a'];\n\n common.extend(Color.prototype, {\n\n toString: function() {\n return toString(this);\n },\n\n toOriginal: function() {\n return this.__state.conversion.write(this);\n }\n\n });\n\n defineRGBComponent(Color.prototype, 'r', 2);\n defineRGBComponent(Color.prototype, 'g', 1);\n defineRGBComponent(Color.prototype, 'b', 0);\n\n defineHSVComponent(Color.prototype, 'h');\n defineHSVComponent(Color.prototype, 's');\n defineHSVComponent(Color.prototype, 'v');\n\n Object.defineProperty(Color.prototype, 'a', {\n\n get: function() {\n return this.__state.a;\n },\n\n set: function(v) {\n this.__state.a = v;\n }\n\n });\n\n Object.defineProperty(Color.prototype, 'hex', {\n\n get: function() {\n\n if (!this.__state.space !== 'HEX') {\n this.__state.hex = math.rgb_to_hex(this.r, this.g, this.b);\n }\n\n return this.__state.hex;\n\n },\n\n set: function(v) {\n\n this.__state.space = 'HEX';\n this.__state.hex = v;\n\n }\n\n });\n\n function defineRGBComponent(target, component, componentHexIndex) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n\n recalculateRGB(this, component, componentHexIndex);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'RGB') {\n recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function defineHSVComponent(target, component) {\n\n Object.defineProperty(target, component, {\n\n get: function() {\n\n if (this.__state.space === 'HSV')\n return this.__state[component];\n\n recalculateHSV(this);\n\n return this.__state[component];\n\n },\n\n set: function(v) {\n\n if (this.__state.space !== 'HSV') {\n recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n\n this.__state[component] = v;\n\n }\n\n });\n\n }\n\n function recalculateRGB(color, component, componentHexIndex) {\n\n if (color.__state.space === 'HEX') {\n\n color.__state[component] = math.component_from_hex(color.__state.hex, componentHexIndex);\n\n } else if (color.__state.space === 'HSV') {\n\n common.extend(color.__state, math.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n\n } else {\n\n throw 'Corrupted color state';\n\n }\n\n }\n\n function recalculateHSV(color) {\n\n var result = math.rgb_to_hsv(color.r, color.g, color.b);\n\n common.extend(color.__state,\n {\n s: result.s,\n v: result.v\n }\n );\n\n if (!common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n\n }\n\n return Color;\n\n})(dat.color.interpret = (function (toString, common) {\n\n var result, toReturn;\n\n var interpret = function() {\n\n toReturn = false;\n\n var original = arguments.length > 1 ? common.toArray(arguments) : arguments[0];\n\n common.each(INTERPRETATIONS, function(family) {\n\n if (family.litmus(original)) {\n\n common.each(family.conversions, function(conversion, conversionName) {\n\n result = conversion.read(original);\n\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return common.BREAK;\n\n }\n\n });\n\n return common.BREAK;\n\n }\n\n });\n\n return toReturn;\n\n };\n\n var INTERPRETATIONS = [\n\n // Strings\n {\n\n litmus: common.isString,\n\n conversions: {\n\n THREE_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt(\n '0x' +\n test[1].toString() + test[1].toString() +\n test[2].toString() + test[2].toString() +\n test[3].toString() + test[3].toString())\n };\n\n },\n\n write: toString\n\n },\n\n SIX_CHAR_HEX: {\n\n read: function(original) {\n\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) return false;\n\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString())\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGB: {\n\n read: function(original) {\n\n var test = original.match(/^rgb\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n\n },\n\n write: toString\n\n },\n\n CSS_RGBA: {\n\n read: function(original) {\n\n var test = original.match(/^rgba\\(\\s*(.+)\\s*,\\s*(.+)\\s*,\\s*(.+)\\s*\\,\\s*(.+)\\s*\\)/);\n if (test === null) return false;\n\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n\n },\n\n write: toString\n\n }\n\n }\n\n },\n\n // Numbers\n {\n\n litmus: common.isNumber,\n\n conversions: {\n\n HEX: {\n read: function(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n }\n },\n\n write: function(color) {\n return color.hex;\n }\n }\n\n }\n\n },\n\n // Arrays\n {\n\n litmus: common.isArray,\n\n conversions: {\n\n RGB_ARRAY: {\n read: function(original) {\n if (original.length != 3) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b];\n }\n\n },\n\n RGBA_ARRAY: {\n read: function(original) {\n if (original.length != 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n\n write: function(color) {\n return [color.r, color.g, color.b, color.a];\n }\n\n }\n\n }\n\n },\n\n // Objects\n {\n\n litmus: common.isObject,\n\n conversions: {\n\n RGBA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b) &&\n common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n }\n }\n },\n\n RGB_OBJ: {\n read: function(original) {\n if (common.isNumber(original.r) &&\n common.isNumber(original.g) &&\n common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n }\n }\n },\n\n HSVA_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v) &&\n common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n }\n }\n },\n\n HSV_OBJ: {\n read: function(original) {\n if (common.isNumber(original.h) &&\n common.isNumber(original.s) &&\n common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n }\n }\n return false;\n },\n\n write: function(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n }\n }\n\n }\n\n }\n\n }\n\n\n ];\n\n return interpret;\n\n\n})(dat.color.toString,\ndat.utils.common),\ndat.color.math = (function () {\n\n var tmpComponent;\n\n return {\n\n hsv_to_rgb: function(h, s, v) {\n\n var hi = Math.floor(h / 60) % 6;\n\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - (f * s));\n var t = v * (1.0 - ((1.0 - f) * s));\n var c = [\n [v, t, p],\n [q, v, p],\n [p, v, t],\n [p, q, v],\n [t, p, v],\n [v, p, q]\n ][hi];\n\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n\n },\n\n rgb_to_hsv: function(r, g, b) {\n\n var min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s;\n\n if (max != 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n\n if (r == max) {\n h = (g - b) / delta;\n } else if (g == max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n\n rgb_to_hex: function(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n\n component_from_hex: function(hex, componentIndex) {\n return (hex >> (componentIndex * 8)) & 0xFF;\n },\n\n hex_with_component: function(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | (hex & ~ (0xFF << tmpComponent));\n }\n\n }\n\n})(),\ndat.color.toString,\ndat.utils.common);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/dat-gui/vendor/dat.color.js\n// module id = 11\n// module chunks = 0","module.exports = function( THREE ) {\n\t/**\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one finger move\n// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n// Pan - right mouse, or arrow keys / touch: three finter swipe\n\n\tfunction OrbitControls( object, domElement ) {\n\n\t\tthis.object = object;\n\n\t\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new THREE.Vector3();\n\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = - Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t//\n\t\t// public methods\n\t\t//\n\n\t\tthis.getPolarAngle = function () {\n\n\t\t\treturn spherical.phi;\n\n\t\t};\n\n\t\tthis.getAzimuthalAngle = function () {\n\n\t\t\treturn spherical.theta;\n\n\t\t};\n\n\t\tthis.reset = function () {\n\n\t\t\tscope.target.copy( scope.target0 );\n\t\t\tscope.object.position.copy( scope.position0 );\n\t\t\tscope.object.zoom = scope.zoom0;\n\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\tscope.update();\n\n\t\t\tstate = STATE.NONE;\n\n\t\t};\n\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\t// so camera.up is the orbit axis\n\t\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\t\tvar quatInverse = quat.clone().inverse();\n\n\t\t\tvar lastPosition = new THREE.Vector3();\n\t\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\t\treturn function update () {\n\n\t\t\t\tvar position = scope.object.position;\n\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t\t// angle from z-axis around y-axis\n\t\t\t\tspherical.setFromVector3( offset );\n\n\t\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t\t}\n\n\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\tspherical.phi += sphericalDelta.phi;\n\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\tspherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) );\n\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tspherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n\t\t\t\tspherical.makeSafe();\n\n\n\t\t\t\tspherical.radius *= scale;\n\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tspherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n\t\t\t\t// move target to panned location\n\t\t\t\tscope.target.add( panOffset );\n\n\t\t\t\toffset.setFromSpherical( spherical );\n\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\t\tsphericalDelta.theta *= ( 1 - scope.dampingFactor );\n\t\t\t\t\tsphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsphericalDelta.set( 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\t\tif ( zoomChanged ||\n\t\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\t\tzoomChanged = false;\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t};\n\n\t\t}();\n\n\t\tthis.dispose = function() {\n\n\t\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\t\tscope.domElement.removeEventListener( 'wheel', onMouseWheel, false );\n\n\t\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t\t};\n\n\t\t//\n\t\t// internals\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tvar changeEvent = { type: 'change' };\n\t\tvar startEvent = { type: 'start' };\n\t\tvar endEvent = { type: 'end' };\n\n\t\tvar STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\n\t\tvar state = STATE.NONE;\n\n\t\tvar EPS = 0.000001;\n\n\t\t// current position in spherical coordinates\n\t\tvar spherical = new THREE.Spherical();\n\t\tvar sphericalDelta = new THREE.Spherical();\n\n\t\tvar scale = 1;\n\t\tvar panOffset = new THREE.Vector3();\n\t\tvar zoomChanged = false;\n\n\t\tvar rotateStart = new THREE.Vector2();\n\t\tvar rotateEnd = new THREE.Vector2();\n\t\tvar rotateDelta = new THREE.Vector2();\n\n\t\tvar panStart = new THREE.Vector2();\n\t\tvar panEnd = new THREE.Vector2();\n\t\tvar panDelta = new THREE.Vector2();\n\n\t\tvar dollyStart = new THREE.Vector2();\n\t\tvar dollyEnd = new THREE.Vector2();\n\t\tvar dollyDelta = new THREE.Vector2();\n\n\t\tfunction getAutoRotationAngle() {\n\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t\t}\n\n\t\tfunction getZoomScale() {\n\n\t\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t\t}\n\n\t\tfunction rotateLeft( angle ) {\n\n\t\t\tsphericalDelta.theta -= angle;\n\n\t\t}\n\n\t\tfunction rotateUp( angle ) {\n\n\t\t\tsphericalDelta.phi -= angle;\n\n\t\t}\n\n\t\tvar panLeft = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panLeft( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t\t\tv.multiplyScalar( - distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\tvar panUp = function() {\n\n\t\t\tvar v = new THREE.Vector3();\n\n\t\t\treturn function panUp( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 1 ); // get Y column of objectMatrix\n\t\t\t\tv.multiplyScalar( distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tvar pan = function() {\n\n\t\t\tvar offset = new THREE.Vector3();\n\n\t\t\treturn function pan ( deltaX, deltaY ) {\n\n\t\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\t\t// perspective\n\t\t\t\t\tvar position = scope.object.position;\n\t\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n\t\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\t\tscope.enablePan = false;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}();\n\n\t\tfunction dollyIn( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale /= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction dollyOut( dollyScale ) {\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\tscale *= dollyScale;\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\n\t\tfunction handleMouseDownRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseDownRotate' );\n\n\t\t\trotateStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseDownDolly' );\n\n\t\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownPan( event ) {\n\n\t\t\t//console.log( 'handleMouseDownPan' );\n\n\t\t\tpanStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveRotate' );\n\n\t\t\trotateEnd.set( event.clientX, event.clientY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleMouseMoveDolly' );\n\n\t\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMovePan( event ) {\n\n\t\t\t//console.log( 'handleMouseMovePan' );\n\n\t\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseUp( event ) {\n\n\t\t\t//console.log( 'handleMouseUp' );\n\n\t\t}\n\n\t\tfunction handleMouseWheel( event ) {\n\n\t\t\t//console.log( 'handleMouseWheel' );\n\n\t\t\tif ( event.deltaY < 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleKeyDown( event ) {\n\n\t\t\t//console.log( 'handleKeyDown' );\n\n\t\t\tswitch ( event.keyCode ) {\n\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction handleTouchStartRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchStartRotate' );\n\n\t\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchStartDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchStartDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyStart.set( 0, distance );\n\n\t\t}\n\n\t\tfunction handleTouchStartPan( event ) {\n\n\t\t\t//console.log( 'handleTouchStartPan' );\n\n\t\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t}\n\n\t\tfunction handleTouchMoveRotate( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveRotate' );\n\n\t\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMoveDolly( event ) {\n\n\t\t\t//console.log( 'handleTouchMoveDolly' );\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyEnd.set( 0, distance );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchMovePan( event ) {\n\n\t\t\t//console.log( 'handleTouchMovePan' );\n\n\t\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleTouchEnd( event ) {\n\n\t\t\t//console.log( 'handleTouchEnd' );\n\n\t\t}\n\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\n\t\tfunction onMouseDown( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( event.button === scope.mouseButtons.ORBIT ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.ZOOM ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseDownDolly( event );\n\n\t\t\t\tstate = STATE.DOLLY;\n\n\t\t\t} else if ( event.button === scope.mouseButtons.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\tstate = STATE.PAN;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseMoveRotate( event );\n\n\t\t\t} else if ( state === STATE.DOLLY ) {\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseMoveDolly( event );\n\n\t\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseMovePan( event );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseUp( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleMouseUp( event );\n\n\t\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onMouseWheel( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\thandleMouseWheel( event );\n\n\t\t\tscope.dispatchEvent( startEvent ); // not sure why these are here...\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t}\n\n\t\tfunction onKeyDown( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\t\thandleKeyDown( event );\n\n\t\t}\n\n\t\tfunction onTouchStart( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\t// two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\t\thandleTouchStartDolly( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleTouchStartPan( event );\n\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tswitch ( event.touches.length ) {\n\n\t\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2: // two-fingered touch: dolly\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMoveDolly( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\t\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return; // is this needed?...\n\n\t\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchEnd( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\thandleTouchEnd( event );\n\n\t\t\tscope.dispatchEvent( endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onContextMenu( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t}\n\n\t\t//\n\n\t\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\t\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.addEventListener( 'wheel', onMouseWheel, false );\n\n\t\tscope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\t\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t\t// force an update at start\n\n\t\tthis.update();\n\n\t};\n\n\tOrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\n\tOrbitControls.prototype.constructor = OrbitControls;\n\n\tObject.defineProperties( OrbitControls.prototype, {\n\n\t\tcenter: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .center has been renamed to .target' );\n\t\t\t\treturn this.target;\n\n\t\t\t}\n\n\t\t},\n\n\t\t// backward compatibility\n\n\t\tnoZoom: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\treturn ! this.enableZoom;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\t\tthis.enableZoom = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoRotate: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\treturn ! this.enableRotate;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\t\tthis.enableRotate = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoPan: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\treturn ! this.enablePan;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\t\tthis.enablePan = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tnoKeys: {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\treturn ! this.enableKeys;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\t\tthis.enableKeys = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tstaticMoving : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\treturn ! this.enableDamping;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\t\tthis.enableDamping = ! value;\n\n\t\t\t}\n\n\t\t},\n\n\t\tdynamicDampingFactor : {\n\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\treturn this.dampingFactor;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\t\tthis.dampingFactor = value;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\treturn OrbitControls;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-orbit-controls/index.js\n// module id = 12\n// module chunks = 0","'use strict';\n\nmodule.exports = function (THREE) {\n\n /**\n * @author mrdoob / http://mrdoob.com/\n */\n THREE.OBJLoader = function (manager) {\n\n this.manager = manager !== undefined ? manager : THREE.DefaultLoadingManager;\n };\n\n THREE.OBJLoader.prototype = {\n\n constructor: THREE.OBJLoader,\n\n load: function load(url, onLoad, onProgress, onError) {\n\n var scope = this;\n\n var loader = new THREE.XHRLoader(scope.manager);\n loader.load(url, function (text) {\n\n onLoad(scope.parse(text));\n }, onProgress, onError);\n },\n\n parse: function parse(text) {\n\n console.time('OBJLoader');\n\n var object,\n objects = [];\n var geometry, material;\n\n function parseVertexIndex(value) {\n\n var index = parseInt(value);\n\n return (index >= 0 ? index - 1 : index + vertices.length / 3) * 3;\n }\n\n function parseNormalIndex(value) {\n\n var index = parseInt(value);\n\n return (index >= 0 ? index - 1 : index + normals.length / 3) * 3;\n }\n\n function parseUVIndex(value) {\n\n var index = parseInt(value);\n\n return (index >= 0 ? index - 1 : index + uvs.length / 2) * 2;\n }\n\n function addVertex(a, b, c) {\n\n geometry.vertices.push(vertices[a], vertices[a + 1], vertices[a + 2], vertices[b], vertices[b + 1], vertices[b + 2], vertices[c], vertices[c + 1], vertices[c + 2]);\n }\n\n function addNormal(a, b, c) {\n\n geometry.normals.push(normals[a], normals[a + 1], normals[a + 2], normals[b], normals[b + 1], normals[b + 2], normals[c], normals[c + 1], normals[c + 2]);\n }\n\n function addUV(a, b, c) {\n\n geometry.uvs.push(uvs[a], uvs[a + 1], uvs[b], uvs[b + 1], uvs[c], uvs[c + 1]);\n }\n\n function addFace(a, b, c, d, ua, ub, uc, ud, na, nb, nc, nd) {\n\n var ia = parseVertexIndex(a);\n var ib = parseVertexIndex(b);\n var ic = parseVertexIndex(c);\n var id;\n\n if (d === undefined) {\n\n addVertex(ia, ib, ic);\n } else {\n\n id = parseVertexIndex(d);\n\n addVertex(ia, ib, id);\n addVertex(ib, ic, id);\n }\n\n if (ua !== undefined) {\n\n ia = parseUVIndex(ua);\n ib = parseUVIndex(ub);\n ic = parseUVIndex(uc);\n\n if (d === undefined) {\n\n addUV(ia, ib, ic);\n } else {\n\n id = parseUVIndex(ud);\n\n addUV(ia, ib, id);\n addUV(ib, ic, id);\n }\n }\n\n if (na !== undefined) {\n\n ia = parseNormalIndex(na);\n ib = parseNormalIndex(nb);\n ic = parseNormalIndex(nc);\n\n if (d === undefined) {\n\n addNormal(ia, ib, ic);\n } else {\n\n id = parseNormalIndex(nd);\n\n addNormal(ia, ib, id);\n addNormal(ib, ic, id);\n }\n }\n }\n\n // create mesh if no objects in text\n\n if (/^o /gm.test(text) === false) {\n\n geometry = {\n vertices: [],\n normals: [],\n uvs: []\n };\n\n material = {\n name: ''\n };\n\n object = {\n name: '',\n geometry: geometry,\n material: material\n };\n\n objects.push(object);\n }\n\n var vertices = [];\n var normals = [];\n var uvs = [];\n\n // v float float float\n\n var vertex_pattern = /v( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)/;\n\n // vn float float float\n\n var normal_pattern = /vn( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)/;\n\n // vt float float\n\n var uv_pattern = /vt( +[\\d|\\.|\\+|\\-|e|E]+)( +[\\d|\\.|\\+|\\-|e|E]+)/;\n\n // f vertex vertex vertex ...\n\n var face_pattern1 = /f( +-?\\d+)( +-?\\d+)( +-?\\d+)( +-?\\d+)?/;\n\n // f vertex/uv vertex/uv vertex/uv ...\n\n var face_pattern2 = /f( +(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+))?/;\n\n // f vertex/uv/normal vertex/uv/normal vertex/uv/normal ...\n\n var face_pattern3 = /f( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))( +(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))?/;\n\n // f vertex//normal vertex//normal vertex//normal ...\n\n var face_pattern4 = /f( +(-?\\d+)\\/\\/(-?\\d+))( +(-?\\d+)\\/\\/(-?\\d+))( +(-?\\d+)\\/\\/(-?\\d+))( +(-?\\d+)\\/\\/(-?\\d+))?/;\n\n //\n\n var lines = text.split('\\n');\n\n for (var i = 0; i < lines.length; i++) {\n\n var line = lines[i];\n line = line.trim();\n\n var result;\n\n if (line.length === 0 || line.charAt(0) === '#') {\n\n continue;\n } else if ((result = vertex_pattern.exec(line)) !== null) {\n\n // [\"v 1.0 2.0 3.0\", \"1.0\", \"2.0\", \"3.0\"]\n\n vertices.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3]));\n } else if ((result = normal_pattern.exec(line)) !== null) {\n\n // [\"vn 1.0 2.0 3.0\", \"1.0\", \"2.0\", \"3.0\"]\n\n normals.push(parseFloat(result[1]), parseFloat(result[2]), parseFloat(result[3]));\n } else if ((result = uv_pattern.exec(line)) !== null) {\n\n // [\"vt 0.1 0.2\", \"0.1\", \"0.2\"]\n\n uvs.push(parseFloat(result[1]), parseFloat(result[2]));\n } else if ((result = face_pattern1.exec(line)) !== null) {\n\n // [\"f 1 2 3\", \"1\", \"2\", \"3\", undefined]\n\n addFace(result[1], result[2], result[3], result[4]);\n } else if ((result = face_pattern2.exec(line)) !== null) {\n\n // [\"f 1/1 2/2 3/3\", \" 1/1\", \"1\", \"1\", \" 2/2\", \"2\", \"2\", \" 3/3\", \"3\", \"3\", undefined, undefined, undefined]\n\n addFace(result[2], result[5], result[8], result[11], result[3], result[6], result[9], result[12]);\n } else if ((result = face_pattern3.exec(line)) !== null) {\n\n // [\"f 1/1/1 2/2/2 3/3/3\", \" 1/1/1\", \"1\", \"1\", \"1\", \" 2/2/2\", \"2\", \"2\", \"2\", \" 3/3/3\", \"3\", \"3\", \"3\", undefined, undefined, undefined, undefined]\n\n addFace(result[2], result[6], result[10], result[14], result[3], result[7], result[11], result[15], result[4], result[8], result[12], result[16]);\n } else if ((result = face_pattern4.exec(line)) !== null) {\n\n // [\"f 1//1 2//2 3//3\", \" 1//1\", \"1\", \"1\", \" 2//2\", \"2\", \"2\", \" 3//3\", \"3\", \"3\", undefined, undefined, undefined]\n\n addFace(result[2], result[5], result[8], result[11], undefined, undefined, undefined, undefined, result[3], result[6], result[9], result[12]);\n } else if (/^o /.test(line)) {\n\n geometry = {\n vertices: [],\n normals: [],\n uvs: []\n };\n\n material = {\n name: ''\n };\n\n object = {\n name: line.substring(2).trim(),\n geometry: geometry,\n material: material\n };\n\n objects.push(object);\n } else if (/^g /.test(line)) {\n\n // group\n\n } else if (/^usemtl /.test(line)) {\n\n // material\n\n material.name = line.substring(7).trim();\n } else if (/^mtllib /.test(line)) {\n\n // mtl file\n\n } else if (/^s /.test(line)) {\n\n // smooth shading\n\n } else {\n\n // console.log( \"THREE.OBJLoader: Unhandled line \" + line );\n\n }\n }\n\n var container = new THREE.Object3D();\n var l;\n\n for (i = 0, l = objects.length; i < l; i++) {\n\n object = objects[i];\n geometry = object.geometry;\n\n var buffergeometry = new THREE.BufferGeometry();\n\n buffergeometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array(geometry.vertices), 3));\n\n if (geometry.normals.length > 0) {\n\n buffergeometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(geometry.normals), 3));\n }\n\n if (geometry.uvs.length > 0) {\n\n buffergeometry.addAttribute('uv', new THREE.BufferAttribute(new Float32Array(geometry.uvs), 2));\n }\n\n material = new THREE.MeshLambertMaterial({\n color: 0xff0000\n });\n material.name = object.material.name;\n\n var mesh = new THREE.Mesh(buffergeometry, material);\n mesh.name = object.name;\n\n container.add(mesh);\n }\n\n console.timeEnd('OBJLoader');\n\n return container;\n }\n\n };\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/three-obj-loader/dist/index.js\n// module id = 13\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file From 92085cab1dd6363002173c653afe80b6399247a6 Mon Sep 17 00:00:00 2001 From: Joseph Gao Date: Wed, 29 Mar 2017 15:18:25 -0400 Subject: [PATCH 09/12] finished --- move.m4a | Bin 0 -> 2600672 bytes move.mp3 | Bin 0 -> 5566912 bytes nyc.jpg | Bin 0 -> 775108 bytes src/crowd.js | 65 ++++++++++++++++++++++++++------------------ src/main.js | 28 +++++++++++++++++-- src/renderengine.js | 16 +++++++++-- 6 files changed, 78 insertions(+), 31 deletions(-) create mode 100644 move.m4a create mode 100644 move.mp3 create mode 100644 nyc.jpg diff --git a/move.m4a b/move.m4a new file mode 100644 index 0000000000000000000000000000000000000000..4838fab49ea7f21fd667a03246a2bf67064c2eda GIT binary patch literal 2600672 zcmV)>K!d*k0010jba`-1G(jK$0000@G(jM3a5OS$b8l?`000PgX=G&pCvEa=WMOn6 zAOk>X93f8UGl$~)re@u6WE=mcP8jNs5BmT8CTfW^hg+_Zz@PU~{{rbh@BjT_3Fb3o z^OzsgNrWM4?WcZ+phC3LY^+IPt>D|!EXdup`;u`bO6~kdx7P%~BuU1xAODdFGDs}d zD2c&l2&;6Y&@T`F2YcMLU0YSbU~pF2DjF&gg&0wV7+?F4L-u9of?v&d`Nk@s$+d9s?0=Dwsc=AESjDy0~U6qLLbLpx=G4 z_h&0NGL4excosew;2(?e5F0UAs$voSF|M~VJWu)m`b&3Q2zC1D0D%tI&B)f{1lpR? zF$oXp8$h>6x<8`{$EP#G{OA9THh@17^$UIE%j)n1U?>W{J8Q5SQy ziG_$57#J8B7#J9z%{}QKnO*}WZ_`BmrSQ0yg}$+n`D4uW{O%RkbCYwMq%;uh@iL%{ zI{0#Qzn4;)afnQqHb8llt&vdz55b;y{uAtDuPbrlM`t>Q_c+=lI)UN)Y!sVaWFR~t zY*W>)qX-a#AK(3a(+UeMiOq?eN*Dy~Z^?LnOisroChJ;0Fy}I377Ht({3W_v{Y&b9z2#e-_i2&q zyEaCd`+~N|mANQ;g}##mT(@iTUUvN&%6TN{j=smJn%tJou! zXy`03V%wMN%tz%%_}9M6*U>b4C$#duvPgJ)VnQC z+A8dy^)W;~Sder?6eWs+ zV4>I`*Yy6*gWkTG-^04r%4M2WJ^+b0xh-mE#9%`G$jp->>Z~7qj9`RG?CljsxA?vZ zo$YfW5QK4gO-{Q1=!1dyjufI=Ley7dfwaqWo-;Gvds`wEb zSGlZzHDrqJ#}HI=vG!~IJ*oR{oJ?6%Ye}76XgA2iaGUm6NDl)Ju*}-Tzfr_;l3u;) zyLPb6qk(UWQfR%6G~}UkYWs6sHn!zngflR|ZiFB~3k~^ALB&D24^eaQQN*PWjIjnV zXh3qMh$E#^Q!$Fg!UQBsp;Wo66uL?jR44JQiidzU8EG<$C9<%x160{0+1sm)S3oVI z=K=GmN2mwu4IzvpWFS~bF%k$G|Kr6g@7~W}NzP}o+Zh_HtFR+wB&lW!wJ%Z>!c?G5 z%let1#4zC|>rZG{W4_M}v~@{UCIAo5f^C~-TadA%Enn3uXR@CQ=J6BVTjJeqOHGC_ zF-u>rb5uu31ZnkMfr4FXjc-^NfnnlEgED%MJS1~SMo9yDg%*tp=sq^%zab1$^{$Z*VF*Ew|75mNC@n=V zZEh?eQ9cYM7W|qYYVkjY-knoBvZjxLs$U+Z%ERh;H9tq9>X|VXac7)vk<={y*Y8-g zzL_77HFy^KA8xi+>e1OQdBzq6Z2cw&Ib8?ca@*0>wsyNe&(>=9wRT*OT9e*ZP|?>& zDypNFJ$5u}1gMj(H|GW{yJF`rxVxBnL7ej#wKLekqlstb+gOr4X(}|G z^O~T5#*-T;mZlA(A|hswW8k|NirBIUj5!A~+0;%>Y-5(PWmYF9u}EN&dW#fVtfv&F z$~oFt-oqv5DWlSjE=7oXjox(01GuPjLxtckvb%J!S60Hpp^7M@kJ8)h6ioI4s;>YJ z)*5LIf`wram?%aFkQo2_sxR}$*2A~A$;NA58p}HFKq2J_#66Sa2uZUjmW3UFpns}1 zITFO>Q?NQC78gcw7xwpbv8=-c3xUd;=B+zxu!D7yy|0CN0Q*K)%qv7{G!4|v1IJ+$AER635Dp$Zqq335qd&ZC|1HXz1sVbHbyZ0#X`~qK&0`FkDV!3bSehAVkYcTL7&0`t zqt^j%eUrm@?9(n{?ZQ#mL@@$Fs-KRnqsc>TD?k? z%od~Wn$C-K>K*+|BfesfvkQ~HO7?&xhOpC_h$adNf&oD&gg}@5l+^k2(hr%|yNldj z?N4rH#(^97(pe`dz1S>pk-2?FJ-E;4e?+1OGb0TYU1T11}7>+Dm%JOb!IT501?brN~!FC4X$xp{CF%^H=i ztR$Oet_2ZPfVqJa56%FG6=t~m_smnJh^s9NB``;DI(=ilp7}!#3vW8;T;=i5P8<3m zJ4~4OCTcGKCjIw=t$hQ=?QSFpert2xG4a*wu617-8rGp(002_$a2z2{w@6y82Fnn4 zVo`z))mT(igLvaa%>DjnDDFoOzx0Z{N%jQz#`4gy5? z1PB>(xd0sbP=HDnGKsW9!$2pd#1Zk8B5H~2-QWEmgR;0UNjm=n#qlkNiB0jnACWks zsf?U-#}?8PkJ;(O7q-)J>+&bnt-U1VPnS_;VBYS!SCx;(8VpRCj*6O&#{6zBBpHPf zw3G_VsC_luh-iiG)7O*H#ol&0c+#{9o!2zuh)&^sduP;Qe7mcY-{Z;sVCn=p$BT*g z6;?Zc&&)r+-rkp2dk+w$_9gNi*6O{r*0c-WgdAzU6F%cTS!I=ko>M=`Hiv6kd9Im4 za{OGC7_wMvB2CVb)0^xnsx2M>atY}o;chHEbEvj>W=-*kWC*o#k8w8m|JfmMx+j4Th@qvM&wvYRR~-e|q5tpj6YgOE?^W5tjz@4&vJSJ|_&(Yi7`=jTQXC^Hj{_HOEAu|u?wQEGxP&o*Ody4nZs} zf*dsjqfR9^Qb5pM+;`~V=7-}&bZ^^+qo{@;q- zZYRhgtmniy26TsmG(>kDG>=o;PSOeYxdi8N;$63wlF@J;v7WBeVG7#}nv1RNV8yru zF^S{C>+K0&z++EBT|Gi~cef<3I^%dp>z-SkPeEg7*fZqvEZ14>aCO?`;GP#7tuo;8 zxk(DAbaytD;G3&ZyyjyjkH0fj9m6;d%w}T8NhVJom`p`EbLZYbIABRORUUQpO!ZcD z@mm`GV=0`dj%KX6XT^S1&n}7}WpXIP&UYh35y!&E*CaG}6(@(Uz#5vrLJd!k;PMVW zzi)_3g5(KI5gzl=NozV0A1Ct?5XB=lIi`Elm(zSQbUugIQHK5YpIh0RITLic`;c2D zI3jW#!2^6I#bYR3N8%?{S4lak*Vt}$T0;XW%%uCamTDL6AyvXMm`Z(ib<%ZuyI&qN zBhy`Ax*{iE;3}S$bwsPc%Vi_L5IsVE$Acz7$FaW?f<~Fj{F7#Tv|fCdQwAtZP@^11peN(H zvKhN{_nd7Pu0_w#S)3Of-|(v1Ui@9&HbujHm2;RG&Mc;4%M{i&V^D=%h^jrh%Dez@ zcO=(K^w4lmRIVPSMRk(ESX?DnlA}gKFlX}EP^D*-D#v6VbxShb(#2?`PiQX!vwRN} zqZUJ@QZ>iA3zDa7`TsuRY^;8*r|GQ8MS@dI04lxO0MHB#EU((lZQa(&a{X_(v+(uZ^ud@Cz{C1mJAf@ui&Mpq}5Y; zkUZjvoI|Iw>9?bq)hT1$r%hl!R{IN|!2AD8)i&Ey+w!>h)%f+DWD6sJ}`?cGZ%%L4+61pMjplI3t= zqJxk{RHd?=38274Ah*mj6`-rrE@0j*Lh~qN*kn8O+$V&k)>l>P$`4!JF}n8> zw5U@P-ERixg3iR=jakJLc1G)%uN)4m)iA!lFEzT}HCfJ+%;PjWR;=wnRcJWf9TLy1|3IoqPA2b9O6eYnbJ?hmn6wt~ng*>UGw^033-nI>tFse%!v~Fd=Gzu;E z$iqy8jYNX*B;W|B)oIBf@g+ZlJZ4GiF|voYh~9S~buS5^KRSTcs+OBfKfC~wveB9d zArb^a!chYso2_pv&gW}bm5?^evTO)39IFT7?Hj?*pR?KU z9+HuEc>J_GS<_P%*4-YfeN8vyN)FH;7F$y%Qf%4~twgs(4u60sYRkJ_l1A$_h z1*ws%o+4Pz)Bp;2St#AUZC*XTcvCzB8Ia6?a3Ks-eY%$nFoNIFGPhdtjHt4SLW)V4 z6cu8B03Z`9Xc>NCQ9;yOlDBWPX)ZE;Pj8HLJ@sk=Z~1QEf=Q){VLm0QIseyi+YW>r zRZ|5q(nhIo0uk`d^jTl^Q0{tv#~ykTsR3(Btn>mn#!h(%sU)ep5_K9s5NiO^LMK7~8Ht3MRht7tskm1wCF zUJ%cUyQWW~e6@v{Z^x=TXF17|ADVy?R#;;l2EjwHNFc}e`pxX(YNZi^JJR->T3{pu z{mn_{ExFVk4oGU?kA_%9=~+4(`<-^`mn+iZvzw8RgF%f(urAl5E6YsGx$qRi zms@V#B5YJ!kp;6^Be}LyvdnC~Yr_Z1UO7uNhA+)8+O*^JUnfwQ_$mcB7B|;9R`j_C z6s{EE^$k1oM{xnX5jfQS^)UnBds8nbI^~C|B|N`q;lQ2-9v=>mNI0X&x^x4pl^K z@@yr%K?&%z{fbMr@F5ITHM*5yh6q7#{*@h7d3vY4>M=HUT;7gz~!X z4&2PV4oPS|e)o z6oo*iOxY?kXO~5!BpdV=04B4bYc*L0?CCbLfBOAQit5If1BLL5bGlRUNetPPH4>^zY@g)-#pN0_4C7BVkX6cl>G` z>fzGb?wojSGnSe>lDAOyv)dMx%|;OPdVT}`kb6Z!CYuHbm5s?|E5rveGK|yb4san1 zR3*BX3=o3f`0ck-Ch%8oXODTqytwU&rvK-w$ zj|pI{(BHW|YA`$N8t)uqp>W1kO3dmL3v>H{z713dqECMAl70@V>8^n`&tqc+)En7j z@=i4$LkEo2Xmj^Mki8y9e@*HhD+i)w_A!BFugj+GL#DuznY0B6z z09q3z5T92}2u>_`8N18NrVQeyJs~>=sMX_8W{j!SqC^`e9aR+Uw!g|$=t)o)8kHnp z8CX~&Nx(rE)h*E{*}*Ca6mDkX;}2q}E|dLHJ>sIkBUVl%PM2SgFt%gMtA8RQ7Ys~z zOJ(${sBbrIOnTOnqpGKpXrO7;F(s2GnS~m;UDX)CRF!|#xB{J-x{>$xu#Kr$wD}kfwnc0JCO5n?hZvW zWku2k3Wu;+3@H`-K5m==z-w2hvb?hsIxp4but^85*0t-z8L++{YP>w!y3>vb{S&jZ z4kNR~O}d3>-!U4^bhT%~OW{(*CqBy(NX#eDqK#AE@|SlzSwRyeoiAiJxIr#ye{9S% zPhh5;C@0a-pZdOR@F5ITEy9TqAcG(F?~av10GY8WjR}B72_gFt__HS6pjnswStUG0 z6>B?Kh1WlL{fCje+xh4aOK5BQ8)>J1?G3??gX{N>O%qFFg6th5)46`bVYa;Y)Ar3_ zuz7DiIgG;QskLAB$>#DmYB5_sjfffg_35u|T_?{YGDKEd=H+GUW!Y(cHtt1B>F&Hd z*ZAEUuB;bSyYEv<4E;U3eP1A}y_S|y5J-=c*0&3K4A;`ZlU^vqA!(RFj~9reu&Ve9 zg;oWHf*G_CEUMZlq!h8y80F9Jcguh*rMKIlR-UFiFYN_&z9^0L`_jlkDlJ_e7GZ`d z7}2Rn*s*jZoJCVbB?w^%01O3P%5>~fs;#4J^C87Z5U*k>ERw{aZyE9-E6Biozj3(_ zWu`JvVkQWQgdzpMsyUT@G#19|u45sWuG|n3$W0-nlW!u+&%NoA{AN-Y*uM+d6?+j0 zW9~-7$j;FQ+Ob=ZttE-j)ITOs8U`dwIyNmh&df+qpwCJnLn2snEI4SE|J2%qLx3R+R6VYn z3t)=%eYK2MRWuwB;bX7-}6*8AOH^K`RSDr+&MokONa zIF^}4Zy|_#v|XBZv!#<7#UZD7Uc+b3F<1)iL|b#U+1xzBHuc;l{msnF8uDrcl?2|f zx<#?iPh6U(OCX8Qi+I%=07a7XrOk;Ehmawc$)f!s*`2HPt3U-wlsULis6srsbOOXi zq)3Rg>nJ!005hAEM|hAVxDgUUa)Uy z-*o|EWmf$!QVr<0n$kgqYSdY91XYHa3`8iHLJ(X2I3RR;>veLZE3^>m@G^dfvr`&+ zS4g7Fk<)Eg%5vKFr;{!Rhu^i%B27!!*=m}ZLLZL|#fO((993c!;O~Q#`qQRJg5M%opru6GJQVOaO7l}}FsSmq8 z!?aC9ll^n@Xq50u&{Q(e&n>HmdFW=w`qNL(OS$z=p?Lx;pl|sf^s{t_5mlONE81h^ z8yXMXxw_c7!i|k;qO8JxACcIyT;j3T5SvzI8)R}u5e~P0Iq(s%Di`GHsm74Yt-E=oLvl8Y|CHr1H4 z>s~IjhFKdAI{Y)IK)|#n`B#`j#vQG?sX4>zfXN!J%fvoj0HTJh^w<! z20=hkMj&hdOZKgC&o{@bx2Y3e9eNiLiv(U`GExPjY1435T{G4?tEY6-LO6yv1hLf& z`o1zjK_+0a)(UsI)r1*#u)^!}6GDwuE9-LLiglC|@LXf0+cc|DgNoUyE~3R}r9&x+ z2(OO#ekYhKnny~R19!nLl@kjO$(0;Ga{g>Mz^%4t2?$2xPB6O_OiS-3?M1*V|J|&{EE&!r3{)+;nFwJBL67<}O(tX6$ym)4jF*U*2)P75 zNdJ8&z}n2HNk5{21oi%}Fm_5M({%1uWlT>dx|y&Gyxco&cy)8zp+9%$4TYbhFX7PR zuBhi%jZ!=2-@l}4IW=DI6xX0ygU;tutfQf*zGbnyxqHm;>>n->&z3k??dK(z@|;S^ z3aNr$n?^mLYX^5!45bg&g5PpmvnFqo<4s{6b79p>S59|@1Z+&JT$W?twPVLu<1~%% zq|{5D0clO0emYVn8Ea4r)GWwhNnu2hvv`>C*+4dTH{sRZvbDJ)EJKbi0c96~XbLJJ zkr8nuDF|Ny1z4vJ4h&r>LKzH>rjBH2lpz^8eZ#KlPro(N&`<5nbhdIHN%S{o0)Pk` zG$odZ5P<|Bm;X!K>UXaa_-AiEuLuytuYq@npCGzm`V0v(5+nGZ0i)UMaQivX#E#6w z!!US0oal&UMd8|*!jR-CdAMKy=)1a7GBJQTMp|;hyBNHk(JTB z%jl%mX&fSdhccEms7ti8{2V=>PvgH0P@P>F+fx!|zoVM0YlbXm7&|py>17;P5#;q) zo2svwEwe}7)RXgp#5UJLw`uJfrC#GC-q%T;<1RnpsB(=C9>q;ut+XyOlY-sV^YE&0 zlNqa5brt$(tnb@h4x@EN1HmQACG+x8ELe{}2>QX{3O6soLK&UmG7(Um}km z9i6W#q`94}_~9o%h$#Z#I+_p9(|zoj1gB#&$*Qc)b?1`8iS6~aUT)qY43ORU(eToz z7T#U58u}!l)Of3%703Y*VWn7Tq$(2~P9+4t*Q|5&XB>LtE7m=kfjQ{iq;whTfN-MX zD5e^>R-6HN#J`M_YNt)?)U)jR)Ae5Mz{`d^R%_&0uri&UU1Xgppnzg>2>(vv1m+X? zM)K{`ueMvy9=WEEMpGSRjAHiNlUz!LC`1oA#@A^YC^ z>s!R=|G4&#K~t5yoRP|sX(n@5{J}-5mh!4}jBzrP_xqZm3x)-q0m=1WQ-k@&mcG0% z4uvj~^V7Q4Tej6`_iP8W)oVZ8*AK(JZ0~Sc!ukkDH1o9Fqd@AFu}v;6{?Kgvc3nMn z!tFRJ?k`EQ(M{cCUjZ)SjcOKhyU|q3QEJH}8F~)>;L)nP2m_&qLa5~~avTkZCDvaR zwynb4RRCe*3`=;rE*I$|KGH~_rK-*G`}nq%6;xWkyyVCet|v@%`gv0)<$qnTBQxD1 zw@xr%$+lpNoHR>O40}E)RXtl+yHg=j#^|EBhwHYBcn*fvVO2i$gPDbzfQwd6C~RPn zC{t~eYf0s^ROHYkB(n*f5D*qxQz=Y>5TJx0$M?q4LtM-8CDnH=xl$>eGzesL#5H@L zzJ5cbIco5L(a!W>BY}I_DMNt8+s}nx&@HgoW7sTFBUvQN9Ti(5H6wGAyH{t1%=>8H z_0KtTZ@w8?|Gf5h)OsVS4!ar>NI)g*lZacjt$g#Bv%pT@ZobYDz8#od7vDcRo8Hcv zrASUWcV4-1?=kSTxZGr`*U=Mq02S!gwF=FTgilvyl>~rldZIZA@^vh)8<77=j%+Gr zj4hfgZ1aHNAq-SS){6=dgCAj&lT3p9u$h)xoG=i95TC(sSI*fA9)TvwHSDwO-`l+>@*5L07Ef>Ok!> z|JT>uJ-+!N$gt5AR&lw;O^7+RyNl|+A^Dttu9d5GQg7vIpfElu_P|EDY!^AzB&82g zd3vu(NqFBf6`w}&gG56w4SDa4$6BU4^#UX!$=I-7dGTiP|p zlNME_Dywv`CRKGEdGUzmj7*@`Pe&8jr%k!fVWVoc%aINN&i`0r~ z8LFf*KadEkVfU$&Z6DTG5l3KGTU!;yIjh%OBh+Vy^-W%M%rcXUy}Aq-Rn#+wB&gJ1XyFCmt}NLfgb3G#1UkomdzX2^9( zTWq*1wq3kTmz}^x!O6rRSrvr3U$(7abBE|q=>DD?_WK-&9~?i~rtNAyNbN_?wcFhCVy43!jiPky6 zjpoC!Ykq4&sVxHv?i=bj&7(oC35RxQYz-abif6Q6S1o2PI2?3rm@Dh=HB7a(`m>JW za>iQr5=d3E@Q;S=G)q}!TcuU`eFEbPYGu@;RMiqV`&*OgCFH6YE41mwdwl_XNQJDT zbVR#E$V)10iBWvWb2re&&n70K+J}F83)AX#(9^G%3Pnb`jkb`~@~1Zz2&naHU`Q)P zw(qd?m*o?}iyamb>c0w6G##QE$AKAvukJdW_a1Y6HdEI@UfbJ!XbJ0hnHjXc?e8Qy zIn8*i=k7K7pG$hi8#b1JN~=&{=QlG+`{sr{$*oI`s_*vmkOT`V@ZpK9GE|T$66C%h zDjGLc*(gcHfDDZRnZ``Fo-f}1S?8H>$7LD4+`3HdPf9Gqhkz`_2OtM*^QH6_0ZEdU zQvd^#%`D(3>V|U3qfud`C_xQH=p3?@e4{`KdHCq+2__r6r(A z`$Nf`TXiE%spuW#==J#yuA?+2*Zfq0;r%e=Z}R2;C_AES4TmH5FU6p{AAxT}s$DX( zOWVQ6KB_RB1F7By%eHxDH$YVlLW>6FA7I9?zppT6PR z7wT2tB-35kN$oA>Q@7l+brUb+45_hFGS(Oky7=iIAfg0t2;% zG{rKyk+yl$C>j{eB!W~Y6AGS}B?c7RBq&>~Ek-$~fCxJjJc|NjD3~G?2s!_z zUP&EHNX)^hSe9M$piO%67c=l0O(vqjA;Ynt^CBCtD&r%w)5dD_ElEY`ECEbXRajIx zt|I%7DEERJ0|40wUZY)9AtZ%&wTaEDIU*);H+wy&0C-ooVPs)7WGD)YFgRa8;74l- zLnX9J0VG~vVohI;Za3iLh6ztE>I`F^f?{%52;Wv`%?#v1JEio-W=jc zktm8Ae;@evme;J8Mz<}PCs+(K?GL|IZND^>GHmFWRXJpk2JY)mzvs_ z>54E$wOtB!sP(W@QdSsSCu;B}H#yhtnREg!*wt}$S~Cr%_BV9l$Z}#&+A$2Y!?giC z^d)2iM>-5;t@uA);*1E`A}J=Vc@2A9J+y|cCtXQEw-TcvhPqsuoO{h8)Q-;k-9pnz z`skaqW|Y%K_0Ex3>^3u^mv<7u6oustMlEZf+oO`WDfg9hvE$E7RUoh85H0$m5?pY0h%Ud zGE6an6f!wzQABlovTXiC8Xehooqao^L!QPGjSveE;p!82#SCf^sWl{(zR1>dMa`;w zg7Qk3OR$4Gv1mnKa2{^g_o>)b2&hucb+`@WSx$Oo@FZ+JpR4WqhdeYoF49lQ=seI< z6){h(T%A#C>HE$>x(~i!$&wr)3{;)Aod^(vUMOWlJ(NmWk#c6Kb_8=A%%0WOise@7 zss2Q+dm~xquGPWWYR1K;-YJ6iCXI&qw8V45kQ(o3ZC$*2C99e{3oZM;Z52B6NoY(7#XRl6?t{?`y8xq-U)YZ=GMg&vz!@yk)f3wXCBvnIDUuyW_hIW%YXloi4)H zp<(6PSrvgTCG{3<&ay|M$ANju=(TP9+o+P`)8-oo7ny;YP7CVZ~Sfd4D6lK9SaJ^xKwyq+#Ufnu!z4V*E)XqJuaGmfs z;TOL;Y~+gX#(^>e(&;wPf)yB=3BT@27PP&pWnL{nl;+&U@By)=dCXT4C=YAyF-OxI zvcB}{d?PYze6xCJ+BslN4HkYj@BhJ% zE)!HIk^@Rq011p@_w{RV00V#_3{(=h8pc9h$V==VFK?!NpKA#jdoGu`PEmBs&t70UxFbd{hG4UL^ZY6?hV(5V zu2-(ByQ(vS%qwi$(#c2AR~Tkb4D_-RU?USyic&tLrmbfdaZ;N_ z>zj$t#Lj0+muXwDv6bKA;a5kZs*8tI$?mz)>85|)(-JKkF3io27DI$E(83^UUfs!1Dx( zq_j_Bfhd~;BMiMI9ww8OWr{@Y(kMP?UKSBIJr-bU<|YKAGevEPXi|j{0f2$>krW5^ zn%zUmtii3nRNAcIg*@ztfroye@bPtihaXM$1pG`+vr6s@p;>nYZQF3Bo$d2>zC3&2 zOuf2P&D4n83Lpc3Aq-UQ&W{KXgOlmLbd7rRFoiN!h`AIA7Dr%CqqPI3ynTj=M=T2|haTSldw%=;l;CO#f;cshw2b6(&*Vl2Z=Qrr7ie2S9yTlwciC-MzW#{ zi+X|?0V6dfaWPoWMlAcSY_vm?q@!D$HcZ$*kj5K1QESQEq}$uLk&Y0MRa5O*?B1eM zPw*o80HEKnTpo>T*Ij#fW}L)I*k7uuTgqNoNU<$uhzMvbR1*k74{^QcUiVLeIlXdc zkLR#XFOV%cc8@u~5vwJRm7Ta_!8;GM0r9cFd7aDrNpA2zt>P^<#Um{6y$i@CDct>x zP0V(uZ#q7ns-T!Eqb@-%K?oLr5Tt;7h>$y#(KFd9cdLvSbhgV};Yv*O;ndSQIsxPL z-!{Jsj=3q+ZA{)0;`?V&MKXot=+JD+S6O(LZSbw;F3P~r7|FO@M$3!kg*K5m6d*6Q zFP4B}A6f-zmB1kkRK>QV1P7(wOt2LuDN;z1E({*UV);$gD)^$5nU#W%1-UbiB2MhX z{-OPk8h%+4>0sRdq4H@6OH8ynJIk(Ks{Fdrg*AUqk-6=i*Nt92LkUd@SA*<3-cQc$ zIA1e=u4wZ@{MSNdu~-!EztGv_+IIUq?n^!68O~o=XN`Cd!`-Mcrm!8ecFBHqL~jF3 z!Hr;A#?7v3vg70OP{o^8cB1&w+9hN-$7@pWxp_@^T)8>u2#!p5 zy)VIX(E(gz5n`G^1()55su*(hLT3D3s60c46Y zAZX~h77DukDg+(#$6x+0l*;)RGrF|1_!O2#a9~K z%gKAj`lN|)&?4$LPzaWN0Wsv_n05r|RC5YZVgORKWh&CSW$Xl%R=MpSz-w?I{P zg~cjHJyfc@=_8wUp!m(BE^0QaD3wYms^sn(>O7{n_7tPE(>qFfDoSO#xxhIV{0hd5 z#J!rB#6qx;W-xMnXRoKvThwL-9wnVDbPzk*6rM1Gw=kEeFLt-L+%pAvv|vdJKReDA z*Rq8eFE+P9SCm7@iu(FwpxK}+$m!>$7I^ik4w?M3CNfCoRk%RAyVt3Xn=T22F;ar$ zT)r;Y&YqR~RK41h1Q3Hl}3rU+b^LIgZ3`0K7b5Ef|Pd{Dld zvjL72eT(p4?5)FeZo;_qTMUKkw+}f@+Y@1IU+X&2VV5Cv-`ZW+$-CnI7GjxCN=7bS zzoZi6xA^_~{DTp^*Z7{Tq5MxNObE5V|c~ELf-J= zgCUac7nQqerZF8C@GUB?W z_zP|>fx&ZD0m4)e9nHf7mH96`k|7t`%m15{&zn10Ow`Y;K-t-Xl7!d714w)W$36 zu<#53nD>faI31vl%RqA-xbLRgt`=*j2wR*Pk2JK$aNB<8u&;jFn;S$K&iO#=q;IUs z_onNjggWU9XtG#ZPn8Zhy>aj1G&J14TO8q|uR!U)kQ4zd?(d=i;2{iDoz|M62RFUf zlr56Ds4`X6nnOT>^#nYWB3sP-zch%LL~f7djFr$noIp2m^nY8A}Km3B|ENa^IIEyvX|vniPnZ71KRG3f;k4bP zC{w^W!Xrv5+k}E8xrYG5EpAjEjVZ8;Fv$S|P=| zY(B}}J+H#>vbU6lglPCW1`JgQ1HbA~TPuQjno$QuoAr8$#T7?cN=jE<)phi1Atv6} zK7!Xbw21*osO~$)0MGZIH6eEA@*mdrSEhes0D&dHp7l{`2Yw}^Et>C7hP)P70w4k* z1@lS8s-OS>x8i3E7IJVuSnsP3yrs@c_ zEt-1@jrh{4$mXLL*6vD4(K#)Ad(R=l6S)&*!JE zg^spgeLizvkkwwY+t*!bjw70*72_KVpEQPu(w?=%GUlf5AoXupvvpu7bei5#=xLMq zzS)F(dFe3E)=O8aTB@Q&AeA&`9UKCcZ^#eVq6W09tY1oxb*UqpCjIpjCsk)eD%WHS?IY+=%ru~X4wT?bGk?IdE*m% z_gq1q)S$KaBUwhD=xmnE%^{Kk9rMPSkKl0~9@swA+=?hz?e=f;$?NX-H%RPLuu!7g zM}@1vRY0MJv%j=F*GMi1jV~VWbREJu&%#40BDp%q>of$WKc>Flybiw3{+_lmiTL&L z$-cn3v#}YNV8FW7eSWQgNnJOkdpk8-013`}yCB9fz#$A&wbqGYqp(5eU8HMe<3%>K zkea9jPt{4lepei^8w(3mvC5h~x489!yYn^UhE?~X z={Ib{eK_KTveVvoED~O}X)Qi8%M=Qthf%2LO|Bem`g8XARVEwKJi~8Ql+I1+5t6%2 zvjgBw`HGvbqdfbzVV@h=^VaLw@%=>k*k&76S6%N$aP2U-7E7m@MLrDM0QxN!O7iXq?=R*(R{Fm3sx#x=y%Tm&|y z5DQ#W^LwvH&n#Cl?(dk9kX}~DN3g-jjD-sYL=P%$oH)Opifh)naIte!zk&7NkLRl` zelt*owkm$3mfFT>`E}(U?}f=&EN@8-4yHdb@ zl-y-mB@<7-e=eDnzw;uLQQ)n;+wXZ`jWgFMyULP9?mz(Pd0A%LFRVzZA*n8uz^wtT zM4q{5il{|XuN2Vrt4uqi9p1gjG7Fa^Kfi`E9eY~4Dv5xLOmEB2ue-B6y}W>MAq-UA z;*<|*s_2;Bs$CU?lIe0t2uvjfQvnUA-pJaN6h-$;pAOh$oH8~O-1!OCp*86uABrC` zV`X6V*Bsz>!aZRYZF&d(>=xyL#d?v&l&Sc2C1Va@kUZ*#1alIRei3V9%0jC3O#Cjc z?EXvR3*uwe8HGoaqow#rihFiRkb0IEwit~I2Qz1f$YE_k5txdrDmA}Q zR(ytK13MzeOW*U2?e4{!W3hecD$Z#Q3!&#-Lgu-xnJe0*)Ah@ZWrb@B`CQ73Ldvgo6yc5Kh zS~$%F70q{rR`{qhk)+a+V|6Q`-zsR1k9mHtABXI}0rxpzjT7(yjX-k0^JLj+YwHU9$Fm|6%L^Ju zt%%}oUOf-?>bo83y67BzlJoNh!s!f&Edv`quPEzZ%)Yj!67r<&qiE#2H$zhze%$W_ zn602X@~bt{WWRf`c5*p`HeD{+{N2Ne;xJ5dP2Z#N*q)C6o+12mx;l1Jbg<0B8^p?j zhj)&osqWBI(St*o7PzcC4N|J4yig1@70<3?D!R3;)!2;6xmH}tqK0WG%viM-!j)g7 zHtrVsbjVNA?e<0soIb|2Y9&t}N}b7)OEh9xVy&Yp41De6P&E!R<*IlCh%uy?ly6_% znt4l9L4<-~z(MYj+Wme#>#H5CqSwxxIvmw7e%F-vy2Fp}trv>D4(f0)DU=$W-qrVX z8jM-}_4s6`Q)9Fa%5%25SGBx7B4|R1bxl&xqk*O<%&w#obRI3dk~WXYjmBbbEjNlZ zS`1}zid7}VFyoCxinTGeP_RH#I~t3Yh{E_$VhaX%Nws&iA~_^Q^=YxEuu8zHE^|ZU zqkrQWwYxeLDhUMccmM+50HYeasz3m?Lz~~);+@4`;kX6f*VRvUtg77l#-2E)&29j5 z!fqi9RGs3K4^DoTDycS%=F%)LN(AdVv898mfvv~d!tahbBWKAqG#N-DcHEvax}yDH zMN&A96_C|d*q|khp;GQ@{*`@O9FgEZM%nP*c=>1YXe0lE@pnDY0q`yWx7B`}=f_;Z zY*&`g&1k9wa|9j^$2aBHE0aLf>;E-I&@dv*H3jI=G~a(wv~kcWI9h!Bqjx!mg+YTa(+v#Oq#6sw26vjE^B3{;)klLDZF*EiIP zJC@1M2Ia*`T38WYFWM)05~aMVEc^ETHc9Yo;Y-H5(MR2AB!^4pw@v*|N`z-u$^yDt zPG?`cW?|g(#I_`1eI4}oZsh$$KT9XL((@j|%z1O#^p{cT#l}c`7TAJ8Fr014hJU%!^Le#^gL0Cvu2t2=2@lgA1^rwT{ z-tT;6B)tc!_mYHl$*N*8G#~Fj+x3qA=07l=IJmejg&ggNf5g;+aO={uAxxbN)?8#O)m3Zd?b!p8p7R(%|m)h+Dj;jL1m_l4t z8B-+~5sKqu4Q;+{HtqNzFF8`hN&ofJ(jg4lqM{y?lb&vto=W$zB}M=bI8>0 z<9DDiK+Rawxm8m&ecN<89Fs5r2O$hpt-6(Aq%cA4GUuN}%e7T6xu_(v;2}Juk$Bwzr&g>ak72ks^Um}Y;weWBCt)p3AxO!af|HR|=)_qzNrFv(5_6>agze$L# zxvUt3j}Mf4#pql!y8ltM@;-!4arPVHt7fwx<0n3eNk2K8Url{-t*O7}m5s1UZb2|g z2X)eu^!c-)XDwW;fUy>nC9aB!jjz^ceC^a4DRCi`_g-^QF&yH#ABmF)&rp7Ol8?Pv zE32xVAi+N)Nt3c>9GtW(M**?k3N z=LOEI6*iPLIUF75Q!297coQ7-k;u9=N1U4sLN7>3g+LCU8mZsa)qZrLfGgaU_Ek@t z*XuP90BwG}W(H)k^0o{m8HQ$PvQ-2CGH*sT6uU%%)*muxHKV3TL@e$qruA%vu7~H8*O`wGR9NG}(zv*hMuV1?n^Nf*-eS5Oi3K z12tv|G8mX7(~G8wls35b7dqgStHqpkT54Q&rG_8)h*y6{O=-CqhpuBIzptg)F9G>v$O>60|)&xRn ziyJtcd$X{nHCg+8ea5r$?w#_5vUav!k5^U1KYt(Jy0ke0dzp>u-7t^!)tf~3J%;PbyG=YQwF(fAf~ zeBTM0k*GIcMqgi2Ry9;ib2PHN14FnDtdu5J26SwHnEQSI$J3Wa_9Occ)7^%{MtB6P zIg<|>#8h%@mD>!Jh}uW4Q--bIund9A4csLpI~5>v>Ip^w{%wH3CI z$WlDm;`ufk`3!8jUU3z^B@Y)s(;8Wq$>TQpGD5eT?>9!lRN}wp+!OkkUZ-vEMR&)uk!8u-jPIR$5@R;;+wb}#(fm-EtlMbq7$NND5E`}>- z{#K%|Z0cW=@RvrElSi}XW{as5|5r8JHeh}_J{fkkP`7X2ET@Ge69{5 zPW6O`NBlR0&>JeY9HbW9J0S_dY+_!COXuP-Nog=dbI_eru;E}UI`6u7Ew9b^$Uvl|OE)w9)UMcHQC6cz2DyEoegl?(M z2d=zmgMhCHtK<09!wXoTA{By|GBOeO<3+l@-LzfQn9OZ3M1E{5^4u}OpkNn33i48&0|f)9U=UftpM@2+%}$F4bN zovh=Hj1*e{bPAU`iquXYq^cpzN6@5BVj=%kZi}9#2`?PCCf@Ald*O{>O=TY-1vAy` z@v-;Vx)lngg*70(jaDzYL4@1QiGsY6gKAFts@SGc2+<6f1xURyW;j}g`=6UN05mkT z_}5ndYwUGFAd%ydbnMk?AX7yi6>0MJ*+tX!#Ef=j*418t7&}7o;1#wR3asQ_4!Xyk z*-o2wyN(F~qP4Qpp*!jOdf7&Ais&5x7f8Keu zI(5x$-p`Q&r-okLMX}K!iW(3>KAp_u|4)}!^Y?u5zmHSPVtfDqs$8Y8=23PWcZq2a zc6UiAOj!_C;VLL1=vg{xB+T1pJW}^|xHL9!%wPME-3A7Z%*$MD3d_e}qPKx?7K4nZ zgm8$UJd52g)bCXD`H&tvx^hO&^}ej~?Gcx1T{2bDtAu&Fi_7;Mc|(N74XA(9wBsy` z>rOpv(T%$I7-6KYrl`e3IyIsLSUNu;mfZOHTI`mz9jH-s=4;|(uT;`ia#qBb-!gWu z%sZUt5e&eNiA5A^`k(@iKM-lWZ-czbbemOFK2DvB%PO)ABGdEib8{H#T5x1m2f!f= zRBikeAqWUU3@sX}rfL~eGFqji)V$~tx$8n(%ePD!V;VvXLPNAoDf*Ei?Fd9vy%33v zM6+zxUC5y$OnE-7V;{Q+imd!XD2h*G;nF%qeW;p|=rxOoy*D@iNXiUvKPqQ0yV${* zqPQ%?f6E{XDiRftMb+3>+o}^*itw3Oz2%LRr2kLYy3WogW`8DER$t3RfNpK}K8_?o z?H!Lhi~9d_Q|Ow(IIYiWhbMwHlt=mAO7<=#kA?nhhD}9jmUkbMEcO;&)>>_oPUQH~ zLN3snZmz=o_I}JgJNq&PW=c{k`7V#fO91>|X3Aj8J@>n`&nQ87WD0oZH~$$|s*ddw z_8)(s*rLKUAhdZE^J_O5+SZ5niFJR3x9iBPBb#*D14M^Uc6AQ{dCtPCFvU1HU9#dH(G4)2wxT=mXs=l8Vzo}YR1W~FrLmY~8eDjit zR$)Iw&K>O=1(&VT;5Z7QRo<#Itc{~~sZ7JX?y9?R)3C;QK3|l2PW7^xP3gRnMCyDP zXB;l|A2F^!KF?dUp-8&^Gns_y_I}&zgJ^o~>GXG~#;Z@cjN~>Id5ACv6LUI^wOos$ zsD!Pqys@Yogq~}&w^j%-m_3FDmN3PN=bRCsLqGt;Ws1|avPG&I-p+&Uc~*`spg186 zRGs>TVK9T=7pgY5aicP#%F^1@0#^Y^v$KgqB1mJEy(k&h*E4GVMYUm3$L#L7d*?fvhs_qG}2A78_` z%kDmX<5ny4h8-;r2$f(C>inI^^|NWImqj=iI2BO(IkEl8-nBre>xODor4dWjd zGBz@WX)BOQGipSZx#u->y9~M%NU25?b!-^vti}FJSn3CEQ_8#y*7o{l8YZ8q?y^c;9tx!vcE#Pv%Jq) zT>2NvOW@;QvqQbILp*B*ZP3Lo9U}_Uyi0eRCQEA0=xwyS_SU^Tdp%3-phe5(*I3)J)$4oRWo%JljK)dm ztBN9eSp05NHcemNCmK6UsJg4C49luv--}4eJf=^&v;~OkQ98q`&Zt_k>NVtcx+yBi z3&vE<`9uBl>vx!^v^!(SdHQuA0l*;)RCV@+VlfbbjY8B;QmXEg8@(o_>SW+DZv-PI z(LMvjNu^{7i6JqBG5F#$)K3|bBUPj)G=gpry@nxh#DNfmQxIc*`Gj~qrh;>4O!5fg zx0Rnium}OTAcz?HoPdccu!2WYAMKei6`-uaOCZHBFKJcX-&ghx4|+2+cRRHHR(7nX1hC=_&FC6jc=wRU}(gT-D`411*x?10!9u)U8@nHadkgNijQ%Sa#z3he4Qs9b)}U z^u%MU`YWm9JLBpW$D8J>Dx7w=)EutnhL8DLfG6xaj-Ec$^;|HxeDM1xc zd-v_;-W@*H>4Vkvvx{q_1Tg{$l0bvY@4KD2LG97^TQVB{-+{omaXp7&*y1KqOyJd5 z?^(0f!N_-4NWs&{IyK(@-%_qL^*?5Q#$GiF0riLFd)AZi7W)AezZIo*u2!d=sa|lT zF*zENy2uO{BO`s*?6e6CvB_a$R7eX7qu#~f--iovkpvN%j-V`=%A1XdcFbL^sxxg7XJWx1PX`;g7>am)o`}-aaZsSYJ zx|9EKewbp;ojU7ByNE6nO222a*4E6&ZqM}gdkIw-j{P*T`2X@Wz~CVaRF(RMAt8uC zZA^5RoUG04}YE4v}wa%8(!K!mI*EsltkdA95_5HaMik%?^aBr}{S zpElmg&LLw~N>ox;MoRrz@U&Eaz)@r;Sp*4>C&kYv8_gx)5^~663w0cshCov=c^D%I zM1BY#mY_vp-rq4;i)l+Ex`ahA>SjADW9Y8Jwl-H)^PlaAlpc+42FC@gJnlkH9f320 zygb%sMZ8?>O6WvFUh39gRs6qU{p~N%K>} zWG-#(>HWNL9wqWx8G|%vekzihHS~%99Ut=04Xw)c?-XoG*juZIzi+PxxiFr<%^f45 zaT~^Rnr*WIzT$3dkv%^=_PvJX=S6)OKO4{vXT7sRP4Me2FX%_9xU&~t=t=!c9n6&( zt!iDUxHMZE%ych^^;~YdLm7bBnk=y*!-l+6mUL9o!wAotZP%`SJ^IFApH&#|oIKC&ojy)|dJ zj2Tz&o$Q~nT4%ulk7bjUMaV51|0jh!@Ve*v73ua?Hmci*CzjTK5Jn%!)uyJA6Eeb-V zDk8k{F;E7v_Q%*bDbU)fp_6@0)0IhmJy*_J)c$(h{T){#Q~iRhhB1&)GxIJ#m)hMn z#cgW1eF-}8I2a5xm|zvXHvTSG2LU!|uhD39`F=KLya}u*tommGKrU=pRW!r{4SWpf zjv=Rbxy2?m;a_VBvwkxnhMndoHNT1FKl=X9>oO|>k$ z;>g$`H;EC&X$ae{L?a@lN(-^#XK)g3y90@VCg|CcES(HWMD$Z{?J{7vEpWUDA1*=; z8v@zMq9sLAU8v%1N2G-nJ9Nrx^%5l)fl#6HpB*4E%7E#g*_q76z@fUMO0394f%O#yf;`eMl5$0ahZqlP!8ba zO+oW*U(dv@Eor>C#|%n|tC%dWW#L0>4|V8VU_Ld0-uK&wOlPFL1D0-(srkp}dzFFn zgL6fbxfgD#$La>P^`{yL*$zf2*%jVW;24W5U!zl)&Ns`LwNtNcJ=Y=U*KV$>_05{! z*wx&;Z=ata00StU*wg?5)JAyyck%pKph?-P5M>Mz!Vh<=XNTgI4=vv2xk)cN<4Xh* z{@u^n{y*tF|Aa}R3LWBNUJ$hW5(jr^AkA%jJ(lA`0>*K|o& zTGyggW2CQju|y1th(`1yYO&?0bhSkw4*ImPqJki z6yjmPEtaE3QLgJDes^|!dd>q|-%a(Zk$0^=UcI>2qwQ){8%UpCpM%Z2`EvK;UA@%* z;V=LkAq-TV`i5l%fiY@Mgd|q2T{XrO1hqY=hVi86YO(vklniGZcgZH<$b?k^2}9!Y z?wE_3NX;Qky-h8X0A9wr+bkO@0F#9?=`r1-C+OVS1^kuzIaRs83aQCM4<{1s53OVL zcy0&}2dGhJ2gUKv)M=tgFNRZox3Q&x&|=77x>Ju)_8hsD0U6_n%6ZDkmCd2{EM!a} z>E5f$zLix^9(m~ZS?5sy#)t*u_n)NH1N`??>rShs`@etY4m_X1uPV;Yc2a+*fa*;( zLW;bWL9(WD`d3wDU}TObt{{Fh6x>-YX7Q3aE4Wy_YiQd->284e?*EK#KK}b08?`KC zTs-lF)i(s)quO^$+!6xrf>R#X<$x=60r=iv&8`*nHdvji(5y z;gy#gC7VV@Tj~a(5Y7!omtH_Q${o-g$J+m&4OZ=*(+iU7Ico3xo&W%300KdDD;MlSgx2mSa2o}p_g;Jk=^bVR! z2&!#Cua~YPsSl>*B{$1wpiw?W)jYJA%NwXIB{pDO@D=?n>}*nbv=KS8OCWsXcWDtmqy?Ka3Ks-&H9FA z1-Rmv)XQ(FU2P+Fy5d}#B>_6yvNT14;P5&e;z=3%5>XTolOqwdJHV8RH)f)>Wp9PE z5Q_)7Qa{=Vj<{ ziH}F|M3~-^!ik+Xhbj6GnR}gN9cjK~!1eE`VB*Pq-}g&gebdIX;XC@oT|x_R-=^BK z>GP{T<2>c+Abbn%8b|bIKmPs&v*sN8_5WMszP0IyC!n_3|9!ES{|SY^HV-KDCH^a3 zS$I}!f_k1~)hjUw-uv(+T+dcNl%Dkak6`W#0y~&^&aT&$$a=!<4rJmTrBzq+57w2p z?)|H;#)n?GYo>FXzruI7igAgL@sPg`>fPUS%GWr@%rA!IS$R zG0CCEb%fN>2xeN!Y^7xL>gl8V4alDT0tUb+#ND7@{zfW~iJcb|4Jo$j;7CS0NRr_m zAQcNpu+PqmM|0n9JZ`srh*^+>a}-fbq%EE7iqew{WtUFmb7tdV*;bz|oO4XbbRUr8 zY-l)C_AEJv%~#MLCL``_yM>I%Pury%V`~Tb)Ii`N3{<836eSV}LJK;Lis+Lpm9@O3 zb!|1a0y+MWPPwHVy=RIhqvdJ2cL!lJ*dixm*O3k&j%?&a@-(Z!1SLrquk%zlqCX!! zaQ)-*K5sG}qdr>K@<&K>K9BfLZ~V^5_CAlIf&X_aip4I6Clr(zc9-1yQfFQ(F@E>M zKbuhU&l)Ug8aqhA;hBGnpcy9!_&MRLE$B#&W9{u1K?n1b6*`{hf@So3kMnLh4eou(IKA0^ribrk-?H)j+-rYqv_>1RtNJ*aIj1fJj8MSpc`%w+{Z9ZR8 zUyz$)ur!@w-sc!t{NCjMmUX>@WU-{4yMO=#T^+rhJXL+Z#$j{z02ps{_ydRH1Vlg1 z0$S?Bp}^>35PN>kBj2e#KI_iC=f~-8rjf&djc}sTG&Bi|UcB+?M2L&Ho^;Da&XNHX*d~YBnb7_Xvh^H}=7QC71DRhXI&W{8fA*JcTRJP&xs~}|v_fM>xT*Q+ zGo9s^?b;Ow~%3$(2#t~ z4PJbE%jvEC|C4>z=oF7Gze|c~5V4{!DYKAHn~Mf+aK_(>9q)^4F3Hf^-%XZ;q6Z-i zRIU6_K?p6?+B+NizFjsEa_g;En8#p*t$p2tB295E$mN<|vPc9bVi861ZXR`lMoiig z@itq*7cIq<#7qmji=?t~=g@o+5ag`PXBKvr%Mqf`V0)MFFol*Sr)z z$!M3$D>BT))vdl!^_x7rQGvSLb=*F8@JmuvphGyGQk7TUHr_m4JJ^?Ktn*q2?yURr zoej~wfkdD66(~HzA(zlU?JFlK{M{)#J0K?kE>vLykJ`UZw;Aww+nmS%9=Qb7GK^1H zkvcYhH!ku+R~RZpIgf5rSz{OLzZs=+mf(zBS|M5AnE)W8ru4a(h>?gZ#siW(@<_N zj9fms9oQLWQ|kM5{xH->*f#1^->z zn{RJCr#R5?=WQ`CZB#D9`xF=4j<6Zagn&Bxu z{JrB!{6E|QDQl!y=~gHjgcg49&B(65kG)Bwj^uBQ)$57IshBLcUe<>C0~Tc`FA-jAZIun!~7~zW+uDG3u+2k^Ax!x1759$%|8E*`>pis+Dr(}32mkF zT5u~QZ8ALw9V57h4`GJ(T`NnvT~UF{tJp!*_Z(&2^s;|{@!WcTzyZJ^EL4sB;Imtt zW>=a5$W^ONbn5P_kV_@2AcK*EYJ$xZtr(ge_TF5X4^z#%(ev{%Nt#Uh@9tX-af zIS?S2lukxMWb33Yz~+hC2?M`66PPLmOo;O?V4aW9A9t6_>^--3qofIhQY~O<@9iBU zZWraYK7Of7_BakqWel$d#}!=e981ipzsH|d`l=ERGVTEuim?U`tEdwowU-0zudra? zue_J=*FbfCy|+s|N>F~s&)&Vaa*x;M4wcm8lzTjufxgEjW+=v7 z>m^}@Mf@Yb#z}y!_RmiK4~x5_pj;4n0Z_&)D2YWIHoDHA+x#;!;?f^n@HhKw>h(Ch ziKcD#{@mmJhZj~k6ZU_E%ntTg0G-)SiBy5L z6K8%)0F(*Gx$#5By0*s!(CXv_1VRabLYx^z#N@=;_L*`mzXY6g<@~5T0A7osY;gOe zq7ndc2f>#G>NFUMiU~Ig-wg%|+!Rqr4E?k7aGyG}4Uhr$+dMz;{63{7A(JpNV=>{s zS+C?R(QxeX;OmP5zyJb9-v+SIpj0Ropcdz*tW#eLA=$XPeAra zLN}ZnEN^t`Tae^&^80;Wu*ZZh$4>b0!(hGd``jH(=1;L!S7~tI1`&b`23e5UYZaG- z+fG9Wb{SK~Gq}rtF9I~8hf(Ewze(!L(V$K=+WN1xG0(&6Z&>Dt^B0iPO`VZESQsEW z6IXCoe^@0k`r(NtD~Eo+*a#F|zDy^RkM>G`0}t#FJ4i4#;pM|`yuUr+|EB*>NE0z_ zaFYQVvU#kT<<@c`&Xeo{ahp&l{~Xjn>a^RPjqHR3Uo7JbgW?I4zf`mhEEDpdovi`r zgJZ*aB(M);p~Lhf;>eSY`2q@0eDe7)rn5-_9D!6q1S*t$5BdK~lAkUEh6o^n2mk@V zAx`~5-&ACSzX7~)#_xn4{eC|~f&v))890(i^J?UcNSq5~q=uxyku$Pxn;_pM$Z>>W z%-O`{;cIf*wr=1`lPSPcIS;9h53B?PPy_u365hcnU78FFEG`bqZZmfxF!H}X3Fba7`^@JvG>_&epHNR z*XBwhp?B|Q{XglNieTM#d^zy2jG>xrC|@l?}*d!Xa}g@Qh7t|A6?3}%*=eZg!A3kGmaDI=XOrr%dMVaP=envoddWi zto2T_qtG3rxTF| z??)EjA7BS!uWeh~Cww0VbNcrSZ7#p`ti{)Ij;pHWo7PIUrjQP%YNO!Ihq0*q;|phz z(>vBa&ynR>O-|!$(2a$qR5Zc8R_(N31NOD|dJy-WDCeQjUumLF|LJKXZUio2N)KU&a(YgsKjpBtg+@scy? zZeES6pOfpAn=(^Xob3RUu7{bokq*4xS$ohiM){qN+i`_~xB6Gu>l&!}?!AiOd2|(Y zyF|kk9L(;~RRgx}zD`dY^nX$WvJ!}JZdnD)WCSc6dDdAwNMny_y&Fh!oQ-__ zbSj&ylK7_lPVuUGPKX+ZVL6JZ zK(QY2bL;>#_7(sD?)>2m01jy77Z3nN1Sn48SR*dazQYg#R-1*%d>HSx4 z;(b5de$^@mqugQv14+)%e&Cz}Ld`ogY}1k?75F3-nwF{A5(w)0&J^#D&(iz&q{{Kn ze|&Yvyq$6>sCRuv`B0y)_0Q&(ht}3=^f>D-xp==7*dM=5so4y69%G(lW4&~K&$LLq zuE$|c=6og9sYS%0y0R(K-ERBTJzMei0{M=&Nu3Hr4jRkRACKr7=U!_)h5KyPs=80< z+U^Ml-;>;GvCJ@<`%S(i%CopY?(61VaoZ#%1FTZpCWmI@{B`8Y6FTmjiUr+$wi(6J zX8PH)PhPu|ctbHyvv6`%TE}A#w9+%Gecfr!J~|hSx4hy!XwShGI;i54x2oqEc3n8> zyf+AF_f7!(=MG_ii}h|{Kmm+>$J0M+C#;zr-CrC)qWa{OBYF?qxWjVrDtpMXmRwlZ zw?KUfaz2QXI6ho$Ky|(Tm!3BCC6EnalaFJLO7p#2DNymmXO#b`jlLvHic^N z*?bjdaPnTn>ksm4AIWE&Py1CEL8(|yF!K7VJpjYv$+6aZPeXAg{-+o2aP%5iBI^E= zqj)4TesXGIMRI38GCB;sL)17SPQLH||J+^p4*Uk^>ibF0x6ayYyD|bgtMe}!C(3$O zRh^LG5R4KgR|xVVHk0n@bs5x^7^`w=K0oFvMz}Jx$8`dV1)@(l{apB8*U^bca!t>odU;gfPCRAj{X*7%DJWylXds%%~z*BoPL6Cu;1v zmMJh2#BNooVlbMEW)~|CQ3raG2sq1_2|PSMg+DFIfa@=Z_AIU+lb?;ieZ`T}abcUx1F^8&hu@`OHYia6#THfyFjaRuK9UYQ2zGKaA_@>I&xJ=f2 z<_vQF#akX}scZPYh~GWq$k!*!{<_rx%VwVBjXU+8B=s6N4)qg6V@%wcLvXfKIEOD- zJd+dh&fMyJxUtnc#l4h$N+#lw?jEzYbvD(cBdkO2KX%g?+;PU=1I06-WkBwq?{^pH zuJCWqN9laY=QeP@O-7csxn|Y|B>Jx-E^heis7~gqbP^Yme8hIjKkOR8UN-+${LLFc zqI?WK*u1Q{L=}kfT=xwS0>>n<1v0=R2o7#u0k`q;Dxd(S{?4ud9F|F9JOB~bD>(;l zotjE)gJ1de*s1frxaOoidjby+HeF7kSFquha(d!c53%IN5Q)0_m0K*5R#b;;@LUhH z;%WO&xpt0O*sk+$S*+GNZ>GJ!6)A*YpAn*LYeGa-!0h$asL&kLOKnXmYRwBD%yadnT%H&yFRY-SK5y1v?#bG@0RLE|}$F;(*s;}8VSXm8%Lz=35!6r9Q zKNMlGnPm9O@jTlq3UYFf8Ka6zoXH%#yoOIW#MuUO^ysN7L_zcK@`h1`;qI$e*Owf1 zRn2d|9S19%3!YG7?!D+x1uM}vsDKYD$Vvb}C;$RRW`F@>762R}Y*g+1#t>TVo=w@Q zS$%r7L{$YQZ?H*NI}-pwO|c^p8pvX*XJ_5RCsEsvAWI|2BaxuuF!6X6F9IG3XNo54 zc4-ioAd+-RHes+skr})f_~eFvkRcKW)vXAGPHma`!V3r0J(r#H-SwdV(vy||-0@p^ zKBeY4H3U>y)ccFSF(1n5JspTm*k*6Hg%#X1D1WV8qD=;v&C&n2*5)| zzi)CU90pvPXu5zOQ1Quv10`D)&XBA?NF@9Z$<}7wWCS|I{n_dM!PME%9t((bZhD65 zFHXW=x%b08zh~Z)-e9J?5|5b^&J-DU-%4%u{XvCQMQY8tWPI!Pz@r7DExcCxr?ck< zziX%O-}VWAv!A}*S3vRIHOl#~D+|-PzfOu|ogcb>;Gwy-4hS1z$nSmkEw|MaP`4ev z45RBD-_V&BK>Wm*>sjy4p-{Z+yqC|Elt0gXV)V=%8g~z9`i)q@DjR9! zeqO?wTQ&rJb&FW-e2G?ghllm;X*@q7zv}7*4bqVVP{61zAY_d0LNa%$5#xp>Q4u%w1T{XHkyeilA>hhmS7m(p-Pab?vvt0Ik8GiImxBwt>5 zb(yW^vf2emCTcPDe?uc@vDP_RwVjU_op113-0m%Pl4^5_0kWuq#8~t7I23>nLF3tD zGsk+LrTDBR-=knVjuO+00me{;O18hux@8)ipbZ=Otnu5B=Px4N$W>Wqg6owMq>{R= zg+fF9`*pvM`1Jt6Zan<}#V;S~W}aU!@#0X_txwUcSV20=EOgoQHMqc?cirQ+}+Ugx%r-A%6|8n zE#d0lq}A6q+GSDK_9!r5WAOJ6r|jPP@k!mG^G6v-lY6oOnDj-><#4V&>=U3|z~&abLpR$8yDkpvg=ZhH=F!&l_Ua{PRw8*F}0R z#NFOg>;HW0-O1~{7^UhN?~?93!OyX@VD?%LR;#l+=+b>h5!Up!N_Z%JR*JU!sYb9y zaGZCwT+!zmTY<#0c3qgga|1ur^ThGJw3dC-4Cfjnz;CO{n49lZU;bYZ37d5i!%0xk zSS~vY1p*@kjdblUmDeQKdf6F^$~yJifV4$P^FNvP{(qIsO{FI(qzelLg)g_*otH=- zc1w?X|3}fkucDp(+u+^7)Sf=-bL$T$(ptBrDO=dX%`?H9ShqLpHwC?N#}ZbL=yG0C z`719BecNa)8E_b`SC_v?)*)D_OlifFInFl19y7iIz`^kQCmHHS+C{+D@40W){9K=K z|AM3MJsV}JdFRIOXOTfF8&BFSk^MPRk}2_v5U%GrR2q2_anH@dLopg4a18Z-^Okax z;V1b_t&(^!Vu;|G+|r{Xp6|7i=l^Ia=WM-C#^V1smkAYJWvpdRZ+gu$EY3k1b_u8?(~u(=lPieYbw+<4C!N~XaqM>4 z+e*abm{He^bsMPwZW}zoVMJlP`^TxOPTa`wpkkG`2qmBmJ9`*f-4* zFZR`Vv#w?wCAWFl8UKQ9En~7eV+nq#ZrXO)Q-R(p)%Anln}fHvCynyo50(eRCE++Z z-&vf2WgTwoy7N-9v0_{y3(GkpV>6v$o?T$lK!#^dX)v7Z=bc#lI5zDJ-wuBu5Nd^VF7HPJEdTh)2y zop907tuxq|tvgC-eNm{ky|?i^gQ~l+|HZ@REcIH3=dv?walsL9O1Vr#pOk{q8x{`b ziv3y>@S79O^Zva5l{3HhEwQAi-W_EBzBq5#f19yh?i1*#_#h_kG+PxA!vSEZpj0Ce zDW4P5QJoniq|E8bT>N?@ObZGm^*3%RDWnAXJi1C5xb_13BYIVWu&ZnTYTz{2*!x2? zdOpkLdN$S!Q$h@jnbjl?qjO&f_VfUlL9X?TSQeNwd4qkc96q_{_QY^h`i08+8G!Gw z))+Pm9IOoWc-T(expR)b>?jK+rhE5Vx(e;zNz7e|uNjRgukuWM!QA(@pbchXX_G3~ zcVfl%^PNlNMM4~NiP#G%2*}_)l1GW9t-K}wpZ>-GsT!WwLdAw*!LjD){hL!&$Z`sG z2mvm?9`BS^_pE262DEEJ`2EhjHm4xKk=6qSl@}S#a#v)RIzXD(zqBYrH$4x;~3M zx*s3@EqvEeicc8;k1z0v!hLdq9TYmR1P0XAJ}cKgzn^c7DR9b1s6dUDA4=@ze*5wY z7FYWq{Z*!oWbDZQ7xEtkS%84W@gLmjujET*9nKx8v5xKCrG05Rvx^<^PhspH3;zj7 zo(<)FDc(*0IigSZt8Wn6UGCuOMjB)4)a_RyJ>|&Z(+>5D#CP0f_w7leny>kC$kv`` zd^zx%YcFBhdHopiR#3l0IL9oz^>jiTtG10-xM401RcFZu^_wPM> zct?F9$(lJD(&^RF}idUVe={g;w) zd%+y67-tz|e9;ui7r$!#gI{rjbA$&)bp1NVCzHVQNA>l#fk^8tLSpG1`J}c}T{C}4 zAwg`PufNm7rhp0ieICm~flyR1K?p79J-e?iUmmX2B2&x5T(@`OD_w+eix3@t9bd_U z?%R(JRc-&vjlX--ezz8MB;tAn6d81pETbN|^&DGpII{N?@(n54Txl4c@7e9f<$C@b z&8s!2bzwKX)9vTY4M|orY>rWN4gH?gWzrsU?i{+$)}w>uxyKsy?Y-J8#7_3Ep$s@P z1Vh8VlGpfKfmRzG=&Qv81HYTGD021)#ve}XjXOtW>{3)NNWL>yL~?&HakOU*Zdc8l zE4%<7o6_-0dr+0^^sRNC{dbx3!|{6nZO{SEQwe0olkjm_mEgF|^sh9X&bJ2J2pr?x zR}%F1)E0=^y>F~^QeO5t#ACVoe~-WK`!WHPud>M|JIvI)kxp`$0I3awEao**QtfpZ zAjeWyb0Esc&Y)B;3$x;RkhmPYPx9`6E>%>VQ4ruE3{TwtGrIT;Uk_h@@yf7 z!tbL(Ng+Z(EeUWi5oF%clL|*CpUwFM6)e3$kW*Wm(nv(TkC_==b34(sMMTNB{#wU1 zWLtd%-aik(V-Q5I#mX-9evq?S`@9|A!2qp5Qoj%8yr?fn`#Cc|+h`Vg-d1TiDy)%q zDqA5i2Bb8)J3xPJzyR~H>kvdXM*p9QK9G>xT)?rQnEf{&yj z8kZ7?@l|j?6SF~azbfqgjp^G|ktdsTb>4!+rU*$`vy_yZgn?d#CgxJQJk;jy^my9`^Ql5R))eXOK8$L`?6#QTn3cld|}t_ z;YFLeYgX{-^jShRn>H8lf7`PE7l;eUHuS~fIyccdj`z>|cA1zuf5Pv0#%|Soq<2?p zj$+}CC@jIo*3J_eSBmY(f4bt)-Q$IGFE()b<9TcyN1k$@8uN@FV|7F!j=;UWbG5q{ zh$ujlvK>w&tbyODX*A6L>A&H^p)GBt*r;qM3X~ZAx_w2+`+Qbv`3tVOW%q62L&&d( z6G2E)iRxbg{_?T=M#HnvNJpv1lSMv)?u~iL;@$N5f6aAeUrNW0M<)#-wx$Y41~r^jDw=4Pa5<|}8#V)TdQ+aducu*3iI1&mpz-jUdH~|dwn}6cXPd!fgn%%EY!{`L zF^@2SgbfQhykbBAE1{2|l4W}IdS~5mFS|L0V*?eC#qt-4rUxMmRJHuV5LmYQ+lO&* zYWZc(?74pteqogn+i;heZW<;7poBQ_;s?0P#DzoDb6-ZNv;v`R9T$IOz* zESxWr_ueDNi&5sU`lm2#{}0MH#V@+Lmzsa#rPDC#qti-s8UX)_jrTmF$`iL+>ub%liV!^Bo;veZv&+>c|@_*IYbBh=<_FE2M`-qp!`wA@>ufCwje{H3@r~`O>QUzn zTW*t$I|JqXkH_+H|E-hByZiae>kU#9weFeb$S+6L_ZD%vU0ln-yUR;qGt?VXXF5-0 z>{#2mxh6DK?y945)S=M6P8KdYA?_^;2(fp=7h#M_hvT<#* ztaln4B4UtcQ~b_m$c0nr=nJd2Yo=r>H-R_uV`lAOIx_b6WE4^B}(? zBNUO!!9{4a?ioi^$6gVVs&#cOn-`}rp!4JDSt@gAnIjAo8NHI0*-eXaa-X;BYmE}* zJ_3{{%=v8M7#;SX1`o;npUb4PflGJbAq-S~_Jw6&gC3I|Zs}JVDzxtCrArJ1g#eHo zOBt#on-K{}CT0DCgAN0kn=<|1L+YfN0#==s2u(G~JpN2bGUy=i$xNgJnIjZG;chDh z9c0fo}%z>s`~p z>tG}Gu36$3`8ryj()By#~FK&`J?(Dzw& zNA~*9ih0}9;MP``nF08o=aKZcBH@*(K57g=snYw?#(j6#wfp;b^`E|*FT4z!S-JOq z*Q^7^{tY4hL-f+Pv%~${9AaN#&06PF_{VCya?VQA80J<6H@BsLbj$~yBq;L7)au-> z6Vp3|lPbXE?fiS3Z&Z8%HagcIx1^ofek+0aSNgNwbEaJ|rKT7pb*TA2a@=tIxi)N_ zn|%7z$FF9wOd?Cmn+n3pY#0A1=bR$Hyqq~k@O;}@oo^6S-Sq5t;L{g+`u2p}ypOam zF{~!84H-iq{X5(?1y_dAns4ezqSiN+Shth_>(yW|loyNkHn0uIzn3<#}shiL&*& zULt>$SZH_*_Ee2)D(ks*w$qhuP(S;u$AvYCl!8_akyJ@TB(aAalcTO#JO3=Syy3DQ zJIl5vPJ7Ou4`3Tr(bgVP%C5W+lzA4o{kL4F4|1=YaXY24<~3DR(|TvdvBJ(w{IXww z5*XxUYto2I5>suQZtFSgIBh;7~IQMwT z>uF0O!QhgBA_|C3Wk0b>3?j+ItPGfsofq~z6j(gMSjp5buFrJ_vP-*S)&EqtTg~zb z$tqz9?jkuq(CAMTBoK8~AWVUtJYU71ADh3ZflvgZgD(TNvB@xs-A+LkIqItD-o2rE zR~{3j{=qFO#|NTJjO94h$9r*B9rF`(%pbx}>7+H^kL3##K2_ZuRCT8UE-0_dF^?Su zLL9N9yNkEJ*+eIsacHEf9P=Z;^Cio-H|7}E62<9GT#8LO*P$@pF6Pc@!jgA(eSdm~ zqDi9P-K7ElH2@AW-w^E?(EFdHyT3efR`}b!xz-$4&5*el__z4S@91j2rf8~mEQsub z3!^ylA#vqUdd}T{r05RR=O`K>^*omuP}H%Xy+);qoI z)8RGf#Juz^tTyrXTQAs|doDQpZC|TLR%78K3$bGwG_O4WL&WNyn9w8?OwT=TG=ykW zf7?+*p2SE(T9pG8V9jxrcEO&~t5L;4P}LzJijIGuZfw0~nS3w8>+qcwW#HC&9)*3A zOw-jxQH8VASvuA`l&O8ri?}SgrQSZ_449-xir8=`6tJkLv^$`MM~3`0-PWa(E^oiz z`26@tGpWZM2FJj3{pKae0%gj|*g#PLdgsopQ|l>pU;)4(3{;)`bR!5c3C@on7!WEH zu*p+n`}qvyZ}YNPv`bcrWNeT;93A8`nerePE!e5b!@=TF6weZq5SyCp(pEbrXA)#0 zW7JSL?8f@d(G%2g6U!j;Iye5f05U}aXjG(Hoj$Zo0_e`1|7k!s!MsuB-Caoa$8*d+ zOD%?VUsZKKV^Wrgts!xb;z$ve&#aMYJ4(|8ORO=^QOKW1ki(|><8t>FY?lLV_igD) z>1pndmx22P>|O$Nr5!(s|XSdFIty2_wf^(>J`?mnEWHJ3EHwoF1VlJfo`{9YX% zbM-m5GFEGty~(E`7v%R(O@Hen_5LcG^nB?bpBSF)-|0p{=RB!Z)0HpAXV|z4=MU?!S@C zec`&e%H0F4)2}$!B#W6T%=rw0K3h8b*Wq(^y}fyP(YN&k9Scr<%=Q{Q;l*bcJ(Km* zjJ3|&rE$0~UDMpw#rr-g&m+6^xHdG1wzO1S5!(A8BW-Y6dk}&RZ{OSO_@<|!I*sMy zL$29Tg3=v#E`EMJE>cy=@H~-Sa;oS{Uu8Ht^~~6E{1YYoZ^^YtEP?bpc z=P2HFf12<+jKBgXzQF(jDXfRj;B zi~8-40yM3O;9YBiiiro^Gq`&n>%Py(Ig7ONa3Ecuk3&%sqZUI^C!*{=j_rOzzO3dM z@Ny>B$HeIA{e7xPrG;yqr{dbO271vfst5lc7?*BoEci&^p+WgMj+KyjET}H<{kyw} zUKa#ii}w4=L`H6Ji0Znhs`5*t64i>`69wrS{uSy^PFAf zc$WVBz6wZ&jphpjjW4J)^WOi6@YcUs^PTY)wzQpjFsR{|ExI55$vo$nqTRj8JXLZ( z-5jenW45OEGTS@BR`%Bzzr?oOJt*j#n~*8)9(TTargI}cE-#s15{n}X_^s7KvPKvjV4Jhqs0_lq78&O*TaWvKl_ zdcfqTyLYZ+GhVaGvyE@jvKu?P5T7whU}};`>k8Qgaf~fD+ouy+T8yLYY|pLSm0Dc~ zAo1gEvpv6vBGHi3G5|Aw+O}&8_o(dcoB#veqGc5xAq-TV{8TjvG0(GiVhW|uD|VMT zg$BBPk~VYEXKDnnT3@J7(8=i{;BUcdR>vR~lPbvKCw<~{rcQJW1SH>LgQ`kJ37yw? zvedSobf8Q1UY#UnN(JQVAeOLW44gmj5<=j6fAU;A|Gu+8AN&7qmI-1SDS(RJO^z(4 zK>_>!^d<4qY&OL}Kd4CC&!Gvt9)8-hN%k+S$Gh^SB|YU@H^b#(duLEq1&=v%C_nmw zQ9o5wLBxEMy96n5Z!2CK?>`i^7tKP9j6&PLSVf~Y{; z(lBmfi{=j|bmH|#=kf@$k2^%%(3ZlQSsz9HyL9GncJdxF*?fl z&gI7Jx%u|Zb>AMi&5EnM9tsU0awPulIs}E^#y@CobmVJ&=n!_+=|KmyOT z)qb8)Xd^4(bQ-IG!LwWZ{?};IrtqC#N;iS5^zSp%M&#@Xvy#};ykq9|fx%BE-oiTe zU>k|~z#tlAI)IlpVIMNg^Fvxua4p$DIvHWNg@q}T>#y@BH$)g6)?V1aSga=+dh2*= zZlw#vUNVRYJ?(@VyWaPH;mZTy8p4UD%V}v`;9?)9YROGFU)kX(p!9yS3w8K-{y&kp zfZ!nvR89O8QwTBYly%DHhkKeCDy}b;-Rxudq-n<|gRf%fZp^tHPSBi)Bta5R$$j6~ zY}wM9F4Yim2{LS@J6vUo0*z0Bm06Dq^JIX_vDb1uR?QJ9B(9=oVcJN^(}^NM2|~4% zX0osq-%lXHpBHtnCNrS3u{tKzPu)9brR|MDu(4h=^yS?gKV;$A3>y!W_4P!1q#XO6 zrLc7M&UO)re@vLe_M4>r`R7DPPpDR5z!TX1ug;tY6y96POSguz2cQe%S@TPa_)m|> z{>J3gULCEp{!!pw0mWVAJ@bsd0W?=Bb`8g56Gey-<&&^9gN-*M*>?LGEQj-QF% z`37<2ddK{Ezh}(x{UbQ(oIU>ruIj!1KlX9&(Nm6F`-s|y;Pr{j5BEMJmdIxtg_Dug zx11h}`JSx(y#JVpA}%zg3?Lf*nmXs<@AXqM=XR`8JL)piK!sQ&WF2R*zxT||_%46z z-ND=L#Qwcgqbc???agnaNs|HR)mmV?f$km?ySp>#8drYv4PYLRvd3>{w^WV4+d4gQ8!DIl{qd6zW{1USwOXpmtCiYFqVKW{7vBB~ zXJ2be1eFQQ1W+t~42E9hq2E72{@0`ba3ph|OUxR&m&hsEmz^Wtz1ffrKn34Kvmt<( z!PbALi$VOe)~e1{_qle#fpreS)ZM|h^J3{9Nc+dKNyGKs)9km8@OMVulR@%--@w7) zdxyrWaMjsP$g(;^v^`HQbQY42n_N|&oKkr_cT?3jKYvy3ZkhGhe!*ou{^#@g$!?dU z+?DPfxM!_@+x3avuzjoZyEo+ZL+d5SN8&w)PRts{VA0gpI?_9Gmc?>Utl^#47}NeE zSc4a*Y(mc&c1Vve4qw)pzi&Gx9g9o6r}rLq&y=2<@CLJWWDtIy?^;d{^|@YV+SqHCZ}KX{un&3VJ-H||+{CN5NUXj$17c>jatL<&M> zR*>7(>?7pqO1F}`k_h{bBCdUmi|!wg>XkEL`Hy#O%#R{LBIKnPj8iOlrXUfW?>VQC=W9KmiN^Hzh_Ync%mVI^F&VlbmP&{nM}ja3N04{lBs8&u=&2 zkXPs{^;7!0aW1{J&mU~ZTwCjJQ84E%ZRMENqeR*I*gc!-q`?^eeul^ONH0X-p|rf>FZ ztUhyP`W*2_FlDd2TpJISeRrhh{hMlzs?6Fgr!dWpkAi$DMx7-Ya1!%N!b(_+IMa1#$T?N1<#P) zj>@5w&P4?J4|Cpmn`O)%^W8sE@y&7_5KP@Ej_6PHQ2h4?TDl%YYPydu4=mPUB+zAd z5J;s}bM$VzD0UCm=HWRHukku*YCU0walc7UV3Yc~b<5P;K3q<~#dYjnd?lhby>dWl z_I_6+xmaI$e%gW&0ml1xLVu!)83QMo|5%N!c%8Yb`eW;lMaMi>pzD}RcR4J0%~<;x za&_Qn7+)g6)1O8;XW+4r7-Pu8J!3@!OaK7;`aV^s-_hCEtmom~zyJgI@dGdb1I_rP z75ZxXqNvOLWJ|p|KP|!d_Vqh&=0)>)T;JR>uW%#CHzcp-$ngA04*+Wj_$xEFsVlq| zM7qqf;gVKd3hxxNr&?a0zs(s*U#EPoq9)_JLFix2(7bRN$KrK#$V)Y`PJh$p=oXau zc}!eCaCcYjt}i&uExx+v?tIO^QQ+FP#SS<>0{;p0R%mjcvE~V!A5H#l-uHdY&ox=JghbAU&~clCyOGA%8!+iB!w17Q5*~0$ZE4-ObkC)$h?KRol*_d1OIcd z5HD~e#5f5Vu>IjU(TS=58D%U)tibhrv=8NJFYaMZt*XZBWOb$upW)Bkiq16&e&c4#(mEC7jife3E<%bC2kd%xJQ0 zOEZWOi(s7Ec@Ci{>&mYth`1`RS`B|kXNtk;{+Z>-^DJWjuDNvg=AG`!*EW*1#ipP; z`Z3#byD&kLdorE^KB4E{LHGlyX8j!V(AxH1_L_}Hur9DG+SDGX0>=H`+Z zBu&O^pu=^?q@`>Ax^As?|D8r+9Di`217F5ITk6;G;}x%~yY9$H53`T|Fb*MXRAv0^ z5(or@!+|(o*-~2NtgCIKCNGla;k=Y4I&nVr7RUm#giNgSoai}WAL*h}LGkh8>mv4c7239Vurl(UiaBtcDF-z}^j zq}aR-_0rtAh4SCoGI^!u|MMWX|1LWhAH&}-85c?aJ)kaQ`x!SQB78+r#`#d!VKbm- zQF+-hALI-m0(_=S1_T+{9|xIjQRh(pSAzCb_aJn}9VP4g%OC->$b^6z%r=lRH-Pqc z`8?l}=!5WtTb@3hkO#Fl)4xYxgQPC8Y>9CmqoKMY`p;7zC+h1+xbZniiiKx}e}zRN z)goPYoyl2;#dbfqVm;f;bs%`Fk*&Vr_1;R>9+$uS0^+5taC@w2*7y)8A?}aj;GmsB z;Jy2Tg246<{%lR**c5Gh7h6xSBg^`ZW474PQWq?X;oADExj!E?=aM4;_3bIEZjkeC zai5Az@Kr?q;V5wHHcBgcCUE@08lrs<~RU44i+-U}E8fMtN{V zNUF@eujStxK^L&Hu{BN7GGs-?MT;f|w5N)EhapF6L^6|Y^u*$m)NG)T#YHom)T zVjGG$2$!VGc?^3?=ZjqOVhna#88V@n0j7P>0000001_9<9hw5d5g?c_I}7&X?XE8B zy`WxFlBOqZMqO_bop9Et@(Eb3MhGxy6QTL$q+#;rOF=qZPi# z;R_jSGQR-GV!_?BD-w0j=_Sx*x}05WfvweK>knQ>u^^X@LpM_Y`H)4AgZ9mXF?B&O zAF1?3m=3^?xmMmrJb&;yvTmxr`;X1*OI1d@g?KH`;NtVUhiP#vOYafOqr%Pc4H?Ff zuYuepbj8J#`6t~S;o`Mhg zy*H9L7w7eKdp7@?K=v<1^Pl+5cXzW`T27SW?}oF1)3Q7l5STFy)AbnF@AK&Wh1a^R z!P=wFqO(VuXry{_D1IS#2ft*DMtPj{5AS(zcFb3jmhjVQa~9dw{JO)L_cyTR4k_^I zO5xIn2Sd~MV;v-s$BofTWNQZFO5+cIvX z6lQ)uO+W>h8!+i?{DtWo|0 zA)^3&(5e*tAn&fgARzwJ`&?~Wk0*olny%<4y4l114!Pg_k#7RTKMG7c|H%r{m_iw9 z2_!95yCT+Mte2G)Xh^fyEGH(S?<0FADuW-~yMN;#mB@TLWAdqxnuEM|_ChaHU?AJL z3b36=viD{4mpor9lTplp&KCzK*Vs7cLE0wI**Ko7p+3O#n%^{kL2JxH!2DYJN;{jk zlOC0its@*}&%W-E)CBGRfzduai1SBC!g0L<>!j~@271*D8Ld+32Snp+2^OEj zQ=1N97(v;&CyG%}bZ1(fQ4ZttfBblklgu${J76pGcVP3TaK;2H6|kXk2;Wlo{U6tJ z-XFA??JH_9dnRL{;&7bq&FCkwWmR+$?>cXlDNna->&nTH_D|dE5N&wUt+7LC7K;+5 z=9+U(?e9LV|M4clBns2vtVlQ% zJ5`#q?iL|)buvmUk~b|~tKA%BZ9j2k6a5V{igy=pR-wq5#qC$Aw!h%}ufZiYlS9ct zC5$`BoajUaDqKkkP&Wf#P<#SQ&(S`D?FD3O<7jhASl`fo`@^MhtaKl=Z1p%UzNr&E zb5teqXpYGE|AN{b*5u7i-TlAzp9lTtsb@Yc+>O_;7qC+386Q!&-}qK2>}E4Nt;?qhzP6!)fxe+ZMyC;xlfSjNjw3 z7ahL#f|7G$Rt1H+`MkPQ2$AA5j7yxS_Z_}j&SD5E3c-UOgGuB5>!>i!xYUP~V@V?$ z=ew87TOn-xs}C9IrZFuQ9?vMR)za&B22HEjt2UErTob!4(+m6t0kYOWV9M6h9y z(s7Pt>UlOK5o1tnVnuQ=@bcm z$y1W*3>~V-+=pkb_|16)8fQgui%^`Q9QKw{_=|1f{q)}R)>?)y9aO@%Q&d9UU_|MTBZ?IeIu5pW8swjH}jZ84;!QZo>>GRSz+$HUEk!~GD1JC^pkeM zqYa57;>QkSh+|{vvMn0sHFIYcMSifa7wj5L#?F(jL6WT?Ylk;j`pVak;@)qpvj;y& z8H!jJBWJA#o0N@cJkswCm=^2tI@wu|(y%^ic0No5xLSlzdV7r_ormz=U3&PxD)V0^ z{Zl>@7(TUHA7khKob0~Cuy5a9B9LRd-tADiDa>y>f?%y}V9d#SJzqS41cl}WVWcR5 zZ|mmszbGf4d&sLXwex9J@!yRCL!3&rSi7$(JGH1HS)m|B+wr|jir7x9U%~N@)rd9~ z0XN;O!1A=XVh3;AJoC6cvmcCCqbEz z&tN3~Dt?r%3n+?u=iPgxzVo=cyVs}!ZY&TQJLP!bU?=}=iR_QB^v&8WUHJA>_g6eq zozOYTJ_NF-7o{}6u;z@TBwUt7%TGCW1vQ82*4gIoVo!!n)@p&ff;<%QK={m-+la!P zP*~4VQx?k0d)cmL>ds0F(`Sj%1BJ<5R<1H~(#Oob*RpsomQ?h)WV@u>)?dp`5-tjubR9NP*jm5i|??k zlzZ1=+lq-8p73{Hk%hR3!1tHfk&TTw2#zb=|H%$7uhah=JG2vzclzurXCVw!UHo(# z6$OL|f7{A8c3PY{gp94;Nmfq4BZ|!u`kC-Nnrv96sFX$wnMn588K@$Mk*#cu+{qD& zwQUH>{Qn_*CUUr*w39gTe9%p2`M*4eX6h( z*y)s&lkf%;JWpEY?}_xa_!(+AG%-4Ii8gAt3HPh5)KGRO1hI+f`wqybctUT_q3=F_ z-z;5m;MY+z73cN##U;EiJjn#`Bj1U2z&(pR>$&_spAhOj6S5;IoP49yUE$IG&)zz_ z@>{EN-DAaJy*UudDfI4dru2?edBia1!`?^qPI8j$E&WIPCgjpvtBTK4keH-pN6AqA zc+!ozQ}ZfaJ$t$H=RGUOyDy9fZf!f;`MOsr<~N^B*_0tWru2+h zuZaCsV?{?!dTy1CcJ{DtZm!4AzH<-yh7|(Yd23nqoXC4;3-uq}*mTEEPQm-6ck!za z>N_9~9hx`BrmD`)aJ>%zvY{C9QhGBzYx?=MJ@st0t*Am>0Yg#%kxBenVRTSQ1a+fq zWfCYo68Uzz>7z5jM+{p*WGpNU9^Q&cm58Sbh~}f%ja9cZo=t^p{msGdnONf`L{ZdEnq(T8)7x(c%wkTWZ}7g9zPFf>H>m;2>| zA+NirS5QvQfZJ$gTa3FKh~0`HW6%V!|NgrTD2M&XNE~nXZFyNFiN&+BHp1TA0!!pw z(ZzeV_T}auHH7oY%by;@vbErIt76*4pbXa9S&V6#TVbU9&YYg0^ks~k)-7sE!t2K; zSblTHo7r*N1cKeZ?F7TlD^F6q$E)=O#mvd;aB{v)0;)0bF3aZg`N8}@=Fy(38%%0c z|GO7W?KaiS;=!W)(hm;Ypt7wtcPiF}T|g5=g8i=u)$R*j88@k;$&gsol~lQNanylk zwLqjnb*^2|)|i%XInHxEggebn))z-$!X+W#5xb%CQ4;`|xQ&)$kT?Q@iE?c(k5c7d zfFTT2jr?)J&oRFyz{3q1?##}uV|$-JgkqcFqzj~=QfJTGT9hLpd%Be0#Rx6 z=_IoO)e|N+y=9|Yso*Z!%pb1nYRI%Rd2)beOl|@)Ar~6XBHd?#9)AXw?n=P0;%_*`qy!pL3d+d}{i>?fs`s5tZf)(4A>jKEU54bE3 z!DR6G1nwQ7+wGtEZm<4oo*yGq`XAZsapK>>t_i-mlAt}>cNRqD2@$;V;qcF5vN_8q z2Yz0j!KJbQA-NMd^Vgc?j+fWW8c9~cn#kQXPIBIV*_j%A1hx<9TB5fB-WjVU>-_ng z_`}mFy#2?Oz%x77jCap=bC+~w59sNqS?(~_oao2074l8-p)4HFUUijM9vyH-Tl08- zY5@=L*@>q@Z$JE4H|#wxHszC{-a6L%o5lrlt~U7Y+i?8Kji-L}&ShH4om^JDp~I}; z(;XtQi(J&M&c-q33Q7;svLq^Rrs90fH}sr$>{}LX)!9YJ%9*ygZ>ORzU%fzkauLbg zYgNm^j5Z$5(Duf?eq+#Mtydi8Tvn02_diuq`Zb~qyWdESspoCB<5-+^VMU5WnnNH^ z!F`DVf}Ax)>@Ql~WybWomyEuVE_8j`iwL2xfiJgn?(w-ZgqF;T(z2+SyhcDyAg~P; zx{R3H3D1q@jD=4+#UZMfK=5f>Et4bazMK8!5(_|3g-ACM)4?JyO&A-n) zlfL9_ovb@gi?iPl+zE`CWt5 zJzqY)&b#)vu}*KDl6yJLYyBTN=9^~GkmcJ2vx22A^)G{gn9F9SrV1|x>Wc9|`K&x& ze>&^Z7c>7Juj)5d=4IM*dbN9hE9s{0S57!2b^iZ?Ha+as>*aB2sWQ)f6k^=4cBdtZ zMlvEobYIGWb+KvCj&*7-s%A^!N2w*v`R8k2@8u?i=3hWNTUz{Y9JS6 zmi)LWV;~113{*Y*)D{pW{g_+5II&&uCmq&Z8p9j731GW{Kh59Eq7bpRcB;f}NE@Vf z{TsHS1=GkG0vH+DUS@S%o?hI#L-*N`xUF!jNpfT8Vs&TI@}35AFhgw1DV9a@RlF-i z5_)}JVZjgfZFfHcI>E*LJOmv{M3>@aqE|}d7FVW9?7IhooA~+BR*e!RVG^ozXX)*p z)W<}I9>UIs^W1KFmP4CyYP+_3|4VvP`U3rlwjELz$#K8i_ACC5`=)E42`m}>vmW}E zP6Ptx&U()k-Iz}qpz3a><(V#l4;t|wMS+~ep?VT?pQ4I;Z-e(YPWivt9r4}Iz_v%A zc$W8&HcxR~;PkGinl^h65bf-vyJRPv2Ur^6RB zH>LodGl-GO?zK*q|NpQyk`h2(bec)!wPtu{(c^rdu=nOZX$ZJdI9TLjIFqarXrqUy~w84AY`_qq3^ee(lsy?y&qtHF|X4Z%l}p2ZM(Rp$nA*w`;RnEBnO)5=DQk z&`RFb66Q51n+w10_2+MOUd5_lNn}_p(mw*58Y``>RY%OqZ#%T-lw7|nsxYwebpdxw z>;Lb9<6gg}Ul&VqoqY}CA4mW5Fuz-Rn219jTzVUDUij~8KGMKNTDORrjB@i-`FUCm za;{6B^sG_vKW~NGF;?)H%V;Qu`ss)3e(!U;I(@j+DPdwK%&}uol8~vxMN^#D4AS!3 zR{sRZD{DiVL@<6%EW7PQxQM#R|IMXph@Y;RyHhm&;HfiL3XFT1Tyx5qn@#rLhNTeeCdBR^h4s(KFG#CrJ}1e3u}$_gihSO0{f z=0224xNd@E0apt2UW&=c$Zo9%R8TIs*WCQ|!?#arTX@*d z?$r|_e=q##xe}=3Kd0D&g1K~eMz!-7xI;OxZCL%dUs*@%JL~EB1)UrA>X6*hL`0TJ zA>^1|(W)moN;UF&ej8=+qg9p2-a(hXGnM;CFi}PBJjFJwajq4v6!p&Brg6*mOHkQy z4xZv!_r!PeO0SB=d<$+`0PG4+i)JXj!r;_cg&7*az9+2q?H}MigF^j1>wJF7pU%xQ zzklF9WLo5^93QDZ>$fS+ESpEy;W^CqiuX)U)_J~;{f!-&IG1-V&8{64`R_h*kGB?e zPgrz4XbXp;HK#VYVwyS1nhU0QiXLg^J!6!Q>fdN0xMX~%fyBaBwy*tF)9v7fRyo+R zp=Fj+c1VkK>Hq-|cBU|BFeDHq|BgMoag>(GqC+KBDkxNdO74bQ)Xx{kZu%6OPdD_^ zRODJ#iK>LDD4C%BaGC)=tMM2LZsSy=%D~5@OIn7~FW%}QR7G&`as(bo(OHzrTe_*7 z)k~>jdC)$C<)j8(nn6L)KWg?#IP>^BSG{(jC8U|r)l%?2yZB63>e-(MKjQmWHf&#> z(J(&O;4%#L)_=3on$)Z^c^%)`Hcba8Q+z|*gq)J%t(Eb!$tH8O5%`+~ErX_HfY3Wn zz_0~8eoaLVCxkU=nP#-rSH?TIAxl4;V>xcUN@A-4*YO#)Rnaal*G#l_sZcAo z>}z_A$p)2(4L#Vhaji_ePI!qe{4&3@E-%v@Ct*}|TDU>Sc-;)7xENJ_!y*bSF+Ds- zfbE;rI7))0;G|5eYBjgAo)`w@{vK{$t}hs`@Ex1)72s39Aq-T#{Lm!`CC^j}Ukt?- zMQq6`Db9j+kVhlJNjiZV%e!WfjY`KE17yfRq(+qDHdI{tP+jO5*!K368S>(sp zyFP=XVh{8EYpo!iZ)V5NqoSK(-NhuS-;*Mt{TBG|Ozv%yd}05JyNQ)k`s$Svyllmk zGHCWsiA#&%#ERb5&f$LI*~ac1_wYIW5;ZuuveE+TEud#MM(7 znrbq$dX&AW0y-MkW?Ke+E8lqXG|oJCgMgW337yhFiX$2MRTq4Ufg~Sro1)L+ zCi)zw)%^DzZm8CwB@ln=)Wwp!7u&9}ej2Zlxvwzz-6?egsppUHS;6vxAYBwJdp#KAans3ZNZJ(pj2~P73EkQrQ3FEr z(bU7Z)H4=va6EhX6*Ucr=8C63dyXs1E}Y^w#pjIWeznm%{Eq#j^1ZG8uT%6mzf^!G z!&{!zqpK0PR{NPRQMFr@KsndB$IMdWY1lQFiNq&7-I)#>RDUk+i_Ot@<>Go^!u(?{ zRZVWaUge(SclPh{^`xX;Cvn?x7&@4Ri11Wx?<%P|()mtDT+KN-llykfx7BO>AQ+y7 z=|6v2&F@w<;wZ3Pz{ueSu0B!2EYs1zVy+f7?Bm&+nW5BWuc&k(YBe@h%EeuGJv%X` zp;yCUVHm`6ce1Uyac_{&Zb<~|0TaVj(=dlO0Q4b@NaYSZ>_kL(OmZ2nq$L4!fKKiWM{-ga-I zXHxNnNI27@cNQ6_b1F?ol6HQUepSk=ao2TrhDE1zhZ%bxVET8x_de>`{`ME-)o#=M zXG=y@^MAGaqE7_|-qwOf{v5MK7E5nc%RD*1jM;sK(VXdW-<hRbe@*yFKgAk zk@Q~2hIXX&Am!fNb?h(3(qCTNBt9R{FNUmYYXUNkDTAvPPleH)mlog5NohqpgPXhS zFK66Sn0gVn&6CuPxHEJK{lzqF;^1w`oHsrUj0u`lGw=H(Is2?Tg4IqTBpaaLgH^iu9xo6dCY9#u<-irqnUVBOD?0e zK5x3rZz9uh+hYjLdbRoYh>P}co|=9(o1LS>G z8I4Gob9Sqp%Z~Z9dFV2FH*S%r+oYMglH}9FcicHJhD(=oqVY{`PG|4)qMX3oY3tcj zJWa|_>zrfMRhi>7XJRrlkBlf-XAHqcLb09M@L}xPMV{f_{Z`7*oOU^yrrC9=#~TZQ z#K5r87+7+`$Sz?vhWuj=cmm`#&6zsXd zW>$z4`KBNacP)+Y?eX(OboC%7JcIx^Aq-TN{LmE;CG&clG3J+1%yjW|0+lV05ruNh z^05_Ct?Ck1$I2A zkDu%Q3!1VTBAPc;N)6!=^&g~u`iLy7E!8TDgCrI*CUa;=7mV71QjBg4+rvAj`Rd$4XnZv0o8GhV&Y9#zsj^8v?y z@w{{|fp@BE_ta&P<?d?yzU)$*BP5R(p$ndjrBx!&C7nv&PX*eo1ec&9%H9C1q z#gy(WCDl|huWvW;du1iE-nbPv{-CR|k(IIBx3(i;@5*`2!D;9f8|GbpM)V}{2%9pWHuL5FUI&-XmNJdQe%Go-q`vhnp3!RH@I0QB`=H^z`!|@u-G3!S6CAxQSxs$D)04ty z(b5^b1NKzmmVlqXQ2F-}>`%|Vg`~*Zhc?4u{j+M5jIU;J)zpSAO|%?N!x_Si!^C1p z@R?=%x>x=irAUwyr^}kxdc$=i5AdF)GdO8Gr;=!?BJ1Uvi*S2O$hpef+{O zOXthp?y1Ffh4!-}CiNG(T-pLzoe@86bq`P=agfkfB=(V20vGj}HrX_UoHzZ_R%N~b zhd_A0vSUdG(IznyJY1+BFd*GFRyMh;h2GfoH!l@#yGfn5VxO}#zWKqC{r{LI0+CTY zgo(@lY}qUyl8M-^LFDqjC2JCi1Q(zEz5A2k@E^+h?bO04E_M(4><%pL3$*j_IID2; zN8;@8R%7fd;}6J|_Hrp|^ z^==0W#Wib-KQ#4}(Q2yA7E=6?81{E|wrHZiR`(X__lTRf_Tg7NJ&)7XuRU`Gi_LC$ zo<@=NtoOycs(&XU^@XGksqpxB`8$7G?jBsHsr%}ZXin+HN0G4CU9%FH@w3&1CDTP_ zD30iN?CZvD?j0e%wU!b2_Qc1)d)q%vu-uBeB?63cD9}&Lr{r&%Z1mb2W3=jwl^tZc zvY2?)nX)s(`qvkr%d+Xo4&~o9eyShcTKTKu0sJb-<~8aiZ!}vC8Ny-&w&FLHeF}}y zt*ZRw_#Gwx)^_E*7?x3gd%9CK0CE`r4kPk+=K!i zR3QQd+Br123_4T$v``|^qk?;*qqZ3p!IJfyt_8hEykU*@i~aMO1>QK7Gf1>SWIANY zwrNaT8!_LdGlNmQOTT$z?%SrLq;9sKd%@ryo?-G{zKRJu_$$-4M-hca@ap=te12Gs ze@7i+zWR#3Yi6AbbJqjR)8@R3Jp3z{e5_36b&U#|Q28Bcs;wFeV>QL=%MCNT_G{eM zk0R#%;e6tHO8!&Nm~m6gr!zF>`Gsp=u4hNsIM?#jGB|r}rzG>NX}0IYm;D0P+p11s zYb!S!4K2fxdh|`#PiEa~7#j|0i``O4*=g0=DC>NhJl^#ATdZ7i&YbOKK3kwO-&Er3 zXc230G!WN6^7gW2A&fBqH?oh$@EjowRDJw(8w~`)3wVz8-mdL=4)>_BR9)b}$+|Kf zv%OjCB~tkvG{Q7x5R{TCaVytJ%B)J9(kfp@U83s}Gn!6GNI-@~0=F1PX^0{O&Vkfd zzCBz+(mz#oj!Z3K2gNSnWv*QOSrHQjCvTAfuu@zWx$Wo#V@V`3+kz$pSmU5zxxe*3 zm*6fJuVVFoA0Q%G;D+BhlV-Y9F&k&gqgfY`{F_VP<6F;_A-RjByQ4zJx#yl~*M0L0 zltUu_SLJhxESOG^s<($-TN5cZcPjnM&pXNa0n*&-yd>gKW$_%Pvb^v7n;o^7;#4>` zRa1*gB&%x>U+?_b+1!znBH~mUpLh)>&l;qHMI3ia;oczy1H7`9}#h_)fUq&8;E_9iyoE3 z^An~-(R|s8aDJQCJIUE0dX+bt_`mw~A%B73t*(HKZhTXF($VK^ZyHNV=-mSyl<7M! zIe4A3xBeYoNi>RtC>{`n_1W(sF?zWMW2BvvSm(IfI>a88{82S-X#>6 z04tJz2Hqh6LL(u>Na>Wh&;+l)SJK&%NPxdOD1kL74Uq zoq-Shq)NTvTr878wYk%ttk8KsBz=^V2SE$fzCym9Fn>*IUXx%Y^7hV+2UF?8f|7^EfoudFGwbJ-_Sh z`k^sTI`)^v|6^gj*bI83FgergnFfyL=Uw*6pMOL+!yv26>OSMGXsCta3C*<{%^g1T z4Milv&m*pzxu%}msqgUcx{K)(^|w}6MDI8T<9uH!A9S4|sZZu_xMe<2`-xg@hh~$q zXXp(^%0H}Axe~+?)k5Qj#iX98X@@eJy^QD$lOS-=*8I{(W{+D3)$}8ETKoQV@mhDa zZg(u}BwnZ{D-{WuzR_Y|cCE+>@AQxZfFTT2t^BkX2rcUG931;^%KOM}(I{JK0nvnK z=6)XSQ8lvOCU%rX5Q*XmTG=HnAGg_l>O>gq6+PNU2=-wFvSmfQX}gBx6sGH1^J9HZ zb$>qcFJMtjsaGmH?RfPB2+mILeHooY^ug9qBqV8YSdPavo?=WGIpx?pm zURr|nRQx_mcg^{lteT|am}O!pZg|ZuKNr@?EUj0XROY3AOAhS)&B=M6x~AP#+3(%;O(Z=S~LR@*Caz${Ti;)!$@h!zLfZbd+5}whxT; z*Fg4`YSY!JDUZH+8nG5)(y zycbK`c`9whY1DVEF$cL|$~Jh~PE>yrN_+h$63rGLWyt#xvDuEyB9@f_nrOt>qhsur1BJi4=b6mKi|iL1 z9&G9C^|GWC%Uo3qajU?%Hq6n^ZT_+3r=D8B|5u8|2>f;^-8UP)f`ACywGP8Zf|x;X z;$5`a)vLrLt8F&3mEGVWWrT|t-l_M$eCNvIX)?1OU?{od3j4TZV?iQIq#l$Z2Lz>tz$bRpv z^$7HrsWNDH6Q0f2;G{6pI_G$XV8e{T4)nwASOK|X40M_wKc(x|yafHC(*+znh5U%R zs`v|6l+5 zGW|iY&}?iFW9B&}H9Xc+Z7QU0r8Ph+Oi3fCkM$zU2u&Hhqm2?Wm~1^11UheEOuc6Lb6gpiN=PUG#}-IX2iSuRda_{ZWRaeWW< zFcbds7bZsCMkOG%A?eBlu1*c|KY_7J^(_&eDnZoj<3DW4glNp!lkPjK`#aNb^*4R~ zFV?zaWbt2fT-8*S>r&`DDWa74d|r@@`wBF}yN>qf*_d`U)a>%uNRVid`%J1W2Z}m5Zx?@&NOO{fy z`O9rX;Q3p)FK-xi;a4WasX_MsW>vf9^7{^>ZL(ln*DU`Nn^Mm8Y|UTjdZ(qfUdoa) z$0=2fX|*Nyz&=~ss^<2vj20XDewb)Y4cYH5{FTOfn{BqAJBN&^mgP3{nXrm6^LMv~ znyX@BqFQxzPbqexS*WleVu6w5$`Ec!$(B@zG2%&CtJ&Fe%lm|sI1>7>Jb4aXw9G_B ze;$TO;5KB-rkNLri4)}n!tFEWmN>Gc36a;fEzl&2D?~QwzoREB`CwY&KGvAtBazzU zz7%$mEf(Y8N=BDgRnLU-&Dmok+}*oZ`kkF<8<9OOrU#bBO*S6fo~|43m}pRYB#n7U zS|g?T3+=M?q)$&^(f%C--F)Y?`|sA`_~*bNS-!asPc$gxyerqPZ@F>rNwyt*H<_#T z3}h`6Qo92A&S;$1j((rcdz#>me|1dPMacf;y@a;;8cC9BmhiGn!wj;LAFAvpja#Jj z-=fIJ@76KUdajH5?jxXS3nqb|JrtLrVUeU^T$yy68e2LwzV=y z1f@)0hUfJ4QjdaPT8%U%lBP9e)YJnAq#W0uQ&cZo!o6Ao*;cK{X`vd{@Y1%@=HPCf zLr|q)%WsmDW*ANBbmoFZY}Y%0AuLoS{4_feh!pyyPTTD_T3QW%1=lt;RF zw44aJKB)&wpCFKyVhG4sl*#L~HfAT*NX=;$sGcaqqEgD!NwHF4<@S=M3d#J}D;N9x zH`l7UX`bJMr#he4uJZ5V01hpIvnCf+_LRRGie+vtHHgrnpo#U#VFVI*HFh4!g8o+Q zKXK*dN+=!$xOmRO;kfWWZXWC&8`B-({Y|LxCISJQ=bl}W96ghWu6R`;mVSp1z6L^Hjb(M=r z{GNQ~D29rsINxH^vv$^w@phN(_aH-LN9>vh6Y;xE+zVNUaP(Xkl6nS^oAUH`G-Gtr zQx;(1glI2uv-{T4wibvEOLFe#QYA=uCD_x$L)+c`;PJOFhX~C z>86X{e>2HKX3BOgG80`sBui_Jw-Pte#m;92)awOREAXxM+I9cWw7S4qlb~`Vrh~oG zm_VoZ!VBxFl|ETw^0ngO6BYy|;z;C=J_FId+&rRr-v&n!XpKn3W3E?TJbqxbf<^`d zj-SKG%!653pY0UQ})pAsjn@caIm|#iS-r;4y%UeE@RA6 z4YBo0*DOn*aL+eD^l#y5snE0Bp2Y#cX_;{Q^kY_)N#8z^-*w}BXXEGg%Ee2h{495! z=(8M+o08gj->B?a9{-o?`5d=smz-7VHvTBv3n47F*O*4SJ%=Y^rfiQv;5hxyk5f&n zIL(Z_TQPO(R;yl`YkfvXU*0QpkPefS{Y9%Xd^Ujf_4QQ^HVM83Kgt`$-;fF7s1}ldOkn5mVVD1#MA%)015&!%Onzr z0N^1`p7@{&o%nGV;E-40kXPZ5PIXJ1wa>r!=JD5p{60KgCybi`9FGkk3WWG}NQWQA zlAzBYA(|gpa^+_ZQ9tx1Lh^nlKnJ%cG9x_ep9PSKoHk)LAH%jT zesAiA5oUth7TwlQGk>jp#$ZE$>4@{KNfu){D_>*P)a2l#;x4gmjxU2JB8di0zzHcp zt!nmh0fdv3P3IutYgY%J^MMh9$1R~Vo-0xk00<2;vORQ|(=v*uWw6iJ1oT-lJ_Fnn z#i)-Y!;#tXauP5k@V)4UdKoPr0V6iaE3mz6fyY3Poqmu=?wN%}K7j|^$tXY6CRv^! zMbiATOedj}T#xc=vSD2Q9)#^nRkS*%s>Pg2utZT(h(%^=Sec{pm@qO_XXr$f=vLe$ z**^&W%tTJ2M{eKQ@zj_KzvOK7bcawmWuteNaJSJPBB=*ilaX3@rY&uF*MUl5_V1z5 zIpfrP7O09>?U^U^uC=`#%)evU>3UTc*O$|Ayob5+2nOU{hS4Z`sMU?}X%AdM4qRVm z(Ej`G$lP_&JWneZp+)!-W%@o=DFj;xo z23+y5AET8Eq@TMev^>?QI$NXPjp_g}4svraz5b5e&sml=atEpo#DDD`sv@t+Ag{?F zugM^uzXP23&basHrSDtwzl!;Dqt^!HF zgXg#q{|$-tZKW6Tb&>h|A4Zqa))!;wc{E8Y%H&hDY64jb5Qq$Us`B`9aquLUGmUI+lP&4BIrg^pp@tIRt3XAv7c@LH_ge{XLJ)Py`|9N#=q`{1lee z7WWY+sJ&ZgiSo&Wg{{ZAGF)(*NR|eLU;;EDb6?I%<{__+K1Z}c_RK3RN#y8~Ax32W z^`8P-c0xB;*n#r=929mzH4ePhzR9e68_560eNQFI$m>ZB^{PoRZmcteE(kfJ7lu}4 zb>wI@XnWt^+h;^bQ#i3Ncl=bsq55BA=o2UY2LSbXF9G!N;%b(lCIY)+Sl{riXdD*kE` zgcAJ%rOubw=QX?69;%|G#I4iP-LozUus69T71>w`SqCczLQ%9SR=v(^&5~agWt~ z!!-2-H!XcPqHNLl#nK%A=Ue)#E4Mj6p|f-DF80)_ARnt8Av!zuJ|b z0ISYh`{?OjXZnnsE4-b9*bb^+T<_hpM}FIXQMVS)1bR-4mQ`5c@aL69H`@%p8l*+aA?Da2fSe`KsE1d01I5)^70s;M0|X%tTHK z$T$$MzteWKzAf|6vS{{Se)G7WX{NP@RO*lO$;7BZG7tN4A5prI{A(`;F3;G$mu9y1 zijY06CgB z8{s`aq~aIUOd#2_{zn>V*e=?hGh|5>N$f-^lBblMH@0hF2&=6Q%|Wz+Ub*YtYn@$8 zrtr=xwwq?*bH(>cM!9HN@^vUgqpH4 zAn}D}l1p_40w-Mp55ZYJMMMY4uhg8H9%9^*YrjiClLuc#PlzDF@sGbEM`BeJ`$j&~ zz=!n7w-4n|eEjmo zb3|DF`+%9zdnVo0eaGY#Il5FAdrXHIzhm(YkA``!E!V!iKZz&Cd5m$}k$*(hO58y0 zRq-wgaoMB%Cx~fG^B8Ohw<=9DpZc_nR+;ZyW@|GWHu48`In2D78#goVY~-j`6t1DV zzh;NxX`>W;V%8ZtdVEW$4i|VwW@U%_yG73P-cEpRsZ17ZK{bqD#e)}0C zujwDRA|qA;^a5rMKpe7M6cW)$m0mwWzt1e;HTUH;&_g?U4&0ITH)!EBsaD^pBmCu} zUK^WmQftq#bi~Zcq1*31OaC80mCMpJ|7pvC;=)2XAdA4Qs^BsomT|6+`mMV*&_+#= zM;VMGb~bfg14N1E=R$bVB7ls1DG9~FsL^jE$=2*5Dlc)=QHcy!NXbBmO#rdmKn8tb z5RQJGcejt~5p0g$>~Ay3BKT4)Zg!eVX#0oCy?gu8&^xChZMrrW*OiRV&$zBps%GV5 z!wtY83{Tx({{PSVUjAkZh!SeBspltM+ZCG59o3M=ncM<$dC3}-NX4j1yXSahVq74$ zU^(I#T&W!?x+IiBNuVM@U8C^QAO)CdNcjB`T7nTejoEorx#rscUP4@`>tvb<^M2Xf zk~V%;>CCPi6nzCs+6T-Xi9ZV~m+3!Bt&8_>u-T7&lleC(B!m3b02OsUq-ndwqi+gY=no|9{16at^mdL{59++**1eClIz#5JE_>Df znf5H6dbj9Azx#Jx_12n<`y)AZuQBb>bl)mPWRI`Xefssk`Hjust(PS?Vb%cDl=5dS zgDZ;e4@r705RAuv&KPa$>|FfcTBWpRxLu1i@n&(W>6(A@=%fgIO8>F6e)jQ4RaHs+ z1k4QEM)wXA0(BWQpApI*vyb9 z%_>QaTxtdAZAD=>lJ<6hzgD zMcP~Hm&s|%vjIaB2OaepPt!@6e&H=AYsta(KF!+RzxWYsLF?X&oq^APCDhkgzN6sx zdAp#H)g}Ea!M=-vSji-_c>MfVzs&qc6J_VKX3G2(ZZETa&q`}sBe>sjHkQ4Mp*1&N z)d=Rj<*>`tSm0M9uTykw=W$oBD-i5P+v>cUZ)KPp0i(EYRQ65FG#RU4)eld2+Di_- z#%6<||A~d=sAsWbW-LXg@^y$TL3rFZ8@1}McA=km?l$1_l=#|LAl7ACE37y)GOiI% zn_2wL)iy_k)oj?-aM~sej1q+CDPR-nF;#EYZhF zX9-jYuHgJrb*mui5Wa)YlX+}2ayF;AZ=0H8`KZ1lq+1?~+P!%sOtdbn#jvDFt~Te= zDqWpS$vP^ne6>bewzFE*X13*>3mN}URatn>XzA#(3sQ=)MGO1v_9|~F<2%n*2x7Rd zwbi<{T8kVUm5F&Wb^ncQn0YV|M1lr8;>m>IAq-U2{4_fg1q2BtPK=rLFnYPIlf4Nk zl87iAH3d^3CeL9gtG6GOD3KdURskHjGIK1y+qg69L3B1vCQKg+5;9_U=TC57n5%Pl zjorbz3HAa(Ow#ELjSTvBwCe6cL}B~~d2>#73$pR>&Sc#7Xf2;EjWH>XxEI1-6u+?| z&$TdOe$^RF!N)yE6zm;>s5un=HwR_D|DS% zglm`&(eW(d+qy#Qyj_GuF+E1&;)^A&5|B0?~-%|2rZ$IMW+1G+^>oTgis=bqlBS-7L-3CrEt&+Vw-2a6(1PhD*w(c4=C;t-Y7D=VMa*q|*EarpyxKMgHf~+1 zl%bd29o3}Y5^wjsUG)1_CQN(=ske0AJop6#J}cN&Icc|ezNy-Dq{3NlIgIY~jBQW! ziXg+ydwq7bR~W9!F2ma#%m(mc4e{C++u%k?RlMwt-(?!&zV^>_KEsV zT?}XU9r{SiGZ}STF@W*A{I4|Sy$@>6mgRonU|xp)y%!2EX!iBI^}?GI&qge}w`FPO zy!XG9Lyq3OYS9g-s)}nAw(L5H{VuQD+p8%VEWg85b;l+C%Ie)p6ZYG|DeBO)}hQSbpBB{^|^;B zHfsy!-|p9T{%Da`$T85TYARUe`7OC;XHA0Ib^}pAg~WG;&`{Oh%&(XF8svgRudKZJ z>!{?D!q;Tbt{fK~*N<~XF_%QnbCLqqXC8)H+n=_z`u7@DJXZ5Jnp_0J3qK#T*(qOJ zj`Hsdj^!717!OW-ZYk9y9ZZ~=nG6JD9Frh%m#J=lwa>7=%XKOUN`NW1?U&G)=Od9t zdstR6up@T&GX3WZv56;x+N_Ci5w8=d6E>}Gjr+Ozl~YA^gfD{YiRWc|5AQm!r2b!@ zdz(t(|9|@9Z_O5mzSjQR;WsxK=`12}$7JrDm2B~D+O>U214z3cE!7s@qs|>%W8;h1 zss2dHgXfFN5!;D5?AI9&U%9_jbO()Q>9)7VXL#1$9!%Be*Y)bxA*?pYI26-ALv9Y`aewvHX*KQZf!!as-1TQd zan(~;wi_k0c)6(eX%Qoy@|vr8XTI2HZ!>CaV4+B#v8`+cyrPy6g(Hj4S)d#t3{=hh zG#d>Gf_Axvzrz4TE7^p1sShkAmXw4&`mrVDEd!4RSY1r!gL7qaC-pKiqxDE=|St6aR4M z%Bv2~aZdEtX7tR#*bm$;*>Uu*SVOcmUq273v?IINzK$=syoYDsIIp+%zS*`$Y+Kv$ zn!eLUaNc3neD4J7E-^jBc%4d3sT_FEidlMRNz#`-Ckw|m3{o}S4w`;@H3DcH^9;&O zTIZZYQeKyqTy92qV;4Qs|7I0}QbPDnWc0m_Zy(^HvuOgZW+M(C!Ar>Y>}90iX|v zJu)cYozxu=U>t$aC}*mo`TxJ%Z`?+WhnM zY9lIoxleRQm-R2JMm@yj&Iu-11>OQ}mI^kefUnsX-cB zCPO7?UrhE7MaW^I*DJ)c+qb_F4)X^NT*yM=ol(uXLw^1Puv)c-Tz%oHwC>UPeNRk& z;vL(ak4xhvQF?o?i*@Lm6T*pqRX8S7~&A-Eb6ehzw`}z)bpGl4uIJRTj9|51WUOMWH16{C1 z>cJt4a?qgn#>?bQH0yu3H_jC8+LU(Nn^eBl;z^%tYmO$yF*8kWpIGz0sNnrI;(t-z zJTe`cQmkT+SMU+3L+s~h{JJh6TD$LC4-Z?rDt(dZe>^t z=4$SB;+q^wqrB@&NnE{2?<+1?1#(!p|8!DW2%}%8Fk(V7TG*reC+8l}B`%c)2r(HN zI2&-y-yo?giAq?(VnpQ8$>=6>z{oz)8yMR*o>wMyMVfMG4ND4$X$T1+ZT*9uzsY2C zEl8Ri9`~VgSFrgn7-D1RBVe;udMh5S+h+AnMaG(&GN#tfb@=65X~W1hxaO&0-*;O{Q|(Pv zs#R>#p_@w@Q7s!(BytdV=|+QM{%U$j8Pys_b9zxfvffl&m*cgLF-!Fi8*QQ*Hs!3T zh6N#}wate0Gb;(kMiSuYA}+0BtjB+EkXw|(>^ZOLYqeptn_YGF>-9-1h3E%FH!fVS zb)nTuq3?`BUR5Uzmb|j3*&1RAu}WI}8TG!4R-SAcwl?V_aQ#c{Z2|yy;1i zTwo-Q(ocx-VsdO*w@J+u`chdaLo`6DE*;HW{YdScnZx{R4*bsP=Po|(ERU9UZFyd{^iQ7mCf=U9OEv0r z)7154HzS*Fo9$?%u&<+=qmMj^c}t}hZr5|t!&CFCH;2`F!|>4y%6Pqc51aAa?kabx z_D05=u$M!7G5D2}Io&%eG-6NZAB}cfPenpKKh>r?D$N#s(|Z@EDV{^-SalLn;)N)t zO`e@bNl#BhQ){0!WU%4%yu-~t%D4R_a-5Ooy zcqWVfgQv(Q3HTbwy6c8@I<6w<^xx?Wp3bl97f$no!>sKRHR=Y#|i$ zI56| z`5tS}wnjzpU3-aRu1Rm-<4E6ceLs&dE!G?JE|46ZuDXo4E$4jTZ&vEX( zo$`puH1K^8x+y8+;Q_APq!ebIhh8?G=Sf_uY+K^X1iJhUR#VRv4Z`9I<92=DtXJ9Z zbln2;WH9qhF>&Uvm(wWYWOYY+t-eJq(J;zIOl*eM^8_MD!L@LD4%(Ro0-*KVbv|$J zSwxv=2G&M(ZXExFg66NbsZyL4tDM$h7w2-V{eK^%mXYQd?tGX5K{*6W)Id*^b%CoA zy9E~5*B;#WN%M!!*atsA$=KtEKLW4&VDA>sp|Qf z<>WGDS)9arrwyR^X)i|fqFjFrL(W^`TiGOgmH?3kPqlK{NaPGZxRC}9p;;xyp~cR( zXbFtm{zV7;HlzDQtq;cdK9wW^dao{6R~PT0{+(jasFT$k#dj0@zQHI7+3dfpRN~r{ z9I^9XB~yY?4#eWl%Z)O}#LR-<*cd#AAp^FXTA~TcT&pN7kt~|*1T)l zKD8zG?h{_y!K;4L>r>uiJf%Eg7*`52sQyYt)G7)P~^gB z+?o#^rfYRr&n?U3y!{s$d3rDBZ%5Ln@N(*L$18b&yhtzi$#oOs0Cs%9 z0F=8%%@;I;sRMjcv}g46oWa7DSLOy%0=J8Lod}NE#wCjd#bVWWB#XqA~RX6jpEmJtMq7Q{A1c)qU zh-$cJ?Bsg`_nq@hlP`uW&X6pRW6b+*X$$-kUy&!6+A*l~2f z{rr=t<9ePNy(T`l0}TFGUlc*D34~D-4Wp1eFio~F9NM39cw*!l?p=yAcTk0{aPSQh z0CY&1XtcB9w()OwaYfGNPppb54J0e0;>+U{6ckzn20<}|00uyOfOS9~_yaNlFIDiZ zb1U`S1mqSjcOpUmUUVi3K8eb08RDBx-PO~58D3pPkNG2qe#w)Cu&Ffto!Rx6H}_n|u=oVy_>_mfMn_#P&chIiIFZA5 zCQcbJ#=%fQH85L*Sr~)^@z}&%IeI7RiM4b12}J=W=LqX!Q6nO@WYP2wsQQld-*p0N zRc1L^1=$cRr!nV^k%UHe@Ngo3=Qa^iPa-Ch&q)l+6Gg;kPkNo+}TmxVq8@VPezpaa^bmljmMDn4V&t6I5LMd*2?< ztz8t~+;ui7sq5}8vt*Q~##@>EXI>(Yg0bA8BQuoVfZTDuLE7cPqa+N>T70rIl{{%c_E(%xNd_t|B%=uXJ3qV@Vo`-bIhK;4OZ5WHk z;p@y-%l$*VbK9#N>)vgrV80{%9yI*iwowhw`({I~da{RIvdrvoQ#fzj4^{_1p}nE6Mu_I1+B6W1IvX z$MiPfKUK18?Y#n0bvu7c+%DGqw1~i8_ z@A&K&T@(N^$sr|X&^j9uF`pAz%`UY{JkC0`NdKnc#8@W-AJ%tQ+)VcK-gViW6<)BH z$z5k#Hdbb__dnILb*}wD^z{YOY&F`?nO28&#!vo1uT%YI`!ef9jB7pL9(+C80B|7; zRL%U*FiJecm8|oHBQ_*#n#7A(CliK|(ZD1sKj|RA)maGsR!WUmMWkAv34s?YPpHa7 zFgkCG@Iim7*EL0zCnfi3i7}WY54Ul{eV-?aw1J-LIo5;?Yy0V#gu)^KF%<(KlLB?p zf8kd^`bTI`LC)ZvkxoLsb2V)pL0W@2%)}1ZNKM#amie3+#5sdUZKW6jj?V9&VzdY4ps+X^p>F4bY&gFRexjHE4ULz%*ONVmOkQ|g_Y{NB=V9hMD~4=63yRf|&l8T^ku`N+0lss3 zq9}$)ea4IrzBjQ&$Z*aqc%pQM@d-BbNwU%->OI z*UJ$Hc75h7J5~UFp_Tq3q zdVT!@nB+|ytnKHnPNX&yxlVa*Vn~p$Cvr?3m2+=g?qcOn1t@6Lywf!(l7&=|%Bp^g zH<~#GRZeGW#NwRk>zzqL3w`(eo|kgxiz$yBHB8)bxpi=5IS24PLkD^wX=D?d!SUqb zESeF3B9xoyuUI5g_OUP$)DBh!wngRE({CUCThHgj{Yxu1>hdES%llP!{(bYeRD0Mt zYky_AikQUlO`#)Ws7=r2XL_R}Dy4*;=zgWZ30=cfwYoV-9J3*JPN2iZn*#89xP#4Q z^aE)vyO#Ike@oyo8?>+S*LE4(V)*}@lJ+^<%9#rnVfGSs9?8RRg!ub5;*%BLwKW_R zcY*=OMds9*8q02~c6_j!I7F@jJOJE5P!ys$_YhB&bas-=M>-O*NU3o!5hipfRWP7t z6nzi)d2bDF4F_%ZsyWsyU*YS(Vp~JL0KN>wbPs8|SfSGPDXR<$sY8QV4OKb?@2^&o zl?EC_hGU*>LKwr>jVp(ZdkyAfrbH}+z-a3)^rnUPp39-|v8_R3rbWg4`2R2E_k1fc zfN&uURGs{)5MsL0p)sP2JGJj5mkO)|c~ zuy<#9`@hKMHaNXe^mwZU>5E>Jdql;4+%f7(U+Cw$t_j55o{Z>jHu5i_Kr8+N(Bs)L zo16Ssvl20auL-NI8pQ;lz=R;j#(Zm@(^Y*=cP2AynIoR2?aUKMu_+_&cA2egq6cl= ze3WJOtl4~S`a5pKbviCF$dFHmupZ~0=;-WUnOs<3)Z;%OqQd!f_il>b(bijaW!u*6@c?)>%PInQN8l_`E-oH~ikOxB>dre->pM*BykxNg;pW$MC+y6M z&(24nu@dThLkw9@%6lr11=5&M93c!;mHc!Y3WOM)JGf=M*43;sltMzL0!Z?4D-em> z+g5V!`vfM&uH@j5NkA^~<`Nn4ODiNxq}HNFE>v%#dI>R-%>gyCv*KUg>z<^H^Nkcz zWj4kjblt_lWe{7HDgwkk)3!HX>!w5VgP-iuMLRPq+4bHEk^v;Y3Q5(utB!}oE~4N? z$Ro8y+c`9!gqeqshi?~H{)UUEdqj$ZKp*_sJXVUc$Ia9z-#6OZ7D$KZ z&$P&QE#=v92zS^1bc_)#U;b*yPp+|d4@396Bg-)aXhoYKPT8ZE7YVYf4kkM{1bM$ z2i0BK$EWa0sUk~<$c*>~`)xR2<(+_s{yJgWGQyL`fH0+4z z-7oEdNZ%7sn(yWv}O^xXw8z_gIYkAuUsGGluHiUeMod zX1${og0`+E-OKE_n<#^NoBzz*fCP2ohhl-z0jS?wo{ztNT%_EkH!XNT2tLLG6owif zlk+7=T@$UznjN0HH??*bd=$_!VVjva8p>KX{!$7kp6VhHaa!+~W8!jvJh~&4-OX>f z_j_LvjFF4*@2>9-D*Th_#|ot$daiq$b%#Maa8Ua0T+A9r>kU1>Am+QD)_KEVrouMd z#hh%ttGlm!=M1Xr-CXJLn2to%cNTu8Sm8Rg^I!DSuY7A-Ob4h{XZc>C zrb=H{5kA`Qr>P5`9&!K>eMzRed82Iqx_wEt>5Q|7YZ_s9H|Xr0bi*ubVFh=mf3`Vw znN+TBi9rPAoXNKNoC@3dlBUxAdt7XZ^cq`^AXpwrxH{)Md&^^F?2X5I*&}ROl&r0F zjH^kq*>rm#;GHh)_hp-SRdsKW!o62tLAIB9KP* zp756H`7;-WW7l#=yLaC}`R&@SNB-Qa2MPZk-SK8<=ZG&<& z?5xvory(cizefw3yym(cm>)CstcDqQxb*jF-Tn)lh=lUnDUEeH2fL=;FYZnK#+_e& zM=(ggmGi%?mFQ~3!Q^GmBEom%I8>DT#(Fc$^T0!@0DcN3G}uaQu&^i znQEF8ovB@}y-;Bz>l?6}%PdIAKLm9zvb@ZW7 zFT3szdZ~@_I{%65&S=9s+L~_ru9LYmKD6j!TiMC&eSWRp10Xq!2ZahbLO5z2*DHu1JB|C2Y&)evxae0fGFoYzcZ zH$xINxIAr;yd~1JbjLyKh(=r}wi-+lMF9|kjE5L$GaEt43VG(zY5^MTASl)~e4Y(K zSr~xT_gKZrxNjn?&3NoeiJ-pu|ZjID-b@1EB+yy@8HViZR zT;Ku=E|!;t&_D{*;`y}anS}*;-?{k>JkA)#mc5_4#QFhkyyf+J!N4I-`rluEJPr5` z{07^(GHa^7W7JL_z@LG6@|iBjvLl&k9Papr${{SZ@;e|9%<&>ScM#{ic!w?>N4fgx z8j*?I5eIDRDCC_^)Q(LV@-);&J|@SjW(I;4+9}l;P}Q=1e;c>3a7#t~C7=)6enXqS z&C$8;2~ZRA+5433B}<_EpS5RL9nB_}_>=NKvnU#}4IhG+nsHln5qzQgJXJTf_5D=< zj=7h&bibYTxbjp_4*Y9aI8Vb{T?v~0CYaRSt7TJrcY$%ILH%!@p&y=v^{O%i*2}tu&{p8AR{ znjEMGsM?aSv}gNqMaKh!eK)}F3y#TjckTWzSX&Vlh*60?mUq-6~cH+MC6{ZuUd+VXGai>`8j;`DLPF|xK8Td z`7nM(SuV~mjpgL<2R3yMx6M+x=!1QCG|4#;#r5)G3_3fGdA>t=-Tvoh3->!a>zZDh z*_yA&pbjqo?7i;Sx|=$_m+wq6H7tY{ke)JaiTJ)C<9@qJ%o{-Oz;5%L%;~!0J=vQQela1w4K#khb4rRMtTXCfXXq*i(ik{Mzk4!20}izUxZ0@a0=wp zowI5Yqemap;~C=S;{L6|B$(O#*mPN=2FvW#INHO5W~TIY-5HG=BBLimrV&;T9=rd4 zX5-RVdf%k+9D8;@-TVDF-ctHkUCYz1w;EZ;VA4R>lQe7>xJ>N{r`A7H_Q>AMfF zb5|DDqkZseWJjjTncz7UbjJn;rE$QHlo5rJ|GmWq;p`#8ICaNWyW|0YnIMy^K$gD( zPm)&2+YHD`PJX4Aitf2}8Bw0iE(`RRu8W?p7ffSJ(>q;0Ie*8~IT`93?|=3kE#(zg zxqk}g_iSIg$+`uuH$TGf=-1O=+&+pQl)r96*?YY@>X2_}_$OIbrM_X*-PW<1F-YgCH4*Ul9UN^P){qoLc{P+Sq#}H2SS(~kr(PBv-l9R^9Bd0km?6O`R z?D!V&hHJADY;t`|+Y-JCyM|ajaik0;2N|4A*!Ti8SFc{^YF+b^)2@?^(&iU97IM zQ6)g~v7WQ{)z#gN?wHExt=)`q@)ui+7luV-UpTu7dCzcnVh|0(+0M`K0Np&K&hRKc zsN(bYv*lC0QTBMipp4MEv2=lY)4ju+%?jUvlkd6m56BRJ%XJtW=k=J+VkBeBB>JMK zi`dT2V(7g?=NuXjeEmz_;gcx2`ti*K5d-&Du>My<`Bg$cOj#NN^($cSz;5}C^H;B5 zt~1-+tf24GPpU%pM4Io^Tf!BwBr^DFnlUMLNMo?X_d7B=a*^L}3Gl3$I`!>I)}9oV z#gIZs#f(BmV4U(0B8a{rHEKzU(Hi5fu69RZ^e^Q8o~8C0m|t_CgNVs|SIC_=g>_y< z$gy3c_Lw${pUJv&R%zQ|+;n|gqtq|2PvO$gJ-Y%0x9Q7MoZXjLcXNtHdWyd@1+%AQghRz8kT|DlGeIXi0vtkR={)4Knb(b5F`f^wQ zja^%O!xYDkKQGgL6u~hR8D*JOHCC#`CWTM-hFUQ3Cwe9%MKml-!in_?TMVWh&HmeGB1KFhVrE3Oxj3DnT6?% z{fn69DIw=Z@pU&C^G-lMcP>L2s~isr`_8n6H2lu<+uT_KV>nO-TiI#KEIm)-nE_$@ zNsY2$LEJ8~iU6?YC1u6~S*>Q21ak6;-^pOanGet3KS}@aiHSo3Kx&aWqu%kIFX4Z= zi%!6Xt5n7N)zm7YAD}j~qVD2mDf~8gKW%v-IvgQvRAu}y8zTk63Uigl@^OTPB*4kG zw{uKn1oZqohp@gVN&U!{2Z@lu$JcY=445Z}HpKIq} zU9(B%FO#`6oH;oT20v}u3H(($CZ3n~`^J|dk?^7TZKYWjQ7JaF00g-P&40=IWu`xy zme1ApRBcCNzH#q;H$fM51G?T%N)#IvBz zAoq@KgtK5_L&GYm>yftxDxmzu91(Nb@(Zw5d!LtcY9pzpl5PT#ba!i|%LPw7$k83` z6=3Tpe>ZmLwOhf!f%G}!_F;ZFfsdFo=v45E2hSt^B;7V1=j~Cv=00ec~iD9AGU{)F; zgcNwPEty?xnQ2tbb1j)x#`PC3;H?Wf-Kdo68&Z{*}%)t|D3*m@IaR~89LOBZMvq}A4gU>SHt;i%s(oo() zWU3IDm7oF)M7S9W+!j)Jl(yk1?Uk?k)|>?Np+U4fcHPm z|32WpWoI=E=c)2|x!5T!|1WFk?^_EkCB3e9xiof$Do$A+U^*S2Nj<&U~MvE^UEBgt-T-Vzi{tcq}loT7C|9yZ>9D;^WK>V6CSC`R9Fd! zI0$}!zUBcNH%svrHqvHw1)a;OWTSDhv;7>Eg+g!9YwI~?ov7#YoomxwhG#r$W$)el zpL(X`o?JBd7fxy3)$KezYli&~^?w86y~7P8Jb_68xp--s7{~#N&B#469E? z0Gq25j@f7%vn}C~evt6o(7>2v+`#F??5e6TaG5=IMj1-=zOT6{*_c;@bL!Dub709+ zZm;y~lgywM_Jz;-?mwoaJdN=6DIn4*<|rn$;Iy_}k~86(r?Mx(lOa2I!+Uqu<)A=S ze2?>;sYm~2V`04F_MH%XR~N?k;&6n9<2QBQq9!nz%<>sNe#er@@-52G+p)wm4!vTJ zvUq7!V$X_~A+|KeXwC#@@m%Bn&-wp_>>?cY-BScoD}0x3>earp;yw%h->&Vy^3%Ls z&R_iIu2juV$#hrO)4Rr{PE`pK7>R{+uIU~ELN9i8f<-4H_U`*4Y%ehI%jYbT8y`^@#f59Q&NJq6w~C`8t4)T)3FkZ$u)>M3I4?kI$bw z)sev^lQ?Q_I?M=Uz?CSRu#4|}!aCn{A)_KV}a z{2Q~i|Ne0uqw^n3+1nxNLz^^fXIW-GRD1r9Z}TS)^!)Ro?5(5zN~y-I!nCbDyC4KAq$Z8n>VS1%Zyy2i-V74*82~vhiLeuA91|OXRCuJ9dX3 zt#jVa%NV}O-VMku>*So*0p#4_$QzeEdGOritD^Lj_xgTRQrOx%fo0d>bcgsxaJBLe zg)%dJ?m{XI%$`N-Ox8>-tjQ%p^RY6yh&8zRx#O#Caqa^{66cZr9Nv7Ql(DGSeV=oh zmASmU_YH0VALSkRA6xq$`ndLH4mtDcz&zMM^9Y2w&?E*NU8o^+omj-8sx!)g=DVPv zyI=WgzyJl1Yw5UpxA*Ay_`nlaS{06oVWB8&z?5sbYxCPPvhRv%Ottjk#C2g-^nZNq z$p6y&z>Gpy6E5h4fbAVv1=i`Bc}@Rvd1NM{UD#ig@O>6cB9w=y-5-gOD?r^T`0j7g z*f4ZV8&S*}Hi`u?^?V54ZbSn7MpN$RsD3GiaxY10M|`@u@YwM3<8kRo34|b)&;?3d zbB-y`%lW*2ua1rDY@~jp8`;-GK-?Uub^kHfoS(SkIMGu-@}8!R=bUVd#vbK)$bT`< z@ogQF`>)?q`UhoQz{IiW9ctm20qg7=zEPa_zlMG58y3-(@b4x**K3i=?k^o>j21Hy_7wAq|p=*1L5zFkL8Mx(NK5?7XMTB+GS>Ms^iS} zzcg=CRDoSwllym;dCT4R`Cknh3sz>Ie{WN!F~nSmfiN=yi~s-t00003DV$4L;(W3C z6V!t5(R8Eiz$nBS%X)8n@UgEYWR82VGjFrzJ(--&86;%4$N&HbAq-E;_x;><9;=XCAiA17cbc!pMXMtXzt=8yiJe^)z6Z#JduYgitRZ7O(cl~^M&*o zNR=ep3%YAy)MMa3_-`U};P}3j(kY*W5F5N6N=TrrR!Qq7dpIHN&}(u7H)oSLUv(&F z@_pavBKgt0mEMxzx>?WO{_S)M&N?1s?e$xvS4nhTq6~r#wW`*2&!c7=Ff246IVa=y zPl|Wr7d3thtnZnzv+uk+U`Vdssf)&h; zp7ez_e5&V?xTko+-o73u7~_wT&Joj#64T@C$%%BADZkFUxvQb(H*1;qJwha(VA9ol zIq3GXbVJ^YqbmKN`RIp5K9#`J6TN=7mlB%IZ;-HQ*>$6^36Z3P8Bn_8aqtdvM9r*a z1nqgAd=2L@ii8)1IQp47$wtZ>9&mL-YxMT7UYhT_#d-%UFqrn|IjCFBT}(O z*#So|paI4ZK?W$XL;wg(&G6-ss;C6L)`?-E*kD#k3Iqb71g%c()Kjx@G>qU#^J}`$ zzyW<>;?igmM%D!x9&(RGG3VdEe8<|@ z<}H21rDe!7Fz&JN&q?|YhoNURy}v5WvmR@=ZS$#ud%*(ElKYiOSShQ{@W5SLCby(z zwCDEcH8AdtX;fwf975g)*R~$lp{Hlb_0CtvX!zPqYe{LkkNWuxrm;_RtzkO1hR^={ zZGNu}Z13)P&7tX{|K0qmwv)p&`4;s1{ZpX$yjL#Xu{9;ided9O(K;rH>}#n1hWKu% zR6inEHW*;u>9t{PJ^@TSqy1w3S3wfxymnMhn}Aa6d{*Ppko15#U`rVCC!=Y-TrWV>a>VH63e9{%>}y$;{k;Q{5z0KuFqZ zv|~;08++pmCmyM33eXcLPg2npP&)qThLHHYdKLp`yO_Zhh@@P$=i_toE7VR$l*4SD zn#|gWrjm&Rj&<10ZWN`M%V2IY-3HD&^VX;E38mT|;td;2YVCD7EA=*-4<>XUa7c+HL!^<^Su^YrF z{%V6q`ZPZ0qpxJQ&w{q%KRsvLaa@W-&KNs{oFOA7G8J|>RjL9AquqqCRt=vvM~rcM z(}H+@pue$cE?%mKbQgwlLT*p)z%$GE^%gB}pvI$ue6nF(?2F#xe1|0yWV}AzqC-nx7AtCoSn? z3`Hz16cR;3VVvhVMp?~D0;>0znRP+=>%3APJ}E>;-!(@lsXF>-DPI|1%cFoH3{>^X zqXKatK_yNSrX^2)il05?=q?rEpO+*ak(g>h8MaTiKPEF+Dr?$t*i-{53rlHSV4=%vZYB?M{R>TA-vbtn zz}x@~2>Eqw+;)esf}!N#m^;?saXtq94c4kcZG~~>YIG|!>&C;v{%`;nCwXgq8We$m zs9-E12rc&NvwqPU_hlMyS9ujas0LSpN#f}_faIq}A%<_;nCAKyP6F__MmII=U<_wnj$RjI^yey!tIxkex^E8Q!c z&n-=O!1K8rL8@h+enW7B~O7$KPpNbUbgI-1LV!8DD|n~&aJ|#q$Qt`rFH?xh}uRG2^7T^ z&Wc2`XF51Odz0%uXwm4l3fp+ms#H;V5HME{uj=-|BN7~yq_mt)6b+;R0ZelQWqPR! zvPy2>R&=m(*M*+^uFHEF;v69iRISE^VW?P?K$m7x)*PJbMe)p{;UiE45k|*U?tFhz zwp`5Y1V1~SCliRWa?{iK%Ph{r*=wq(j`VO&g3fgP&zEeZqj-mdXG4-fXVp|FAkiYO z&vASu^T?O41?L=hJEw=^Ai+Y(T}u7o-_l-p-jb>&2^~+A;96Kc*Y$c9z1yMYy%~9N z$+}u{WT})wUp*sTjL-9L-7Bivvn5wlYSTcKme=Uxs4o;__zhKE?Kw`~sTGeY&8bI9 zSHKCUCYMsyku>|N(w8m9P!3ne@nDWD!R+-QAv8woW^#fy4#A+Q34Tlhx>ue&4X|-E zcw633`5&Jxt*KJ6{P->M-IOeTNgAtQp~~Lh%b40WL`rwFO_NEq+h2}CCvXwPGAeW` zpbqx_$CuZ|R0sbb=?gmlfbE#c&c9U5xeo)eVWw2Zl(2G>#}M4J^7*fKcAsnJ>|?q; zaOI!3?M=ByifXm76z%-|*bq8x#~43beLpCjmsfDM5xsfRGN|M0){2K^Kv89eDb#F zr)bok9JV525o0Y75g#0L0RafSdkCT!)jTeilfrOpsA62_->#2RlLQ&gP_WY^BVlW& zOr5k!bLr2)X!&jD<%sjL8Sv1P`_ZwV_{3>>lIQ#UBm%aYsp|3a%Ip?SiDR!Gi|so;rjL7f^p2^TyPq#XH8&2} z`x;k97YDA#Ko*?#55Lh63BV?2%zV9FjDh0oui#rY&pS%OfNZ?eG9EepUfjk#Wty`? z$t|WVbv!_pB$>AqFj+WSKM>|EW~Xvu@;v34(biZFjsVEdyp4xu(?Z@=*66~}FbB!> z@19n!$sx}AO}U)}d3kgF3VFD4Hekb=NrdKCWmu7yv z@G8)9cyyGB|E}+G=E(wh#bXQp(Ax^i3>~`S&VLdAZ&>$B_Lg5@CqNgA<$p2`mAxji zSa~O?!cA$dmb7};l=J-4a?LCy9Po=XUU=%7eY#dHat@FX35BpSbZdVeu%WEe5)Z^I zWP8Lhv4HqdBNt+d!KJlS4C(A~WE=jYQ`icT~rTd)txV zEQq8535+Egq=UVERJtT=+_5Y6AxDyYwSKAXZs~@llLtUPxaT?p!URHaTnAQnwX=~g zP=!>hYus;Iv;bM`uIBiuzCa}}n>qUDgeabSoYYNz>U|&M(^_}$9R#nL@BQPGacAcxJ(1KtUIS1PelDhr^Png3*8%y@VW;q# zZkvy4#tWDHeC6)lneV$*7|pK|Hfxd(%Q9r#TkMsneZM}cW?NRr7!pIyQ!sXM_W0V> zOnaf^mLrTz`8hl4HEPatB~*lA@TsrD@=J?q(l;Lg?e4ErQ-Q?Z?&gHp29^DT87VV* zmVdR*F{f7=rxTI-9S{sH%^eRLC#I!l&Dc2ne$ZIA@KQKy;!KExfp}b1ZV2)tL}F4| z>}Hh!6D*p>Vpp89!p69YAf9DIT4So*bI!8YZT|8k2;Q)rqH}nTn79=meBL)S(jVz8 zcuu`=os>(}^0QcFz#ED=lp*;_mveampdjpjuQgMrK5())DMmAl5ETRkqE15Kpq(zr z4gnV;TmS$7P28w(+6xT?2oR9XaT`w*5Ydv^YK$&_+(t28n9TQcrtcf@wXHidH9xy3 zb0rKZS^iBc1E5F%o8v{tXm2fV72Eta8S0%y%RT@4k9Wub_$|FyE1GcV(+ME$@Q&5hJq?{+jHzK7v6>>u$g9cYXHcQagP~bOA=|@t=;I{(Uv? zC#SuUb5X3PGsuxsHoNTTX+u)$xzb3=n%6Mt+0teG)QTH!=X1=m9i;a7?WS{6xa#zF zOgCRqLdS#!hJtem#0D)I5vNYjrKKr`63VpWl~Q*OW;l)z?5y>&1iffO3~ESVcxYHB^t1jdXX>gK@hHd zBp)X^z)AzHpeB$}1RUCjP;A+5>@Yb4bsKm9007`23{aQtdJuB`%`~t}2pAp}Ed;mS&$OMvrM?I*TsE zJ6YUGIx1tsnDu7fhE7YO)}_MIK&f*Yo>bmCgp~5A=^;-A0)qfOM?99T^->7jcHRDg48KTL|*@AB4NrbUME&X~Y1sSpl5>g_}*FfgE z6ymjrIh9e}en3 zeLuf5&o}yYd4+7gNW5xS9B#9oxHX&HW=JZfR=&mLU2ePp32oI3<7u?iD?D;hx((Ik zm~m4mb~vVCS6o;)fi2+Enrh7CgL(7H;%s6owbbMYlN9YZwaH za3DdMpgF>`o)|{CO%vTTxJrvIl^FI|P>XIVK#DKTjo*^?9HDHZp*oKS!ji857fFN) z$;T;E8+&I~mo(YXW`X&r9HR8`r?Az_lHFct zWGdGf5b?FGI*of7=2+`JE9r^m^_HFXwdQ|qA$YQCXgplYxrEL%yE?rAShEStcj}$@ zC?))Ow9%KQu+nI@TrU~2X5HfcnfDsvSK++Wa8=sOS!}Leo9p;(_*g^g+;}6mYG{>1 zx~7nAVVz#h&FSMo(MTCStAICJ22)da zm(>P! z056(g#wkD_$Itu^Akq#Y3{Qr}FaP)ccI`=mFjOGNON7PFGrUU|lNM-oARtNBGbiY? z>*$%*;1t8>Q}doX+z((X2Oj_^H;6nrRJQTs6l784b^+Uy-2+ z%t*IcHPsV(DB0dSOXEO{`OX!st=_5NH)sT^hEF2;YJKcmxc8YFmBKMgb!M;HD}-JE zC^Wgzr(0d|723vikZUVnZ?DMPCA^X|np>p4GoTj%B{H_8_Vp4y0Rf)h7z1VE1m`KK zC^fm^QjcNXS74l0R4zf+J@cM18lIRlhrijs`1E^Z1r6Q`$WVZUAeYv}p4YVIvfGu> zG6{CQKyMbu-BhZZI^kFi%uPWWn7f$%CMX)a$jFi)KJ7&s^WEW(J+KqWB z$KY5;mJ(3*f7NeZosU}%XobhPSFPt!XWpRpti^j%(`4eEflWT^g!69P^egLCy>ALj zopdfQ5m$3VPJSzKUfJqD+{G#y1yYkWXf;+=&s|@`LY}Txb^E%K>Oqi4CV*mmSn@bE zx*jcTS@^Q?NrtDzUXcgQYKe6Goz~=i+okghO4e61W0m^@OKn{lz;@v%_MZN)fLo^% zyl4vb<(q%nNjDG{e(~#$zXv&AzPuB$IJS2@lwaxwU^#IiTJU1S`H(9-1P+}CjLzW9 zfLdnD-R&>{APyl6RNdB^AqOh@cdI&NDVE%qgEbHdG9IY=_y4lO{?8Q2j3+%dkSyU! z(W&`3USFEnIXSzM9Cv{X_`LzAs&(BxyJ0g5dVr}SRJHw4*N9<7jL3MhBGOwzt#@1I#g}&EoxuZX=!lRkoy%)ywVz8sZD~L3qmV$Z9 zT)X`;*q(yK@@cESXRc{xT~xu$g5g!CfYFRf{1Ecdp%TALpN_d#uZUeqTjj|wltn9Z zfC2?tLdGuaDN0ZPA}xO5o+%Ar#NZ(;RF&G30-&gYu6OK=)~REAtr;K{WEPIVisTa< z;x3=UGf@7b(6UOqr&Z+GL>xRT^x1lv-d}6tQn7kAesMhRFXO4HSljC)+kaf~Ev21< z>HcvyP$jIz#!(Gj#e6h~#ZPZOiuCRWo+5X}hc?2Ma?7Ej!1lMtF6`$9MyqsRRPs}^ zU+v!p!frXf2@2Dn_?k>C94rPO6OnC+>a*IUoAjzaN<|4X9b3X``(T0o0(5&!=N`cC zzI$eCUI#{G%sZKJ^R)E}jdrVjt+J(f*=o&|Sf4kUGcVkr1i1uZG}wCcdhFaLY*$l! zFDryK$e6{JDW8{EjPvYp@Ojl%Ze|oYyR2!{GYh-Jb)F_3rrq@9;sHR5v!8d4Y7Ffm zZ)=B;V4ciq*L+1*wX5EQ|M$lg@{VxRO=-K-XaGsusSw5pgc|N!q_m?Z#_X#KxS*~^ zW43ujnX15TM?{27{}`x5pxeKr=KJgNa)>`);Evixtkm&@g&1a%R?^UYMz7`n9go2%up;0X)1Onl0xbtMY1nRArvl<+X znFSryDA|@V%CwZmx-Qt-se1>!FS7r2q9e=E$Hgo4)4Z`-zgB74NQF@!+3Bqz$Jbr& zl~s>CFJf622<)|TOSr1XaZkEIHPp~kkZn4pDL|92xmoP!M9wx1_SA+NWza@ZcD(#1 zY>I|>)}8Xs0M+x<%=HSkIbYV5Q99=}6bME7fZ!ocy6<=XUF-0dYN-cuvXLOKnl_CA zewRGwI#1`n>()~*es!N8+vt6@zM1SS%`J?NaHm_Xx&I( z-e>^)55sc4vw!6{y{ll*S0v?I)HrlBwEO@DLy^pOJt)%rgFjl_7KoC+icD;%tI3pB z*Ttw0X1X}^!75q&19nHZ@{&3nksiIu$mi&j@V3B$PbU+0{$F59YL4a}2bVs-=vu}| zLsanXfy5nCC@I;6*(G;)`|e(LeYWWr3A`4$rRuogW8w@HIeOZ7+o5WThCij19 zfm|?^4eGqABy+zWJixBJwieeW-KBhXKJI&xn#E7{dN;cW#K1TLT<3_8;8_wMr7ywx z50G3|v?`$>m&)*w#`U~s!Da8abCJmq z5<@HY#;vGyj2K*BEbIhRX3ng6gdTZV=_dF?l51bp?jVST)^DwTCRl{BSH!#jhAW(( z<`~9~Ktts*A)sa$(I$^VB7xFC3N3Bu<|Rc@rR5sn2Xhyz5QI<2&xgR(ou!dWYj83? zzQ(`thKNM;o@@UfhP1#0+G#D*Y6b3voT-BWH(Ot2`c z&ZXKuN))!S&b+PW{`u2=iZjQE`ozF5E@CC11J`@?2th$nb$Nl=kO+1z3Pxf`dm~3G z<+$5clN)E_$F_KW)g${BrmPD}av5B_SJsyVJ6`{BCB>J9_1~L;m{HIyQQq*pQqRnEu<~@^< z*mUNFn-wq>^LMR!)fnCSzfJ5`%{V4y%=JQ-MCl3ZbZW@%n%rK+T!2m|G;T+%5(|^n zH>@2$VQ0M8q7^UGf}(42OrHQ~h$A4mG`&B2*WxOPx4SU9AvJ0q66t1|lZK{ObeN4< ziT4?zGYFp3M-Od!IyJl<<-N|NxWAkFYkk1}<*?m+eQ*FC%v^gB?g^P*f67`y(ic%+ z$b4kP>1lA5=rlSHm4V|PPlL+2hw%QhTAkPX&U>AE5zHf}T=?0#-#w=GEaP*Xh{+oo zZ>2t=4%nN6=PC&t#{`<8LAm+$jfF9^=k7jTxQGwaW~2b?-Pgu-7%+X83WFv3DHN9B9X;w2dZ{;zz{+0i&FANNvoarelkuXhTnD(Zte4UTH z^#?7&O4`c zx~VE-D}VigBW{S|_5^Y+BV}GyX@apd@gqwC&HQkj;voU2FXV1D{`4;IFPhy@|F^5M z0zA{@w53ynHjU?rd|$EmyA+x)Q^4Fh>5d`cxeSxX{hcrkT`}2uulgCsx1ZTc{OQFr zYXhDc2c)tk5?Pp*Av1<)nBbiQ3}lVidK*tK<`)i`<_N+w&C^XCpxzVD-`&;eq!#L_ zHI~-e#J;-K-$A;}ZCP#(wFMy75&IFi=4|PeUC{bIr>QEU(dxBcKV!fd#_;Kej;!ta z2K+IM6N)ucUafPnMo8IThOSalL1CI3gGxr3;c^ho*F@%IlBLR%P<%?Bf@5OFwCwu* zcEyl!TiUhO7MSW-HmzK}D&V)(Dfo3PHY!JZ-WTKjRpN&>k=U0R3Ci-yoHY98xmdbj zvayO{1J@eGS-#f!jHZXr`b@j5TUyi_SbFtl$+3-7lH$c!_m=Ow4n59m$**SwuogJE z0o(up0Y^bX(U?@IO%TEg5Vqpp%aQLm(xh%ZN|?Eky3hVa2S55yJ?b2=-CM-o;BS8s z9nd#C!{~J@O-G#ijO=5?h*z;b!r^H^0zfn@lD)S76G0D_)f>?1=QW z_B))f)hb&$G0gRb;ezi-(`hHMO0HLF^J#hZL#e@Gi}|SYO@kcoTb&!YCsWbe6Dv9; zt8;H_+g!S+7JU?L)MiixQ&$9i%%A5~`AECizO+oCtj<5b?(^-+@3E=yacZHYG!x)! zC#=R(XB-un7q1$Lh8?nVc{D6f8Dffug;iqAcC#-SC&dn{@;y$V{HIL$4xRZ!MvMSF z_>pE>J@4ng$4&%5003|y3{>sbn8Bg~%3beJlB({BnOQ~E&l2-65}B08kYy?q1U@Aw z#-RYkQOC1O;r4Q-LiX_^GNo5F&&|+{bMPK3Q*RAJ6Q2S0R*cbm(*06nW2!lVLe1*Y zURUw%w7S9mP4%l;r#R^3uYW49|6HL;WzUO_J?7%@%D<>Ri)6d?J(lQahWnsbjZCF`9c zy9s%I4!APq^HtZ?rrT?Lf57qj90mVQb!_=+3f_gaYoy+(;l?b)DDGrS9C(Z~)Fpl` zPOKFpl3ZbCb{>U;09=mchQhg}lGU3SUBgfeoCjlY#+S3h+QJ&K_;s3VpL z+RM^6YQ>sKnCulQWg-gF=qnIv3=)FDF@jxU$v3VuAhT`OS~%vE&i7-bdN=fp1PCsT zrRZQu!FrP)W9hPbJbgA;7PYo-xmuqn;a*#oFycV5q6a&@HaBo!17%dI8n zFtF=*129wSSM$}X=Js@LatitlMkdap(AIxerIayA;|9wNnS}=2F@|wOqZ0g4I@zO@ z0n%hrJadSdtf{t_#<_MAl-OAeoJy@jRTf$e+N(IAx)?;RCmsKDT;%+z`4+Q|!aJ@i_X(AbaP!{;yVD zui?BO-T(y0Aq-U=wvl0_uxwNz2q}5xCU6;Kp+#W~aa(L>d3}R}PMHySR_C$H6RqZV z-w>4K)+WN}F@E!YlM=Y2FmPs)L05V8MdJzd-g2FStK8S8@7s5O@NssnXJUrgdAFYa z2Z+Pop{>!q{k7wj$a^l7-S)w?dOlY5xmzG|j!M^vL%R0*ub>f|>U#B?f}*=*xO3hI zU+!$Qef1zuhBkb!jJC`$9dZE%G*8)6_HM_OGmNZP6qqm2sjA_acZ|P`_X{)*Kz3%SsbDJ?J=9G0yNJoEzRSdZJ?5&klkE@004CL`Btgb7BrLw2N<|o zTv)ar%Pqci&v%~U#bB*cHglU!?J9SE`)hts9q5&c7Q=okE`do@k>u2gB_x6+5oW5diWRBLRbn&JIY>;beegosX zKO8O8!s272{S9Ms(>SWl$k&EGiZQ6!0W{R4X{K_Q=e|-i^i)Gx7MH!11E`VCVFp;jv zgn~pT2trCyVg&X!@7iX{##2q8MU=H$G?e40PFzG{ts0VDJYU2HR#+S%3{@4*oWY_9 zK}mLLF$9{f?4>YNP0Q>NB5Gt>6s6d)+@8s3{v=FPH`bS^V98!Tlg+VdVj+>q!p){} z()2EIf@?mg;9IV)vY;LTiCGsvP>2iD}Ax(VQ$v??tSjCXMDCWf9FzA24*5(w?w}OPST%_Nus~10jR<0xU??UC zgcdk;Jzv!8JY$P*18TgC>pRdCF@922y;S9aPiRDW8tGm!Lx;>PJ$ujG^&fZ@nVLB{ zY<}!Cw{Cg$ySW;gEn070j2L+I=8XMqP<9fHc0m@hyZPPXVo=W`ddnI52F_yZ z!G}QI(NMCl7k@#K16KXy0}WCPk#8Dn{nQc42ilmMyw(>US*$m9J^5*Jm4P&<)3zDT z?E|3^FzwoHa0S!0a|7}M#g85cA;0lgC(5t30tPNp>7^rJ1)ygg9~|6{=}CRZbFS}t z-5Xk0_>{sYj4QRWpKs-%;T$0hRPElJ!4U#NLxP&DNSNCQva2HifNl~v2{$Qr;CQ3C ze7#0drz;C*S|;SbPrAkHj=MxuIyn#Ay5y0|$46E1w|~RCsCchpYWi26yBBEb{LAKl zN5Sy9vN`IE_Sds-E@5xt5uUuqa7nUY#B=sIs_DDaKz{R2pVd@QIa4sv^rDt0(ix>| zj3fwu6KKc)w&@+iA0O3fZ;bT5VJnL6`%W`b-Vcn&^_+dqau;lCh_YY_3_z1|^%GGh~4z-6-SeEn-5qQh~udX-$qk75@TGt{s% zInFmnj9sLf>ofgFLFE|}Y^2&azlGWp)@J8P8ZNDa-K@o$idyB(jg@Je20PzbS1#$Z z84T_G&UYNNG8VrvgRmRKk65-XxZ<_!a+>ws8|ZUnlr6i&p8>%;Gf2$Rl8wsCd|-0J z72|H4(J=T=V2H=~vD(6)5(tLA+ z8C5fB^0idMWKp(MnshP)1qf*@9#W#~3zccvY?4ZfW7rKCD~vOFH?TP(Tb_7@Mj%QU zk|uT3uuX~)sLaWgF#$s&3Slr9D07>sV16PolTDUt6BCOWo`p6@5$d1-)`AKNr9Dlv zrKX!r6*4O6UWlu~U91YwZ#SWn7l_BaHK<(no=P|e+Et95UKPhEe* z>c1R)-LL_`Aq-UQ%8g;6*l18HA_PJTH5OLyRR$!(B9uv0kT7M)l9m=!yYTjs?&T2} zxb2C0Ul8OIse18&uqJ}#Q4r@l9ESro#SSk8UZ>fCJ( zbd`GC6B+$#R7=^K&UOgYyH$hcaF@2Un%_37=o&9fn3tA7>b-@F%a^JDL0gXg8dtu9 zisd|kM0KDozCwd4HaWMPXy;i%R5mLJw0tkr$@8ypw_=$qkbk@HMz>tYna^A(ds6%tL`45V$vwOM+YYIDFZc5nfUSsEQe+36P5GI z{qSG2NGCv4#T+e+f?$Y2Yv%OQ)4sc^yS#5KZmv090Nu6Hfp(y2Dqc)(IPgF(c7qol z*_q%>wQqX~!-S_+RiD4<1Cm6^5Dr=tg0r`=;b?0AuebIz5b3|PsX|cC?dxZ)6ix{ZVxS6;|5K9t>?L4`$7?c}eKh^X)H) zHwXJ9dv^IUs>?b1Qk4?)PbCR=6$UXRIuhC3$cvP%yP({)6&*m-uA2{Q^s(`JsB2|^ijCDJY2whDL4lq3{=IwnPH^}K}r94DK{Cy(5uLEME?*Y32d29`i=z_Cmgn4kwU~azK&tpt{q9`4&Or^C zD$mVPoO<^`b`@@1z4D%2h{hE#`bIbItRs2yy_kQi`_0iL-0RDDhQ7nsHE-7Isb?|^ zwF)M`=1ykP@^fYs8Eyw*)%?+4n|dDwlxcJI`vteFNqMH*ZlJ|^=}koTn_ofTJ097M z%&_6oSO&B1)%H3Dy{g(3<~6Gh^<03p$(q<$pYwZamTP@d)o*2X;ofMe0W(N0=2l?v z9eq}{Xio!ytEL*lt0!|;G5MnRsQCFe?oniH;BArU3gi@~)+e`+)y%%E#$n9pR_ZK6 z?JVK%Gp-LjGZ>{wUREA??)X~s!lPN1G^#_X7&NeT9Nv?hvU$IMVaL-~_vhT=3S~$+AhNbPzXxxrifp4ZOfU|beb2|#+ve~+e^7#O*%SdZo z!d(iq7?yiVQ-Yw`A7)rGSbNIymVb%^GS|sn!GUW~ zo1W@SixRD&3BvsoZsV6A*h_tkw-r-_E-ozm71~52sdFdfjfSUZY=^PPo;@Y5JGPQx<>%++pzR-RopxE3|ckewy?svGg`9|PU{g0 zS&8kZG*1aVFGiWPG0rL}k3!K0(UL5h6Hn`Qll0dP!KaeR0@i1s6O0Hv9*GyBR`G1D zRqDCjvY;bA-05ClVA7pN&-%t&`R+U-Jmr3$6|=NCv=>n%C;lu$X; z1t#2@R2=K-A%f2H3fLh%*MjQE2>DtY(|avP6WY3;Sbnb`0;0b>yw9Z2NX*P~4XC&- zhWVj0;It&yy6DSr>72tJua7Td8$7d?_SO-_*KFnqAuuoou3HZfpKHixIFRaHWTkR| z6M!pZEr|j`2!V|}`}NWr=E)n~PZugO_V1uz$U#ZZ)EN}eI&M0r@-4;2a*;WzQ4Z*= z!+mO+qv}+n1G!Q~kmuO}&ujC@V$#02;c*!%$kFCs-_Y1QzEj0ZJn2q@&uLb&E_TxM&S8)#xyU?i9%z{x#?dW7qF z6ZLiRg zsW{So&bh&I{RqgjEh%%HKSq;p?XlI&tt!)f_t*MoBZt6Sv}9*Ic8h_<8rSR@r2cI+ z?f2NbF9HsQoK4qnC+MxXO zy8x&WRl2u&7&shz)Oyv=Z0ZK3v&{AKE2b*-Yhh%mQkSRYk3vB{*Qc-&Qx`%M+WhCY zs|SaPkqN(T^gajScC2QuMxZ_Q0(eOVu~A`6pkUSO4=%k-S(zpclQf_d{+F{cC`2G8 z(%#D)AK;+e#kntyCir8z8(^Q2{B<3nn$<}dROh|#xohpaXWDSEF>d#TpyK^stF4(( zj3G7DoZP8&ZY`>F>g33q%bT~%V+Ll6Nu6MLUBlDVGeCh-7J|@^(99Kyt;Z&f>Qiy@ zAkp$6(IhFC#r|x1tAdKaEMNf!-KW=QR+!UFxz3S=l-7+;l6&#*>Jp4A{E+ur?O*{( zK$usWK$a0ac{m2#mdZE(EfeSAEJ9h+ZFx+QKC%g&Y`3>X;#{hPbAtpa`d>!!jmMN< zt5@*atbP%d#4*4j3{;iQiD9Ogflfu&U6u%LFR%eHEo0cw$(C&aldZuhN}^4{Yirb4 zJ0B%|pFY}0vu}M@L!?%#$s#0utUAVE^{hj6*GTd#x%SNsq<>Q$-#<#pQctpC9%Sp; zj;6fjqx9QeQ|4KvhQZ|=shViy6k6`h$>~1Z{F!zwd*&Y{hp%ze-z6`Re!hU51;3l= z8d5O(-=X(UW%qaV>v9bXulZctMm2f2?lsY^7d*mBdl4U6t?m{5(IsxA^F0ZOD?-?} z4o34-j3df#515VvpPUMn}sMjl~XZX%Si6>{|;eq%690NKHr$mgq`Yrd7qt?5}1j&8x6BUmQAO4<@_LdNR2VTLixAhW4A+!l-o?o2|3&}fgGH2r2yC8GUm#Sh@~A0#6JAV5%lmU`wE zOj6)zj41|-Y0TeOu9{yN(o_(q#w{lL}*j8gq2M)-_qRG1s0O%K3Q>>+(yOYr zoOkmXmv=d+lcD7z0UDXwY^7*`1}ixz=oAH}ewp5q=C2NPAq-TV%7ovN;0}D)k zuPc@LbN_ep4ho!qdA$ie9eUGEW+uZHT!-r_0Ci>g(@oLxG*6FXRyQPPl8yaWX^rGY z3%u$KdcOaZC*{LONB5gE@IIA=L3|S8%Z@I>z4Szp(WK;PvL4>$A1K(ePn~;@xbw>E z&9JBMCxVUGsG)HgM%Mal!^0}w1@^k;xr>l{+AzBIr1Y(nre&r>TIS9aUp?lan5Y!0 zuSVfsO*UD2-d9P5iZxV!V;XHG!IbqrZr`%oYESgGdN^Y1_$<>pb&!X#WK6a+Vp-mV zoUXPG4m6kSlSum3l;5h}wfGD>{1aONmJe>!*^{T$b}cPoJ5BKniLk@TOSjUCfeAlT z1klv7hPcGrEg1{SwrTk>QW4qM@O7^v+5O3)2)jKf!vZk00gvJAsLc3nXRDqrs1X9k zujp_cGw(HMS|lIWwpzZc2-v-WyfA|LE;8TCvx0gHciMNUVQ6;Ft?4`$NuM>#F-tqQ zD4@{(LIJaVm(hnpp0=*Fe&ysa;Wl*b?(p0c&r~!$M+5%TFda2x+>* z_QI+lPZx+%QfeMmk3Ajg8Bb`eLC`J>gwl-r|5k^6;#2Y9nUqO9zYDa|^R6cBlXZUOw(tKx0@Vx`tMGjF1)%X(cDJPyjW0<)Io{%sHX;=$pIj z;O+ncz#$A&Ro0yWF#_L^veI)rbrn#|({^IOmB2*~sB#ocZ0f77Ws4W#$%b(l2&(wP zr)|;<>WUN-oc%2+&n88#0skqtTROd7)dhj|kGN>Q)AkP=?h9i`bjLYU+m6XYqLsI- zbslrw5*Wt%xb{Ecb3NtVICg|`s?8wO-S5g7hDD4o9YI#KyM|{}@*k((^qZaw zgyjN!<>QxsdbKw)ThGFEcDlsoZh9 zzj{l+*s(mXuUR;qFMzO5Hup-qmVltJcM4(CaroH zOHCla52}6;sicYuMfn9){`*q_L30ZmD2P8&#AP#O0S{+`vEYn&35A3q20x>I&U1sT za@BaZw{*fran7X+tha2ZJ%l?UO1B5;OF4CEn)cje9Lu$aSYb7m^np5%t7k?>uZ?qhLzi39Zc5sRNI~zHJIQbNLV7MC*4bq z+jLcAjj=`Ow9p%#nWZL~VrR%}m8=P!nzZdzY2;V>`jAwSw^^^PR=59M z8Gi#sVj^`b$O@XwXzzEq)yC4DYR4?kdSPCX|m?oi(4}!Iz%10UuIe(*d z&@D?+2wcjKiSYUhmYj0LLT!a*m-B!SHrhlXf?;BVU+}u`=~dPnVZ`tZ5o;LrgrKVZ zWGx{vi|B_a-Q{KRYz5&9gh=m+Q!P=h9UmYtWQO4MzNvZ3F$QdPi!2=k%LOfcjoro3 zwyI}=o~v7S&hEBOhVvQNwX196H5ie?gh^FJnkXNPRxGxRJq`-uabGDJkkgno0_nE< z9Bs7wRC}Bon@TY%lgWx!LVKJNS-z%l97`~iq@}zePrVwY7_NSo0`3!-nr-4lgtR+1 z_19P2n*Lo#HW`P@?mnY(XM#?y=c!Xk4B0OEL zF4M`lVsQa-`n49n@9TRIJP++rqiBesOM=uMi^VYl2L(=g^96Y_g1JWCkU1{G{_Pe& z#nK+@$T_}r2gbSiqgM|-W(u>eG2j0zo~NzJ*guh;GUJVn{-wlw0#g_KG14=yx@K!_ zRc$w=RiUW=1;chfB<{RDrR_dzZ`E(P!sA?&EVR1o<>0c>0k z44?GZ_=T$It3Yu)vqIS`ZC&ACFO#d%MyuU*PFB)RqeGzEA)P=;OPkKuR5QP}-#Vp- z4Qk>IhgLdB-C`eIc#fJ)PM1NV=kKjo$)KQ38gXusf5S$l%Q5T9yk*4W>`}9o{PFrj zT=N$F4%I#uBCcYV2bxnE(+Lh6)pxYUsed`}5fkKBzfvp8J9vQ%V6%XBYJyWzJ~zPB zgpMc-9X$79gCQ(%b|eLgfq<}(AjkLoqpI4U2Qb*hakZQB0UH@2S9ja~?FrO0F6`v+ zv;d_f)FTSpGbWRwL}^VPtHo4~?&^PHHoIbgzHU1{(*U`1IJY+$C{-Dk%&Rk1K6FGJ z?JEVq`@m4u&HiV9WUFO;`BSZ!Cd+-9Su6)tDQZf2iG=j(t)QCE0%{Z#ss-dmB$2mG z($Cjn2pQj>qG6l1w$W+mTUMZa?Z__gyQpiiJ+<{tz4jlXY4Qr|FNTV*$XYgHE%E1Z z*l|RoOKGdeD7otyW(%q8$E?TorE{fBazf?tx`Y8D?x0WN^wKd*F;BoDPVE23`ycdg zm#JG43j8t({6Y!)RCm33dw2N$Cf)DO_`bcrPmk%Y?Hqgp8!?jbpvd(e5IG_4DNWNvW)(ZWl83P=FPJqhdTmVAC7sBqRk1oqw3tr2IiVKk2|93 zMxoVz{$QewFA2%`QW-)rxo|LMuM6gBB@t1gZ#yfH9Y7(wgV0nh{bK4B3DaId#6$ z`%1Bn6sy~aUful9_x%qX_dVDPe5x7}8`UmNE%2K%LQ|t4vhgr*(PsXGbJ6^FVA+7f z@cnM%JN9xB?2(#@S_;^o>$79|otrl?pT`sM+SPQL1pX2E9G{Z0Sx_E;M*0awLd7AA z=jio0xK4|D#Wmg)MUU*i6D4TxQ2xuuU4CCx9&phh>g)(mvN8)?8S?w+gmQPwRT$I< za-FI`@0wuWJ`MNhjrIKfx$nG}ejoXJ`+sA7cU_5220oMbs=~!X6rMRV{E{=-95uS_ zinmg@$re{WE)bx8Po zP4KT~oxDifeJ3x{G-z=O$J-%q*SZlKK2T(F2=u3Qb86iG@03_XR1ErZc|8#vXEGsr z!5jxWBZ`A|t8iufdR+~}>3-&~R%r)R;jxT^4X&L5bj6DR%ZJ1mn_)B*WgNVavU9Ww zty+v|T&p2gG@W|IAo)w{k+g?RZ-6@1#LXlXh9|%F{g>~hK2D4|Ix5@uq+!cH<$s&}zauHZ3)wPalhhHu0ZLQ=@CMUe!JxUj$t05q zb?G?0zJg!~C6{>b>K?eCA9NWJ? zUpkI*W3WTuFTr~s&V>6nhsb9*HQF!VMYx4RF13)D28cr8U5gpVR?C(fNxN2}NjVb_ ztKBRd7osLUsYG+mTPY~)rxZRUec1Gto26+jvN_4*cJZVbSu1Z*`ih@%Blp~mes{%V zQGo)kAsn&@0HA!pu8M)XDdHM5W?%#9O?3 zIlu8WTbD7*;gtu7dDqu7jn27;#9lqi+W)7Hfb8E!$?L?%ct3Pu(rbSM!Ey?OhUwqz zA7KaObQnw8w?n$4nIeplAeD0sgQB7LBL@xn)+U;7gYV2`emW6@nyqIg&(K)Zn^*2t zKZ37fYtQ!V7Q@mun^Ndoc7fxGntYu+I7f1B`q!T5N%sznTB2Nh9YsSH#?I*@GZ`fsq1Lm>eTo-t8^`@=*TNo zY|?^c6US@J?;QV+Z(Q5OHUTP7rbQ9A!^q96 z_fgVy4MR7cGOomE)dTQDI$GleD#K~| z_x8yN4nfarx~+{q(S3%=^}S=F*s1x<)cK(p43&owRjAh^(&&MyP%o2)XIU9rHS7;1 z+7e71j-NJF#w5nr=|AGtJ5ONaGx+O^_Zn1d4`8rVE1{XRb(_o)-IWn;G3GGQrhw?N0Ny{B@P z=+a6GvY942kESR#ga@%3p}-+*RCUg#Aq785R9;<^XxB2eo1qZRoq{%b2`@E#aF&Tw z)a}Sst#o)jaVvn)NX~}9BkwY1ZUT1%_HIz(8%{L40rNPA{W{mA`@b&fn!oWJ;^;Na zu{zxpH~y7tlRa;C-6PHZy?S*=7;L)ev_oYgXncAS{CD^d(< ztkc{w4W6ZCSC2M%-hFQ=`^~Fr>aBgF*VK4!A#YY2wk${|{10?YGN#bD*LNHv#AVej zKZ4wqJxOJ%^ZZWZIBtn+!bSB`TVcnCd6q-m``jFqcMVT1zLCP(F_NBuTGpne!B!QG z!ER&%->*=1aVbb!YqQU;yxLj_p?-Hk0;QAw8q7r%HAVL}DO$$rpXa;Qg`IV*buRms zQEJd!$Bz0=Ym(vMa+37EcS%8;RCNs3{#VL<_h8HGMmk$)4F+A_3JHvob65f}#Z7!e zD~zw=YdBgjM}tU` zwpQvw@-eyNfJUBZmTxphOfqquW)Zoa&En!B;{H>8m$hF!uYF;EWt}G6@z{o=v)ujo zT^Fn7a9mYKG;zK2`+o2JySk0iZU0)Fb0&<3+#S~(K{MybNq4kHAI}ji;gLBH=41d( zm|Y2;Z~0tP>@n@LI%QC#U5O=d8o9XS=X^!_);xExCZz4HU*Sn8zfAhAF!fEyM+x@S z5;N28uK4!5KOpjQkj41^odo!_Mj=pWnnQZWV@EciiIjmCRKy|E)P`$1g;X^@kuC+W zNL$`AoT=#)qpngWDU%ROs4F-|b=84s>@QQ*6ATxaK<2rgH#Orr3jB718sP~nmx|Zt z767e80(a@wqp+`Hr{7eF`u3&iC$DY7=Q~R4;c!kEzBH2jc%a+XC{M&ms!~s@G&kxW z$Hk`^q0h%DKm@;o#Bd=DRCU&(Aq78ZL9Dp(GNgvQSPYpq1SEiuus#mVgup3~Fv%Yf zLG}n@u!IK8dscikM?S@a*K(Y$gU|o0nVEY}&Fxx8(4&|ga!i64FOL0#n6|H6{m%p? zecd0c<}w8r+Iw3B0|z_FTC*%+oY>Z_VfCK^ymyt9?a6KRKImhu$?JbM)turQN32VL zey&bEHHgVXGJ)f7t@vD#@4dim52(~`Ph!iSX`ItG(oX2Wz;liA&m1uqefTic}8Aw3zEF1IBe7Skjfv}*-L@Ey36}M zRjL=5@c~z|Juw~Io|l{Gnnv5LW%GKefS>=2K!~|f*$@^S1Q!0?q6fB2!*q2!Qt-2x z0X-f_j@GtP$5I%zy8M5J>O6G>>c;!WHrMKJ0~DQYK7Y;G^FF6pfpt%He)HzP2!C-_ zg!svhN~&r8JRksYeOI^rx3%1Fu446xAN{h^=7q_sXU4HlytVqb1opk6<72r%N|K_C z$Z6!&D#5zoH;a5`Xno`p4TE}DK70zyuHgO7X&Z_$ysLIcfp2zpRk|em7CJB;bm)I_ znYI%7JG@qAO6m$`gM4Ad-rYbbe=kPb4_@B{U|w2ezNjT&W&rG{4}Qb+cE~3;m+Tup zBT3rDbDb!<#zQ<_GP8+Qg$+;Rz1azWb;83z)b)i$niR5yU7`ZyFZ=K5>{*j7DdI`> zERrBUAq-S)){z6DKx{N22r2&=eR#eJ)%VD#i^Qp!cacv3hXdM@_>J!mla&|PJaCmE zEN2kHNh5JaTk6fxTU6R>98?L4XAf_FvgBT_Q@r*MtaxRtOj9%c4tV=*JN>T0ms_Qh$qaXs4Fr%Q)i z5($A|vdHG zwp<`1XYU+FGkT%W*45gU-zA_dvkYU8%ERuuQ9p!fQL$}T?{MRESC~(yZBusOcGg(A ze9U4Qf1i?$G<_F+>u(FWlBwMUoCQa8|{$98;VR|*Wb9oPL&WMZW2{38# zdS^-XvqrqR@+OUK?T)6#QvS{rJ@~Ia_$7b+TaS&tZPq2}Az@f!7`E8Lxx&?x5=?xK zB*vFVV5t_!48hT67MwF2DpkV{YEB%t?3|gnI05fyw`0JQK-E}p>vQH~O; zldef-V$`wQ#f)LlT#xt0a`0R`gVLW}0pK}JX>Ym5n8b!<8nElAai9UAjsyy$KR^y4 z3{+LpmcgSKfiL*6a$L-JR9Q8GR7{y{fQ?Heep7ussl_hdph>SWfm{E^oA1;MHbKUs-tHwAy0R23mpty%H~*w^90STio5tp5*5C4z=#C z%Y#ywwmRY4b7DVB!=wBv!h2);H$!uN%j&Ev@pbLbyX|^v?jyJ5^!W#pY_Mfa4l8rs z@*dF9eqC|&Srm((Y8zdPd9#Uf=X{<6Rk6NdwkZ58aEvjO^@cj7Wr7nN!zjtreIJxA z&~-+=RvvkC2K}#P)6vd6_6=Umn`rZ@{!tHRfeq^R(+fr}N$InCYQ|Sa!uqwzS*gxe z=?3}Gsqz=Th6LYr#a5-vp*Al*+b4u-<6z*GxSij1>a=Y$!!Q=aTg#wHlBqIP0TP60 zJ>JFzev8u8zVqxAGiw6Q+f{nH^N_1=t1B1}O_t?KN$0;^yoeJPD@3;KDqTj%kSvU3 z0PSN?bXUOVfbILY|6j=>uFz@|4hkX!zwvh#>Wp{eP>YUk3&N{h*e7)u6kN-U@)$R_ zk{q0eR_YxRT8)&xj^uiCzW1&j8u7N>nDfQ&#eF;X|5^H<-2SOkj?5t{ zYsYh|j37>S-i6J6cdLCzTkC#xxGMcE7}EOFKH;s6(Wy8;Nj56XaN$~VwHF)7TeZx) zhjiBPgy3XU(#+HjqNY~7d_vF2!>Oyr(wt>bB>+xBgkn`yPA=REPGphdQ{g|T+SERH zUfD4umxe3bk2=R#YcZIW(Vd!7u!dD6Tq#mBkyE3=f4#$_h|}d?B~f?J%dY096PqdG znR8skJ$@@dJF2N%xwT78l ziaM~zl7OEP1%xF$@TFB>rcxBDiP-5)mE)tXorX8CG_!{x3{+*piD9KcsEiX3CH>a6 zNf^#?sTH7zFf0?By(RGz+P3X0QpQ7tlS)A&lL1k~AtvD*nKk~9Bv5|FVv5vc_7`t` zRs2U*?I%S5DGjxwdq-3`XYs9FsN=!|0Wu2o?CN`s{42!}eGh*&|5bj#+GIQ^3U{49 zW#-bbysUWx;P0m9dACw%c%0@&qBfW##|g-gTod}kF5_HcmY4{{s`g>eD{Z^({tk+q z(@I<^1l3ucxaL`!vnQ0%2&HFu<4OV5M?YxpK5W!+eM#x0l*{#nei@pe>%+S*lU&lKu@Ow_I;h%>Hr<7n|JQ$2 zw)f%W$+c8YwB6NhctrTMEsV)rm|@!NPB)gPcM8PO*wBLRUL)`!3{<7QjbW#lkRX@w zepugDS2f+`%|{q+CG8bgpiR#s(fMsg`B4}#eD~tMJG6;mTt+SK;;fO`pI?HctV7oF z2f$;S>tQgRt$~gy4+QSc2>yucS!li6;m`^&Y_6leekV`09H)?Dj!ONumBdh+eb5qEwYT$~#V&0lEz$)1eHI$)7~=BP3oM1>plv0I)Yk5~@`jIP~7pM@Ja;HD3d+DsM6KR%%8T zk(=}mU2U=tP$aWghaf;#Ms!K?)H9S2QU#J6+OClZ`)@b=H}$nE`B6{+2VVPBcL)%H3Ce8AlZAL|uU{{=KmWJGnLUMQ z+Oq_c1JnQ)>iOmzAq-TN%BCR&zRRL#w`{)XvP}#!RcZOaR~h$$%>? z+gZi8)M&4arL_4E7yrtxPa}D^O7rGZG(EQC%$V%msK)bmJ=gbsFQD;#zR8$oy*#?exB)FB5Ext+#1X|7 z#V6uuv^|;zkNkAP8YOLU*23pB7dX4KV;9j!;@SdHm^PrY&K50L0kwCLAtJ*N-7?hc z;EW&n#0a~677BrZpp;M%C@KE5ml~wT@JyW@=)uRid;&N1#O7DBT#@XQ$=T?Ap+&Hi z7k2(5UPuh-XWT-L_v!i;56hjYPih;PzczSE;GfZ=1NS>f-I33?yL=f6_Fic3PwIKV zG?IogeAff*T2p@e8?^ouxI3QBjg|k^A2Xwi0$s{t;Yns4j4K3Y9w18%#3_kUOk>i(HtF+n4z_GecaCinYV>_HRL)>Kn_?CX?+~EASX>G2m3lxz?ug zEvtIM?JsmWMJ9s@o87d8$l2j(xT@TEbIWd3;A3`&<{2E43@J1|1kQx_oGh^@Z#A`I zjCr~UxYwIg1$xbv0fcpRD{xO-1@)EbO0x@{BRm94LWA}68p1i z_NLfcqM;kyjbPh?IVD)?bt);2N3S-4GWz)j=!zO!ZWggl_m(Tzq_aGZG=BwRx&2)& zc%oGRw@uB+jf&=C+{}M=&;5y`1+Wvaa4Vn)yLB4Ifr2p5ra(*n->=!fxuo>k7p`Xb zqjGOmt+gN|eIX6*RTK;3zll%B_)N+!r8=@XhZi7uf2i z>^tZ_cC|El{LuAfbQK!gPFI@XXmJ`k4WH3W-k>E?-hx}0oqK}dJm)=ktu^&}EY(zF z2%G7rwO36l=tR#L3{D+r!0f+Ikh5{s5d8k$k%G(sOtCUaF(Tgshb7{ge}Xg&*)T)0 zDwyO}jPg>d70Np>SN9_z8mKYde`+C4i zg1l$qWI=k7KOg&fjfL|HCf$Po5i3CO`g~XhC;}x5fZ!nvR8_jA1EB~(Z}{tQ;Kpxv zGUUxAm_=N63E62cr{1!`RcH*1b5}BYz9Z~av#^bf9V&Oh{W%Z^6=FM^%=#FHUEQP{Jj6q8h6AS-sq=nXIt{^ zuJikKyu-O+JBix2;A%+m0#ml(h~SXgf_^ak6Rd9bsOsm%~~aGckB*YwwPuSGC+k zqLv$rDBaHe?!_aFo+CA(P{wey+*Qk(rjt3W)0;)trTrjDc^=890wOTV++mc> zt3Pll{+lzP0Di46VFEVeL$N{_kQEp${|ae1wqnlB2%FO_cijeb%ah@l2bJs%l^s_Z zWxpQjKO>r<@N@P zv*&VFy8W)sEcXD=n4Q6B3OVh;zbQD&6veo=t9|}&rxfC{Ra6-bh^vwalvz?#6~h#h zIXP}%sS6981omzz0z{&>Fc)5a(k?w2@u0XtFrfl&J9T16nfuZJ$v~4N?zXj)p@A=384j~LwZQ79qpujrrA&)msSz9gQ79}(qNs(brN;y2SXsHVrt4<2UZ7r<26;S*TP1QvfdF-UPZ7yW z1S297x+d)jVW`26)76lZwj!FtiYXviXMPw*l*_uog1$Y9>}j$c=0lkaUpB;f}xzi ztmnVy^ZPF_YwPZb4`09Qt@rZ&Ukj1IAq-S?%7tM`W17N8W zo{3>iHKV#mD;uM?W{+E?BX&$*V$`WBp6cbB*JwBN&IbE>&lhoy8|Y+`H^Obq?b%sA zao1BFUB#aTr2Hy4ZH4vUOFl8*V!vo8vGqF@T#m@g>5?c z-Ub$3b9xIHpCG-D^f7d{3tQd9_L;XANM|g@F5{X8-6oli#dc#(<7eg;Sk>c8m2i-T zTYVz6az?X{%2``qO3nLjj&q$)U8aKP%gop_XFch8XGXxh?Q7|Yp@70toHFV=b6V6O zU>Ge{%B9L#Nz;}93Y8d93Is?9Vrqp<-~E#FN}yv#RL9{>fTlE)$HKV}?@sLeB8L!< zx6$D2I13EI41SrFs?75xa!k&*ZiZLonkfI^}bfZHvA5 zlke#9->~GxmW;!z@}cPztX4*}%QEMkzQysMtAAfz?P$}<0ejBodJq-z#Q|ALnXg%4 z^v&3g4?X^M@z}K7Aq-S)%A_F%KSwlZ1C`qE6qR%@w$|oRm^`Er4 z2#NMb!F}rPG&d&AtS3hpIO}40=4j42LYFVedPso_$NAO1rzym!&+44r2i0Aa!RoZ{ zjdUZIX=wc(gZ)u0>t!mwcCFVeuv#k|7hr|6gZ|)z;&dDxEDbh^_oCB1&*)-M?z)v; z!Cv4L&)KbY>jW$((q%i4&iUPf8OCo@E(YOEMEj2tmt!u^C*gDu>sXNm+nR zE3UDY7!i`nrJlEVzf@|ubo^!<%Cc)x2109>R<&-8uD2yOC{J`G8s?3#Bpx#=Ov_0f z*n+(zGMZD`{B@=n2QFNxVi^L6Nx-HQrNWH~Vjx5y$IRijD@q%uS2?m1Td5#lAGk4x z31js7fxYKG$Nns5L@1EMpZ@wyH(M7dDi9Q3!i8lR;>X@|lhk#W0=;E*J3h-Yqn%fI`{a-@-pQ3__FHbZCUyss*{AVNwya}Zjey1RyDbyVMWX6q`R(67 zoX_k1Q!4_?Ry9>qjgG13ygHYJGBZsml+MFX|ZProJ|w8|ySyXD%+++1U^4Ja*c(cny-WVrl#OKoWHAoQzE zj^aGV+h(H~k%yUd&3sv7h(-2Bg$RT^%3(>z^oV% z`CZZBG8Rog{NmH-sI%73CQ?a*%v@t_`xYDExEQm!vI#Ge3N7W?S$|nOSenb2VGZ@T zy0Ro3df?!mbkN7Zf?CQ}QTv{3HW!1dVJRuigw~fOAArJ25ivlL@{92kKoq)CAE6UV z6&X_*WOTD(OPVFrWQLpTd4tq@q{v5ma0Ukf0tGEQ)NkI@u{ohN;ZGYx7Td9fC?icv zoiJxpSuEG_5K3IIs~=7ifDr}rtSsPAum)wIA)Ej!YXlRqjL{vm(NUlP03(*L0l*cf%k;_NykJNgdys3B{|4^c@?{6QA ztP&e2qRslgGLG{Q`m&Aiyl1UH3#0YDP}SWyD|4tWYHfEsoq2ix=l8Xr7+>dd$?sI3 zO)d4WBulpA@Huk&-VWR6xJ*1a3a)qr*=2|m?H<0tB=b9ms4ll{VCH!P%}{AK!>OgPx8Y5l zu4c0vQiV{(Mv}^xVoEn$b8hceQyug+0J!3)hAf?L5qkP2CPg7>)s>^DX>b;X5N&a0 z%AUyq@pQNw9%KR}WEr=P0G>c$zola{Lg1eiQD2D}sWhilLbwbs?{_u4VylDpCc z!ocxr{4Lig`q@B|--8izf)kGRWtpXULF<~}y1Ui8X2jX-QGq3LemEvvlk@ZnB#e&C zVrw`|m=e%dS~-?OuVM62zS24Al-68S(h)PFl*A~_42eRoKqx#Em|<52nU{ zBXYYbvzk1!NB~zFzDW=(cmyfSeA^yo9(uiZ)wAV{XLTZP6gk^u3b`EpIov=Lqb3+` z$r@$aPrLvy?_dNHYMeY`6izgdki;$f%JzVuPrw%Ml1K-K_YPWE7$TV)4k6!wAx_Tk z?xy|!&$lapCP3Y+ZrySOQ~$49&u#U_{OkGu`yUZ`r&sgve_kr(VC(J)@h-woOV&yJ z9OC2!?ZSJ;k?{Yf=o4Wd!RtPW`_^LD^>ad8$;y^n(*_&a+=(AUS5<#G6v)P6GvHn+3=tUJ`Fo3~q850n>(yTG`pogf_Mw zw9@UVLCY3wq=h7K0p%c66E>yGrI!19(e01yY#dd$AU)G3uL8^#ZJEK6qd!9P)66u1 z5^Xz-|13)hzf{CC8YL#&=MwTap@{mw?0)*NH}*RFUwJ`$?@yaF!EdI}&6s0CB^-GR zAV;%B(t6)!D?=l=HaOnd$1&mQmc@v>^297$A%VI>CbC(K(F=75>1S5)wZm0271@d! z!CmDD5tw3f6r;2MWMfXN?)snQr?i;KcrZ|m`^}0AKnzee+ZEIAPdZgWl-h=4E-?ec z$uzVOG?7(A3XNuoAZHpxL=6zEZV60kRU+w!8jQ9(OSg?TH95j2{(TyC-KGQs<-aHZ zuflNv{Cm^rAOHdO_JJTcA#7BYwz47wIA5VKMlXYFrA(7GIaynCfBqnr_OU;%o$QSU z&g~;fonXUqc|0qH3^Kynnb>R`3x3dH)jDg6K9`RL;9br74vKH@vmD}b!OywJ8H1ao zcRCO?y;~ecvrEA77)^!k?=d`7-7DVvUYnBk8iIx#{RUNBQ|_KQ);4GcF1)GJ2strO z)>ZV=jjFO@o74w0UNQiH%&J~Te8+0_tgz2QoPXnQ7QPDsH)o@)R5m?&+X%U6!iuF8 z3)GSX5UndoR{}EEchJ*|W$5W57=jvan#M*x8*?LabDZ0PR4aXU$5~H|18CQZld)8r zlLv=eOa)!t9Z6LH6$69hp{FC{v6}*%tyLvadJ}9`wK2wF3$WLzsEnIoA4PGuK{)(nMnRRZ)PS*Xv>c!vBegTM@1S)kcq1rp?n2Sue@Or$pqyAX`a`xth<|wBvh;_xS2@P@Y6;q z+ONT8(RjWtj+YK-nn+&fNV6FC8pIW#a2j*XP*6Kod$y^76Ot4 zwqxe=m;~fdnv$|FqLmmX!8|$akkd^GYx&&}000~z3{Sk@|LFhza@$XWP+(LT5r_~W zLi;UCX_zk%q=qI;*Z!cHsS?h>mrO;fpbgS>_V)e{95=_}S&RLNtajf5_8<7{HuAMY zUWHt!ED5+dG?%ebbWwUg*gBuksOr93dhU78w!D8YnDvr)j&1DQ#zSl4JQVivBZ2*Q zn^+{4*J=%o$1pdhXHl&vxTmQ07}(UN!jyaL+zOHh1b306ay3E?!eLh8UiOWy&z3SM z+~T_RezjsMaX7Z;_S;S*0l`Yh{S?(LXGc=B5?*1qO=~>3U|hsXFJofbX=P(K_ja3N z-!)Nbl_oZL;=;%t-l$9$56R+(7lXl@gOAGBAC2l!#S+IMN3Os29Ln~!WOV5ybHtGB8HZ*JyzhrX~wRz)5ADVMi8ibVD5esA(v9Cx_U zC?#}!aA}hfZd%aZ(#O5WGHHcp8^qOc_ZUme`_Ru4Y{|P`LYpkh;1dFxcwy2J=+YTC zO=)KpMd;H~M>vSo38%!_W!qM?XwS8qUd7@c6Re6v5!qZo0I+3yQ>ed777QT>47JT= zrH#C|QklMU3MOJOxJe?8YXh)dwVBPj(Yj-2Ba4M4G3QK4&D*b8rAq-EdZ}0qn{%YAy zg0P^7Fi0E3T(fkVRHE3K0^lKzy^pC=94hXS`t{Tu#6im>xqeeZ$F7-UMzaULu^#*I zKl^PtFjP^nGLlS=qMb$L|F8B8*74eKT=sX#>fhoT!MZ_PG1WR=N%Js&?p1jYQpEZl z2~4Vf#f`x!he2lnE2TVQJK>ANby-zxQG9SJ=$N z4l>MLUCKor6$3i9&lcIIK7wI<6_$!_a;!buvA4UO1a7jXSsB%~i}@{GQ%G^q$s*c( z;&QTkSDB&&uBY)(pJ_=cJS`F(cGs82Y?uiQJ z?kHtz_4DqF!z5a$&GIXEY&9~)_npb?3Z_`a(hmcd5K<6IbN=?f+@(I+wI9oip7u`7 z8p!x6GD);ty|?h+8*kpIADI{U*n%QM!Q@?Mrn<2+I|BpfBO zKhaDx*x~H0A++(Tq3nx1QxFcC)<$^a<)cW$EOxcz$YfmO62o7Nz#=emqlj=uIZTp8 zf>zq3G<}Ewx=c>%W6<$iG9036bR`-D*p)b(E#iL(@Dheq)m0*hMog*G@6NILab8m- z(rS_>fhMY&DWc}WjVOV`*w83f?umW-=oCP{oLE(;m*tu|yI zRRocF5-WVW_I)yD9lB|7ZOyN|x!M2j?>*C>bc~DW&FkA|W+^JZr%9yDEG-HVxd#~m zwC(lttTp9jwaeZkx_lezTY8<4Gxc;Cofxv`rc6}ML|MQ=CyOO?qskOQS@C@u=%!Yv;o$Fq0cn-g?;h(&M3D7h9B6 zSQ;yjKmz~ALpc|TX9T9mg6Fo{XX=Nel%I~>2zOylIbGJ5Yw+Xvsf_Vxr*-)oQXnYz zk@eFufrt*@f?3x|JC7@swxzk)`#3STwB6BjGU!f8l-H{a)?|ekB;I5zOca2mpMc5{ zBbP@!Eo5u`CF7y7z#$Azyy^dd|NeH_M6pv~tRoO5b<`M3mZoA+Xo{L@AQNRdW+vjI zSH`#0to(9C(MZiltKJ_{_$y3Tj^_JyH*^C-a_))Xzi_*enzjpHZG>msvGuHKdMu`s zuJXIq^d-s8+drgfeeL!lL_bw4sPERU!=?%{#H&l8&a+FKFGalD>eb>DYgy5Gub{?O zGVT!58=Q6jJJakOnM~U~)X}?UXQfmu?6B0X-s@ZB3FdcdDiHvMzTJHeJVPKZ=f#oH&fu&5~lF z8d~zrCwcV~5aClt164&9jSaQ4Lzn|F=f;i4aB`04Im$?7Osb7{!Ke#mRBMkX58ybf zGvWw!R?LEbMD@2iE%1Rz56G6ZVvs6Mm^K| zNA6Q`OdH0#OVGPX4&qH`p*kKPaluj)-*J+ab(VwXBIVu-9hAq z>f)hUG@?>2vplKNp(cqaKAEu6h8i@8OqEch3F8VI5HQT)p@gl|qi^13rFkTu)H(9 zy9==YZQ!)0lIB!j|Fut09>rD$j)i|R&KCIG$8PGe_dHF7m3h`-;w10t3A9`tnMpUh>@i8#X=gprBKDH+JiEDgH+ z=jpkrhVJ2Q4|MXg=okyVLP{6>5zqk_2{-GK!-Sj#^UD=SJCL9BDjN>wsoITMrf2G znbA_7*pFYmQY&%8sbMQpinb+~(FX|Ah<QEKmRc|KvaVV&P9<(2yb!YTXeN3S}(XWL~np zy+{Zqb)OeTO9iPGzD|oA$fX{j^Zp~U>aOJ<& zYaS`MB@wsXJkl0E-se9#38AE5@z1pl_h)>NyTKo7 zzO}c6mTpE_kkyFEK>9fP^gHE%BCewnT^eSv_X83|9{#bnq}8Z#QHuHKQBg1nxfUj$ z>{b|e$5n{y+3w~^Yj?dX{=Pe5UY?B5TN9Wo2OrDs8@H7Ahc0GqQ?pv-6$6@m?MBhJ}+x2C*BOXd=E*BPx)b48fq4w$pjvu&pN ztwWYgFxps+L(a0(skaC$^MuHLW6Lx1Cz!3Y0JV=|T%+5GXT__ldjco+ zzw7)ScHRDd-#$|d=YbMsSSAx@s%=XE{x@OP=g2WBmrR)O8828i=Y!|3FxuC{LKt62mpfUl z(b9PeDn+^p{|>8rP@Sg-nX_(wLLA5)2*mj(#94m+i+8=@ z>^6q|JEb&}??$S4EWB&XMk&prU=$ zQXj|#strZjN42{x`=*4mHxcFd9ENEN1$?^?nWousa4%Acusc9F}K|2P)hrq3u?Kt4%KU5?ZQI_j2bFIyPfgs{j0CP+tP2VCce^cy(UgU z1uJ}G!^wjF9i$F%+I!|VT>C;KY}We29pL%;gJ^CF()jl^xd@y>AnVd9YdNZ#vto(A zXAM-6R6+*A)C^m4;t*;eO;m&=FxkUkeBF})QV;!aso;zd^PLP-v%2GLx=CN@c1_yn z=-iOLfrVGBO(rtRLH(sus^+~WcvwBpf6=%QNK2qXYxS+?hb^?vS)oyHP~|C56cBMv zVtwH{%6YXy;may}Pd(unlvXY?+Hu9b;>EIIR`a+JR7st05S#TZG@%a$26N?#I0V>; z)Pw~lut<3aPI~&1pE>5eQ%`&0$H;+u%*-;Kp)|!;pFjr)K=s|IF^>A7GjNg=3SWo@ zNrQpIdwLVR;WW{dO}2}De$1FLgo;9b?kkoPmcR7>zqhg<3C7QF)!}BNJC$pniNGOj zPrvW){m=eJ<4r)(AVx4rrVu%MP5tJ0}MztcTA z#wvP`yGtFTE%~FT8|Mt87EMVdSO5f~&ZY?^T6u7ekBRkMOl$e`8#?_?^F=+EP<5iA zk<8wuzgvr}kFmu}OU0oKhGXLBu4lk)CAb+2JNCEhyZ-}q#i{}zByIFqQU(UYfQW%F zeL7R0CMNRC!YEf6JBi=0y3xl=`98GmuDGbxQANA8pPV5wkqPhb3WOxiJanf^DqRA} zunEpBh=K!b{8A21xo;!J%zaL?UPQIZ?vU_bm=4FC^fuLq8x<8RSv}mp`=K-!f1!cNCaPqPK&aQ|w`7wog_ujjPYS}M1sOJ(g%w%esX)6J+5C)ue ztt7e{IWLmK0(=)!IG;+Xp&YWyZ7VjTSd`a1%oZ|V;LMyIyQIz+|6j}hFE(-SRek8^O*Y5ZIF~2U`i}$;dB83X=o59K zvgmEWP2hW%bXncirD27rJOxC_jgjoI?YP&GkReT3M&U&6JSMMiRCUeNy)G1*>)mC# z_Ovu?2Cm)nitg~i6}bv5jV=hW8>F2@LhCi^mU?d!$HMA$_#V$on7NpdN`Esc3@BPQ zp4A^`3RZ|^R+frTkmmu-VJ>B+CFsSDg{@UOFPyMr58iUSn(Jw{b}dL`wDN}pwIf3C zMGHg)0^Spmw62a^3FM&qkgpUcsb*ZFpK(cBJ|M!#42lJ5Ykq9MW-T68F|Mt_?#+Qf z0LmB>*1A&}0>gl@L5~l-XFhKnRA9nYaP*@u=YF&0f1G@fhQC}yY;U#NwpAjC z{ZW!|l~O_*zgGPn-*pV|YA!*SyNFKt+dY-qT=*rCt_GDo^O9?QbHAW%uGYOoX`J?AuY}HEY;1Vh>MC9{$TcU{8beo8ZSSN;lT6du-5;K7zbWF8?wd zvU(~qtLaQrUQtZd#F+V`voSrs6!FgPvS6+PBueB<7p-+m;jhSN*1Mp<+PM=Beg=Zm zOTZxvROPaXVWC)P(54V9%DpC=TH}>MMF|&nutKECnsvI@Zf=u_R}cg}7vYv{Y^y?p zEGMxpgWIGa1OMx@?a^YIVQ=wtR9s#}xKh6N_nZCL-7?-1r3tO#>boMuE`<98yYm)0 zB>YzwfW%;TjU@Ei;QzgeVlfp8zJv}AlCzaOHK4WdZwZ31utAf&6z@!eu0txPpIGh| z-kifK^Mg72o7NJC2ya6);Oh5}?DG-2udE!89tdk|T4}hs7Mu4LHuV+tSehMcikuc| z0d-ZFozlj-on@rE)lZEV%!M4j1nIBJV1)SVylj)bm6b_%Sl&IBlFnDIoeebU5>mZq z6j^VVu<)Wrac>7P@={nrWrQ(Xqv$XI6%FR%!1(w%H;%Qyo8Vox8x?a| zLX^aRbeNpkh`|7!me)&Rz*z_u5QG-}^N)Xt6|tkz?-j!>339-2{?ebq>YCQI$RL_} zGHn#CUza|q)tankuC=oJpa3+8TiW+TMgSMswAtJI6=(#o(Bj0VY3k_KY%?Gj@EWQMVcwy5A8gZh$ zd0AaNmb{pNDSE5ZhTFcl04NS^ez$9_j=edi?2rO_q|s8@Uhx1e&=w4HPVT}e(*$|Q zh@QG+DyDopOmSsBXem_+b#;2Q*dU{7bk7d1NfFTT2#j=TGr9o6EAqXsYby0TFZedkwh-oCy5`)M8foPDBpk3_qN`&@s z>{jJ;YoFIpLD}9_(ciS6iJwmW)&srzVog;Q7DI->WNZ0L%B=P3T5)uB{hJZ;-%@7N zQ=1UdKQV~Q;6;b!zx4I5%Ur(Y+upstsA!lu45tIxw%O7B-;G{+Wi@5_jogf;u3BK~ zVy&(x(N+?a3ZY-JhYu^-m2P1{W7IMk&1$VwRy)M1dqxOwUz8zFc|fFS8jU^~Y2jX6 z(n63XVhn42V+mD^Xr{wrPF>{cUPcTP0#GX$Z7sYR){^G2jXG-2M?%+aN5y#?8qBO( za9!?Yv*-de5yKKdj7Mt@|tqXV@S--i{7VN*IO60z_DKd*UKYWK(I1cS< zWlvYbWZ=5JKQ+Jd7z>1)3uX(?HcSIc4pCXf0LeagpeJi`o;7@%KJY!8Va1uAjO4~N znQJD*VV&6jU98(~?pUQRgLM%mz-(nGtdkjRRzKt+cgvtV0FN2Ie`Y>(`hED>J6`=& z%YRY`Xx*w^LHHQ^3xF>z-}? znKDMch=u?qm<-HZdJekq?5W*FXUBe)hK8w~3@9=?~Oti>$`O7>rmyHCiu2=&ql0J;xA5hCkla{ToMjbGcw zdCr5Co1S3tYHsI`dr}49_k~=#s)KOd{gHcLW4Lge<*OFip4r9R$qoWcCyWjY)vC=_ z)K_CnUwx{)^KPxhHtkXGwKe+%p;@Eibojo;rWq^R%jdYN6pzmxOvX(K!F6zFmrA1R zO>y+RWNjX4l{2QJg&mDqkl0>)x!BhYjLM~Cv$}}sntl$0lb$3us+-M~7LB$7+BoGd zxPooOl389n#Jib5Gf{+;oHbUeaEB&{ml3q{C-;R@Ql+{CmZ61|S^2yAV$A$A02_Dx zJH5wld%I)j-je2`KnutO-KLtzfUyif#8)^MhAkGZr)!d$Uw`QVdMevYO8RmZs8+jUz!| z8L_(f5b>=ci7h&T)D0?6EI8qsJG#EPqnemLoKh8_EiR}VMg-nC+!}s=z++(9_lrg)TnkXuxqNro?*QvV;z;2W(hU097SIwaZ3o* zWPcAD2n%$BhPsdKv@Dl82S%qG(xIl(?*G&{5=oRAj3VG;0HRfdKuTLFOhg+60>LqZ zlbpv|%PCfvCL3qheH{wjJd@1$3=7v>$;hdbnDvbUO&COpCNX_~fb)G-^DdXF_r`FK zK7>C`JjvMFy;aJ*DmbLBq^_7lHD|5kEs8ZeE?OlliwudC`R0|RQ#5@~V?KWgH`0D5 zd>zpc)&6kFgv>eOhOQggv|YcF6a~}O!=Un~EWS`X4qg_JO{NJI))+9ngtGQ!1Hxf zpY&fD&*jSCCd(4(q?fD0!Hx9Rb5)7bI{y2|b61PZWqE9w>r{Ei zf>Tl?J&H-;FPjDE`OeSZwh0CEG$-fPL%&covH?`LU~e6)#qP#pesxOwx~>5`C@D9A zv{!r|6;Z0NlX^=!wUoT&ptYs5Z;Zb%S~TFhCMwh181bGmzSY?)(Ufv0mn{;Ty&$$Z z_&TZZa_ea2G^dH0CJPO)H1mZununBlR%1?7aEcft-hTCd<}4I=8Q?)sfwO_;Z1fdz z-GLr&a#<>X5*msgd_1#eL3d{TnOlZq>>@&2jsyZTuk`GkjGY1v{xD?xU-$l=3Cm>` z#RFx)gn*|CM49vzhda>-t!ggyeneG4hginhNP>sWRQ)&XUb;vyZsdNx-z7aI9E)-; zNAKSdCO}9%SJ-|ZUa{(Tsz^YC2mEjN{sOP{_xG3~=-rg1$<0gbo8n3vYD1)tZx%lh zfJE50yG-n6CWLZzeRfD>7EMM{`<8Dhf#77@Jn(v|+oH)e6`3pFHL?n7PP}Ams5KWg zw{+OK)jsp8$iqf^yt_EhDj1rD(Ia3M~9 zu3zW;P52}g%9g}}WWL{2{doEH`RU7+uE2zeAdc!c-f5_?2i)vAWsWQ(j z=FZ`sxW)3kWK4QHG)lt9q3(Yd(Hv*7ystIJ=!7u%UKS}XFV0AH83f>H2=Jzp$?_6( z?vTv9ms-$}Mwpv(B$3WZl3j8>H0pmWq_{$DDioIRZ9-Onmj(9gP^caOZ`{s}H!uJ#r*AP_L}Y4tk>a zIpa%b{Q7t+&Qzr7kGkXqUlMdtL>V^yecl4*rt*_VEXsZ}$c}r;tOg9SAT&b^wp;Jb zn8W{OUGy=%bL6YaKklpgO&6fC==vW0a*7UPHMCV>VyO6p-?kJpES0EZQkgH{w@@Qe z!MU?t54V$3;rz*e7!cBJZil!!+BNzA)oY?hsyk9V@BhoI`pwc0=v7_8$JXdb2py4= zgP3MOY)u*CK8>;Vw60D)aKW|*El+MyTF)#LU0J&R&81(m{j3gk_q|hd&l#>y!!S1 ze9P}S_Fq7UDa8`--qI@uiR;{x%Xjo{4%_Qy?j)-f5OGvx zj9SI;>TYgGhG-txQe#m&93hKtv8o^Y^E$RGtlx?HZ^5kMvhZZA+h7zKr@Q}L3@!^o zh8JD48yAnZ35=iYoWmN><0BNWsY1JEzS~GqX|!*( zMkm1z=h2X*U^j;OKaj5h2IjxfILIJ%aIGs~&c3p+hi<40fJgujF`)qS9y|~HKdWXA zA#7B2&XWY7uxN@9Q`cyU>KBUFHH|QsB}AYnuJE}m$BzhcYb5d5c{!vK;zJ=7KG7K^ zFqlDg$0r>c9GqiwL`wC?<@+{FEs=E+r%^g9&fZ=l%!+hFp3SJd(@hse0Q zUexLM>iPbk=kPJ|PSoK8-jPk`)BR`Ff0?B0vc21;b#fio9MJWxiUddH_Xt~UM_1sr z8$J>@8WCM9vbTn-VzD~?yjqEx>r`?t#$yd0sM@+rQHpTNg=CWisFI}-UQFbQ(vIa^ z5&5h96@EH!oPf~VSzC29n8uTm`-7%_oTwAJ{X>SflKwxIbuuKV)!g`&eMsV0H~rGy(J|)*%m8e49Wn6$+51^|KZBXC|0B` zbXznbg8^YcOi(aO^EWN$cPU&ho-Cr2h84uIq=~(_YyWWDqWId#^G!5B!>2gbKACP4 zu1aDiL8|aeOg4Z#X45B!9rDy0$GU3y&&n#FsZPB=Y?1hlpK|*T=dxjHLQw_%f2sU^ zf5{v-RPlGVeOtC7^y8sCV!nH7k|5nrPn`=^U%wk{Dyb}@ zws>*2mh&5A0!1tJS<`knMM9#4s|@S3ZD`&pQd(zcLA`A=TfplWU)O1;h*USihWIT- zKH$z33UF;OQkh6V_}eDaQ86$8x^)|r!ZFy6%j^pHDR|Jgzjtj(>SMZxpo$701soco zUhdW~v>9#YfedDXAwn;^b$IU%LhSJt^WB!Zm-f-^ZCPZ=LdlY9sqlfR#VnSZ5z?hN zr3#bmgvZI66olt+Aq-TN(v<}g0-v{8$zImplT(@q3PHZC3FZ9?N0Dp31M#pH;K0a0 zB9>qP{q@IyL7|ZcH=nWarQwl4NkW&EUuUym%vFP|9p!MkT#0iarqyFJyzijz zoX^j)6qJ#eTa+O=g$hgP$;+Jti(*zA$TSW`jxrc#4i{A(jaA3joyIt9oVn~aT5e8w z!}VqwWIHEmo7+IHi6WUzbXnGNGI5U(Z*<}?L9=%=rffm9meo7J4v$caiK0N^lWh!w z8aheQzlA#H8MU>;g z39B)`oz#3*R{D7x`Jkn(7|nzDLE&T=C5zV#48Bi=sr*>31Ark6RQ28xfq?+TAfjCr zCN5gNP7)xZO*#Z&z?a`T6JO%B(DSm1!=ymytjQ-ffs9KF0$7jt&S!V~`_(<4334 z(|q-K#O?}=3+AV?hdp7!yA^itt8ANxCG-Znr(0NS%c<1E4VNm}S07pCNiMpnTDy#0 zdL)x{-os^aYuM;gt=0JeC*YmAJy&>L4aU-MX>;@yk;fzCMa`4yX=t!l*qJ7-X<3#t z^>5LeLVvKv=y)v9*jtAL&Ax%A0z|#}Q|IC{9QrZC>i|mJsIVqF34#Lx@;8qdqS3y%&!#9!mN-0{nw{4aCQIV#@;aL4|E~VkZpqo54SL1#l@;XRP)6R)LD)8%=46-{&ZQ8+_`0 z3%A-dz9Na@0`kzM^4gyIpqQbxQJMudneO^?#g*wS>s)MWikx`o(6O_}(@ly4#`=2% z2R5!LBok^zd!j8w6KT+;Vk&P2M-5 zkZZ1i$iMh~+HR;rbvT2BeGb+8mqI{!M>-BMouSmD|Ahh%Z`iO~#znHV7j#Fe@sC6U{l!vr>=O)p~?Y-|#$ITYaqCx~l|rW}c#z z5v(8C32+p%KvkducgV9 zu#7A;5IN&caLL0F%}a+C%A3=yv04+Y;*W^c`!`(*pcZDjZ;@B!ywpOSF z?OWte0yY zKuT?CVO^z5u6O`nxv`Wuy8ZsS(mS2m}}YnM0w~kAEUfO(2*Kz$1#?-%FPRD*q<@! zVJq(re9P^5Smeikadk3kX+)_aR0!kQofVZ98*IZ-tW@q4nNOm(Z(&k!7a=%mcdqWd zD^yF~{n+tT=K<2GtvPS5p!M|b_j7Kwu#`9u#*THZYa5Y+p!rWj9=k`z?7v?5r<$p_ z-=du2sKDvTCd6v8Yl8cWRqs7XR^gW1JEeF+ir#*~l5`3udb>F)?{Zu3`MpYJk(NyZ9} z+_0+uACQ2JLI&zDLVrfpjXT(%;&_zI%EdoXm&~IHhfgySv$xu$ofCP-Q0lYHy)TOD zpQz5k<!aV1(S4##z0!*KvF%e|M!vzUMez2g04V+m{m0NiDU?<6E^;U~fh&d;Um^ zsU*{^Tjmg#iqay(85V|eTkPv>cb7VKq*#-T_FhGOhRLU~w3FRYiCdW4G3CJZ0FhCk zboONP6~pJ1wZjr)JG?jA^tn7GZQLaGJ2`hgeC;K-Z5f^3Vk{>vWo69R%?)x>R2!G$ zIz`lLiZDfekO2`?pRXf|%5LQzVeYPMfMtOgmBva|kNRfFFyYsIDZOHe+~5IBx5w;4joSZ3h?T-SFvSqNy9RhkB|IDyDx)nLdv6D@r zFHeC zCr?{Sc(@WY^WM)?!}PM-pJ|@?2?_gP4`nhua)VZkiNsJ#LmOnP2A5V)4Rv4@O2*R@ zy@bdBGlb@V)Yqi!qh@#$cM_EnR4+MWmn?xoxmQR9c;$rMnXSJ2X_V5=LDziT02GRz zfhF}@B;Y+(%_%2mO!E-3zbZG5l`E27$B3sq#_Xp+c=G)Eua|Vgm&6AlEL6q1l@2h1 zl&!}n1H#v1tYoIHW2C@E=J$ErL?b%SF4T{_re|JM0TVQv2tnku0rhCZ$|G5coj$P$ zRH8NVU6O|;qu}OQQo~r zN~-CU)~A1KlJC7&++j8DfcLDDned~{D0Q~KdX+ik)a&x1fRwx}Ki1VYvPsvj2)eE> zm!-~$ke%t`2xeLrI^x|d5~l&B&hKN-B$=^d%Xs-aW`HLkv5x})uDJx+ede%e*#VT~ zUP!CtC?yP%PF&&wRdyH=h!#^BcrNm2Wig+Ml~Z80^2oTF2Qg4QC6=ZrOq&ojZIv7@ zp$b-*a4alSfE1}qgEg#%XKH)0Ajfln0_HB_q|L*Fil1L!Ko>fidDq!SUki4cBzkc_ z=Of4jrM`~`VnIwGqs3r#+{$K4bchvltvF!Z+}qOopX@$|2)=r@RTpUeZp4>Venv;u zi$0I?%rk7*o1vKX$Fous!(M@wdv6bhY(7`gJHeI<+T<(9Q(`dseA+eC{nd3c%FCz- zc>2-{r1h&_NTnqupp5V>w)G4Y&P8UZAF34?tJ3$7h zAtju8AZ^$i>zkBw#&MSrGe2X_1 zQz(=;&g!jG@lw#Q{m0jQSBd63XJXzMIciZ)pz!)ztTz@vE@k*l88G)MSn&a=y^|X> zP(oH19C}4TKBed9-YsTO!rGBYWov_ZVyvO7^R%;!g^=7aZNPy!dkH>x3+(FJnU$Ce zIjk&{B)GXXFpYVp7NeGH6f9ipaEK9n1jBxXkPHs6H;H!yAVO!NC6m0DZd+n9MIwS_ ztypEVp&1+uoxY*Z-A1*6uiT!}8M>TqZI3@g2L)ys%gaSJV-e)kcgBS~Ko_)#IlrlF2 z&rX`yf&J`{`_Iah(hh@b8vX{oVU%A@zkIbT+jk+c@C4@E!<@J618u`{U)Pr z5)xJBTDYQY44A2GzbD1JO<$cM-M^|m$M>}&K9$-SmQ%iI|FY4}KdarK=+5=B;8ofLCvM5t7fow*!udrM?oQ9pcy#?UfCV#fdKG&n+XNvC9RZ892t`XFoNEs=4pL%kJ5Eu z(L$4jV+QNN7U!ov<4Nz|q^;vlPOPzR=U4_*au_ic|W_>PX4V8#+ zsJXGRp@Q$+8UvXwvgIzfqs&qj(IK|gf*3ZAf_&-@UGaCN4L|BuS zL`!xA+HnRdf<~rnu(lb=)6`lcYKr*3;#yp=*?)bHZs2>)&sHD1n(A9HY~1QCmYvMB zDAatuhKIkB)m5Ba>bEmH-w2QqtDWZ-36#+Qpg>>0n4A<`u&z`N%xsV@oq^rm@RHl9 z_DxRy2w5aItDhZtO%By3%B0Igv#p;*noU(sjN}utzB3e!DpS!W5>AOHhAE&&qH}vs z83TYJ3{=I+iov5n#2~k*UYpl$K6nOcauOP2Ku)h5BbIJL1k4ZN<9g0fC;!CaPnNDv zr6gAVD2WQIbGWs1H51v$-X09?A}Ev%Ff9BtZ&57+S6@mpIeANmp#iz|owzWrB9}Xh;}{Os6@{ zN)-UC7r{6y6fW`#R-C=uMUwjLj-+0M=t(8UMs8M9;Sk9=REiNo6fsWWf|TL;Dds>* z+o=#{NrV>s#967fa~r#f$2Fm)szC7`%}{Drg%>6kqMiR-30x9%9-Biq#%1F*w#mX+ z6fL7+>@Jwqzpp$9Xy>^!H-(x97ytK&+Iy-*zZ7Z=bhHL?ID$ve6M~Fo!;NWH$+k@|a zJN-~NAq-UA#*qV{z|>F?2sFesNza_#!N4nr7>EeK&rx%@;wDn>_^0Ll#ENqm2?nN9e?8ZT7@a}^4E+2_#-@LT_ z|4qbl>a&AZ?G6VYj<;0usP;f9>I?R@Y8H9MpCQ$_4R*SJm(9%#V-c94`Vo-!_{9kc zFt$69^Cz1{22;uRdo$v_6WhR}b}qe@x)%1wqmuyB%&sohdG!H^#CkF>ykowtwNBQ} z!rarz0JZ5wr!S$EjesTbH7Wr%2dZZrZ_yN~rjQjhC&2Em_M6gx0=&yc-<1 z+w?%%*9wyu`SECNKmBXyBX}!N*3kBJR`HbREY$cj6$T;(AFh13M5g=isA#w?pjg_c zkJt7gKdIKZHY4`3n0oIQ;<*#AIrLVo-eW0~b~+czxQ*}Xf5oJ-XHv;q;wWVpTxw0{ zW%Z46NwXBSN2U^Mv`W-1(llj2N!b!^i;6UMK6)v~up+3{ciwOZ3wVGAXvjdc67%k= ziZQ9ZFI902N%PrjL%_lLs@s9m>9S4vnmRwNb^7bwVlmx+x~chRpUc4WDLUsn@N9Dc z-#yd>`OVucq5wj987%l}yR^PkqBX+frh5lG=p`py#=QYN}2=_KC**5BW&%>QCTjyJ)dxc6+r`US$Y1P zqn*0vBvKv5W2;DAYJyu`=IYJq^BV!>`6c%-iBbr) zwzHlFkX8dCMhQDhi5~g^Oz$OYerkxI$u&e>dPM~ym?{P#bI*+gQ-$^}DP@84Pa2zr ztPDuqk~6n+=Jw3# zUX!W=f--sFxZ*2HlP!8HCzFdgp$Ww-awfmV9mPC*g4I07oT0A&gHwyRoUxy$c6X{E z$dtZ91Mdz0&g>ssCd_!G*=+|KqoX&;Un_@!K9-(qeoqu)Jh!QIHRo(uIuLN)m?BXy z18q+9G4Ml5eO#s_hyihHp`S45Jj`lMhR(Ebc85v+iL?_(K^;MS0KMhT;}v zfjI)-3-oBsE#^vy!7^Et`_ZM%VW7(_6=2Am+sU@oBu4uWITl%b#KP}Gzqi075K4&^ z02yj5^cly3WY=#@Cl0uyU4$mwD}UnjnE33y-m5LjCA!!+Aq-U2!i@={z(I^nrn*Ni z`Gv;%rN!qQUwlAHHXE=qv>LKyFS>QPH{wamz)Gl$zGLz63@apO{dUzy^$w$8`nf8K z;B^6iO`5Vk)3S8@TgbDpqS~V&21?i7<(9skTjZp;09jLJltOsgDx zN(lSEP0piZuVW(=0M_lb7CTl@6#7phcq92pMzSYRZFnH5rps95#m`4)BdclXR&f%y z#M01&@s@>wnruo{fM@~9kGmZ-AlE^+93#9P&EpXQYDVX4oP+YdZto9=$4ZU8@{iBS zNZ9}9{+@;2y6Hm-81)Eo3NS&#&!WI}_)T-?{$7jGE*l3_Fx`0ab#IU-1gMwXnSx88 zIjF7_Xk7*d40SWV=0^4Cu6el9=#tsg;--Pa^B?o&$>J15GW62TplMnrLN*?$+Dz$= zVVY4w;+H=`=;#x%wxxfLY0SlY@l0}DrW|^28R3-maIh zsoBhrX#X2-MR4~Sl-l`>GMD;YZwI=DG8A$WJgNgFq)_BRjfaPi9(fE^q~peHiL>L+ zXi{cl$f(d|**svN8muvOF@qerY6yzZV^oCO`+>D}9wkXO$P$k^_nOqjd6X!ZNQway z#xp}Kq+4@=mn_zU7TvUn!1VPb^GJ&zmu>Cr0-9M7K>mP3(X%;SV#RH%jA!?GUU18s zVJ6v+$)eBNVwnnja&J|z-CbJo5px?$No`_7eGemv^H~KojZY##I3WyFwYHH8p+OK} zkPA7#nYAQp@d)9P?O;q+<=K+B$fVmh&8Rp8GTIU`B-CfL0c>Y;{-;XBbdRcMj%U`L zy#18X>yf1)J;3>+-J@rD#Jb!!T=#Fn@vi#rp8H<7@Aewr7Z_XE>1>Q672+_LDvlP} z&*HIAcH4DD*{0d#=T><+O)V%MaH#9%LE&3$tZOB_L!@?k7(^XBkG_;iK+3wAl@^C8 zRV-xWZBXD)A(Sd+W!J(~ap9THCfq0|94zZ?-XyA-CrYlhR$+RvR~M~V3(cnimNa9! z?qmv};kPD%iAb-wKNnok=M9202-tDotb60=Iryej&{W})h_etkKu#^SkYR3MratED z$e*N4(XA<+bTFYNHkmAwdF4`FV?MdZ9_w=R&2yZXo9UgDaE#ApC2~Sp||pkEzSS zvfb|6Uv2aw|KED1tyKC2&fOtc);@CK?*7;P@B25M3oF$<{^Mz+=AqYYt+=}iqwsw7 z?n2wQ=L}=kF@(-3p0YUo1$x!0ty0!MP$88J#Yn;d0Gb&w?)H?`CPFz(dej4Q;0yJ` zwy?d`7aC+C18dDR3Q7Yr`lu9v>)w&PcoatJ-=TG+8i~S=7*(6f0LK%_9li<&Ek=VjQVy zq+Xw&J+(6`@|?}dFR&$$gy@Zg2N@Xr{pIli>nkJgEDyg~ZiN4j;3?+Iq0$7?PZcrtb z63K{4MA{far9h!p#Xuyq!ftMTz?gcW?Vj%~v?M`LgvUS>q_(8kymgdkI(}$?18@!@ zPQJVMs(fwQ#z9-IAc+Luh_=_#bK@LVChQXzCam;i&$N}YyOX+nlU^j2&MtlR-BX`; zq=u59JZe809BQQuh7mI-Fn0+W+7POMELHH%AYP%+7ZiJS!oah)${EeC;4(^MF6|3g z$G<+JkL2wl1TUY8r7~3wfI|3opQU7 z-(6j)FI1`-Z(fct;tAcPUw3*E`g8axXyM=xsKrw#F)*PQ66@ktRqq4~dD1BIu*g+t zufr@;f0KHGWP{j+-X7o%+2*(jS;vo3Oo)z>tCFRfywcr{{h=>yu4%5wGHXi0O=y#9 z*q$r0!=tR{w?e9_Rdk{l8j=>(W*OcyyTRwqRs{#0-$AqG9uisJr52 zoFj1ttMHzrw_Z?KJD?yn4WdGVQr%c`L0O|_4VZM8i3H>3o^46>&x-NIHp!ur@RS(I zhMi7(FC1)z7#3m3)ajdKi@kF7ba+na!3ZilREy0@uVbycth|T8%4YfzCk7L+s?ezp`}hlxrA^83FC(czyI&;xej@Af@jbl$UvuvE zpRZSqJz-W|#qK#Q z6AUHKt#A-iKqF6C@UJ^k#H|}O%=C-5g%W$6k#_fk#Vtvi=%(yj>*+^S$H+wVO z`-5eCKXb+P7h&vrj+)nVlLUYXsjfN4U1rb$#O@Z{N0?U|w!3V3!q>QOG$q)vT7& z_P#e`=+(<;+PhesEerhGizq2QK3h}sTe+3KR8~@MqOr1)gcJh<(4qi%=g76H;jR}w zYhI6#IpO=zmm5Ctri$L6JONM8v9+$JMNojw9P9STwrBjWW^90 zx(+;7b5~2M`PMOBEBMAs(k(_e$B{##u^y8k0dq%^35MEI7)=>ou)V%~fAe;;+@r<66B#!{e{I%Xfz`ct_& zOmFE&&(c`zqty{IHb4RuJ_3n_;Gz-%PSDqGgfZ0uQSoOy(pIe;RLpjj9stRU6)5>vH228M-Z`wOqVV3@s-DqCw;TY>y+;FJI`7^>@KPHmc)|LHO%ex zh{F}6CJl0e$<>k%6Q_Qo=069;+j!oS2bou^7~Cq&+|8|II%?6XE-#*^zuqwkY!%5S zLoXi}i~z06yY@gkU0u*I+3RV8;%n1qnRt2?zn&hs0E>{&Rc4&h>n`g|B(ya>ub_er zR?0S2MR``T-sI2ONJ{1VjdRqhFk52GW>$TQ@XFp)GB1b@&Y7#8%H-v9I>_=&5^55# zhn~c2s;bw_L~ScOnyA~)jfZY|k?7*19sBf(4eS)Mr#ZSXiK{x99;>kLFNH+&w%BP; zrp=2Zb-N;Zs?Slz_kqIOpoDo#7(tIL;&U8@&ngMxk~zfiua9fEUi6AqOeQM{t~mnM z72}8#R%8_(!$h$`6fmU-Ewfem*OsymPOf*W+a;7Ye2l`MS8VK38P^>h_1Wqna})rZ zB2qTe2yQ4S!#gac7bm-W&PQ~seYfA$KLwZ8(cmFM6p>}7r_WX7pkRW{ETC2tO)`?UO9f6QmA34 zTwQBieRAxEVHQo_Kj{QCV{Q{L#>%q5W!C;H*5BUY>^oM@nvM4XRiJ62=1|^X`jSh- zPg%qGkuP?CA{m4NZY}}*Dy1Q!JIu*G=Ou1LDRM`r* zOX)olaxrr}MUYA@Ht|yD^r$OT)S8bf+HT}A<)XcG>uR8l)kQ!f;9+is0ttl%7C4b< z;TWRYG|@aoI>g7J^IfMl={&n@-Ji&E;!oW^$~?Rv{Mvw$+3A&6FunH-m4^i3-)F1F z;z5S~@B(6x#j-*fP!Cu4%(cyoDV(Z;iuMT)-^YqDj;&WTZa941IVpAQ5;e zAiD6`zgD;N>B`cT*xHQvZ$9>y7Ia51BGO*xBAj}$WBS_KnS0c-*`?dYjrrNu^>MhO zlOc$KyqN-1q73fCIrUlo4C=CqW`zkG3r21ibyiZvO*#M$R0>&UvfrhdnX9pjiOOp9 zXPl$qkx4sDb)keoJ+fY^01;rktC9x#hTYse#APwbt3?wWp*TlFd*%`Vfm!u!D|BOwGUB7{0E8uj=)8c{%K{LE^WkwLz)d z;&b;tUQ;%baaif0o-h`v5ss!9)=rGxVO#b0D!k^CyGu0zoxg!tud?1MXwC>9sdYkA zf9vH;7w+KKbURD&2^4L z-rZ)7u3q~Ow1JC}sv2ngWHSaqdvJPlUSe)RF!7=-fUo*xsFs22h8r!vFu@+A&yqy7+Q{M~wcWHj!P7R&vA1d>j z!DdsxlzE#MxjY80f&|i0(=CT8f#d;)6&5NP&^l2JDjS#}r^c z2d3j1=2+cY<9xBHp%sl85(rk(?$TU;x3I74n2QrDY=`ER`8+AW?f|V>03N+6MG$~S zfK{M}BrFy(tGkr!4id)5iP7nDOe%{Z14V8}78@z8G@H&vlrOafAk8NI5ICVEcA!J$B?Fd$pgDovd-`LTFj6sow~@nDHH#I*3p475$s1$9@C zBz1;ZpI2*>65O|C$o8JerP@$j&c&tr%dQB3?oQ+4H0^dS^rtn%8I9WKQ*lk7JT_;u z55#mgV)oM+`arutp48f+n(rU$ym##;52W{c#j(T%d0q+Ex4GdsK{-ldvmYA}@~Ei|UPSpfb?t#V2Ev5F__6|(=$^547>t>8RU z^QAHtYm$kPJYexE^*aB3@>#AYd#H8}~5(hQ3^9rkX^g&$hnLA^!jAGV#84q(G(kUb0efbUunpt=F} z9b%so9kJud#_@x0e@%U-0cM4t#L3VbKu8rSBK0Uj6*6*CEY5V5o)KcAu^=p=2rcVs z<9*}qNm(~C@+9w!Qt`-f|1Vy@oZ+9<@GN9xce4-=C+yZ@;Ka;^Fa@^kKSSze{&cSt~#i71(-p^G$0O8sp>)C4GJRwKeC3p^;NC zG;W-hPK~p#R&;3JHP(Fcw>>R#Eh_J%a=U`25NkV{0DP4WxoTSE8R#$qfLz3(D!{b=wp_6}?uTleEnp_G zORk&lqN8e{5VPr@Noq&{0!3r7mo|hV`EUb(Aq-TV#*+&Wg5NouGbGZ=b1s)j%_L>2 zuw&K|%)i$O)_!&a-a=)B?y7gRd(xbA_xAU@H5sd6y!AJF{oF|Z6quiuna=QDE^TI& zFB*Q*dH%rYnIG_d)1-I9s{h2*ma%Ii0&Ey+os4YKmID`Ee$ynkRV(p{*COziFDvLX zt4vp$v$GmMAxIkPVeCwsY#2`yKc&7uG`J+Dv*A@Gd;Wa=Su<}9=@A>_g0@mnkRy;`d>_iUfNhOXRFs&GY}PC$Mo88MM>pMb7<{S=QGqKeo_$xSZCmv+^h=L5 zw__BIH@iJEVthMn|8kwhaKV7880&EbQu1_cd1K#~!aHQHuB|+KeAbkf$dv)WB{W__ zM6WM^9d>9o&3M{YKtt~HuvMbyT7ZdKS__)B2ihxu(mMx=C*H~VR;=pl?X;5N2(G-3 zxEX?qg4(m?Uuwmje=~5WwZi?xy{;2O~L7)~vqF6w1Aq-Tdwx0kC~^zMR(3z!zBbcE!o$hDLD=K4rbJ$l;gEKZ z^7oea0A}UYx%H}_Qup7L_KbhA=N-fzLmCB5eU7y7y2)FuPHt-~6jkVYhP{M`Q+8}w zlc8C)W_7p8=L#y@jhR&VMp*1-pm(!!?ydV|HdO~1V4i!k#JN(&W*VGA2*X*Ew%iCmF=np4;&wsi<@n^0pqLIh3gK=K1k z!D`DJ0~Xp2IBU0Xgtgn6fvd=BSqRwW6&3JYKZqiG_B-{QBxLXAt42T?x@ljIM2h@3 zG&UqMdagYy^|kaH$q#9So0+J}DdGqeh0}I?gNTQ;fRVG(pv;sgG4gp<^GwXUbJi1O zWsJxVj3Pvdd}+%cE!?&|IyKVy*HqHuFKlbNDnl?4_A_czIdGV?K`3$xVy%xU^M6## zGNo(^fhCCa>hsCqWL!=%Ok|Qh@cBkStQ9!JVdBqEUXV{PAp#eGX7kY1@f@eWH|k-! z0R(i}WARG_wsmj06-Y)2#DUpXJM6iXbE=Tfr7dCe9exx$ensP;gS5)JdnKw>ENeN6 z=2-D8=gxwxK|AFM)-yqCxQ#CMHI6bnYUd(-m*^u51^&Ipc1#EVN;U!F(C~O63{+jR zp$P^*)t`D~paw$+F?kaJmF~<+{jG~G+53ef^v7RzR8uBsGBgZ@nDHMPkSB<|k(XMd zy{t?F)0*SV9z! zg98GPE9NUSxC>Jo?I_mK1C<3?hkkUV^jjZ0Ro^DwR>8nZ;r&51n^o#34$|+9aTlx?M%!XEC%0dmC9lvGGj|>E6vYY z6JrV$wMNS1f+x&HAwvBaBU5g90OBwuX`)+1PhGjAESRD^kdYXNLmq90h!Z_nmvd)X z;t@YeB^E2i&1LwOc9!5Z2M$~=GmR;pOE@Jg!Zc-~lLj#`(5e;~gckp&!Y0pWr4g3D zoho4|4T3Z3l3@d~S@Ce296^PWHcPvi&xBp#>3Ac(<7IR(n5 z!E8EBSz;oQf;?f<{|k<~l#Q@o8&7xS=vwn(gBe%PxR z`i_Bv?yHbM4)-3|v8KguhIldqh&jTRYJ*xS(E}5!ZHPw#hz=nPRF%Gw24TTOAh*25 zK+Yhnnx@%NS3tqeQ!8aCq}O6}9BGxO^2JqJ0$K~7p{h3CTb5BBE~^obTbzcj@=CN- zr#ajzdunvigia-RG2s0Cz;`$XAraWX;#NU zR*IZ?-f-4ce5;PSr(xZ@^4SP1v#jCj@kyqIKFXHj{}FZ^bmEaah?POKNP(4gc`NjH zH8HD*0eD%i+ulc|D?%M`rNxZ9jRW zn*l#jlxP!JbtN?d5ywugyObFrta-R#H7O&wbl2n;QiPcAvnCMT#JYVLr7=QXT20=T znQlHB@vcMX5O6-t%H>7@F6aU(!wqDjjA#&J{Z($g{;7-fj<9w!sxVk3Ok^h4scPV! zL~6p))^7HANb+f8w1RT}S~wCh64_?ca}yGSXeF>Iq0kw`0^rYl^woIvmaQ4x`XOZJ zeob`3o=&9Rs|7od@tzflK*#KYnr0^&ZQh&m8WQ4_oP;1>wkJWh)xJ+aDD8{)p2CYnDV>W0f9yBeSuX!Aq-S?#)$=?!O$WQ zTl0ji$?P1|DsI_zd1W_XME5f$Pa!P4u7guZh7<;XelY#rIZoYNd6#U1Wpx;=Hk%zt>3dNVV;4`tDGjRKaGNmhr zzJphDKS(F!P4IOSYVBmcE7(mXyia>m8EV!bRERMvqX*H@Wz@eJv*R-jP*P!EtL{_L z`GqofHzA9IW*HDl%~x0!DWK>z;gS2P2Mc&^hZXu5(EzwL}?ikq$JeTZdCk%uu$a#8>KPv zDqT!cl7yCbnH;Bq3Ne;9H#x#+o{O$z(2l?%Y>?Cx4Gh6Sut;J+OZ%(E)6Z`ympwX9 zm9t8=$bG<;Z!AXDFJ6tZ^?0`!5a*t%Q8Bjt$<%_Eho9SF#igTbp+nf6P|A8XX!VfJ z`SRIs2pzdO z_r9Hkzp*%uheB?`_M3qzEFV*8TeJ%Iy+*5j!|{foyCr0(2BTmjVU7oE77Bur-G#wl zSB>>S$rsgg-9xKwKnzzX0pW!_*q1SRp*#m63{;J-oe5zGL61NYr*c(GHr>LBl?9q9 zT;E9{p%DNcO$K+r7q}$`xiUYR&g=X8Ij36aM>Gg|z{)M_nbdtk3x@tF0O8Wqlfu zSps!7L6nlVb7&0Z_3f7Jo?8Yi25s5onUq@3<7FI|TcnjXf#)<^^fy*(AeK%JB1})u zwFH%eHiTj&ponK}APQF6x#)!H7i$~{kf5#CN>xK45KA>vcde!o8u>-Mm<=_XMoIZP}Ie{ezX`qBC zU~BW|)`xv+sAEk#6B(*3DA92^`qw&`$pG)5@B)X^=9s1&{J}bS1kRMO0nJaJkt-9C z0nc&OBZ;G`KHpaktTm>3=4KT}3f>}GL`x3lHvmGiQp#&w-nltXO?v*)=K8G){4^C$ z)hO^ogHcwubU7BCt4WbeO$b!r;(p8aWS}V+wipDes37FFD#=k~mAiXL z@|`KmI4ljbFCh$6b*7DBqQjIx$LF`fiDF>J8T{xR(rJWR`Xl&#>&GJ8 z%B&U+AGE=zw>YEayAEHE=rQo}umQ;G?KeDI3r73*bTYP%~cD9>u7d~eK zoz|aM7aO6r?Rl>cZC|VBXC6B{N<3(R2)P}u8n!j?KgRB2GKz`VG1Rp%#+)b#HW`RX zP%MjfXVbW(%l4@WZB<-LkR%(_F($@M)=dk%2(k$z)^*)*g9J#EG)vG9TQEXj{?%0T zfk_TZCx$Q>X8d^r8Wh=#L2EfG37^-$vS#BAFBdFG01@D46Bsr8dwctK z+Wt4}-6w{erVy^X)eWonEUOt#T#LHasxzTVtsnwA`Bi;%;Q-3nAo3X&Cg!m=97Ibq zMMUMA^PIR!C7sy@F8aK;;W~wqOlLsYXyaAyD^HB|7V^QV-V63H?e_6Px4~8I1^mru z{@Mvfl{>wa3lZ~sPI3zxVpOj9)bV4Ktw=?|6*WC@SK=fU;O4sM19#9R`qOF^z{!_3 z>lSlqmw+J*RAt7K3J`-HJ!bu_3aDcu+?8+^40UNLrvWX-p57;t5=_qI#`kyCaz+qE zDo^yEi=iCP`K9r?@2-Cpucj5Fnr~=s+$zd}2 zRM6bGRgel?6inlG%@5_>c&l26Io=n) zw5g|~Pez^;)tzvxp|S2cYAR%XS_$^`KW>m;SoQMIblt#FuE%=83clj(+%?KwFlSe8 z=(r&)RDHsa3~+;96_V4Q6+LykVoXq2u(J;-9{~v*i!!mhepAZPE{(fO(e(Z0cc)e5 zEU!9=7|vOEaCV-OiZoY|)fryLFH7nCGqR~=rL^u!H{v;V_HNuczi#N7F_b|%S38%_ zuR`tQ)lALL9{7adG4C@4&WT)35v^I4-AOAlyhZJ{1)|)=ok+{d1OMxn+*O+F$UQGdMu3LR6PlU8s1@&SP0JyB8$-)!3=aNv4 z7zqG1226yg$VZkjoB#8}FOD%B) zsC2+J7ssuQH7>g5(NI!NG{>@<-WAP4~D)9*Dmgvt2VgZ(bCFE z-yf?fuf*H%f3<)+#%>>c*zi~Y?s$N_rVA!5UfZX0>y*SjsqTrei>p!$#W96OD9>Ic zfD5Yu`>~%4C1%7@yc)594k1q5_y7I>`j9rOLR1RPSc-vPY=J+F)bP1{dq1~K%(Lo! zewXTG>)q$*6XLy?pEZ(0l5iqi((wa!f-|&SRRpC*-#e1eyFl+69sBN;VgB{HyW3+q zUVD?LgRhACng=B9!FW3z3>#? zNU(?G4&GBURdih51?Djqiv%|xV$G{ac*l#x>!&lR$U$$%;wunNWmEEdHMr3J~ zQW_EqroQQf8q1{_h>G}I!y$Kqk@Dto$inpcSfDa8Kp2c3DTG_7Oflyk5yeOn;xu5^ zkxI@BIU~uH!b7yFX%cuds*)NFLV*kj+#nG9S@xudk6KNsw+}CfgQiuD+DlSwcrGTi z_`+T7nCzKNkjL8Qny{5ZOJG&ac%C~t;Da+WglV$F}Cj2dM(Lo z5Au|5o66xP0#H5BYYr^BDK-N77hMfATQ);TtfpY|DwI^TgLBx-^eG={&o}K z2_@(cGZV3oBlKs)M0(!|nP7cS^Z0xdDE}uE%@&43)pn6sI(Gva^kKPpn&wl)x(!^s z29c{UGYhVk(o}?S$k9xJjUOKrP5%7BfudS?&(_e$dQLA-0WpDI@l$h*KECu6TI3m2 zfdL&W!6B{?I48uqW)eK9o&o!C@2{=2B6PT)f&c&p9j6)#KzI3j4qsLWgW!RWZUG-D z^ukiOK|hN*G8`)lyJB9$`I;v8BGHmrNY`z4+RUmK=VXg~t#=E!@rzNnw~s=$!?@Ek z^YWv#v}z~U%Q;+xILX7aO`v0X(-u5x-3c_lRRXW^uK5`TET0c>dcYF;<7AE-9!t}{ zXCuXJ5&HFuBd0#}Gyg8_!?(&zUV5~{P2LoY6BkvRA`%!d)}gB4>2Z<+j5U(2ys2Wj zeFp`cK$_nZVRh9_qnRbtD}(|qECbP~7X;&}4J+lj3CUN$!xZT#h<;Wr2FB$Z%}?YcgK}u#`&XF z`t7#%m%l%7sE04$2}zzv!6CkyN$Yp5>=?ld60yXk7|&%#ZrP(uhw!%faBGIj+3(MC zH4*!HmHq!647~kDSk@A+Rj|HiGM%KlhBj@2q5;2pZ4ZD}39N;klf7H2cT8PqKBtCf z$7z{rof|duy_Em2H{G*0Kpe6MZ-|UDapC5Ii2rmK9grguSr@~*vE;3X`6d!G;E+tJ zcv~m6rC(~^q$nzA%5qcUu~Y)BffkeW@1{t3+|o*U-RxsiqM3&>=7Ij3f7L@O`;T6q zwEG^jsvW{N(KSq42e1;643LCNGHbB}s;adtIJK4+K%<)^eST67?EWPXsf$Z zr_-|^We?Mbo_6C+$ou5#>V17$T8k5MMQNzlC7cl?Y^H8AZO5&g?;vAdELOdFI`&YP ztcMe!iCNAjQ^A#7Bwrk@F*uxMfsQ}%5- ztr}sXj%H-GXr1Yl32+XIPS=r0&Nb3cUHvZv&6J0m`IJkfxI*R0hEg7+)py@Nnr{)? z;C>bJWzW34Z2^$z)A%)jL04R}3oz0qSkUwYOnzklP_8U4Rk zwPkrno@CoTP)N4M$H1OhYR4Z=k}?+;1vUaX@?28aRv5i!EaDzh5rG)-xn00e7zh z(T%qvtCGfLJM&dOf$w?PwVkUWZkpZ3-z{aUBGaGgI+POz!(lVkN}Ag)vl-Ljm*dr% zUWXsd2|G~+mdJxJfp5{p3)LYooM-_cjN zZqIU>pyjsPW;0JbnzLGIDO0ynceEh5MzRl(rty3pzOqRtE5*HGP0XewMn_9dVEbi( zg%jkn0ZU-dF4J{^^G6+j)i2fG($Q7W_#s<>QZx1)>)E=&@W4v0x&yH0cfD@UKv(5k z94G}ODvGsp5@r=eCKCvvW0G}A&&Miatw@emG)nT(LId$4DeS^Z1Zkh5w>i#ps5B%L zP)Uwi#KpT6^D3m>?Wo?VhCY-Ia*oJRN>8#)k#tItu|!5#+~5&%bP+G1Jzt%4izowc z*4BA_oOcAG01V6lz#$A&y~dpf1-bh=?&VkBVvWIU5}eqsK?qnPI}T-2QsJIa479}? z&2SM*VN``m;*RZ~19(KIQw@k;UvX{UD{ILu>U$K$EEn8`U}l!Y#fjotrwiMbxw=|5 zDAnf&b;8D2_|>IMbMuPraETk%kew!^v{(96vLVcBHy*n#0<5_t~dR&;R`_g6I}Z|yx>C4(wCE1eYzZc zkEDQ?w=<&AFL~TxPVO-Wfl~Gwn-D_7K`@kT5ePBQ?QyS!O^Eekb09HS*sPnY?OC|a zSto`F7?Do}?rr{Fr^Eg$R&$cLWY&B1u$9_;<3&l9S-TjuKQ>n*C;Obny-DR=7RvFM zL!b&*BUf8gg{s0N{rRN3w|L^RUz^?_5(9*+aUfobF#ztQUiq65032DHS-J&tg=>b? zb~ZtDe6)I#eCNChmd+~{XI!0xDVBiGCQED;o=c=1($gglbC?Z6BT`2>4y-9X_{VfX zpfEdtMAGlgfGM7i?Q%K7nm8OG3{I*%m z?3#Di=t2HFALn>G-eci$?e+mCfhA#(fvLYGy6tJ?jL`Lc@n*8G$DL+MYKyX|klABZ zePId`R5 zJgc4FJnXG(1|4HoaVck}ZMou{0<~j}*j=Z@F2(O4({ELL>zQBL=)@cQPr{CJ93P7oK-Bu&qQw z1VJu&hs_iuFXCaMQ!1wp*C1GhnOFjSwxJo3p_@Vpi)Bxv%-{bKdzoqaW)C)gO~fsP zuF14ClnEJGI`N7}#+*gRNl{QYHQ>wh>l?IYm7mIO*;|<}QS@h&i*I|`3j{&P6MYFc zW&r&+Q|7GtwM@W2AYj8X*diFn#!R%zt)U(_)ovU>AJms6ab1bVvXm_OKSIJFB;X+o zRK3EB1EIj!a8U>;{95`Un)HQ3M#(pJ+{xI-u*vSW8#AWrV8^#{zJu!BwXgBVMG>0r z@aKxn)at@skB^vraO%7b@HL=`X`A{F88BRVYB2TB(dKJ(e|}M9K6~o?K7rD&jeV{Z z-8=5Z=#~o&UH0K}VI};ygtVHM>fu+2!)C;6IslM%MFB;%Q(yQ;7DC_EsE)I0dTNwB z1DOaD4{Mf;&iY#fucbVuI;vW$kmf0<4)O9*vv$EsfIhn<{oegKWmyM22#)KL%s0aUZXeO(>BDZ#)+Bs-~sU@)*K zxNAd(!B=K#hF9q-&en)inw_ii0UyHQAcPZ>c^WK+Q%splkP0}eODndG-evZ+39=60 zBrP=65)Fid0I3)vAWQvPoh^zyF{WLzi`-v&%gY38B%H}_0?m_)Bh&HgV!J9ur|HTF zzhRIxa=RCuTh))igaE;-z`$ zX=I{nWom2JWwGM7=c%g%raRNXXO2P=Q}Cvq(48n4YTW zzTO>ru~-3Hl}ayAi5hLgXn+Jq0l*;)RDIG1LV_`9P#|0VRO&1@%XcrGb$Q7Z2|yzd zgnT#azk{iv@6SP`I43t)pq2}qI!gj)cyuS}Sf?6yy-keVa7Roz`n8H!$G`(@&8Pc) z{)N*{eoZYe=r$YbjcIL2mlPS*ObW{w+;u*+{*l7(4F5JylqrGLuF_4{Hi?9e36C8B z23y!`6svMwVr3Vdi(;?WVa(`Cplgk+uaqyikTzK20(1Ei*te&1P~OrlE-tA&N9LaR zWxm5*6^PnUu(la^zXd zA_O8W)9e$&ZvS4;E|Id-80a=C2t)~g#ajIOo@95nE+n?^V?{BX40wVu@XHD3lx~ME zR0px^SbKNMqSlnfqFk(&Jl(SU!td>o)8~mKB~aWdy8off+e*zab}R88MuE2m4)BgW ziMBI`mtL4HedWtVG#*OwvH3=;SZIol4x|7Cw!*smODbiHwp4mFLv7%oVNAu3Uz2Z) zqH7YMT6!WlyI49ilKl2#0Sf=u`nqXj`InOqP0304%w|Z|hb?K6XXs#q+SHPJCa&g#4gi?VnGBTr~R@z3&VdrUP^hJQV3#fWbQOWi2gEbi zyaE;fCw|$kG@@qS3`hPkRz;A$(E=YRWjx=p?x1+K=l@&k(An|RZ$x&FmE-WqY*1Qs zkP=VSwM=zG5W)YK1xo69tV2S=Bgw?o?(6s%gigeBZPjTeYZ5|xMcDFnv|enYH?wA= zE@^!NY+SVPIt=vBLg2Qe;aVyp*FfE__*ZEQ@YJQFC8|=CjbS6NdQcB-h$R)BJ9u@jrhpIAlrYm7#N8 zw~&*rb(TD*u6zZ`OI`I3Nw`O*x2=sV{7r`k$HP(-O$Y zSGOdXkfV76*s?>^imY~&1$D&fU8M021lkB7HTFqS7}JBs zYpdRt%e`{t%aT5&#Pwcu4G_(mK0|rijO1`RfKxuM;iuNCS%%uzPHcnFl^rgrSbyKC z5V1)|&@_UBm2?~X17)p-A|aJ-1mKL)uR@Ii*!uN~vx_?$QN?DTwg)0+>9Ci$uZqN7Bz*merhpyqu?~zr zyo6~kfj3ePy?(Ed+Qfc zz2}~(Q_G;A2_%as0JA~Yx?pf23{*|JlLulz!H@o%zMItYq0CU~vXI!f8wTKHrya+QrijLsbg@sM+I`w)Lv{am zMH@fE^d3;-tp7v7RbMTk2RrAoNgN1~mtdlrHf1Q_PMG{cS$B{5#SC&>W<|D1q5IBbs5!b)j-usql=^LPwX zb`oZl;BFBu;t2FmIwj-RcSXoW3m?NNxVEXur~+)@n{|@ABMFHAnt9+>*K-0TK^Y@~ zQI?1;h7!VnvW!5t`~_+p>b4?QjAGC%3E(0Up2k#q^7ub<(i*to~W#&F*Okz7;lrUn$->MOS@4-)KUZ8JvTFf!kAU zmBccNP15%&=#Jy>@TR1Bq|r9CI)DHGqOq%;`xU0)21ab#=@epIBsvfRnbwl2tRk~Q zEw0K4u#%-T_TKHro25$TRS*fSo~zuV*OPkf=l^N{X|m4ny$(o+Aq-Sio{eIo!Wgh2 z2rd8NL=;;n1h}_YA&~q8Nb;gT5g|~C-?f`637#L;MA`}2l_xj7DAm5& zz601an(Js0{hj{zqO@;e^S9#W>L53f8MnM%_CK_YhEwAjvLj-XnNi*nw!sD63woLuLfb$Rpo z{y#RXU+=u#+LTP zl$+Mq)+A4cS;DBjvBq<(5eX5r0FSrP*$5^S1%g2aKk@v$3kQo~7k%`iuUO0(+ypaF z*j!!B;-5G7qE9Y%MFeToTJn~0KCTXSkH>sP=I0uzPz^eqP>@FLFLt2T=f&i@MJ}_- zGj2?5t1_tOIGw(|91>@9vl*~T(?kl(;gK2G4+KNDGE3WI9m)?w7l)PDHCel|{8^ab z0KjRP@qU|WKmS1m{_T|cW}d$6B%!FO21h+DCXLm3ycUS$_up}gb!+Qn!bGEwZXaC5 zMICpJ=9)DHS9huv+h~yq!6lo*Tyc@6?Q@HzY&1|4 z+bOO8zvX*CyGeApu1s4ZOZh6|NIrWzmi}W}Q;d6AcC}oH;2k1V(PeR?ye0r0>q>(j z{?5_4WmJ`RkkgS~BAY=}j};yw^%(ck3NJE0(QCJ+c)M9O3(9{(r!@JbX>(XC&r4?W zL%zmcE9Y5MWU3;sfQ13@G(^UHSMpo9A&T*`s8O0Hf&+20V z)EcQzqYYDUoys9N^z{WtiY2#3ZB^gP-jePXa>Y1EqShWxg%>C+l9570lO&WtMA_-= zl@kdB41eip)n=jDG6xi#olwXL-^k!xwN^ZEs6X>XPHr-`Bs;u(wNGG=q)f=p0Nj-Y zu6vAHImY+Ucqg5|qXeQ!2vS%xh|R*Dw{goSRE*T!++vCbkCxe2G8xMxX$T`ES1vT7 zJqNGjeX_U)Q~}#pQPsr)@oT8;-)tO`YDKP|X~PBgSyT8tnQO=vdgm2Xzyc;p)FKZX zniAJw3zqP-9GWW zc56_#shPm~SDx7I9hX7uYAZHqDc5*-!84I@z+3jQE`*}0*dxEY9H#{Hp^ph;0GwoE zi+(OX2w}C9AMtNR4bIX>D&t+Q-$YM|+%17%z8im8-VdLA2lJhD90zrpAv9 zHn#lkrrruo;a1$FFz1}HGPKW0rKf&jZPL;W#c-ewcvXp-p};0eMEDO67LWE z7iNhoD|g@_3{-`>mkSXB-_hQdhdLQnI)DUSf>9(8%=;h2@#HhTf63ik*KQN&{0xcY z_%{#Cd_G$f9VI-ST<3Sb)LtTg9OC;$lgd#3LBM}{yhb}8*-|obzr!!tIvhMXro+Cv z@meMgT}L5cG1t>op3TI|*L34dh(sC}Gl;QVO4Xu>`kDes%>957nu{G~pejorcTX}_ z*;N;8WADMA`cTbRFumldZYWTzLS~NWi)!YQFLe1gDPx$T*Jmfnv+q^T@zz+}XNeji zqr6S&?V?TUxFWN3AmF7LPvdKIbllDHt{4GVbZ*#sOB-kajn~azl{v>&!7m)eHnyD-I3c-NCWM-mXgBj?r(j?w9i*X zKIPwCp7_SFyG%#`cnuGmB{#WW7U*<_O+^CyVKrFx9+d>u_pN!BX#sWB+z?qYh( z%#p-C|D=0916%VKs1Vudcu_(;+EIJd4(T{FK{+8SRgvj1=~ecB@&loi>bf6x)dm}j z6%gqv!dC=!oEB?-1PI~n`=fW~3cNl-RPfR<%FQ`6x8&RM93c!;jk=EwaIlPEm(EPe z2moEMSq_T}wsAh`v8f|u7jaitkaIq5YX+O(+z;|{7f0Nf{WIY@K_os&KCt|1<~~!+ z7VCR+%sGsS$Cns{kf*I-H(sI9euuIBO>4hae4nQ>E*<6Zdfli@6GpXPH&d?MXVldx z{q|FvMVXJ_v@E=c1x7imx|eU$yDJvoW6DQ!r}1Cf+RRC@RwqMWbmA_TwS$LTv`J!s z!;@BpY~!FLbKl9Wj|4%D6bfqUo(%+B`87mCPfn<#MivOgAgEKnJWM1Ms>FqUNohn* z!-F2*0}&uX%GO;tiCpQ+DI%FHl21ga`sagU{I?)W$vhD*3dM{UQSI--^M}V1#)qy1 zn&)~>EON77m!P#lZIS=le4@DZXyo8ufPmGYkGDaX&=eCCM8PqFUbDBZvJu)-SG&<0 zu$Jp8nbY$MBvrQigG^tww0A0wokuja^EUa+Cfa?)bNPYkecT z2B|LPlD1fxHkj;o{B|QiLebJ{xM<`tYM0G$KgNqSAox-BOsPKa zu2xb&R+blEFx=QuP1$CKJp65hh8$bj2%F!+s%kdgEBzDO-+ey{_GXa%l_XdSNn(s` z7Dc|v(!o33pib2dWCKaAV#x_Ss4}fX31sxO3TJW%ghofBvZtBph>PC!DPJl^(Cvi zG$=B(wGAK~vMWhTcQM0t*)sU|_Y$L{*px12XC0D~xkaQ3k`$Sc+E#h8ukP(IVr_`F z3U)T}e*;{-fo1d>X3@@S$aS@70-7OYtSX6I^;41Y@noTs8e93c^@g2VjH-a^zT(1L zY$KBu@>2}FIoE#WLWpZ55KGtqX-%2^z|Fs+%$f|xT;2)Fm`?1y)x zs2MGK-Ljf=5Dxr?_m&Q5FsVNW+;-PQFHq|cyqN-)HblrI9XH(o075_t#qmuLg-*=m zIbU0D$bYzyR|muTOU{1|K9qjHw;(Y8Js<(hI99t7UTkT$w<$Ergrx8pMVSDv)7?4) zFdQLH^7sD>=k)P*sl%fMh&xr#kXK^^e-&Eed{yh~{x6ODa;eno`%akO9sr+CenY@k zSpsvkqNZ2C_cPQ%-|G#e94V>4|Ab;lKXu{Y=Yq>cv9 za+9lT|3f!1LkSr19l$(LV+p!yMpvjrLRMts)}ULR+z%LoW@%Ki zrT!0;lqrmYTLX$>m7%e_wpTa^TQVTE6fD7i!%qWF>V8_PVqP8*3jS86{*}W26L+@u zx`uIm>KHjX4J$Vy0Tl)mx`#I@nFN=ocj)IQRTCRcGu55#UT=rjn-SMZl_h+6YgWjfy0Rh7z zT7-g3txuQ=j!ZE4%JBZQvs}Ji9ona>5mqkRs{Y$y{Tpejo`oljMEl6*2KujB<4?ZM zjwjSpAStxkC@iTH8CrLHb|u%^WtKNB5H3)Y)ss<8-?l}aw1|!L1Fx2pN@^X`COX8O z1?Y1S0GJHx44qitsO#EERkxbeG@8IN6-o6vg_7{57cq~k+3T-1IZtkJx#gZs(1*pC zdO|)TIPPES&;`eRH)>S*qo%r)s1*!7zpxHeX&SyN zYvyf@v28xe;f09=x$a&$1tbGqaT@PnUOTJmbpW(FA^0Iq{PA#LX7;m5lUX)m4yS|_yA;%h+BszsB;zzvv1t^XtKfo#xy@u&L^~^mxV5k= za8dcmO!!Cpf<>crYPFhS;O#wz*|wN0KBYRrY~5H~d*PT8ER*hZUt}>$2c|Z zxz28F?2)>uIoU-!jA@kfq%A?SN(&lHM1p>0xbeMn0E9V&(TXQBc2~!e#Y-aK;26RX zr)1EQpGb}(9HAhJ)F;{a*m7F-FKFC6j4#d|DElrCUN#?PwI5@EYY*g z{afFatX(~$t2Mgpsiq3Rur^e@TL|@}mx*JAg>)tus5*0v)b(+U#UQj< zPFlrgD(e@EyOu02VLQGG`xj#8^!g~|Z}PmluNw~`I`k`eNFxm6mn;G{zGNm$Ec?^9 z%ec*?*X=V*LG-UKC>@#0at1nA05HU;Q0*OGX9Jd%;u=6?0gwO(A#6{numArK{wmo@ zhEQN&xBOQOZjDjH0xGdpYZe4)`4E@Sy)h;#ULDQVS6Q>>4FiR327jgCg&^wR-=;eX zc&y26$2^^uKek0p*MGC+(8fN>dqdOUV0b-yXN{=7LzF+->wTNB_%-2tp@Gp!Zn_Mt-h+2U=a>JcbXt`&{TrcA_!>-0*ufhdXlSFc0>*=ixe zi7ohY8>t$R71oIb6M_m#oYZKEQe+Z^2;|LVlpvL7MWk_Jfaw*JDs#?71B`6Elk0KD zl-$`OEF!8dj7({7O{%FOOJ*W-Lqgnz@N~Og4(Dr&pOdorw^U4DbKL(NUk0?L2(*z4 zEQ(tjQf0enNnj(DRC>zT;FP##u4*AP12|a{hbeI6)YQ==LTah{NXm@!MjaempX0Tf zNYx!}q(PXlU|aiDb=ah{&th*>=*=TYX;QK#TpLbu?1D+fv|EoybC1xr)5%3 z{axl5hwJ_hc)aHC1Ehqn?`l?!P*qb7Iq~PWUh^(-vgn?$Tnx&jfa&O1D3)9yyAZox zVOGUUUCxSI2}@BIF<^7?ueS7BFb0QNCb-_*zW)_d^>#F>3|yfJ)lw%@peXI&Z(~yR zO&PL31ZRyLKT`6SG_O?1(&6EE0t>FE7Cd^Qnj#|`8oU5TOLh2j>tS1;IinPtciUac znfK|6da5S~qFO_BRc#Vwed}gIl`N);Xi9S3B9&0osQJ`r*yix7*M$nHY=!7|TU5n5 z#RFrYa>{ZK499dKLfZIXoe2h<>W$XQ60PxSNQ9B_Aq-EyyYJ*5`a<1FgD{|sF$gLB zJe{)lTCStJfP#>?)PRQ;@i{Kvonh`xMacf!qPLkT<(7jHoe4S*NRMS{AuX%*&CJ`c z``v%hS~#ak#A0^}f=W_siweQG`#o!F;h&dJCHRWpA)wqk6>kv>;paIXNvv{tNo0qy zFnE?i5S3b+-A$6kmsBNIuStGf=0eCXlP4MeOBEebW&Eohd@>8F(;{y6r8ZKg+JxDf zwo4a&obeM(hVG*kQY4#Rm4{7#a}x{%|Cf#tzPWK|Lm7nuLcb;hzxnN`+)yi6314K3 zn$W4Z02MA#tBg{OfgOu7sWU8)JsgW_l8I5J)`+2LV${cAtM}SJ2WmoeRM{4AodKD_ zicBFHtEnJZh_ym?pq~jqPV-i$RvZN)j`{z?SGAONc2iy=Q zkd5)e`O=!EP|P~1S-Ru9!GRAppn$z>oKHtff&W$9ZzV%nPr7`v$7CvWPD$xSZb;$XuJ0Wrs*|HX%7dj#g=g5J%{(`yV<iMKJ{4Q{S54?zA6u2<@--QO$eb9nt3Dg*VT8of!920CHEY901q=0EU!T@J}Z_^wQpL z>bHAu{<;X23&8@QH&7>SbjB1Bj{!jlK`J=IB0_TznIbcSy6$g50MiOFO- zq);6%m^e*srkPqXIZ|%~0dZF5RR|IV-Bn`gY9QGfXuD`Ilr7s@O^?~jI#Ht76CBn37k0H7wIUKgsE zNk_R%{FlZaNeZp{qC+pum>}+I4L3hH!E1ba{uKGT^aIJRXgp^7#syrjWb@%Q%a8q+ z&5x4!re)=1%^vBMIc@{ziH-ZTHq|7J#IXeW$fHG2q5133dP9^G@x{O)3{TDdfAt6Y zV%bHo(O}Ft2?d0N1h8b#gEueRl#%Sy`G@~dGN43ccxn>Y3I+ZR!_buE4B`rTdS^`b=& zo%+oce?=CCcb4F7NuSpRFuvo#w4{rd$Pzf&{29 zn&?@L(i1JKnyo4pE?w$gzP(_5@sLMNzbkJ3QD}SV?{)T z*L5Qtoizq^C&+xvs@@foH2cd6ET;YZ%QurPpJE+Naqa&f1bapM^{Sx{`8U0Otn@*G zE9<50Lf31R$E{BhriH;e1D4pq4DPr*eH76i85(gYlyV@9{S6WAEbEbSSHp(=>{29& zEmOiyBR3eqD7Coln}?oZJaf3h3621sWkAbQTl^f2Nf8!-slG^UMOt+=5C#glbkTYRGU#0Vo%feb zvqZmo`iqMVsx0qY7mJ1J)V_U46b&9={RK!M*cdz^0;ZbIQwOV>=#>_;unAWMVVbk2 zs>hDI=45!ptT=J5*{YK5s&3uWOD$Bydy^Y1q&oILl0d)jd0c^g+4o@k|A&^{#8ivt zDdX95aR;<(&O-~zVF`0C<$s7$lL9Noos}uh0CPE^^{fRf)_?J#;a$Q@8x8^4S0ZPl z1_8Md&531w<%R&RGawN2YNrzS9EehS#g!fvKw^<;a(6eAc&VeL{mBh9a#@qPkW!rI zIU=tR*~0+Pz}NxS<~=77EMRaUEKi01|KJb)Qrk;|s9-7}3XBx+w7Vg+DUHjh;^?QH zK|AB9mFjD{4YA4D*xuIQ#_rsYBz0z(odwq)Prl?VJ`Q(S?2oEHKTr3w>;1znt`7z3 zQQS6vWXZ?q9b<~nYS6qw7LV<*Ech$X7CeM=r+BmcZqq}hhRMwu=9jgSd|S%BJKa{c z(8(CLO)PQNsjF1LY<|4?lkN2o<>Lp4kSn!`1xveRYSXZNR1mSvJv(6yMx#aBd%Q$% z+zVS6j}?XdxcqTZNTewC6Du<6*S&+I@56ocgZc?&)IhPEal<1-^0PpxPnY!1c9c%5 zm9G;3z73U1)*kuaHY`ql1ij zJ{8lO^?B63?PBFzhnaQPFm$p`>Dr&)^`82-RV9P+R>NoGb6W#YRu#8^yXF_qZe3GX z5=2EXi6Wi(ikajFNpjkpH34J2ah&YgUlHq^*89)bTSkRl8t0oU8hmQo-z&TsThstJ zgKnR~dMQXbQWFDpMtgO0>Cb+8TL@qw20zKp`T1=^ZmVra9OILy-thU>B9l2}V->7oXk)q~*`^^08BInxb|R|>=*bCko@xd z23HYZx%4c1{-0@iR_}D%XWx3&Vt))kWwKZX5yXLP7%mQm_Y!n5VR2h zL-?+J`6Z_1q`$qtUQbCxY0Y|G0Il2Vcg60k5LJL(v=BbA4W2a~0U;@H_t1r$NkUcho` zPJP(u1O0k{A^R2mLX+@E$LNhCQ9HI}H|C(q{_H5g@KZxDLrGaG4nbYSmVP-~XTP?>FuB@t>#u|Nnpe=Xq|w z$L;n1(*CzpYv1GJ>;JF%QGVwSAW!Hw#u8sMe#jE{=fhGTUp~!|_rKjTK1J~{FOVNn zNqI+6gU`mrowkLr_kUH9a8y3V*Q!-3;6VN6PFTg#hSZmi*e-KD7gc8ak_uFvL{QY^ z1IaVf4w+0M8Cqb3ta7X0aJX@G1P}!47{v_^;V&2AA0c`p4IKO?H&q=ty%ntiP_Y)Y z70#rsTY9@V0BX_(%VdG2q=ANqBn;mG2m)WYAJ6$8p_8;m`*mY*Zz(nGFSqU;kn3_J|HD zPz-GA86H3R1ib(Jj0yiTZ}H%M*Rpb5gV_2;K+G3&RDBJi8)OSlO(TlJi~a_S|?-6jWuPLHBg*n7R7 zdAthCD>*Q;HvA1D5|B)SB=_()HC9s4kb`q6p{2b~nk->k)~(f($~ff*#k`@ z0%j*+mc~|Ay4)LDPo0Z+_(3kK44|`7V_dx^huZUxWnHn{#Ys4{lc_R^Haw!LBiP?^ zkfA=n_&eHNZv^8ii_cY3j7!5&&LKNXC?i^&aEbr`03j?UDs&x*0${*cWFT3E|NOlD zI9@suR_qO|wo1-_`vMhtSw4y8*O!b_ht+F49;`pm=wmP;J@XKW#qs#(#C8gxOW4ee zfHvH$wRv_ctudFTBmsC-CnY-8>7v=#oT`F$_4VEc<%g--=%&{h70-@h8^DxTxO%F>E%57}Lo9TJxRMTr)r|4aj`CZ6))`c? z>r;f7=fMS7Y#a;)vmu`Z7aY>sPDOP+SB~aW(y@~cSvHU-cXtkQU_ZRb;s6C9;+S9^ z<4zp=r1jV$(-XQW;6@;?umO{f-~a#)Aq-TFvWsJ(!O$>95QG;0r<6?3qODO=5pMWZ z#kW99gz(Z|Gkl}iUDe#WE66FyMRk%kGY(ytS;8TUq#U91bc35bcb|;qc~k*?OA=Go z*~TMPR3szx%qM&PJ_@3o-8T_f|F3&`L>X2?h`Km$wX8ezo}=FpkR;?f20fyiiV%cp z7tdGqx-%3^PzdZW*Y8Jxl~u8B)mS4HFGl=%dF-`=gQcqNGQzkZiH5vH206s@@}gDE zK(`|f-aW=-NW6^>&aR-O&RZA@0i#>7T(YVvn`lG7#Wc8&wKVwwG^_V0#7xlSXwiIe zqg1|D#-=0^NNY zI;=~o-|{={_T7NFxsuffmIj~ZFF8hX36DO=$4>l*gl3?08ua;`S4OQ_e z01Z|5cGo&6*G&C58o(v^mIQzh0C?9J9yQ24vJZ9=00K;O3@vyX0RRFqRK#(+wm~ce zI3WyF&9Vn$q(In$7!m{+?%~^us9znF5@a+@AR&7OOK5&Hx&bVY!@Hv=5R(K!P^*^_ zBrcxT?!O7$v9BfC2JG*S)tD%uob6h#Q`-+^o?W}_cABboaMaqmu^K9AtGIgG3_TCk z^o<)We$UZ4O`1obeD7_nXz23W5~wVVK786qA-AWJk7iS4s=_xEYx;ZOMu@{P9&sp0 zpeZ3Y%GF$NJtu@yne!U-yLwx4qywJPsKizY*ld!UhSUp{9%%xz-8LDGHd+`gnw$3E z_25=TC5EZ+vkiT6$)N1W7;-afKJ&==`F|8&<3+#YqG0*Z9*F{lw)sqESV%A)68Y)G zuk1w0E7euZ=b#}dO%$;tDL7e*AambfOMBIo1x zsi-SD{GIpyUiIXd&c0NbUGH!BCMzFNBG28s&8%)S-6fM(e)E+Gt5)y|a!aUg+% zbVhN*hP%K-#FEJXfw#4kUa#}oz^w9N2^M6s3HWsgJo|Lxto=WN>;+%jirfWm_`IBx z0R%?qB>KA@nXxmR*_6F!JhD;eugPZY?7zo!i> zaE>8^}} zo6?-Z7Ivm?yg3XbMxNo$0(c4$t0K>frCohQ=GwZ*s&ex+trarfRRALQ6;L#^paD<` z-*FtTo#?R5rtnb(1fqt__gBH;v8SQ4Qmiz18yUpG5Q86m<`$Dy8ZT=Z3@&NgcpYEieWN}33(E(}bvn#@&fDVjjRqb%?LxD1IEeCWPgf_* z@|BbI7U*l~)SP#HD--S?w6f)Ou3;9Mr$c7YIF2^Mm;J_jB%Y^2Oyh$wlwiQSzasZURBX(Q7F0j)0>e8%D zI1bJF#ZIb`pG(oXIlpo12Jgg;+ADfLe0xv2Q1z%pW~<{hv=^*(tUe&AoSt8s|B|He zywcr`#JH-SnZ)^yW4LE;c*T`5@XdvzBsV2ib_X{`i18lE&ksAINm-5l(&WcZK&e#P zmYz^>HSO7?q11}C_B_k|r_5Jk<)CE7h*5>GDfbGNZ*Uh;wjz zoNX=z1no~e%Jpg@R1-sJ|BkIY6)XC|FYz$;J)#C3-*&o0QSCV&`|RUfeLj&;aY73^1;V4M3z&8r0~ft{BrZ++|GA{@?+Z(b_yA z3{<7&kiigxoX=cWdiIxBcf8dUUgg3}piESV<-`1P6vZX&EQSI>0sP4)lIl>2Pw86|(pc*ezvf$m66JlCiaBV5>IoYV(J+Nr z8>)?^ICk40Z_nH`=!#Ezu;FYr7;|sd{qlLuL~8Xs<0p<0mMR|MZ___++X{`{?`Gr2 z*Qd4k$?GlmwR%L+xHm5~UsKV~Z6io2iIP=&t`+**go1R^!68Py{3PidK+77ks0PL| zHXOA5HA@gME?lR}6?CF??C$R=Q|&gahO?Cgu!#|rm(>wz_s^KX0hj55(Mek<_Bb^O zh9L*NYt*&sUtROn=0+h=sHY>nwMdy7`IA|lNjy5W?|W-sGN6V<0OXyC$hvR5w-klL zbN6RQWKzDgddlLjM-*_nHWQqlhs#^jv2kbKI;Hnoow-4@$Aim<=NWr7`J~5qIIe9j ztmSLIa}L;|=)A>kss)`#Cx4_coL# z+XvY^^LF&j#O{+RiEpbz-y{6f$uCJMonATQ0l*qmnKLC?zKRXCZg zZg&bwS|f}CYv^QjGA$?%`hq27T&SKUHe@nTCiEMd-FOdieOrkUt8&WWJkL+#<*yKP^z`o`)aT<`IZHdX*xqo~Ee6zP#g@E}P=y;9J~`}5?BSFE za>gdBDSPAXwmT5Yg!|H zmt@W?Dk5sqh&qfGk|Yqb6CZ6RcC{fV62iNcZiuwr7B=Z%#N`9GYp)fuEoQZRvJl;) zP=(KV{*@>pFfn*imbyz06oCh~O=~XrcDx&$((H~GST~NzclsQMb)$q9$(;vwqHFfa zOm-+W{wu>?ZeG{ao#spp$>`q)-@GdCEt!A%gL$+aexZ}>NQGR?;FqSYTzb9uKaprb>D9m?PGYfG>%C0;3;jHaI$x6fu`9bUY6 zO7_TDMu(syZLVSL82(2t=I?Cynu^cIv*!JxJ_TwnpjLmEvI0BIQ5x7ncbh|yiZTT5 z1KX={Ueh!wgoDi5?wYZbzg+w-qV$U%A(uUelwPq0l<3(f2^h|Re9v2likUXUCiW8vsGxq-|C~$>AD`m< zG>AcIo?d*aL^Y8~u(cEh6*2-=RheZ}@fP%dNnd%aV$gI)L~QE+qC1npf18=O9(NUJ z-u3gzK1msEBm!eFRA)eSJ(dhF5z0U%fXH2#LN2UD$Cz>gutUqY;5U==s5q9fkf)98 z&qpINiT=hrKRfdu;m#p^9bekY>G3td9pQq4pM0+;mP&iiwFPOaZ2>*WyqRYhW#IQP z!;SdzMO&=oC7RIz-!#GBfbCPWR2z5Kt{Pv?eR_*)uW!@2^$F^{--lZl>wRa7<;%7q z)9c_$g?kbMhu$O`i1rBo<*qxje^Tv9y2jFm!35g10bDTw^?P8H=Xq%n$L8`dQ)8C6 z*_>+SyLFZ=jv0x*e#2o5?kkdQoUIv&kWDQ<7GaP`yDwUU)e1BcM@JkK+0@@fvX*5W z?GTPMk!+;^Ox2}c@Vr(!9on4dU45$27~YS9%=FTM=Q!?^nc<##e~$u>wjv^fL&t?= z5R_t`TKtc$#h*<#HT838IQW|26Iv#b)1$^@?+2At7%EWTUi@!?%`9(Z5vZB#*JG5; zfrmp>L+@Uk!ggDK{P#j_6q9TY&dIGOSVS8vh2+`U+p>`;*djJmPc4ThPHt95amm8L z)fnwY$HV(OfqEoVL5LXy;9H<8dkz3A97IkD2rlT-3p%QqX9UpPUc-Pu`$ntP5$!6H zdYI-zFu8%2Ze}$ak(5K`l$xJ2KwJI#yGToO;%`~KNFNs=PX4uz z8ETcNpxy~yBT5X9oJ4mDz6N!8<|=gB4I3nZvR zec^0yXs;$^C`Lrk?x<&0#x@LxtUYf%QMEp|2DetO+;y!ZR#f=Lvh5VUb7R{lF-@y^ zX75D3Z&~Qh-J@h}x2PuWzY(Tzr(vavz#ti?#a9_OW3qtxzzHswC?p(Ipow+m#Ug`F zlH9V}yQLFPs6O`FP2sO|1TvQ`e#%#jug?g7|=7h zMW7NOT#lz_c}G5T+e%_$*H@&!fm^m3EP&pZsC@>aZIMAI+~r}BJT9oSscFv5tn*(YAL**`;Qa7&MrJeXC9POxVDqRY>q*$Y!O~lJBRF zR$v@CH9#5VZ6X{$5`{q3`*Wxy-LDFRI&mQkb+^O=fFW#Djkb+pqQY1(FkAS^mzvWd zYr>sY@k0?d1n+s!mt^FhQY2`f#`|}BP-nVB&@&a>40E1-bNshpA~Jx!uiM=l$DQfg zeZJ_}{f7FmN?QcV+S_28ga;PmclWF><4x<|1+4PDzLQhE(Qdl@>`ndY7bWE+$mB2? zW!629%idG8S{lZbIQ&E#0b8taL4aT6EF8lKC`qH21sQBqVqieUIblMC%7!LBFt$86 zPPrI%u{Pjk=(?zjeHX8ner>N+3Dc~gV3t!0EJ&QyROodhqRSTrHA@*_JZMp+PLD*j zw1`qsR`3+(+X&9nsbQAM+hrI^#z{0l3}MN2{d9jPTZh8iWp1&SK9-OSmYm%e7n)?F z%7ux$U%=g;Ye;rikd1XNr$eF1nIzM=kBJs3E>6}cNkm05YNCZDY@}GAYHu3OSzQevy|!bb?$X<) z*rx0+(_OOY-Bh%@%{}+|w0IToV&qr##n}gFfsSb4bG?II#6!wc#$c0zBRtdDL`?xb zW!xHA#T>cO!cO@$EI6gex@#F2EVb6sZd?cIWZ;WCq%DCGQsdYZo*37zZ^++2cHbrV z;!<pxe<8vg!YYY-<@W!hJU?Wmxt&`pw zBj~nFp3*9Hp&W}zfuAdkoK@CD*I$_>_bxGE`LDJ&O5qolNOo8>Iep$p=nib@4;m^d=^|a5&kdVb%?`2>-L1kY@s=O z>JklxEQ69onS2MYU#rpd^zWgEQ9EFtA0Zf=3SHI);*w6?skpY}F+)|2+2G2=6_uoC zDn;rjm2}Lkir};|N|re_7U+yfiSRg6(PTAITgA|1;h-{drBsthb84iugq#S**A$V5 zOe8A&efY%F1w+e+e4u-;@Xm~^SbqweT```4#TLbX5okZE*P?v5ZcoNaRn#oVAzn9u zE568RzDf%kH(7sa+QwSXO@grCERb7x$9i|fLny22JF!=gpzz;buQF<8LPr)^7C4e) z5gO`rz=2!6@ru9R*KUHvd`viYoXQ^0zLZ7k2 zj3JbQt|&njt6y-bB>;ht7D$c>aVA(QGdSgv!-!i8n2LAr5ecgG_O_EM_2H;P5Mk#H zgpMYFl{NESR}Oo#+BND-jqDlBP_0sc2(htb>xUh^-ZUc_E&TwpKuy2Z=Ac9{G)Ta! zL#x;v90u6JpM-Y>^hk|zROPYRC9c$)+kVFmbu`{^iHfnBnHXr~FAq-U2wv!2CAWT4(1#T*)6)Q#QL9MuEhzLN_ z(O8Hiw%oBesYQAJqEe^Az@JJ+gKmjmVCKzi>DBn*!w<5YJ7a5sG2o%Mfh~*e^E%Z} zuNNxxZxRonP`7FUDcn_pz?xW^n zONLDft>CY=npixlx*d!soHJu3_4>AcH^tTQ?#zlh*lMk}WyN8Z@XDK^eI-5~oaek& zB$L3&XXw6er&l06yq5nmBNZ-9rTUdbIL8?@plTPz2@oX=jXI}PmN(Z8n*#_O3rTAx z;A=XYl?8G3aziVJ_ge;ErV&v}Su4-m7aV0t{!a`fB@<~{R zG|*>nYoVdO63o!@AsIM1R`kq(>)_l5MH(ogNxnZfnzL3O=y(WKw_ z*Naxr^q&JCpy)Y?iyRE>>%7$W<6ykAhFJL52^jK|;Fb)4YK<5TWD(8E@~|2?xvtYgL|%o z04$|k^vYy9>b$}1kX15TkL{uQY^PhWYUk6M75@z#t|V{ zLJ(5_X$)_y=BawR)vsmp=+>@4w2fAG&%j6ybcXca@A&Hd@o2xnG-W9IN|Li?GX}c4 zGiQfJVMu~~sV-JnDxH#)&`n%YLrG1KhE-*np~|Z6lF_SK9xP~Fw_Jpw?KH12HC?#G zGu5_HV+M|od)R&!%SeH>;d|E71)h@$Hy|3+u!JLN# zmSbirpTdz*G4NU&8K;2BgbpDLRK>oI!J=G+1 z**=+EL&~H1tEmv)w!vZKH`{gh{KyeqMZH$^vwI6p<1n3mSU!{pZk4M z{GHkw#ER@jy^v8Q-F=n$PYnl+fqk+UJ5RG-tG?Ut@sJKQ2svw>uvN~uU;t+1FeEN0 zg(AvW$U>?ZNX8PxkUGM_jSDzu!C#}6u29+k5j|Fq$Xekha&Gr#qLaFxUlEc8PZ2b6 zI&oE8RB~m@){^+xu)1P{{yrBiyt!nS7`Km3XoqK#*ywjTy^K z45hJpUHe=KJ9Qz9f-@k2XUVoF49`}tI&S)G$#9OKsY};haq60_Ye9@Z)0KnW?Jpnc znMtM^S|U$9Q@j_88#-SDXVyM2Nj*Th{#gRpeZ9!0)x5~L8nmed5k*#EjamyQsm0sH z_hRLy*w*&DZiL+|H2bk*3V>wumVvJ1fQWQ=MEA51I`rv-{ZI;EL6S5iwR?>K}^a~yR&_lE*2U> z*C+{!RbdOX2#&R;y;Jx<5+XIu^fGFzAzV7zurEnzwA7xGjnGdS68)6D#t)=#t?!~b zqk30G>!<$lm`?Je@&a40d@H+jDz0?acTZ$?Ygv^T(K9Lv^@^H*xJFR)_~sQ)yy5D* z`4?HUnsJC)NDf(doF|ZO$s&NkuApnjzqOdUwAe4Mmru$smU}r>72Zxoh$>^1-_@{$ zQcz8?L!BB+ZA)~dS!t~c<1g~yCQ#~V+Mboz$SEpSVJ$L|fo}@!yij@}$2#e={&rcG z$ekf(iD7H1z1ohY4-ci2*(ew#=0dlEr-a0kic~P+2bAQaoeVzA>YcMbtA>TDp^~{i zbaiHHab(Pkwp1=Azi%9903>Yn1~LVZVFe$fDM=0OG_oZw^4hi1g>rwRCbn8{@2Lit z>_48U3+u2tZt>%^mZ#YaT9=lxt+A9>dCfjG=QVuUYNlR!W^m^HO%#J{*@cNF+Z@r6 zkRh2~)ja5M#-7YDZJ5+ivsY=SB$(Bg$uNW%$>JPv1yMD$)bhl z%*jS{HoD_7Z7MdqY`$3&QeRyhFzQ7ckyEo~5#O`3>)+oKjv0LN+a^mdPK6de6WUaW z`)a&TO5MDos2k|KdnC4(Z~gJ`93f8L-M`d)WyrKxgSifi8Zbe>ZMCMJd-nagTa2lI ziE5JAWeC&7kmr_&K-iJtS)Gj}>6fyZfUzg(;=IwOdkktu=?u+Bwy@5_p7y0 zzFL^O$fC64!DYJ*#E;B_Tf^eU7FgK9!s@-|ysnvVJ%T(Gj?sTm&>P9zq>1y^P%k~- zABYD;s&qKvQAdbuqY||KG27;jy3l2}v6}{zV|rlEbrMS`G_fxr=R`vtGdr@YK@&N& zB~Wvak!J&)8FiHyOhMVH6-YPFF>f;a>+|1Lcb7XIl13?sCQ%H$!UK#)NfN&9e8Xps z*o4)4F64#tC$}@DUC!8pt1w}7`>$haZ-xK%ZFH|O1PirUopaGGG|g&K#R0SS{MwR# zV$<6p&N>*4lfNW*_Mz2ssP&uQ3m1Lq5@1UMcT0!=T9wLs6vG;Mz=gewhy}f1gQ1cH z`S|(T88ohgQ7UI5+gaKk#!XV#_(YkrBGKE=BF9qa-3=nEAv+lR`1S={lS*}XC}8Xw z3~spM`plO}&qua%j%Ny4*JN7KmpWZ`+sTg7x`Dkqnp%kVwuup89qzIBwfdvlE_3-j z|ETOJcvd%-jEf%(Dsy=MQID#i_YBU%u~n#66e3o(a!Ty7Y7}b``%J0NNP#CUud_sS zozfnTK(!wU$lxJtPi^$;|Nr_@;YEa?U@RyS1%e?3K6g^-!b*6l&U|i8vlAw!?5G6k zZb@pZ5VFfs0V0pUo4*z21jpuTuRfXIWHRC?DP4TfrTyp;8srd!eezZarBgC z5d8oE=RyENT*Yp6?e`ytziWaQxnVm&#>Hirsab8O5+d>H%*PV{cl?tf=^|L~Cm{9J)!#$jB;u_^^DF;%+#h5761r^6ys~&2mp4)6^P$mxa-8Ej|rx~MG`iL*P@f2 zmS#M0#*i!|u3Tt&<<~_r!ojo$Aq-4a|JVQj`d;5igE1g17zv1k33A#Kjn>ZXX8!pm z66#+utpPdR9FCI(YAT0Cs?{8mZ%rV(S9CkPpHZd14*A}{%Mr&rpF_i=mWKT+SrqHE z#&O$7Qi?J4AG0MQ{o~q59t*78EV<6C%MSU0!g19$yc7#)AeGy->U8OYcy{44I{Id2 zSex$?`M!-aTKiG0_cc(|>76`rG6XB_wX%bCT=qp&T`o^4MOnmMiL?*Wv$%}%FtwJ+ zHFIijPerTm*E-4YQ{S9`8{eHHAzT??^hte!LIQSUh8`& zAb^x;)dM)goWJWerrV3!N0MmXcf*-GT%GsWP#|7m73Z2hmuAJ=`^S$z)2Y;%vQapw z*R2cgHa-F-H7P_6niaxP{f~cdVX$^=6siE36;pYp4^UiXHFQkc zQuSI|Or+hT+jrcq*Rc#m2GfPpu6R zN>l@!g{10UI3dM!frK&YLP%*-8db_C{03l?3|DthX ztu4Z}m(k%Rh*C+IrxGOrNKUz4$B4FfA!zFxmcz{r)&K#37E4txI8CQ>o==^~M52X!L7jFqGdY!Ml^F>NF^2@0QZ#%SZ5XoV1tNsxS{+#32qu6? zNzw{_1bfoxK5>?3(}ARh`POHR1x@5pIE$SaxFtZGisI6qO~P;^6;x0KYatS3EI}6D z_e9&>+#jwqe(&`5{V+lTgQji37z$h7_TeB5ZX_;JC*KzEuT3w2ovBt5VeedAH_gzi z7nEHLDJ6|fn0O%!PyFWp|9}2o<3xopP%st{gc#0yjw626%`Gu6FE?OBPm711-d+QXIIY4@ zs`(#W=AD(pS*`5y+I+TMHzkufA(?h1m%NXS2825h<)4@KW}%lrG0LflV>O*tE7T?0 zu_V$`Z7e#BVhcV|oo5ev2<6@yTfr{{8|^6}Pm+r`ssCb>EQ>|v(y1q@WD0VrGMI)m%E-^s`_YbYcEwUS;?aY*7AL9X`Kh*@(?9a26310IPp3v} z^nILG0p4b4(MwJ(i4*nWRy+ti%QPlcfD=~=GbIMWaRU__DK*`oD}gOzQP0rW8{NZ> z?oC`lw{iKoelEbOrVA$z8pEqM+9bEi25TdqTAp7opg8QuqWNu&C6Nj&QhRSX33=Xn zG|KX{jIH2UmsF&<@v8gIS-)e_(y>08IW@|{uElPGe*Ng&Xt-4^z*)5eQ7tdBy+Hsl zenG$#rPvlVHr>}i50ac_s|`s*%t6~j+b0W>-WK1pwr3n13fM_tXtsJ+q<|U9me*}T z9u)_JO{ddNRYzzAVfZiBnsHi`&E#LL6#4G*4&oGnJ-QJqX`0urS9SEYjru6n%Hil_ z01hDxPjC3YzJLB^+XJxDSa2pB1cD7RjvX6zrmoSJrR!C$IfFW7iB%-*5>Xd4|M-(B zl8#8Fhacj+^o5@v*rM!ydhZWjkerNJ&qY@+rlea3CEt3d<49}u#SHscZ2ybRC=s;Q zo3F1uV4G)KRbSC$seysct={jhQ*}GWg7qU+#u<;nUn3x4_L3JLXkZiTLXmbOXQr>u zQKqCiO4O5-4YKKQMxk)bre0j+RhL}NIyc?Sxusw?K;Lal)(`jUt6%Dy%DjS{B!&UK z7WEgP$(oBSmJs0Go{W%~s#wK0kHY(l5Hu+S0Ej{!cW^eOfaNCxK{P@LuM6}{a)lQ3 zpZhIEEs!Kom+0rZ8g1EIJtD^kV8K{$AZzD>LQH^?P|hZoClDmXYB60@mMlbuu0hsJ zS^)U3xYd{0kVul8&RqEed@R=RS=D{4m2Ax)% zI~qB?7QHXM`MJUC*f4T&rRnC7B^ZRpU_TQ2Oq}bMfd*vywt-4;7-2nE zg$jK6V=a3wlmLmv$efDeaV9ZlIi5yhda%OW1n4$2*(RejCYLs)lu5~Z8fm1&YW*ln zm34Eqf!rYsPy6rxus`}{-ArK6U`Q7V3IZVpnEEJ+1%*=WsL_KbSMRCZR7*arWOuT; zzq|i`#ypAlEl2CG9UpCDBWG-noT2gAC*7D-1=Y9L1k$NAw_5P{i$_(s`^Rxlu5xd= zY=(Lik@lXO+&bz4OyxiLHd*%QVf#*CU2iX{JmvK(3Z@yzjx^1rrC36d?EL=4m>Wv5 z24Nyu)l6cilbFrR)3=e>rX4oqT7#*Bn!vZ=0_i*^z`l?t?@ zMF87Oi;bF?wXsTl&`gRsXE8Vjl+VZ;nc$36(Sie$gN6*tY1&;Ynt`i$syLxBpCpqU zO)-Y)HfA@Jw!0dHj<6`~fUZ@wP+@4~V#Z;=m*V%Ii&dUo&YjopM9UuFm)2C&Ox z01i(D1z3TlFpD}+9H%a;#!B1Bu^IE=Xj%9CQ4mVE_WHNB_5xnh4P*#tEKp;mJik9o z=DKd8CF3T#lj60lP;^B*hw^A*@pt3uX^!JRMz$klmpoquIhbeTo<}T03?ZeZ=XaPc ztzadYPHmWo5;a!eetbMoP92-$n8-s3SyXmek<+-I=jh(n=(g?h($6(-b(B;x3mf#y z5skLbH79D03Sy4T&O=(QAoEnr7049n^a6G+j$<&0?aJ);%);?5eUF|~%roYzLSf(( zizblCLBG%XJ&tNuc3C7MATj_pEKUVoZU-go-me=w5`}5}+Grwf!apD0EQ_hIv@T$C&?uKhkc~t(ppT9M^8t`6YWw~*l zOfL6ufS@b#wD9yO0UiH|$VS}ZJh^ecjyk;kU15rTvIpTd=Y7>w9rz)%_~78!-Lr>G zQClmRBgL^sCBbpT_zwu`jxE`Wvt=8t&$-v8P`vVEh$!C;r0VFkF>qfJUSfJgKh=96 znOU70MI@n)?Ob5NbiSZN^$+)`hnl%R{4y9Z@$LCmFbJ3)g$?|cJVlq4I4P7sW6k%OVg=a(Hc- zDMtMb)b&*PwKB9F>e)+MjNfZhx?tCwycvJeUU>8xbW=5*GS(g-ks>$>LCrN{3z_e~ zc4G;;t$>8RI1<#5%9i#HthXls=6}Swu;#gI?%2B>VVn_|P0vu=wHG-&=_~(D9 zBt+)}1 z7;-mh{hr4}$AO~T@#$PJ$j`ibLQF;4A5@}AJgBQ0X8CZgK$lvmMhpiY=~RS5oOp!r zw_a}F;as(wzpH6s#)owHniqDBG8;D|mWM;}$z+PWV0eUZ-m+_050X@#0DO8BN|g_1 zRP(20KfWSxV4oT1C*sdEnqc~HTQQj_`S?|Dr^0X|8aYk6YbV=JHn;6k+O8(*?P^i| zD53?3eKAEAf_EHW>!I9AmFE6xx(nw~mgun$j@!8| zO7}+ZA$4sim2Q5igKGEB8Rj~5)uM3i^RfM(nyrpww)d8(`oH1xf2?Sp%l(aLOu9)n z*+vI%Wv&wU4LGIhu!OJ?2;kGOH=I@UNW(zaq-JI93cireA2f6B1ml@QrsnE)EXKvd zmDyhQ`qmGCoyBGvOIDeB-eKxFe|x#f#%6KmhpDy#!E=tXR23GJs5KH>nq?;P5DnJf zOnj%1Yj2Zn0&a4dITlU~$VvkchDrwMEISFDF zrx@Skt8H1VWo_=fgd#D4HF7qzk4TvoMVI7>>-FURli9t&*Is z4iST(nMbr(iO8GpKIPCm#p9pwewFF$Q_X1QvY^=rY4ciR`=Jl2KmYx&$GYjKo$=>6 zDMbIz*YVf>KTdGWK%ERHre4n<8%`S2xMN>|Ty<6$)C}K&x|&f;BzfN38R13%lge z*C66N(Nh=6c~9uL0qm~a``({W>+#2N`W;o69Wq9;X5-;{s zV>10-!qHhnTyzfV_3R@~#It`tJPnkvyYc}Wdr|Wp@UKogRb5=r?0vCpQNK-OHdWndWaXA}_ z{95hohVi6O5=ekA&K~u&M1+<2v#Lo5a%NTdGeV4#Miho7hK5Tzfw=1nyHsfQLy_Z8 zY*7Ov*W*4hx8hr@bvPHFDD*{VF`3WS-GSrCC5<~yu|pVe790&k34VO4`Uq}f@zCsK z*E*`n0)rB8HwX+~b%nSwNppq;rj#q=jJ!KqY53Ro;o4 z2)kdl+;28yMgSP=Qm0WfoZ}~jDRhdl&4vM;jV)~Iq8A>Jj$M~2-$GlJnH;#=B{VqB zL_(B7(sb_>kY!VtFtu~H-Nug}YBBh`!JGxBL+O^MbEhHLT||F>6TEZFj4 zk0ek46INP_iUPw?u#_-C5GDLPqf*p&%Fiiz%8f;9D}BJx;Ny(jH@FkzG&;gSb88l| zd#V;<5%toW={CiyHz&MP3-g+NOZ9F`38|GeMGH=i!=Pf7Sz0GmHk0X1ByCIa){OGm zf@>sFEa2r=CC+)ofUNWTKQHwoL}s6Jz?xQFO6jVQ1J_4chD#r+(kB1_ITmN4i5p;s ztF5t&eD}wFtCuO7>C0G#uXW!bKaU>!g>gERNllPtGCS_K0J7i3lLUh!9ImAjDN?i; zGGk4v5{O+s-by>G!VAK#VXZ3=KjHQ#UK|7FVr{mu4|0t4|I_4FX$qqc;N;MjGwEq@9Op3wc=` zD!6GPf*u>%cEnqF>@@Zprw_`A+xzRspLgBh?)!%KL%;F~x;jlZ+^{hVXP6z0<$Ca# zZ9no!+m>5R-SKZ3ZzoagK5G2iz1LLsG>>c6+$=7+|NWLc0)PRMN#X6r&Bm3|iJj<# zOmlM&aju{rA1j5L9r;eL2D&!ITn#CDb9*4m3^Y-Gp(40ooBthyy!rT=~pjC z<;JlT4_^&f%hu;bSEXog9$R|0Ovv}387n}^HpexlZ&P$?)*Upu*Mm?upBZ1io{UYp zGG(-A+D7SPazEFfS*p;S%SlKr7n^7Gq{;w>45;A~K#Ankmt~V4{)|N6trsbqB}Igx zK`|6CB@6|GAqBq4mp!OA-c1R^nn@jEa_}vm+n!aB5AiRyd@jD(xq-IpoY*Jy>lnT) zb~edz2}N2ulO@f!yR7oFqV0c9))B*}e98GNFLzsT0YN8darRs)jI1rI5-u;i8=(7f zlciI32KqCdlmHCy-{^Ep<~$|lKi}wg8}njLY?N#$jDU+jO{fdk8`aBx3n}ieg;e_Z zSwK%Tt0!&mG@2PJeFz0ZJNWvEtWwr-K3SGTY7$O`M4>IVktzURBrYPkM*3veA8m}( zbeLMHPU~*o%hZ9FaI8?<9f%TJndndgS7G1kwfN&uURNcOg;-d&)lqLu* z@@m@d`on$_UU1@aOU^a{fujNhn;MIQtp4Lg2aX#AnoI(qS!lDx-=qjD!SBu0gjJe5 z@{3`L(E?llez>?}|0#1`M$TO~(wPKb=|2ld_i=vH+HBcN465jXA8(2Uj#qA7j@h1U zhK5?I+Q>mtOkB6CtiZxAPB-yCbB9u08)Bc-XDn}5jlQUG!ndzm>cAU_i{Y45X_CxV z<-^<6A6viGYcZA1C{vfo8Z4Y5s09f@IRn7A)fl#(&ZDtcKS3^0%Ih#eBl>-!GQlRP z&6fQ8@;(p2i$pZz5tTHe6#)A6ixS)P(zc5$%n=oCE_@Iqfdc_|kThto`{khBxLKPu z11>=1>yw8}<*=%paOR{vs!c#-*KRdQJBaAu}fOk z*Uy=9dPqbAI`oJta3HdqjbSiGk%p;isJSN1$#0!oo3-c5rGxVoJMO__|0`}YJ=khJV-1ntSCHW@ zE!(b%9`VI}A6RI|-IqK#!1w;Ogy`5Ut^&*uktU9vG0Sgy^}#oRZ-%xa&bHYFfQ|i7 zkcd73U%EF3QBFiMS{I8FEH!M%U}AD_$DBk7jsP$%I$)2CBHwJ7C${ptU(sOz11vYV zaU1`TOR+1)tCIhK04S)IbOEmGEv|uU`oakAv5ElC*Vk+ss7Wl6M71me2&LA$3I}sK z?QhzqWN}dL1Ark6RMoPT2mskAHWd&l+UYcgcepfGvL$iFT1|#Pl`Rr?u1df($9Qs; zqS7Z(5xVY!r5c#6)N<>dPBd+B%sDAxYRT}mtV!oV?R}p$f_Yik9~n{aAJgG7Jz_RT zW6ja!nhh@%AO@az*%#X5%K)}m9N(b9yvbfTOJ7>>-!Rfl*nfG&N{CH`qUck03dHnW zNJX~Q$BDq%*RF1Td3^*zRpJP0MFv@(N)U1orI~jp;Er8ZH4jSNX-&o1Y&c!S^yyU) z5=rlST=pg7d`)aRv+AyjOy^N$8QdD*XfQizjV;!nbH&&oe^bkx%EXz0^z3c7Y#VAI zV{#plWWeRdt({^7L;#bd8#NHy-mi4ZXDDHuG(&-}@e4_xFXpxyRTUx&)Q~dPtg;RnWS!jlGU|7tXzB53W-`|Zs@uCPG%mKdmo#6XNl~mp5d(?RMeE<0Y=dOVAR`k$ z^&im9(5l?Ll;X1TQX(bI3&?%aOC2M+l= z^Wi{6T8C6s%|x6OfDn|trxitn$8}i!QY*X#R-JmDk%nWoI~;2%gA-J=QhZZ2Q>rLt z-F7>ZCt8xh29-#Uin=@JJux%NR37(a%@(eI1wzs=BT=rKCe!NHn^%e8v)%ZSd0snE zdmjNmd{|G0(-Ifn;URy==+{QH4K*FBSHii|ByOWSz&AD1F+BqP1m~(ZF`Z)+DDTLp^`0_2ihdL&QvB8L7DfOtvlB3_ zjw7AN5k-6BRGKzrbbECKpn=}r(=&4H037zeJz){aU z5Tg3-xLIu5Vo&fmt8;s{63{;)Ql?0%{EFutF#duF7n;RwIyrC?UUf`MJ*F*Em zKP#5VA(9qQ{swi2(p&mgE%#`Z)k@c8vQu+6Ux3mfr+W0LDm`v2(_qbG8uJ!++7A8C z`o6;Ak-B@Y?5&^Pa}8^>aq^mPv9yuWn?4Quu0N=8te4Atu%r>8yR5Nz!!}BnaioCX zRKT7ZMGq#&6=R(z7fq6?)XHbsCufJS)?cjWpALftPflNJrqVNa4`RxtQbAIMJBNzYX$n=;wpxocgG(k7Qc`Vly8>x}znZGoC+|$v(Rimz zEoT9rWeagd91<&|Y^6D8OY+B2dTt*j@7DBBFbPYA8H6EWnAj#zW9+)8*8P6Imz|`U z7IQ@N<6Bs|!Oe;>M>IxYeHMel8fW!P+{U!$RlICid+#~cODspzLMpc^CD=-LKxs^TXn$j4{#|$og z(BUhklGm8LC%KaTw2W%Q$!ieC=IcdqCpt)tFjlRZ&-lFFPyhhSQ3fCAj)ZD5oXiav zF>q;r^243Y`|F#{-4lY{D<}YH@{S=4RHeR~1fej*Ah)`2$))dLYqS{&FS-DULP&tF zi$PDvr_PT44_aB{s8RMG=u5+ z=k37)=)UJflZ?|bPV0`98g5!SuXlVJ9-7c!3NvYpvhC`v05X-3kvA~a({$!Yi7jC$ zPI#4&+#^`P~d6u zco)n4#)6j(6k(oA6c4xrowAgKQHYpC5PSA;MbADB;linde;)VKVmaI=1#PrXfOXVC zyGPEg%k)VbWcvgBBzLVyv|{4ICf7LJDUZf;MUJpHF{#h$^;9wCd!6 z1tj2`16!S0U*2_X9A$298XZMz<9#3h9!dVdp}fSpzzk&LG2~t_XT)H}KK;X#TnzHO zT}CwO>g)f%pP{4UKm$$;@|4zLzWcOeM5~mXQeP}p*>2thX$#kRnTPu87jq-<7(m*p#avVE4TzC@I!Rhxa_Z zk6-*q^i?+G27TA7kUTd^!?}Nsh5WI1&~btp8Y7m!?Af zo$^$GSl(BsYBfoNF&msr#Ur{ju_H>oN)8Y$suw@S7?k~p1x0M6hC`ub6N5y)6=u?` zx)ob$9ce2e3J*7>=k0p^D3#sqs~c@snM>1B6fe}JKI7bf>uSQMAgIJwuDx{;5(A)} z+GrD(wUM9tzu8B3nxPSdF*u7Gnbi^Gmb~%q(3G&OmWis{79thUs9kbJsbtSEWpKV4O?+G?i|(Xe zrehxSp%_h>3B`zCOon5>VY9Io$6N1~=irp}WO)UPCC_&jg$f=+OD;1;1dQ#UGJ_BY z1$Wy%&WJhvl71E*q|n$X$#|!tKaKKdPSoI-IBmvYCJ;<%p^1bPNd%mf(SPSzhNqCr zx%zM+3{(}up9B$t-}u!y%9YavFs9Qf0`|}(L6XBv!76aBA_HLOmLq^e3GVb|O}X1pf^;5~U%w@NY^_&OW0ogPC^sTInm*{{Q~V zhwJnUN|xs3*yi3;#VoZnL*u-j{nYt&{1s+B>`g`&V(1m9FDZn5^%(P22+onm;~Y*2 zvJxcZ4v#M|vL14?jbR^zwl*JA^T9W^D*QC+ubbMI&SIEFVPv#L)B>+{1g8|ra{3&> zQ-Vc^V6^s&9^~GT)!73(BPE3B4EY(I0J~?&Rs+F$=WqF z5aKQJwwd5Q%^5|Sp7qLI@n`%yDD_kDUkIMQL*EB;T$90$c&DIB#Rg#@0f+=0qLm3@ zpkOQ`5H`y2$&6A!P-e>rQmCGW!CG9t&Ccg<2trj&t{YDEtk^vxCA92O zmF}~)H>0g}+ zlH3KRbE5oM?EnU-=3V0ug;E7^ea-23L*n7%_iq>es8fAt&f~kbe@FWnW3t#hY}t3w z9awjHhfUxbUV;m3&js>>*}y(9s2eXF^D)1^^SM zUrQG>I;~IeX8L1Kfe4Jw$-p5DQ_aSi1~7wP{?nDhT%55fnUamkLcouIyhg68A!Oya zMBy6+zd{Ey$`y6}`)W+)%=M6V7c+c^3OEe(2RA#hF)paLBW}``qZn&csZ7OsF37A0oot%{xutB={ ziK>{L(r?gQ)(5Ps^tz2Q@_=} z649j-9U_k9qFCr77EJV~uzI~cwBbhmG_z@0hgS6ywu3A;#Tn)nppjpOUK-L|>pAP5 zl=Q-#Du4=9gCWdlwg{(HPh}L<7<+Q#b3cYc0k;gBjGGTdf7X;S1SBr--`Agwn_zdW zZ_`_l>{_4#GqS7oU#DEcR15b|cw8Y2Q~lPF0--RBAlLo@-?nPiRdlB743u8->=EJo z42}~=QCjwkwN{M}t)Zx_kpS^}fin2MuL-2}<01_=SHrhOizLv!c*HNlx` zi+CHx$((N$(_Ps0k-9;GZGX+MKWTy0P`id>b9Y+ys2%-#6M<`$LPQLAPbUZrP*5l|3+|+NYZGsoOJK4PNlwe$(j9DxD{FqSAdz){%Xt z88i}wRfyOZY4On0I5@`U*4Z*OOK0UqNa2`OZJ3tPIt~EkFn`L=~&*$088qfZxuVZMI;l zuCM3mwLa0FdlK0l#q9ovL_JeXPb#plM;fTDvlMmx4D{TsToXLa{>Sv%{0anHU+Ez0yOBM zAG%2LT|wSY)5-U*cEM_=Q=;y9#{bS@ikV9FyAgf)-&YZ+AVUZd=cSZv8re9a2It9_pTVUGNA%7Mn zTj@#rJ7BX*$*i|ZSF53c4;O5^7@`5Kq~4E$!AdA;Y_-~o8*T}EUnZ$AsVQz7|)cN^tV*naT{{VVLM9YoD%8jE8OeKN=tLI+OClIz8vmyk-5rW_LnV+oh zOSZ)f=dxwXV7mlkGT%son?&$km%vU&!!I{X0>U7u9xSod{ASa=X8E;&B#e9wmozr? zNw{Zj>Q|NESH`c%!d2_;X2QkVoaUpF#+tWmuUn{ZBSV7#k@kS}gaF|nv>*)Fv><|a zc^Q$!E3?B`&oNbONk4NxP5Vd8J_gjj9kDH{+6ju7{OSfwBo_B^j_%TIA1o>}yLS$G zRe4QNm6Ts+ps$cXVoE01n5FJS`8e56&Q&GSwxa0}q6`?oS~aZFILX&?0005CP7h{8 z&QpPn-&=HNQ|Ev2`*rP^Pl%A$OTZAf}=oXv`yvt;WVaQ(Zt`0Xp6FEnUN*;`dvz?nRu5x{6- zzP?~XPi;lSN=AN!sz*0uoq2@&=OZPsK_5zXniq?b@*fo=4$+JG6PRxIQYfw0eAW%XCY?!aE}FCI>)sE`=zJkr&uQ1y)6x*v zX^7)iN2>JMn+Mx?Lte7mL(}s7n*3(a+eK*mwmg@ebJ8}RW2zX$1%tzBmZ;HQw^$mk znCF}ZPn$G1byDR}#Abb-*WLKEbGX&R#O}d~P0q4zA#QWks^}fM&{T;9W~@+e>4tCb zy5HmY>TBQK+5#IopDe6SIEF3~Q9jx-EN*+nQ-a@-tdfZ2^v$8(f{LZm( zmWiWjZ10KJfQ&@n7b^snn8e~jCydK`c_=tia&HmC-?3~%p*4F>_emslC1OsQ*);0{ z(g)Av%=ycUyq|W&p=BOI8cV2HjRYuBiBAR0gh-lB1F+MDr-tzyTh}@22H+UK-yxG( z1D797F*{2NY;r?IhU5uu4a*h?=Jm)a{1K#=cnG3Ma0tW!#tckEZH}S4vy_fykKfC3 zZV!Tx^dl`ZxaBOVW0%+2I!jd_$MU`jwwGU2W-_qV?$58HB>F$D{-}QrQS`&!`#L}X z2!ctayzE#OVXbR%%&4rnRNNNR`<+aqGK^mr7A2(33N&bbzQ2FD-r!Ei>FQA6pk7aH zD|soz+Cg)JP_Jjis@nk$kAV;$AIKi;pv3D^m~(I;Y)bq1zkdJvHtj@$&|q{i2qi-Q z!OyqER=0S}b?xJ>dtq1wJOA?pZu%UDL;OvWdoU;MDjXJYzb(3!AYGR^aG3-ZFs#9Tw`s8AeFw8InpbyiPL#pP_I-cXJ);R&tb8YmkA>8YLfZ^0 zWF1<`39+@&bq2d2IcxrL3n>#RT>)#{(FvXz%-MMH`V`0*>xXZ^tf5Xq<4O0kJxje^ z%!xR#?UEH1N!uzJ7t*c4dW|xswQ*t^TNkL~RW~Tj%af+i?65)*a8;%7=qrJ9NZ$EO z7ZYv43aTpdvSpHHNjz!H5kDw|T*7)QavC(?hH*rcB`Hb*Mn+CW>4+EbZ4xO+(rSk} zVN3$uFHkb$^$k2GXB}6C;H~#JzD^M&kpjQ2Nc?UmDv5v(5C8xG000nn${nH##ep!y zAgBM_Bk^w>b=x$)GEMmA>vx4CCwR{_&_y`M*_-8RB5F; zOATJItDpkjN?H&UH0qB=qJ8Suo*y~^rN6XF$*4|eRO;0~lXB)Jb6Yg16aVi?ToZAT6_jm$apq11pwoFgO^g{*zoG<|DZdy=VJ zZY*wPdvP8qOba#m{3C^80-CScQ1mVnIdC!KDK!gCZZ57=ARHkKR5iwn3ShvfP!L=H zK+2l)n1)_vn-VBh?~p^E;mP_Z_H~n)KMQ$fbkIY|iR^w6a!#4&bt~J<6mZ7^u6G`) zTde`&cwUpfu1#dwOpyzIt)@MPx-@6PdIwDZHcS)cr=&eoqSkms^Pbh>H`)FB)_&gA znN?xnS-$D4^{P%#quVPIsx|cBX~o4LNLm6olyNtwStb`GrM*$b44qY)Q zQy79hR;y}^paV*d1jZW~R~XQA5oN#y(p?S~G|PmAaD2}78@}$^-+#LCQKJ+FIoMor zFgHm#sn3Fx73Di@jfB_t-(}lMeA*^a4$# ziq`$KwQTKPjm=H+y*mJ{T=?15ro-MLaqm?ZQ+NFqRf+9(U-F)9Mdm#RY1#(sA}UPI zxxbRW9l3NE4OOqkYTG{hai252s+WRIo&0PPp8=+QI_Z)HPbCX|O!|W3ru>q(L96wB zbXy@hU7ryO@J{Pfak0dJ2f6#O(;klA5@t5d-{9ucQize6bzHMwC;^;H zKmoG>km5wep4W5T+s9Ah@_zHZFO)0Eyv|wY_yb=vf*5%b5LBw@kGxRgNzI6F>3BZ| z4j~Lwb;6AbP{BkXr}v9lLUzG=jH+90FAmX_PD z!MvCTj!b+NOdml04)N<&Dc*G})Iayf>;`5+P<{HQ07Arf+Q_G5Ti|b1*WynaZH5}S zsDe@t_fimqPHaV&Zp2b7Wz9nK!JA`40cklk%K~pK{(A4_sRcQA$f}w}=w{ACE{BUA zwx~va~bWxC%hn8O^yJI&RAr(|fsqtu;e8~}E zAt%xkQ2`lhAlT^EC=(z90#SnB{2z5ZAFr-HLgksYjJmABblM@J$DwdW;?fhKNIjoU z`_5{zGg@jN=g?AxIX=Akq80NEw+^N|*Z0+Y= z*s~p?M}1oC-Z!2a-CW-P@C8_H^8r_5RS+C>M;f|>z~cyUn2U8zzOL^7VgLfi9dfCf zU{J1dq=!*O25Yzj71!KjETRi#L}hAaJte$?aJC&h9^3KK4aYs2$Ujxc6Yx?R?8*QQ zB$<-Bf@(2Qnm`s+=An27EP+nGOG67NXG%QrE~0nXD=Wv@ob~2DbsOcE0bj$vF@qou zAq-Sy!jlIO!9j2T1?QPvMogRT>hp`b+K_81gDXQLXXkZrc0Hx3dpLY@{h@&;Ka<+6 zHEMl_(emh{jT29u_S{r%kGyUehe61ir+;e=#qo`FS;>`mNInYEUMTQtyEPkUn!R;Q z1-d8hZ;CZZ+fr-uPH%24=aqCCj81V+o*T(}Nh0MFeWvnc*=;)RLL1 zc37^e;w*PLGYFv~{0#9~c_haj`YhN8Z8^DUiHuAwmm7xO5?w_%KKX4iX_9$l#Cjtn;#BCXt}q66=j52 z=*&bYiG*YYKmI4vxYYB>O{Ajh1x59q?ywV)pdx#Qh}QS9$$|+8Bks2|4vSA6Y!%C-OdGx|*RQj0thx^)Js=w%OEnjW3JPqgKB z%Kai|tM|pVa1A`!%mPl`!MH|D*bO_yKIR{wG^xXfY|B~qmVCyvLj2s~hRDH&Z;-WzeG&m516#n+dLNScps!LQ5 z(z3e*s7@iS^v%6zk86kCR=gVNmq_pyxb&7M?R!pEYl`9CjfmelYTcUt+jYG!8*@c` z>bdxYWye9W`|`Cv?I@yHemAu6oRuU0uJyIf*t>L$ftT7U^WhF@*;VaElG)#%(l>z9 zK{6>(pH1WFcEOgl%YEo-a1zZ0am__7Wj#`$N=ITHAjC-XF4w?EE}JEASyWwXircAJ z-xHf0sqin(b88(7L@}!0lLA;K#2&1n6?%l~xMzwwT)NOO{;dBM+|wM_2qnfq77kiQ z2nz%ytsy7ZL^=KCf;k#cCeI~Xa@B@}sm`!cfnqha9g4R7HKAkh^TKR zpWc4*%j{!63RWVqWV$ulJhv*sNK(3j!+tRsK0B++BP-DTpfJfozctG^MNJ zns(8jkFVU|YZRvBtnwI>s&zX_3sVN6dJ0DhiV#jOs&BwghA0)2ZJC1Jo#+2L3VGt3=mVfl$5v>1h|MWnQb3|j0UAI=VU6s#n23sud zQY)Gk$tAB0pa93*J_;!i>PZ;>m zx;xnXIg5>)pBtIRd`15MDd$$W$vUZ9=NCQj+7sV>_za#)E8x9vSbk$)la^rFk^sX) z8=U7r5R%OeG^>ul1rDrd$n&3rq@+_s`H0?%|#nyqAKwSYwNt&v*Cr1z<$5d+l zZKj$T+m>`;p6UZ^6jrI4=^~i@>4sEQZHN{L$AS<(SBT8Aha}4FB(8Nr& z001+b<$$K=@z@nUC>CNP=^vVb4$IfnGB}6T$+aGfQ<)x_0H%l&y!w$Q5+VGWEP74Z zYzcQ?0?ZNHBbXZjVIvW+M%n4+7z+^uq5!E_A`naVetf>aGtD!3Nh-B>m}8}P=PTO* z8W%~D&bIs)JLM|&oF57Q2@vikeZq+?uuMc)j2pg^E`M3&BahqjJ zqc0W&i}XKv0U9CMQmH&gDyxIvO?0nDkjoPZu;put#BLm(ypi^MD0&R>NtMd{7Ad3Ipv5W(sRdkgK2bgCuYSK2>&(S*kGFb8#~ zg;tpHnnxY26{euvhl=bB{?_lkvBI14u=nhJh3_&zTbJ+NF=B?_JfFCA?G&B2U{zAw zaU#EtSr0EMxh5-5kHV{CJ@{V&)^bg8py(#(Tg1F_j%PWDt%_AE+47k3sOb3XoqKdB zRmS`UALL%1BCh#XtYtGPmg==Zs;?tQcRGh5vqil=|Ae$mJ4#U2p*#|RSPt^POPDeG z*tQtbM%xt2TMu9qMCPf!w8Hr)k_{aW(@zSV;?)70bDZQDZHJ~+DPc_NNQldN3Sg`t zmgnPAXu6)qDdur@IEE}HGnA*mGcj5|kM)#jiZwt0RS3})YooyEDi{(50>e?T#6Y+G zgGWrqY$csMX+^JPf-&xr<9Mi6rsX82*T2B*+%K`eN!W80IHLEs+-`2*?Cyj$mYpDE z8vWclYN0jNOhS?${5ebzR77tAwXP_OPz;_3Hx zU;vflt5mruOqEJatCv?s^@@s){QpsL0yh_@uA3K4$`ZS{#2;`4o%^jQkRF)r@+hMT zvPjBZ$&6qJJFk1W&sK%;+0*T)Tu(qY+=8}TG#5_!MN}Z%^=xTk=#>O+iZAO_+KoN+ z7?7d35!j!U3l{$hgMc9nR5ikl4lsis{TjzZhi$O4Jn|JT6a)*_i2Vcnisa(pAoHoN z4llc9RY2{^J=r=R#J+pSu>TmQqMsqLv~yu^w0VcBA=LDjpPv5z@{!KJ;kXfUm6zUp zW6mNxf7QZlZR(FfX3y3JuS5|$HzH%7@tyhGmpK?O>UUw9Kx9@MH9RI*4rF89(`!vi zb%yD6(pxMGzg&&zn9n0=$8u0wkkwS|)@H9qKVthq+cWQUBvNMaNXbu7xBBnba^{~k zA|wrhq%ne765zIk3q+#=1k7Sg8iEI~3dV^O&?%Qbwe96NVF9eHa}&Zedvew{K#8e6 z8K5p2wWtKHV49b8l@y#g2)z?VQ+Il;wvArP4wS;o`YSWgWF zs`jIV=-jP>$$)P%Nsr)*vMX`g0KBF70T3=(;D7=;dWtRlPGkL65l8zdgbGFV()@fB$ z(T>!~v1rfMlELC%DoWv6CLt9@k&9Je#)U$ep`kVi6gcRjK?(s+iI8g(*aa4mb=?X| z(^|ap;;r)rBt%!mb**Yfkf()nc5*9_s~tMy0QQSSpeWFa)yG%}J2gR&f?%M*ulzl8 z(d?|-7fTL2Nt$KS0ueW)yanj|S;^Bg3O?S8EYV=%R;G-rH+7-tF_nk%B&lUOF=~fz z>Sty)Dg(=aM$d4cjo;=4tpZZw#hhgCVj56v(|@ObgAbAYpc7TysCv?Ybl{)imr4a$_v|R+DuwQgxN-q%VxH)70FF3_( zVRtgwH!d@ZRaB!@BVcUBOk`&5)8jU)4odIe|NIN=zfYh6GlOT_7c?~L_F8WIHr-3u z=veUk(-Q`Uh-Ba}a}sfrzT3o~u=;&T=6H21advB;XmrsV6@{^ITFHYc3ImbV(bJ*7 zcd^%3x*+O!ws6S1j~}|rFVh}p0$+EqGKF(mi$m^rDcsv&fjD4rmwk$w1h;aLGAnKX z&uzBZVUIkLZ52#MB71lbII&}1E}fxkLOLUS&I^$o7cp#nRVQJwq-JGXQs`frNJAjN zaTP_mOghzyaq?50PXOzo3FlPaq|RNTD40r3!ZMu51SOu0VWhE8j1(9(|J1gs(BF9? zIA!2VPzcxHF&od%%Tc7z)q9Ca^&rF*s{>n+ns#Ic|O#M1>{8>TmtJ#F*F za1>veY?G@Zf_vqm>4h|{j?4e+2t`_KJcsl7yNemnM7D;(peGrO9&Aq-R< zx{(eBzxp?D8rxutK#+(D1%$sLzqUG!T?;}3%`YlinDqh>iMO%ydIfSk*SI+&1gAV zH7`#2rl)yIE)_l%1a5t|QW+>R5HPX@_Bp0fCTW@R?Fc5_KHwju)6b zDWtdB79^eoku~LkvD68POjJs3dn%>^-+sR^EPbiURG{4?N!lckjVHKb!?oQ{kFMWW zWEk~=zu(q~tK9)K#9{HHL~VeJ3n#-vfFTT1-O7^)V1r-(aSOs*)_Xa+Rq&+?F98lg z=CVKGp#Lsprmw$e+B+%Mg(P=m2U;K_5#)_tghxN*;gUj$wGo$iRXASP%{^6vo3$*T zQ70i=lYaN?%FBEggP{&mc4`gJwI(dN{I-I=8&q0Dn9jOe9vqV?I;-=`Z1AOA<1UWw z;n}IQRj%cs-Kn5_QzpP*TofBdudL%jt*)b~U9Z5tC$&eqj&obMTmzsF%5-$v(Xq{C z*tj~xn+j}2+w5^SIoXW(K1Xw0p`*!qaeBn#sQ7cX(4TzB&&5fm;>v_OB;pE&n4%(r zu1{(?Ovu%V_oGxZGWLlA9y|^$hFk5@2!BkslaB}sR2CI758F?^yHk;eCPn<((Uesg zyoR%06e|mcf{tE)ub-S7eLV`~GKI zG(O9}C64wXf1z6L9sAcSKIKHN2e~0X*xPI_{gv)1BCS~7NyT#h$`k>*ATgG8D_DYJ zZ6mFO)F{7p@kpn+M3$K0BhTKnf&2g}={*tM*RKv3I9rWb)DJ}cH4IG#Eblp)oM5Qy znG^#RNtABDm;#-6Pfu=CSg74NAu>Ka8H>pfj-4l8B|Gzi`t&#<3{&;WkqIG!-~CYe zw-?OrG^uxN786SXdA_Vm`M-ZiO72AtosX__cM<=CYXBBFVd!qEO-Zse5;+iWPJU3*29?ct1$2I3E>*~I1jT+36O!9bF z+g!tEtv*2S2LxB1Ye{Q=!T%uK5nYBn)b3Mtj;2HhbWDvK zp(pGqW1N=sFQlH z0I&dIskMZ%0_8)~#n3(&<;@&+yiu0HEqyIi8Ad?~Xl@`zF{zn{h9Eaq&%VK1l z!`Sw?bZn6s=tCA=$A)QoSf=MS4MS+pW+_6voS7`tOP_H)ef`ecJ{yip&X2l-D!=dU zrin2WfHJz%9WQ*SL!SKPF5JpVFq7Hgbh%AEX7bRVOj$Z*bzIwrgI^#VRm7dR=I}?DQ76i7_qtZ>hmU$ziQ<*h=EACJP%MKo{z8XOzJG_#N8yf%Q!NSNq!RXgG7Aon66N1?(itRb&WnSGf{Z>qL+hnJh+|4K}Z_M<{GMva8Z6*rGK|oj{5L5r`eQ4u; z=tNS@Ooduyug(DmR$V^5Dxr<5tqNTzWlS{dFBV$x5BW(v6g8@CXR zr0*{<)%fh9nd2*D$)1+{%Nqe@G>mti(=wX8&HxL15Xq#a(@ zyF5UO>30DI{V>Y*Y(0q8Fija%lp~r6g4}4yRfZl0 z3N@5sAQ+sk(Nx`6i@2164>ecR3=TvEbj2ujR<*cuo;%b(bRgg-KWT07s!9l3-1yE{JWJKth{ zj5Z4nkv1=-a6clmg1XCv0G7lRa*WqAFg^Ic44 zIcK1O;6|-~bFsTKx5LmUv0pq3e?JFDBb>NvIfS{$$UWdB_o)?@gkfkveC!$4nO$+M zg6bPymnE!T4QE+!^@|3sn(qT)s^Boy=s0GoTvKVX#d9)=P)`KgD`ssP0m^`y7=#`G zHc0xSCkU>O06-{Cb1Mv_Pm*Dda}X~b{`iBCt%*5|LJ%}fsL5ICg2-jhwz@z#&IZxg z%vb37{>9gsE!Qjh#2udht#n+kLwWP+HG4E1>U;LXbGla+p>wjQ263H%t7&F-yK8#^ z-JzS)rndkE$4E7Ck6=FEpQEoC}5a`}3D`#oPPq{Yw!&%_R%uowUX z^!*@CKmdEY7RVMRZBnxpQI{|Nj(S?3A9VlIP^zYTd~^wT$6in4FQ+9SkvP46LF?iv zqbg&3j?QO9J#B+%;ZC^vJ>sepGqA&u?0?!WFR1{s%gdMd@JrFSl03Jmk?mM=S+tPo z*oqgS54e`-d&^=03MH@ds zq^Gy2*A*{N7Nt{wvpDIAfGdA0(8f}&r3L7Ca_Lu%Y{a2QjdVN-_T?^DHCM`_U0X$( zYvkM@E5~}O#=E^$X;uVoU>y8T&hr(2XHOfw8uosF_oMjwwZ!=JdnC={zJ~rJ`uje) zb$yDU00002008?y004j4{7&EPfHA}X000kfy#N3MfFW#DO}?x{1i$*PjrqdLYJ)X0 zD;767t}qhwm#GN<0l&oe-+r5^IkwroFjL4@A2i@as32Bg=A3>9|D#@ffx)ZDL_D-C zn9YvUdUwYB*Lv{sHUgokm(<^XWmXqq^wzvrt8f2DtZW`+E!K2rPtxnM9KUPc_loVS zuH1;Bs4RGGO_~=Cd#){7X%~4*!?I&%=e9d+69g%ZVxwyc9TA__q_oPP-xRK}=;#|_ z`0qV~w2q#IVW(jUl**kmRBYHJXdqNpqEdpqOH)FpELTSAsj)SP>nS|+1KS4?^;KZY zO`&;dg6|`}1|g^E986>|rcJkU0A+}vgq4C6)h9U7PUUUJ;oCo1Z#`SvcnY<9N4efz z80^uzX^mUE>N~z8BZqLd|4i;iGR1!3a1pMRDC5`g2D3GX-!O^0XzSJ{0aH^*6xosm zihw~n;R6C<$QySfoX4oZI)VU4SXg$-TM7^YK!RWWHNU%O5=rIqA$VaWWUhRQoP=;e z5%dtgypKvboMTLo>9Yepdi3>OnCG^Th>1u9h;M_2uinroE~;TVC)CkqT)2D2tKNoT zlf>DmHaN%Mw@l#GP2f~3y^_y$h_7a~Jm(v+=cik_isp=!yI5116X6R(BSdYOAz+}` z4EoJV$%>o2rbP%rlE~g4@}m#|$<;KL>0=TQDq#XS_0(_;E`>GYP=FHEp25bs#;9IB z)a#a5Wjr$f4?Y(6Gi^V%R7x20WN+M4YT|Vm7&5>E0v6Qt4CPPB!7cHik{2vs*LOH6 z@MfFEZft7B)nO79STMc>;qQK4N1b5_v!a0pOJienP}rP8iWx;vzhrYR2+K)AeMKT= zYCvOA8h3sn3{<_!i3Om-OkkJi==6>gM4lBQZFARRES8$j=k26lxok(D;vAX2TEwjagOF~?>Yh$obaM+OcmsX|NjbVg8L!hp> zPDL93)VAXQ>dMqd$dhP6S5Kz&4bL4+HBPy_WzCvn3X2Z2*;Liq&OZ7vWM^FS z8;{J8$QBt~6WwHp8FYxuunBe8gCBqQWZ)^G2P8a0oBj*zJB5SILwHKMjKrO&Ko1*qvd<%Y`vR@ns) z3ol2k&M*N+=Ad0prk2{Up+;C=9iS!LxdW6-nhJ7@E-c%~O{#&Y)>KZ>gUyj`I_C8!!ADsvyseW}ur#ShE)&&4s74cT zAq-Tl%8>`5xPfl)f*eLuyCha{Nx2&g@6*ZAhxY1U>Rp3Vo+WQVwdmRP5E%e${0kc&n8L|gE}4tu4+?iw!%dkX47x9!-(#XZb#CGasnm10phlff~w#Ym)oxwK2soe9QX zA8~96LI!TcH9zBC7yL~kl@-vGt`i%JVd&oF(4e7wqx#A9dca9lYhqY^u9C&cYUjvt z?9Zyn*iGA7lcQn)h6P#r%nG(_u|5l)aAJZH->8zZBJW?fdZg==2c3m0~MeGB^v z_gb=a3AS@6JmX4zk_)9dMs#Y^E(9f}MVeS*&nk*FG-?&Xxgl3lHP;BX)L_?|cFwT4 zvx{a-O1zdiHc2F^ov!7X7{JuB+vEmZPAGGI=5(`r#he3&T9Rv|RnbYP>8hzA%{Z@b z)YQ2lQdun%B$*Uc6UdHaA!?D*JDtEG3{=&wjbfv~=rA@E2?hyNSxd`CNbX%*7bJ0n zXeC=Du9HY@+cY;V6n12ZDziZl5P@a=?wIiYUG5*U>JJ&bY^Dkk%d?0Z3qR0XjMn5B zM1E6jtw;`+Ld-pN^CrhjdmiGZ?60`C=F8tG&sYGhCau9yQD2>%4SS@!SFUASEiF>U z*0g>q8A8+9^q#drfwRce@vm$s*Y=t9bUhAQFSX^p8PiBb`k_!ty20n)V2kq1$~D)V zV&`_}p}MPK^|qVplQ&h8pyfcRkLAA`5{HEu(~?kfA--0L;es8>EhmdBDe_tv3i0;Q z3Omf0%cS{oBWM_g>OJICM~;PZY`INc`a7&FbXLR!ehC~h3h=7g1~qH{EaYO85rt@k z3m`AB{0b?@TbBwkUqpXucdRmHxh^ZMf6_-R29x-=;-$4t^LDy5iU!1hvLGxJ7$tKW za-SW9j@HZFqgALzfnv&8l73c@+?HrG)An>hDrU)~k0Tm-E4FKx|Klq-6$4_v1#b}b zp65>$ed?Ig$?ysar+a^iPZmn-Gmew#wjPXv{d&6#^TBzma#!n%6_$$qwipSo#GKco zZ$@FR>A>RZuNBO%<`?t zNNgueNle~;T<)s+47J59$SiXT!?bA#aSA(?9Kh>PEC8!Bnu422?o}4(wBxMVkcR|rnL?MA#q|=*YOk!GIX1& z5hqFRKWJmQ{VV2Uj09aDY6mg=YfczfIpLWK!{qlPAg-n?9eBq~HQjJA>%r;EhlTN_;>UJi#l zDzGCaq6=EROB@ELTN=O0Rd469sfk2sN`9*D)0@aaw1o7|GZ{to|UA( zfo2*Zlz?V_56x$VNM#Iaw0Eq z<(v#pnk`7wA|AUMN@75Cp9&lTl&B@tm+Ua`EFLREWz%m&tk2gPZ&)I%AXn7Wx2c!C1l%Dd$|i|?42+BgnTp2nhG%OKZq++aFG`2p z?8%KaFhZ529+6}gnWVaHX6{l6!kaO2n-01CxSRG|_V$|Dq%D@z7zSp605hF?xVsTy`=2!{n*P33M}k-|fCR2crX1at-2CHZ(@!^U zndH!p^+TgpA>6dVwV(mwQXwcDAuLq2#*Ja4m|!SCVI}ESHmJ-qI1^F})ro#40Irso z21UrXmharQ7Vzz2Y=x%oi1;z<5me;CV_J>s-d%%WVY}A#WwO@>6szy>5_5+44 zFqzARe9q3+7DUmAp5sMLF*AvQyEM{%$EntW4RR+15F*4NPR)jUjX!7zFia#wgW{|V z-^AJ6fS12#-x8B@RZTJwE&gh&s(EE53b(PUqOTgpu-7QmMPjuLzpB|KYojw%j1?Fx z=c>h>W*)rku62nT*Ib=C!S>_u_c7F)&C=N5r~>ZD)S(|wBT{$9r^n;4KVqm8y`XCl1qdTH>1gyQ7JL*4$jARkxV z001~4PWeOIt!79&@E!OK-EA+AZ^r)HF*@O$?=&*6V1cauAdGqh(2^Nd`u;L)LH) zRcVk_yyeBJb*h|y*gzZ71A$W`=$R^Jd0n-ns9Y_E;P_0g~p>fDx&ph-lIZk=C}tpEO||-{0G(D}VquKvjmm zw*YuA5BR<&zM&&9fFu6`G(rdL`adl~^OVUVO9#b{^9SF^kT+gR9eL z-@V|1!fx>XM4MBf*>9{+(p6v)hdb_F@9dnDod=kDFY*ug?@eUkS%n}WP^2a^(8%I8 zyYNwRU0KxLS*d!q6{#>0^_mKCm_u2L#ub?$@4$B{+y?n&<@xLR=k`_n z&pz6ZcXzW{P`o?SF)Tc9&Z1k32LJ;5~1kXQg$dPDjO&X}?rYaHo)2 z(TKQPk5nRNWjAk4NozE84K7%3+s9m~$|Y=R;AZsqDTs|S7yqXQ|- z8ENbuOwq48R_H1m3lRkP-_C4n{rQPI>>A0Ko7$m*hGTl6Dn&3`kJ8h-W zMuCt`sZz(WB8)wwKondyqlS+py7`b0u&?X5cybN?i{kXk{^x}d*5mcL1TN*s;_*Aj zGrDzr-uF9$S!GExJP(h=Y!CiPCR?)tiY~Ss&k}^N^Q`Fo3V5U9Cmp!@{bxLwPhwmp zoR9vWwTS;9WPbNhUNeUG(zE`er7SH`gm&ZZHvz=*ip@f!BZpU}6q?zKqdqePx^T=& zv?|6)we7FvpD2k~t0Q#akcz~QM3WH-6C?x&E~s86DgiejR^;hb3X!;D1g4RBXE$QQ zoJmrS zWe7n4cX1|fxk{N~@d;IgzD^PbcyD8tB_8!oI1ryzzd`zv2pg+e9U+2vYtycp;pdER zyE6eUzElleP@2)I<+5ZgE7i0;VJ*sgZ?)r_0c5nAq+^w*;oF_}!vT5LFF0FDdOC@a zpN>r|$Zfajl8F!UzsBwoD+aS7p||yRWW4uQjnP*&{L7SU^|xF_i*Ghti@MMaDjS0$ zoP{DtMnW;$TPYcG-~SdTZ?MbJAZ6Qd<`Q)!6I(@#0vGo^6$QMW;RF46-P&ja+q&cn zV!IGHA#7Bo(v<{Yz|0`0DHknAEgYCj$Vt0vGhl`%w2|mth=t5uorcNs@J7t8v~1ME zv*$`nA_?|ua-!3aVroWKWT+yLGkx|5X*Llonn*|-&IxGwT_5D-?r#6i>T0BB=b8O&5b*3f#RlRMAZ)lFZ!BdLq)LxqBH=ok_HEc%a>bwP<1hj|G5;6pB2C zDl4OVj3|nLDu0oMM`%OcM>6z(1dTqSn&7-v2FCt=AZ%) z3lDx2x9g2p%4gY(YP4&wxnDsMw@3ixZ@frUm7cf>Ahxdk2VI(*d?0a1)W!80_fJmv zv+4!@yc9g#%*V~~y)E+>2W7ccO@i`G2DX0xwN{#5wYrkL>fEt~Q*~nC6L)uTZfnwJ z^ZFZ&jDd=glRHhb-*qhZWc3O7)lkWIkhys~vmK8duGPudbGS&%VYF)*+;Q-fra4(% zm5{vGS~ud`Y(eR0RNbL#WG1B2a^Zw9qg50#c*3~v9l-(OI+S|C5jMe6-IDcPA{c7G zr8tAQO`W|PeLeyWv`JQ=+Ha_)tUxiCgju1l>(BuB06Vqp>;N`N$*rXulO!urgeU@= zHHd#H$kgK0mUzc#RYFLxn5&tj5@GaT|K+XC37cF&Ljo}{fG{NpEnQVI=Q+N*ZLrl# z#-pAdX2ms^BrY4LY^g+Yay`0yO-WKy1lf6eWfBg0`~wD<$rcQ4nS4(ulx5KdT=#)C z_1z?|*=S#__VGvbNem!LbX&*Aw$Jr{4kgXgB2Na97J@z4dv{5yeHQa_!b1lWE8vh#!i3kx*sf}73NwS0 z{MAEJ_lULaM#5-otL}DZzuVgmmBGLv3{L(3|M;K&Zskv4h+t|EQwC^>!&jM=i;`5A zbD4ix&=Yp5#bls+p#6U}eub`iIRBoy5s%p|u`cuQecy2ZRcBFhOSaKHC%T=qdcR<% zZtIa}gE6a8OHF}lgV$ys-fD0EwT2tudrzynQlPB%$&gas zkV+m(R@(^T4P4?veSY}>I|=8o5<1eV*~`0zg9kXNBWV?r+V;J-JZpPS=}yeWiRwby zxeG(F6E({jiytbQ{_25y$Tr>6Ies_ymHMV+#2XTE9ti;FP8hS05Mfr?-baAT>PD9c zawmpcmDS!yb71~pYO(%;o((}5PgjS1P(%8JT^xZ4AJVu)0|a2X;NXgc?(Qdy-^U1Y z80g-q+Q~2ql1x<~nUbYBl@v4tlwmZYsaH-e#!E41+UQf5n|v#;tJm8r0GzeaY%o?F z5XWJG(3Bvi{LQ(xj*6R8FNzX%H7{3T!Q)pvLLJY<1#k6H#$F>4^fO_R8f>S(*U70Q zqiSyegS|Z_0R34$FRtke&ka0*?Szh)y~iEznol<8;r|NR?8&a?dpsMHLz%grN9&s* zIEjgg_iTg$$c#5h?Qnd0xmoPd9u4koQDFd?eqB4gd#!f;dorR-F77F;BTBop7|Rj!O-0r?5~={1f&SLs^xqK9bfo za4oSmTln$W)(_x!n-_jh45KZ$+9f;lQPBB9gdp%4u$@&>gciH4DZTTY~}`zN}KeTBgl|N_^o^y89es> zq&wN)-i?0^*fm9JA2DmR>!(w@-@N;evJQ#6Y{RK2fpOG0-^5I%=g8x2G@l=iNkR4+ zx{Qy-bt_w`Et}=>)l(7HIV`>c9n~dekTtql&R-kp+7vtn3PKD!%Y!D%O~pEcG_{Qj z;iL#pZ)WmnHx=pS?OKq=y0Qxt_lZ)&PWYMTF_zV>dAg6=Q(r0>1f~Zhu|f7JKo~fP zSl(LJIrfUn5&(wrr&g1#VG=RUYdHxocFuE<%MuHchSf}A!4OO#A_Nxu&V4$UdF@GA zjW9&FS1OMoWlOql@VdB`R)Y-^ji#^q2JuqC2|ac;a`9?%p{qF?W(L_MVx4!d#& zJ8rz~4|jbbT`7X1rZ$F&G|9-ebQ8y5!8QdDSmPaJqb)&1nForntwlzOxh+T5%sE5b zc=mo2LbQi~?(qDbyo+L}L?Wt<)4=66d+#h&ipQJA-z0O#I4kta&u%@i00UC5>a+s- zfvj*L3{Us}|JV=yYTHnNuxKzL2sq=G&azK|UXsjV&SaGy9%T4|^#6AlMrkpM^_w4JZWrxr1XGUYhd zyvo$D@TP;s1KyqvMEEl5X=U4S zobR>5ZMpw3o*qK3j~L7P4SaYwRrN>aXbxnBIi7=A!OqJMEw4LohInjVKw)@y))dyM zbd!mfG5R^XZ33amCFvu{5;{adOqBs8LPA4cm$YiGkdMxb?^xt!B|@G-90FsC?e)3K zj$x>V;4qN6ov>ralF%`LIy-1)D`%}LM;!BgDO3Z#<0E0-AuLYC-~ahP{$|-ou+bpY z7!iaVxkhlB6if;&d*hC0K$8pABnWH*6;ecyG8^TBeq{U$IkJ<u2wW>3!3o8wDRDC;5`aY!z94zj2b5x6f zK&pr`!ky+H82#jAY1!F<5vl?&V8T#LlcrDXO?j6>Vu>(}rm^k&B217EzmiB|ArJb9 zh>m?vzS>7M;fy4U`=m{-l%(aNjR|8AU{)m=r*s;;{P3E2`0?^@%>BpD zFH8FT59#TfDb9fz^Rf0cgC_qFi{gFgiL#Z9iTqN*XI4w1!CAg5wn!OkjW=ArOA3^s z#ran}9(cB?Tx%XVMUyf&vA1jO(eVGMnSaJ7(qmx!`_B-@qV35X6^Z)M%3wO$FDL zu*gcLMhPt<*D?vmh)(7lo)0ij8)%*aVLO%y&aO`UQfOtQo#s!J3v!XkXvl^QLaC1- zul?eh7Qwwa`BD(mZ+fbv^^G2J;RQL|pDz20EyET21DBjmO~D|1lP_%9$&M;9;+iaW z1H-rWtj2+MAq{;gxS{t4XD~(xCb7a0uvj#9V>}Ty;;~c?^-y=-5#*^=f!E^v0ujiVmT0*HJLyDcLFDo$&1`g!86{>%bsxMT z`aRF~mLqoKvyKqZTooJrdg#fpPld!l5K_ZUyckomn3+XTsIc!A$}#fopYK>eWb8Fa zO@c2J z-q+rW?fFn0h0=J*x{!@IGITFN6@Ks~xlmwoIadfire>hla*u`T$%W)!I^qolix0rc zB+21$A#7B2x}9Qy(5y5e2r2o|OG%njnZ747u9t+OZ+wDPc(D%ahGt76VpYd;iksT@s+^69Bo3;8U;q8ye$m$$Anl|;L z|C@i?_xgs3LwwRycNw6hZ1-k^m#SPVFZ$YQiCP7n9*#pyB+nX8Y zNuU;}&Ba|$6x-rD+%(fUy)D&Sp{!9ms#E-%oK8G$+hw=cTUK=U+L5DUwH|jD@4B_; zoWExA!m3EJ=hxq4xdaFGdN!@zFpB{`T#j|DXMF!=7^@V9*4pE$$NpcmXjONvC&1Z= zXFGH>w`)?_Y%N-~IhMc?Hp)yMguyraA4EHie-&F329}ncWzNGbqE(?TfiCLA)vqp&to##>c zU6K}BjN=KIn32kNLUtiIeN(V&l^oNH@0lA0E2cYFo0G`J)@voV2Y&UWc>D3j(qDWqq4oXzA?k7Z0uJc;gXfjo# z4cbC%{$OU09UB}@!?R?d-dK@^d_*}U7ulTv`*eA_^8J4J$*aOqjqwIhXN`ZfHsnr% z2`kC#mnAWy8O{L&Jn&I9m=0RP6~0^J*TH)ls#uLNxR~8y5{x_TBWc=ObefG)Cu2mX z8&xiTIZs zM+<=?Qa5ba$(>qGQzmc|Xg*AkA1sdD1r9&a-W7ggh4Q*bMY;lR1avQRxx4f3@Xj8& zpmB`jk;7y9g>TN5K5bRcThDfF-6b}W(iXeEfcH%ltCgcWa{* z!}-s($K$cq;gNffyv*1pZ|MefcOku{^b?Vd-NlrPnZ!i z@9jympk#E$DKHJDq{?pRRuc-EReuX@-?P-|E_etxGo--rN)mzmZ*JJ~2)kV_499^8 zL2vBq(sYVyfsDJuEp?R}7&j{+e&#FpZxx*cOA}0nA{K%4pUkKKebE>hDmQ-K@o@Fu z#9#sTkGlMxD!)roTZ*nx^WN#pRPlM-eu2n11oRn}%Oj_R^t%FjV*`B^YrD){cicR+d00!cA#QEP>9o&%_qO?T(Y8_S7>L{Fm@Um_^d4r5HK-BB zDDaF!q#A0XgAY7ZF<^~N7>o7b1Ark6PXBs;`v3ZF?L)B9SdbwYCCp32(x#6WH+F>p z)nz~=oxNbI>x!jubNm>JNQUTfa$|1D zqw`Ka_j5sL-ki1zOJB%r%ARg@vWvQD&t~QnzA>hG&gHcsN;A(e)sq9ttYV>1QhKM@ zCzV(+O{r>l=}k-_isuPNha8v%30@9dpz@zZHQXrG5C!cg-{7GT0blB$$Qn6z_&q*P zWL=Mj-#ndk>N%!qU@30yw-iaJ{?Z%g&SPt3XDUsf{p>5$tMa|8=*>%wmhH_pE6?wdtR*!1B4>vcaO9>0znQc!VN8r)L`%^WKrG(X3Shkt5n>56TueI}fyKmk7~Q)*QOTy@xagNjn4Ag(+%vY<}tT+a${llzaHA zn{^zr+ivX@-(>UXSc{iMW+naMx9wN*l+P!Gl{i~)f$|MjGa3_waUeVPT^{h^A&MB% zW(`&B&VmZk5v4q7R2`CO5Y<$zweVruwK)gEO&h}<^1`zO*lIxw6QsnKTXi|{QF!j7 z8NeY7RPEM}24KK|LJ&!EeDEPgS#Agl;S)fdNmC@QGWTkT6RA8yyU7s5aBsu+4JGE9G)K%+_gLvtL)Hnkz2 zUrlA3SL&ls;?>;)v8~Ckm@G7q?&{0Gt-o13i+&t|8&gRRGfeRwxtnxFXGe(%Y&kQm zZe*8VD`%uk2;jOo7Nam27CBQ>TT$sG2sRAK&8(Gaq1;HNd>5$1wUhl#&Ks6z=J0bw z3CZsWMXV$gLB^na@kFFk*BUzphQxrd$RHsIC1E?M7F%R!xm1lpxD0KTZ|22QUcW=>f%du@?k*F9e7Y%Uj{SL{#gGUldPEu?>5^9-ScbBQ9L(h)J$+ZSTQL<32) zINPnM%(h@>09A?w{k2m@=n4GyD#};cw3}MjZsXbxso+3>p=v}lx@g5Nox3cqNo_5b zbf3V*Z|6T4{j%~|F$Pia`^YzR^>=$MzPxFE<<&EpF(KEkaa>SrWJgIFHH%0}2+MxM zFJ;pAV~#Q|?}W$($A}~`#;{xQ8d{&WndPR-qOdPRLD`KPB>*@f3{TU4fB!%JYUx6P zP+;sO2r$PXmx)mkE!I}5Ehhj)x?h#j6Ep{p?$HAF$v_zh_V|c`9I|`}I12o?hVg1F zl+=mMIOngYCdx6)C%SG}%P{pG-M?dr#B}IYRalJYzr4($-LP0b5ytKo{1jOBICr{l z-V64A=;Ggc>(h=fvPr{dy=tnV(#u-h7Z#Kxy2f5(BtJNEY_|>EU3oo!idzF_rDVA&Qwh1|&-wntsLi^*PBFgyQlBj{i{QYSMSiV~K zgx{pIi~|+6w8Ebj$AOCya;r&#aG8m{%5!CfnAVUY8MUm?ml45aCcJf~CqPruXelPh zDs#-pA&7*IG8HjUu7IibfR|}mX{;ersA`+YicEefa_uXHaZu(HsA6OU*}+6%DdAY+ z&pf%}s_HE_NHr`0SEt6R`hi}WycKjvG|@b>*?iSq1SLFBp_ib=%|z^IIrHCk4z`=X zLXJaq?5Y4yPU#v160m}^@tVWyN~wzE1UIdTpEM^@n&2S}Prow1zkm8}>q>#pOd!-# zHX%b1g(*N!fwa0CeHnV;s)h05e60r6Mj2_=4dNK&Xl+6wd9kX@B9KwNK@IKsWp zk{^ZXoqrN`b@8yflh`esW=)I}63P?(<{N$l3Nx4n{vVwq}6S zjQBlSY;A30nj`EfBN-Wdeys$+mF)u_YV?b=Olyz~Mj#0anz+K$8jqUuQNuxG{%H3g8a0`Ws-dGie!6|wdT!daC}Sx+}_$i2-rl1O`EB$w6{F>Lh?l7XB@ z9wc$l*1?$+p<|I99N6Kg#C{87n6jjv(eOFUH#2YAd=}z)Ei&^`a@r`R3Bx*v)G5;$ z0s`0d22C&102zeph(QzL`eZnn*Yj*F@{PrH z6q&I;?I6&D$E4GDAdc(uDyBeK*&h=<=vw)!@UXx0JNe1^J}sude+3EvAEF)iazD9K zVcnJ9Wa_Qe`W`z6$Zc>{0#f{M=@qibd6UaOLoGcm!N{ya98;b{GL$E`B%H{#3|%EE z30qdrv?YT%i;=d_y;4=ciQI8y%#h6zGH&y9Z6c|Qz);a^DM(3M!PTx_maIJhY42*T z*{x-Ofs?PgMzY7Mzw^yJQrY`kcTNV4LV3fjE86nda^FSSPJ+Y};F}F!#QQ6Pb}dLd z2Vd_1Ud$@cUU@$uEL6qHj|E~tLCW>#wsY0G?*(ed7u!K31eHHkeNwY$I?_OjwL!J^zCh{YY|KBJ*bm#$zkhA%x$vegUaNA zR@3{NeUx&RA8SMuDt=p>&N{{j40hZ(TRgQ7J4lGV@{sz_o1f2L{t_7L=-(Q?Ep{DV z?Ue{!S|Ud~^kIq&3vj5DAf#Cg>6uh1wYAq+Z8nmswF80ZBUs%`sK&h& z3bmTN=9=L@B$Lk?q}gas7u>gKnBW2qErK=EFJ`cY&)kt708h%R3*89OO?6h#jf7odA{p&<#n*OUn4U5)_$J}D~CQSd201^ zUX`M^Q{{{CzO|UL-9JsOV|~`V`ek!OEN+{;B@ol?wB*`4-9t3V+bS40Q7n(84)g& zzJ%alnH@4)FcmpY6XG_e#RhT^e1Fuj4UWWIf;eSrZ2K*-w~-oMj?J640906G1UCA@ z99|(lPweU~q`Z05$?5R@zun|&7Q1EIUWclA?E@Icf#I^>yhSjkZ>C;5x z2&+p@-Dz+%ABNthSvr*JA1@AM`u_Vp>K3!m*QrHHm{V$zwOH;U!FjZUTsq;9#7cS{ zFGsrk55eK+`91_;1E9t#-=+Q{F~%%34;F|3KQF^K!~^akY{9ciE0A|#vjQpojcIq+ zx98Wdt<;g{=q)snzk??RxhnMt)PO^fU^BLqj|AIb*9q)oX2@q_iuTf!svNSk%P!)=utEb&NSX!g+lSo4AHsnA@J>-D<9HezjZOzEi|ujr`ipWEoh*U} zTNsN+{cC5LVk|lrR@eFyBHplg1%1Tfy+!dFo5*7aLG-g)=bkC4)ME^B8+4H&#XwaM z6b+>m_HEhM(S~{z4%M7(PB`k{w(pLr^DeBa(>9Py^i3w2=EWmb^oW>7ipC79x*4$m z{Iq@l=m*?zA#7BQ%83o2*i0ZH2nh=ze|k8M5Zv6X(oQ+L%imLTCbN$&6ZZr)-v1-$ z|DKc!s0g_=KGSA{Ec5LWYgM-R?2oFwW_t5d>X*RI5hK}<$~?T>EnQngE#bGnbnF{){EjJI3#GF=6m=1`nHT75`U@nP6d{L*BV==I z9|cH!q%7=u+1Mnb+Y@luVQ5YPkGEhj)~#%?g&{&r2DVFT!+6qkxeusJhD~u%VM+$> zXw^xm!BvFvv_VCiTcR6-e(1MWNVGM_WcTH8r%F0obG+Ep2hdkOXc`Ri4X z8!5#{Tih##3*YX$nfro7nU8QncSmacN8cq;)miUz=9)h^^^Pk_v{lb~Gd68qFz#Nee^a_D*f5K5a)^+~nh?8slBBKA$$?8wV`ZoE74&Wujqh4l-jrA8o|w zsWK$dH-zc7ClZaaNk38P?Pz)y_JkjL*tg*b$_=gZZ6qUtObxX)r)gA>oLWrO&Y}3S zp_~UO^M)=bwf~Ak3540YoT;w58l5wmW9=Tid~*BYhO1?3_4nD%X`3BDZA41HZQi^z zHMDy_jt9$!&TBpL?Pe@i|0L2`r$a01e$D$|XSW&J-I!%sg|R4VNx=IWvNxmD$uUN^ z#jSWb#gkGE)aXB)K$OHHW3iN?6B@}Uv(DAz5mYJLsbu?UADi{&{T zugzeqH5hT%hk5h6);-?s7ts1g&*by?mIw^Jq&vg9|KHR8pBA<}>b5oK3nfv=1zgc( zv-0@1oi4%<-VYM>TaFOgRi=}uR*xUL7Kpj~Mx4v4f~!^@YeJ+gIHtUmHg!6DGh<0% zUh4x}*FE(_ps#IZ5G2;Js51(fVfj`z82cwino38)4Ma}fKHE~lJgZ|W>kCK;PEZO0 zscLMmB7&AneCbRlDsr&JbS1J%^%`JaW+L)#I-!zJ+Vo!isnqpUBtN#6 zXI9fZOVJ}r=kH-5qMS6)eT=QuQc5VNE^Lxoom?_abvy2?KslrH&AHBRreC|9+p;v= z&3<{H0oN1+Jo8Zy000tK3N$T-WoQ+hni_s4lv0m6Gb_l2-@|VYYN1P9F?s* zx)(qbaKAc4LHQa+=GnAKdEYF@TuUQ2Y$aMsZQ8d5^owS;J1h4pIUcXH!NInbAFJ^? zHpEZtU!z-M}QzvD6~n%MRdxID5YspB1V^7an!+Gl+sh^$Fyk~4J0AzGW(wAYf>7) z5d4xRu<)6x=FfZAZG5@r*uzS9_T8ev;)|nt>A0a6o*8hz(vrDkk|9JAJ0lN7?UZ6kNXxXHDhD*OIfgapqO%<%B7ZV}*WLa_ zrzwM{=2Mrs5Fc4$woQk_?!d6QzCkoa*_R3sR)(ceyEO35^kZnkJQ`9e3!&{{nk7y+ zPLgwJki*z2Q>^bHwWvZ>ZMKFrOy*#;m)=l89$u8b3}%GY8MCV|?G!!6LrkzF#~97( zO2Phzfhm}g@Ih2bCtJ~@$R`zGe31ZY^L&Q5PP=Pb6iQq8YB(#!;A9N8OiYlxNP)m1PV-3JisT*2wp@d` zS;#kvty@;}`b_xkIrHax#uUlOBb&BLRf0I+5w|>vPD~-J?vpG+c}qm9Q>Po98m#1t z?dBc5o3}UQG$jNdisf8aSb5n615CcT3!iTfJvd?}&sXR(K~&ELfNRK1S?nK}0{*Cl zd+~7*BL-`FxSLD8Oc(legWE2v6C;aa2K4Ds@dr9@9JnX)Fk+B0Q?>B@=BOHkMuvKM zF)5(~EJ&S33B+GOrkTMLPot1~zF9(XA?xWY)=YYd5o8$@h-d`im1#sieSxKjYVb72 z3#;LesoHXZJ2i8T)bakOnTg<*a(5nA3ip@K@A1DUf5}~;S9!8UOd2Xd{TcVejq z@sY!gI`!L(koKQ#tT%m%fYvoTNpv<4m;_G_LSvOdVkFtuVG~N63yF_T{R;V{;u3bQ za5l~H-0Fap{=h)O$G4(cX@gGNNM^IJp+3WKqM(yy9ul-K!i^FpWHiOSJR~f*{L>0+y>qPOmp7nvV`B7a}WE;FB~9_Yt-Pcp-`lv){gr z4_{vaz#&e5M%}999lDUzgFO+` zEXAa)OJE(_But?Y2VYQW34a&0kVjiYhP=dfG6-+bLn(zL#1KOlqO&ptrf~8laV#eG z*2t2}Vu|af<*$~FcolLl7IABxFQfEsDRbrhkJ>Z%K3}DE?aMG_I(q$50>IVT$yq8s zLzZ**`NW^F>2=c+RTi7QwVvaa9H!plQxX8KP%aZsrmLW7)6uLEsMR%{eq<|_Ruz!; z9J8X=x%E}dLRyZin8Kjy-BFTGmKj@_(s30mXxq|%=E~5Zigvt_rkGbV-GeHD9Y4Zf<)ltOb zAcyZEWs<)HnRA*pj{LXAsK@E&n?7BfhjK=Kkkp5M0U;A^vY>Y9!erzd^SIz|=l9pi zVelvJ88Y#R-WA4vXXGSvHU;7>CMp#S?V63&Yd!i*-NuxxP2=}%P%0|2tT{rQsVdxu zQox<4^K_VW*HbR@bL_1L;6A6-Qt0j$-Y-sfJ#ro?b!=C|A6;(^nIw87H>c@Oj^1{- zdH?mRBW(K2CN9iARwXAK%(aO3EtnGh+s<4K4c0+=NTury zbU@ccAz`cc0@V9!a=O+oGmrkzQ~feWvbSw zALzi3qPN|w)h|A}AY=%nrG$}Vk{N!VXFIE`DL@qVqRpL8EQ4F*IWz#Nu4vO-^1+&E zO*O?|L7j)#{Akb{m(eQ{f0moBa_{JHrB3Edvq?B7>~6hxM?!M%L#gc!wwqPM zC%sp184P-=KTF|w5?j8v+&v?2hq5vAT?>J**K@lrrW7@JM#ACmZ%v-x^0N-uUPYzf zW7t#n&`a15jRDi91SiKPE2L$}@8T^>v;^AN!B1A#c+Tj&k zL4FN2G8kPNlu=<}%AyDcTgEa4r)9#fMfVoBEkv>#oRKv0hZF+f#hra;8kQ4`k*w-w zO-?OIJSyahQc#)GR|;GSjty^3@huo{zEaY3$cRdTRaFm!ujBfJ1O(}5{J-G*KB&w6 z!(Y!GF&nT_{{I}do?BPfLBet^CC;5U)wfyl2({IHIQ&0a&p2#ahcL%2NN8r}6iQxV z1n}9fUpF4jyN*qG*eBZ4XQhs#W)y-B&>AFP-PS+`{YCp*BTVJ3n{~9WSyj0+Xr7*8 zc5U8K9NhZ|Hwx*Y?2Jt$eSM6FIW6H#sAG&FsP?P3qs_?5zR`d(_u~Lvd2(MiQg?X- zUHc;RsDME!vyT?4haRvvmUzBqT38H$1duL4YJg_FrZ$@%aN+=o4n+`5Atkjr2pQea z;WC4O2yh`RRPDx<2@r!4*yE+&ZwyeYx{+w>Rtybc2wq63efvx{iCQ z_^ziz$6QaNKEcYMb5mEUYUDCo3VP!BI8~?_V}X_+ZkpY_ zW%xOaEif<%;D|SE!*NMpGPN1cOo5nYK_#{d3vke2(!uExO=ZB0$ELMNt(0Jgqp#k% z?keSE-hX17^<|dbg|)sew1oxomRe7C&@~dAwHb6kkfw-B zBuABuk~46!L=CkEDVeGiT0;#+>M>4+q^62nGNTz}zW#>8JsQSTy>~3jb8pE?F zipGt*3o?x}3u@K3N<)g6hRQNP7n{O45lV)|LWcB3BdTrC+t4bU6m@p6tuV77M{<({ z)~A|=MY}1BFp4Y|ixLX5xGjy}0osHF$)UAwzi*g#SEuv9Ma&LdE~L`?nwvJxt>lk1t}VjLD}o~e%=tAf!}M{Y)lN{$1FWV)2|`?ZV*-xhadp_Q*>Pd?dy_PA zYrljEsqI|YhOoLs1&K&M7XH=5Q9T3^1Gf_DB;S;@ZxJFp^+5MIHZea zXxaZIok{4M(yM>X004X?89-BlX*eiCumKPedu6uSjKBf_m6?REQuVoTQyjKWPmi{S zaORgvsM$`xkX-r#$5eZNnJb?e%Zu1(+YD1}YAvah>-c!dJI*G`x-xzooR;ogK?NXH zVbq#x?Pj}91x822TUpG`dws0q$2SA*e_(gXdp{wnhEMoNO(mD^`*{NercVef83fWD zcl?@PhvW#+TE1T}n&mrJBUeH50S=?MEfKPpc%yP>t%kY!F} zI$7O6F3e{ zakUcn22@KO_$Ie?Z@A+ycvq+|B~+l+T8x5NOcQGZZhWU6y&n)KBhDiREibsfuOHJ6 zHU1wd1x&&iv-z(D{Ji|whrs=>HJyg-1MjEw@a2rFpb&Y9vRO6*)44$fph^Jw43#-Q z^S(PXJFd@0OlcNRpr~cVAEknJGxH^KX5gfwD)Y=&8}ClpJ@oBa#y_H5w@JFMsB7^Z z%Bhsrk}xZ_HTv{wx0jaN%JxjYqMcwd{(0;Es?s&RW(U9Bk(z4`8uWjA#J4cjIrBkQ6VCR1e^);D!4)JQn|NK{*rwkpVT1z<7%JH^!(Kq zWF~MzGi#ASP5FHH*Bu{-{AV?ERW9*|!dl>W3C^LU`UYcvhrM@iL*<_lI9BOs=%q|s zHeqTh5R5qm%xD^q5Ud=$X1A9wme?A1ZsR%kwRJ%!45fmB+QC=e2}v(W^=)12HP7ch zKKniSIp?kOxI9V@*+8}ddWWj=Ny+;&JDpajJ@m@c8dwuKZo|p9%-Po>Rp<%)c>{@9Is|pC9wXaZW52>_v`IYU)(xk$^FZMpcyehQk zVQM^~p<1B0e_q9HrzNvg=7ft+n3JB$xg8Lw;xnh_2yCLXNnyo;U*;s8#+;$B(O5v2 z&z|2K?t53fW$c$acX_zQ=2o+M6&Wxgwlqxsax7hPD>#JfM1qlkQY|0vHQy#osKwU) ztK=MI6d(X()3Cmm&M6@n9l5Dxik)*fu{!f+`zaZ-NfHmR_Ljin`bz?8WKBC%X0;HO zdwy3e`TVao#9MP3pM}IoafiS|XI|_!yB=9}19m>=)TsGKi^Oq=?)nRQb9vo7u$Mct zvU0AsAo*>xE08xZC^H#6t<@U5d_BypBVxmS!^l!T8)6X<2OdEZq~)IGVYd05Zbi=2 z|CdIz%&of4I3_pwZh)=mpM%>YwTxy(BBM4|k(_+EfGex$%QCrVsV2>(+m7-e6QVHI zIWV#m6B1};?hf&7_L_xvlheX8(jhI!vDsie zPaKnX*x6UAiMU$Lj6Pv{z1mqpQ^@g%%ro%=SaMqGtD(+KH3tl%mbefErg1w}nW)r- zo`a*+?e$YA0B|7;RL#bf1)~T-PY7?NIJPzhvY1-1bAW_xkuG1Zz@5MJ%* zI;tRe-Z=Pv!QvW17^5B8YSskbqAq%8Mt|k%dZW-h=8f%6wcZnZ&RnxWq9@XjL8akg zbzh9UTRu1LHvAxc3PR;np<&(nLdq=B<3XvB`Yds-e|)mxW6cV8#ORWPZ61p5e%qImRW{Damw?1G zQkSI4*}{955nBDNMN16I!lTHWi{o)}ZC;7=;_gCBkJ0DVPNpcKP0$%*7{GGOl_Y^b zz|!FHhL_hzDOFR>;;5sR1y@lLrFqWM>PgFXph2+-FznXIFJ)6w`-)W`U)DzjT1N5* zho-P#C+kpQ&b?*Wtc@&V#E(PSsF&;gfsOTG+arZHA^}T<2|*gP0VQIl*r^c12rc8h zn(np2WhDaQvm&*aXJharPX4#+Fkowb{o&ZKbfYaGx>Bh+I~>|ZNT&2VYT<;>%`7Kx zCV(3o?yU0dy@h|r5ycbX8%yz*Nzm5h=suLZ=K!xT=HHj7=-!?rxx5Pq`&bR(Hdw~f zl9#R}?LvhKmjYvgmOWnk0H8@1t+%CIS1}RLPo?&*_${x-)5b`-u45XR6PHG-gklC8 zsQ{M}Y>L^t?bE3^r7ZzalvToIL%iA&BThjriA8>)#yqg$8(g8F-iX$ zfU2vfA4#1?Rwj=&#g%yH*kOLK*um3zTxWXm_FHV?Yslkzg|l(EMY&1zfulE_XY2o)98aZ#b||7)tKa3Ks-#lo2fp_oBW1=LegZ9Vu*mno9jcw=Be z9d5K%4BtlJWCH|{Q!Aj1qG1|tvzKj2uKA0Kwmn+{>W)gyu+Q1``CNEZclW-X#d(jR zbVeO9Y+LJ;q*l$hbXCI0~tGA>wRCL6E5Hd4pw`2U^dM4bgBay zNZRclOqdWL3?ehejc2bl5+xB9(JHB!Z)>WPMUtFW(rH9MynEhv%fV! zCakq6BMt(Af|!9!FTY(UNZWO#)S;I}(cWlbtaKP5x?is8HQ54N^<{D03FSNW#|~)#&ytpt8ydQ@9pN8P-L~L7cS3yjeX}I$Wu?eE48? za-9&?>a{|-(SX*^eCfFaQ5z3GRv7e}6Cyy=+FcxnoL-*Zi?Fn3ImJ>axcU5~>-}&p zE<19tj6==v2A`GJ<~ZX#-;fkp^p|VSLt^oqS!KQi-yk2d(-nO6d(V7MK~jm^ZCPNC z6H95Fn5$*svqh7>B9;?4IW1*59kobn+&OyLvpuw*2DdiHN!vtsO({6(Em6n=<_jr} z^1z;7-0e?I!Mcxw;)8%83{>61iD9F`Xe=8H2*L__ok*lbHHuv;Xbguq1nph5E7wqL zKzE*ZAF@pDvEo@$c*#6pbM<*q-D!2R`6P*Gd;$j#u1V3?l##mZ9Xj;pO^uhNsME)? z^7#TqrnS{-zu|-@pl1DV*!AikpxN?{MOfR{P^rMv!$~Sp-XFI)=Um9hZrT;Ui_8t| zUryg0QX;#2yu&DTl;rc*aPS03X`v)Tt%?7&`4(V@R z;q?M^Z|qRB!Y`;#!Z%W0vAk`dy~5>>NmZqOSUeaaP^76<#q)eCH>*h}fWPb(wHaj7 z{&;it(=c4j_U*_j&Q4_U@BMX&>}gX1J23@`T?fHFl7`oO#ArS4K-;-DGGzk{W;ay( zb)8KTzJ%6YL2o2)hL$kDl(>^Wy+n+Yjxh~X%-qgct?u$p68DAR#9c?jY0*o zOPrua)oroaZcylwK`oX!0q0wLlDg=3S2>-`83cGSNc}Is-`UN7+1TqS|6}@tYRza^ zK%;CMQ$8sB!|^A>{k;`YyNy-?pNtb0PaU8r=TtLF*>h<%P(bIiXKXFC(tZKPaP$#t ziO?5*KnwR134H6Ia3Ks-<-VN-q5|1UxMKBxq;E**HY7a4o#+ADW{% z1LPLRM!r}dtolxKVy?QdUAZ?S{NFNfp21eKe!2DX&63Js#TR*zBrd^SD5UU4F+7+X zE^%smmCsV+I7W(aonYRk`VEy@+MwspE4;nlc@B|9O$ttVREXV?V+puK;x4PPj8I{M z_15i1W?@-w)g!{%wh?qzFtkvr0yCz|(2=LLi*qUVP@ON<-B))twS!doF%d=-WmpuF z^*Nbr-oI^+VhlEzFWpX!AalkRu$>CuGbr}doep#@sW6&5KaM5!vs{Y6%M9NJHxwTX*zWP z&E|^#8z($ItDb5nx3al2*P3)k<-lacjYJ2sWghvqpzr0bfH-|WRrT$3+WPBYi6p}B z*Q?ES5=n-w2zgbpvGZ=#L5Ww%022okLhiv!djjfkuy5_vr*-6kn)xW!wqw^yu&z99@%4c3nbp@Pw-4O%xi0=c@~<&;brQ9JJk zz|bZA%@hpz)kNqwO{h^LfcOm(8Rrn_^)WR)8&!6VW>0O;UY{W5Z7=S&Mmgf;X3||c zCgEDh`6t?8I`eMvFMz`)=-)Ow6L=PteRY>MMyWH46NP74wdF56&Ia8O;3hUBf2_i! zCch(M+%{o#?yZ93*bSjOc~6`Dou;Hi}hlb|sU@l9Nn5}A9|7drqx^tY@D zr&qO|Q89y_9C(Rex=TdrbX3h{N^PljB?=4CAEH<5ZEJe=s##*%)@>;(yt#E)+hIe0 zS*{tMj=pcUq0(bUFtM_Y7SPFJX7$Y)TT9rF>Yg1`^Hr!aE+~hMYzhL7wkg{@B96p> zu!JZkA&eCFei6;*e^^-&*i)Tr8ts@>ZY;Lsr!;&4K>Z)1pAF#~CQ~(_wCacG1 zQr-QiTpF26S0h8^HI{D>b#&1jnizOM$g>0zI8_bV0R9sPy1)<7?9~{lpb+_&%3nk!}Ai~ z!EFY#kw%3jvoE_pD*J96g1kGYBEgTK7blo1MNCm>r2_v79};`uz#j)habbv{Lh0t~ zCM&l%PZC`y-(V3Xl_Sq>T1(@u|##(3cufw_B+ z>y=ls*iEi7*%2B#Y5V_Y>pld_-l>OH%(xoyPfn}BrAoOyJ!E4C2Js4L>V`mjby1yG zmbS{ZXV-X!BC)E-`;YYdh>2=*^chizE&Yy6{pn|`nG$g}a5>eR8T1?I?E0HS z6C$D-*cwiX>U$fmGPakZC0SmqPJL->*pdG(wYFD2Ek?RLtsT29Ck!2;WNOLzje{o3 z#;mm)izl1)^z0gPOZaF^iEp~@>-rhzTZlSi1&+Q(XUBG~6`oyMCY(X{+qbGKvk(4(4xO{V>0wn<>1u z=WlmGkTj8=WI(+{DVl9mG%mX<@^xg#w^b<<@uKOdde&wo5=a6zMn@RFPVRnhgI-Wh zfN0jqc~|_`D_yT2yvw3;$ce=8enIwqSdz**#6~|bA>srI zMTnM4jB?W|fp`!(j9v5zNh^4}@zXA&Va1@{nW?1S^xLP!9VH$Ai_noWX5#$TuSl%Q zeQd<7QdUOsVqxs+@gmn$<7NwzR)RU#f-!)lyIhcFrU)5zOWdb~`qo130#?^XVJM(X z;Rr4BoHXk*TXD*&Qsy%#;mV_8GB~EWjX9Tm;dVhe2M@8z#`XcE=jj>pPYeYqu);q;{>(t z^7FMb?a;~|R?e+i$^>)>L)5nDV9Jq+_x2Rjc#(u90B|7;RHeS2!Gj1vZ$-imJ^IAf zF-12rMNGj&lHOqP4s4Ba zvOW$!==39vwE9O4MO~BK+5ek9dFr1BZU>FY$ZL>}yr0k6d0w6CtnHm{OKLTBYs$1+ zMJUfgJe$E=*j?s{{FQi*cxa#pZIZ$}RGCzWrht1G0~M@`mQS0I;e zW^}g#C6@-xrEM&QI*c54xmhAIK#MP3aSZyeO$b@X34Ai{NZ}T#m{aySz4NS*+INNW zP%iGZx5{@Mq9k9rjdyi{M96Bun5}Q+N~+md2F7E&&yZ@PC#nq(xsE|}xMwGp)=GI1$BU?^a7d z+N{F=LbOFej9?*6gz&(Wz}?4u>Ow)qS3*M|(G^OI)kBDYDvTTsc(PDvC?rF2ROK>| zOD73Y8_f$fO_wE2jGM-DWLFh6g3u;4tiU1PhEvqugv69W6maAsqwmh1bjiJBx_b1r zsdj8q9*r#3iJZuwb+uF=6&3XbH0Xc;04T5tDaBZvSt;w|Vh4A!0ss&SJ8KF>=Wt5o zs>k4f8=oGt!~x&3fzBHky#l}FfZ!nvRHdeiVW&a_Ah)_%mn9_&D<&e4C6VW& zO6Lm@eKFM}WU;v!*`xjs6Y2;BeZHjkp0m_M?H#W?ws$S!&A7%5Gd6X~uZDBSdV z$Hc;V@apR%EG5+MXHwwizjSQDB5mt7^%WbJ?kKNjLtZQex4KbE=Q!o)$=Cs7Hp^`_ z$E&T2`f^rOitQjVo0YXcb9sK`9LV;JK@+A2)y1vj$mnO>=l zkRT=$_(`{l`}ovK*VNw5tWAEWPvDrAS0?nltGgw0X6YBFeT!=)y|oj6)S$uCUKmHk-Gp#qdL*@6}+~6=7kw z6oH~`CMx+7%M6!z zT8}?NaE<|rswv=}QkMXVu_T%zB-u|rajFgmfdQ$pUpnNNkuEClW{Xq$pP`YMt_w9( zBi4&s)4kL;9eR%j^Kn4OzlNP%dWy*VR1sRv)vfT&&Wh}W!-gysmSSyA6PQyb-Q025 zZQ%-m8twac$zIegO`6(wH9PT2HJ>)?zBFP>Qfusd7J^n`^iRnatUOj~#xCRH?BD-#lR z-;372rSnSIjhxFV8}+f>k$lH>4GPx`(o3uCS}&)Q)&5sQwQ8l?>pVeu^{ebhsBC#d z*7*i&?Q=L?|K9K@N8|*f$9cD|&MdjDt`^-C9poz-SUp<0O-_$ZbkRYa*Vn&Frd3Mb zHc<&qN^03%QuEF)RTrfzq)t7Qg|O=JyZdeEqd3bI46`-Z1y!Re!EGLH78vXu<>nS^ zN8!}p&c7)c8P?Rmr5(yi%)EgR9fXnu@|);Y&=Ni<5j7Z>uyyIS+lG^bf&9HIb}NN< zOgfnqy$bl@=J1qw7s`XwuQi+Ql)J=vg#? zN7egH*?T}Sg+-}w!w5rbx?JD4!q{H5=+hFO z$Zx^1v9>F+<_z5}#|@uGh-%{wsV4_$%t`)Q zV~$qxea*I8FTb<3)|_VW`XK2+($d+T?s^ip z#hD4~sX!d9n$NjJH|M%MwWRuJ$?j`<&K{-c^`&nc+bLb;zH}f4lc!YRgiiXh^6@T5 z-=5d*N#-&Hc*km;@zfuSEZlam>_75a0`}h<%}{Qb<6Z~4D}M`m&SWHV5&U*z{r?w? zob}hI?oC_wp=GKpx1C?3!q78)YDv3QV&7wX6>L^3kmmM*Ti74;#a0X{OJ27_Cq38+ z-xfdX#+y?3Ov#R(ZN`;4fXAaTq|zU``<K&)+Ei)Z=_DN5F)VA1qbo2Du5{Dp8Zg0GQ^V84+F)-j`;3r!!#p%49zT`m z^;k!3vA2vob~h{A(%NcQx$=&A&f;$P5Kka7SfdaW<8!P~MZ{yAU;rpmY$%vgdKEk6 zdNQ+MqFO{RDdg?2uNwX1N`*dnp|{B+#qdMk_QCj`h#>8a9!n4w-O4LR#0aMa3oZ-Mjtc5J4g@N=^KUeC*vEaz* z@T^e-B4${iy9h}Hh~va`5iy55hMjJ0>eZe6J@$Tn1{OjQzBVZYu#j$JFAJ-qFHRQ2 zmbtiOFKW-bY$B;kr>s}GFq?c<+wfI=-A$c=yYt~PVUq>XwxkG)z8wZ!q)ML1XlT39 zj+XmZe6|;knk{OmNzM9R1;{|bLtfAF7z zK8$c7Y*c-|od^(u-R-+lZ_@#?-%lv*9#jaC|4CrdGcW+3k=O9m?CFtYH$w8r6U((t*R?wWKg)y2_(do z7<9N+$z_OZSbRVt>{TKR8H#~o10V72xS8-n#aoAVn~l*nGzrR?Y6PM6rBZ{26tu#Q zygd``l9*Zd+TC*vuln{Hn;diwM=))EQMHoQpy9a59g+*>(24X`X0{z$rB##I;Ej(Z zZs^nEEJ)W?z`{u-K{Z#xT&fG_qji`@P#u0bWG(Ze-uWRggnatFlWa69>zhPP+87xpw)xqn-N0&)duiFCu9QBE zI@H^>3w5Y5v`<(l^SdBH4wg)^Ij|AwmB-#)qg`RcxTT~Ukg-!-*fHV zZx345asS!kX{!_e0%^xN<$hfWIp$}o%3s;yJfo>!=bnAYIOq3xDyN~XK;*021Y~q? z?D5wcyb%>&4hqY$>bzxGxAp?@_p?+(uAhR1aUG|DFH&t-v2*HeBI)(Iw2G54>D@l< zq`uWBUu%XyOsUQFRprgd5IdDx2DZ8ghuZT)Od7b!X!P0#C0K=JS!N9GX2w31SRb*eT7j@T$M_7VYCVfF-(rL^ zVxoD0rjXx(H0RaA6PJN$hT|?@6-y++_KQx;xf&cDw*CPKN!;tGPqXOa_&wb6)3cK_ zF=vH$bvE(ALyljRno9CwDyiM=zfdHy5FAsYT&V!d>yjZ$xJ@)#@gtgHa?-e zW#IN(C_DC7m_ILI{^EqqzR;Y*deUotIXXqPTHaY~`}`$BvUttkEY^MBGOySqy4HnK zjF#(xjJ+((T01Ow!Q8YrAgR5f%yJ4VN^(*4yXH%1sg}55f`7)c%&_)?Z!&9hjPFs& z=(4YI@BU5ARF2j?2q|UgBQ5lt#^2PtZn>rDQu8Ic>JQ5L)O7D~R;KJvE_TQ?8^l*0 zbXJjORNx={i{1&Yb)asV_qlBwRfnO}_}?S5zV>^PsW*zSKqif(aO}AyZ>_6gvba|g zN>B?s(}88SoOx@eRV*p$wXL~?RZ?Gig$oZ(8h(&~06`q0p72o=EF|iv4kdC4kh3KG zwBIRcw>>wIjf57nAD;Xf5|W?y!k$6LPS~>L?#A3h;fq0Qr~kgKs)M6sHSiNOFAMaduK#HC`WC@%SJlR^jk|N8s>3-19w)0;)H25ht0 z>Y(0i7Z|>Zo47|Bv}0Dju9N>B=OY3RAx_Hkhdh77eYd_{rDm0tAg`KMT!Oz0g1Ju3 zF(9Any>ili`|tSs_3ocvH^bMdUmk~EpB(Ysxx8)yKB(p-d|96-)_odFd6Xsdqvl}_ zwWik1oTB>l?eUbaFRiAwTMHA#wF73tX7$M4>DVkk5r*bpI`hi)zSn2PYg`ZBcB*Hu z$*QbdiA&16XGL?BH@0Sf;U`_s4n;$hF{@lJ#V7(OnonK0(Z0PZ)HZ91g+P6dWJ?4^ z)t-}007wE==8hrkbi-|}B>Rr{CI(x=rX)H6fFI)(U_;P*f^@mH-hBj|X$0gjgQSpI zHU8nV%ii91C<^q|5}-Q+u81|{#D4JN?Abz@{vHl@+x}mz*@>~1di@ld(FmG&asf1a z11Hj}67`2sC&~5%2JIPkmddw*_F)lmHHUh8v}8(;Bl>Z{y8jM`MIvo4jVY&rj_$vD zrP%)gBR(m+R2~IR`534u+IyQl>4PiZZ`~2&x$6feMBxTZ!r4RwZcCL2Wj~zM2MlE& z0;E?5Bz%A)@XMi56{=2ROB+;@&Db~#BwjG|-ps+ngxem=sb1vn`Gk!pqIEaT=ky(o zdlE4r69da64k*1c@4UK*p~VKnot0p_kccsty;r)n{JCDKAWwSbwQtN>It3HNLGc09 zv67D1DjzPfr)bD4@W?AQ&6p}dS*~osQVIFySEmhsKJ}hD-b-iKeEy$GN1e#?-q2IGY>azPrpa@%`sq2 zcZl3|7-NCzRdiI;VsPQbXsP~86^YhdB<{|((Uv%7tAiN|GjZ5|*jlOxA*bN{4tVSf=FWKMoH?t?tj4I_C$MSzxC(sM3F6}h0pR4SUYs$f9 zNE2)IWZ#O~{HpJ&EMwFAUm@x{r{Me_7fW?obs?QD16soOiszVVr#B|{SXdcqb4+#m z?CG{yScZcM)tJnL^}4t83t2Q+T0#S(y<00ffssN!CUWDi)zAlaK;R*4Pxe3E%YOz^ z=TktKK%_7W{yfbjUrdpgRU5R*W@_^(O#E0AyQL@dbC%#F`KeeR<&#N(nzV2JSP(wG z=F@4nPp0=A2NnF-+G4`@`+|DRJgdMvB>y&OU9F9hw4YNr`eNAqX5WSOTrtOSQnLf} zfWy}wbK84Uq#Y4#z=w*To>(^;XV3CbCq3em0c;^OV~ekj^zJsQ&ds-K_C2S@dacj&SDGBs z(UjqQYLqI1EV%B4$1|=UA-!Yr?b9fyZ-tNAaUPpgdfRg65Uk8JlJo^z<+W1W0I6dP z#|ZE#*(sAk9Y1;?MZ>r z7$^`xh5x7T>&)r5O$KLKGNwk_Vz;fI`i!39dFTR$^Np2HVe3iGzO{Y;DwHtSJ8eFs z-Q#4Z7bRZ)2d;Oo0qYEvmJV4KUjAcRU!V`j9gUx{$#AD7Ea0jQj2-W|0@Qt~x4vQ3 zexFO~{ciee8LkML4ZC5{yoLWfEfEp}jVoHUsKz!QZS78L`aNgq zp<=gZlfCr!T#aXc2Cx0V8!Kib@@a0Wb*EhhqrB5oSYGr?ueX7?=a*eD#o?~BGs4ZG zFd!RvjKyf?RQU}O%yU~po1)-~crd2E3X;hzbI_R4_RbLGHoP?cCroqqA*`+7000Ak zAq-Sq!jWR3z-a;?OZ($<&Nb%zOm60C=}a;S%P$+as<7+CeB+U$Q0qmz%KeMWbI@!Fp!kA`?>+P?LdDLgut z<4&cE_oheWlXdERKCk0=7;LsR>tVL_ey~-$gm)db>KWhtoJHi_PtoWZUaec!cK2|t z$CSf)o5XFnj<=(n_&1lFCL2z3WXHMhe{{(zl#gr1aBg7UJ#WF`&Dk6N|CN_Hap^pJ zK1S!GJeHJ+GaO+y4mD^cy3Ce^j%itRY@CVnyb`$;FmKwj-e!9e$ZNf36Ax?M$5bZzqY2e`Gkd-znJl+uUiXDi4MBDL)H|eM8GXT|cekcn+IHYDq%6LAzZZ*XWqK-Il?Y z^eqXLf)*m7NXL9 zIaMzmY0fE?$~t*3Nzf;y+j{O#OAvwu!+Mv3X zumO^(Q*;gxcdydpAb_Yx%d%@Ca&eF$;xNN&`imC~wzWGM7kIh4P&+7S2&jn)^=Tec z!oWnHy0asKo|P;V3pAEsGjvh&(|oX9w6V*dzq4c8$ML(SQelRiS+U)mG5{4a93c!; zW!8sbqF89QGYBdD=WT0wtLrl8CPQ-Jg;Kc$Iz~W@|BhslQdF^4-NoKJx~F{XD;@{U zTaC9#bQ|t=IGTMEE24-o6gwUYo43)AN5xy0Z~eziM>?nRv3G3oAW7o!sLR+L@=mbt zEGkkH_Yl}yJNkP&&zw6?7x!#4i@cLE_vi8Pc_H%$yUXTvVw!^o0YJmiW}d;C&`PpS zRIf&--tBK0#Mbz~H_v+Ft&Mi3j-%Tf5l$;lxsl`M!7mkqyoOgh!Tv@^n5Z&X=?ZEG zg;P6gpz9GIc=Ob1l#0aIYKIeNN#65(XB{|SA4ciX1XZ$@!J$G_V7L0W(eHA3F@p5w+i`~G zyk{Vm_hT>0XpU^*Xv$#W0!OVHMMjqjOfco)M=kD**-`%?p@$%Iy&+yKMR9ElmwgR; z*LRNSmX)Cf_XtYGx(M1eZI_H@8Tn(w-YPJq*dXt3KAE?ru6h<9!**6z+acrN8|Ho3 zMVsbql|s2*P{gIVjrGYCVO44lae2WFK&7&0Y0upq*6H9=bEniH6}H@WEF_sJ@Cs{B zvioq-AP8(YnI$@PSJ|Ec1*D6p3xc7UrKuZ>MVYYS$F8YV;h2K?uDQcNAbgv8x8M>* z9cDT+!jyLjBYIaf;lzGGs-~a##JG2#z0dSyF)?$Vd`DN2t5Hj?FYsR8@TJjmWi}Tsk($nNH;()Y!|xkeAqg=HpLR z(Sjm*xuJjU6MwpUf2;1H=$!Ro{y#@exfeAc%bdrs;*}7+DmH#BvGq@DYv|UMzhh6v zGYLu(PtR}=yb_HKAye$LFO9mzOe9V)kSdBbQ5=lAw^6b~PV!Nnu4xkhbHOu{Y_@76 z-Hw0vrPTktB54@_CN|kcxd?y(Pi1p??Uc5%SBAOdUQJ%MzTf`_^Zl$&~d9c4}d4{>Ciei@EDde?B!F2#rPx80CJ@lT!+zozwN{H z;pDMU+e%nhwDvi;_Rc~T{N85*xck%-2HC12TeNs4r$Z~BtEl1G)@S3hcvv4m$$Sy! zAFl_k)N))l!Qyr5iyFT%+N@L(8&(puZTaT15dfk}2S*xlry{n}?fI^<1W0IA%TPv* zUzHeJ!j{)WohHhR!s`N37J(A#Bj+tXNRsEsq+Yp0FfJlPVYPRoIRHy_8 zB$n#9s!~Tqj0cEDSipP$002nZ=+;O>3JhZdxS#6yuL}Apzdg7~md&QNg&rmUkMboG z6RNc&uPZcminPc{mOnpaIB#g_!BZclXd+vW!3;<@arAvYdK7zyQ2yQ2*{}`4J*P;ychrw3u{tQnweH>*v~Ui6^9OUQX7E_+Pp4u$flrRmFLj;@YWm96CY0gZSEhwC$ ztp#_fSp0Nb-pEulR5MgFSM~q^00000;2{iDP11>Bq1b6AAUOp>|E5^VuRJYPh!jk+ zuLeKU^#pEFC;0X5WD^jbGGqZ{@_v?0aTJrciDzU;TCTY!nUoJt@w)t{J})qJ3oJr? zC!)tag8cYDIm@0Cndu4$+(QG1u)i74Eb0@dUxfuyN34nPYblvN<%H5G(>iWvy$!x%naSf&nh0XloeZf^Kva&~5 zux_DXx-{n~C#l;Pv)lLU`PBxC$L`s`@L(RHZ?@X4p>385J|H{+VO7xH<+#vTieu}Y zS*?sVzev<1Gdw&c{TxUqw^r?LoJncpBW+D|%-d zIxftohf2uGqN=s13N%>cVP*#W^#G#n@<3~8LmFKj(q$}qt7F2)*KQSoHd3VXGV{HP z1DJ0OIn7>n@cy9PZ+ofLjo&>MOd)kS6%v=pRhUUOT$ZZw4pd*xlZXQuo%kWmo%lRJ z0000007cxP>KGFQ!U-UNU-8lN($B8Y-*;$lOlh_5XZr#*Yml#3495RYMPaaCmL*R1 z+;8PCfU?r-jyU=1rxd{pcRM}Pa{4Q!=W1x~xB!Z9Nf~RsyyTwCCIt_!1L>w5jkbOayKzDlLEL&7pKy%9};oDr(I0IIM&NS$Z z$Ds2fX{=J{p{`A5YGJ91hqm5gEOxW$zjeB|n&5^{cTu!P_AFDm&OwF&MVg?NgU)k) z9_TJ0wj?J)@!Yu>i0D}#fpv`e_ENDJrNwS=micbOUb8vDCI&iy3Xb2r%`39#@6^r2 z#3ffO4y1sU6z*6P*D`l3ZS~@Tu8Qy!00MLJLI9i5k=cz8Aq-Sa(urZF7{M?2Wh`q} zC?*>s=wliLRfQqNMRu6G^2M8?JK>>30hfNDfnBPokI9DkfB8iH?Y11kk6fJh(fX*_}y04Fiq2BwYQm zjKeqS50Zc$UjO6o)_gwqn6)l)ZAxW`us|KCMpXg|X*vp-7Aysrs)Z;G+Rwc4+zR8c z{x3|db2hb0mS&tI+l?=id4>@}m*XiX^fiXttAbYZIBD~gbloa5^i8licC9@*W?@t^ zWj}F_Xry{P!IkS9UCfAHkzV!Yo zCiJ_WyN5+gBLwDi?vp1!g)2(Px>-)z?N%ePFmPldQOYx#S5dmh*Y1y8_TPXE%j{13 z>U&|+BES-eGK??;1PgRlFC86kB`GuRTDPe+eNB?ZIvWkFfDEeLeNAiGtx=MTgjv)l z#yuuEU^B4GnkUxf5SWch9qkL8@zxnq&5BIGI93_|fZQXwY1twPvWj;V_ixQD@QDE8 zG|-0fPr1%jjEbm%@=%$X0NF_T(-b^rvI{xo!rqxqb9@=f5>y-^3{-v2hhe7!AJ#X) z%=VE>$(47r6q9K{N}i~nDfBrcyn~HWLz5XdT6Rc5Atk1R#F8Lt?-0NR#XI^%kX+Y! zw^y;(zVB%t9jgCRxJ|@sBZ3d`OmjgOotMvJw28Hq(H^cbGhR zfZ1p+rR$V$S&SkLUxZl-^sfUYX+>zU&o3^_x@9U|4iJLOkuA$9>W+1l_6SbZbDAXP zXrdC_Za0)niZbP*O}V_=>a+9A?No##Sj@7QvZ72$W(|WGbAu>YiV_Hf1VIMB<5Ra# zxXoLVA>Ii#1j7iO>~i`$&ulvfwI%WIED9V9PJ^GzkC4+u3UwXlva~Gr-^wsX{wW(o z>Y-K=3}gw=uOd>_e-&e_DTZvf4l}}dJOtw$)1zYW2KRgk(s4I4Aq-SC(vt`VKk%t_#%ZiZ zT`!eEj3Ho*4$@2N_v3pj*C69~#nuO1(?VCMMy+B`9%=tfVUxs3PnX;{Al znKKs+A|lhBE6Tl>KZa!mDaVwi@#=)#EzKHByFSgoTY1TYoha_(vy1A`ZbX>$2_@U# zc}MutBuhTI&=<;I_-kHXh+(!;vJz~cIp}Nt8rq_|)*J$M%mZ!wn>`1sW4Z2b@2Ywp z72+Dp=ttDGJ~xumv_-!U+LfbVc zzTJOUBeyRaMK~8jwA=Sfxf`-cyX>xSJ}Qfenf6kz;i5;`YmVNx@xNlt`5HUA&cj8+ zxrz(u|JGXO!i^f2nzkg!N+}|R4{M{?Xv`rC2qynmDW-M1L0ZlV?;Y`Al$;?h@64aw z@NZQ(Z?Y{#5jJH++qXH3^WE!B&?6)`1SH4w9#4NjSQ3WCoa2-+*>;iXfJUT0IiIsI zyqZ=H9IvsQvSBQ~kG@nVIRG=%m4_vT)VhfMst&mQTkf_k{zl;%1PYTUQ#HD+ivpGO z)*6VrGe*{Dr|Of`9^~GPol+nnZK70&T=3DP%pMc?0OC)qar?6$Tz?VRe2Y(e>g{Gc zV}KzHRAuItVFo{~D#mfHws_Y(EOQuzUI7ip)Q`?DN0BtyDzqfBjSNH($QoqJW?VgP z53xz&>8M(H4 zE`n#yvC1D~T^PM9@(n+?sqBk$Mon)0AjgVgGg_{iInimGo*_Mu{ zuMQai!t*_WA-ib}CgaRHr^zV!i-T;6%#+hvtX3!KY~%EoK8>m1nbi4)eKn}A5=h1T zO4uF8C0vzRtL1w8h7Ww2*jsAa)b7t>TZgXS1jV#a4_e4i%S$vw)XYYddz2I!#GG+B zGN^8{R%jWTw??#X4p>-;5)g-(gjLy86;X=(%A~x?=lXT(@1{_|(S)-e8#Pl@Um9yF z2S(MY?`8&AK@PyL=c<%?~l{&hm|HWE#0eL z;F>rw4nw`^kHw@Pu1TG@aEl>u9aQ0%zK#i7w|rQU3B*AfEaPlT4Us!~J3p$qQ{~$D zUXfF5p5y8^Qs3raRMzLzoUB3{;)Y zodXbq9*2Yo3;&t4_EB0dJUr#r~}Aj z80s(czmJM_T&MFdTAVevo{#xo;m4Pk^-CMy)!LtU#__o`$ni8jhgV5Ad^qQ z^4RJ|8J%-Bp6Xa96>iaTO5LO{6_4XHl4P$zMje2XoR`>b`}KhN1yJ9q)>)U#O5@6w;VcN0&yHHYQ zi_pMW)DSzx3gcuX?X*h`4MhY%fS@2T7zjcMd${K$-k(lDzGGwC-+p)#=)A3ib=7+} z?{y9cfbJ2ih@e$U>MZr6fA8QC5(9%`gGWDD67^l{)-HV~ku-;f7h#*4U)VI#RrXNp zQlB}>@&G=+N_HM`jP?AThpSwDtDQkhD3FS{oi$;k`DfAdkSw6T+viLb zMa{ux(^0|fItj{C2sfP)BmhmK7!y#>Oh5qkBT19bZLwr)DkdRwyKby)pXN5e0Dp{s zJc122X}f?S3{;KEjbWvjL63Tvte5ATu;)~f-k?*7fQzh<@%K@;m%2#VVHZ2=RmPfv z$dSFkJLC8k*L>(y9KN1gD%FS8uG8P$@IM-3Uzc4og3_S<7#@~2tSI}^@* zW_A$=8(;Fj`8SMnaoCu>`R}R!+3~iVsZr%<4AS*E(`o%gS%_(jrD5$WV?%yf<$eqVrLL5LgBX}XCK3=5^y}tL zC%26#%+?ZzI&kNyspbg2bS?F#RHE#yP(&D#4-HDkeIFOEB)~9Gi@a>q(8r-7W{rJJ zTGeK1x%)jjo&E`50e8B{PPyclR;M!QI}iR{YR%{Pon&C)DwkNUe$!zv;CC(v5I`bW zKNX<%3W}*}1co2IVQS959*)hJvsmstTuajF^06KUm=tlsMBGwlr(TyIZk4)tQ!K!~ zm0hG_0JO;PI7cOKoW4mzdo~dhaIK+6NlA#Kw6chw2!u5jnSL3KdI?YEpf$qV(DB=_ zL0-v@?~Rhw1hfbc1Zyp~QX5sbUBRB?OM0vg;df)Y*ZL|VpT0^<{#4ehfFTT2rM8P= zqF89qHVp*A40o8*MAp5^t0bd(TPj}=5-SPP+1BWjTd`|mYpFWXGnP`hfiE>tnKXOO zP=Ts)6X(d*;bQiX^WRA7r3ub0*4}w93*3G{;OS6lzC>U87o0)&hwvX+T{4=e^|I@ z_a0w=AZ^7nccH2J47Eo+xcZNtHs|ac_RRRE(-fNL_)&>faCOd0`1j_o87voZuam9F zj{B_>XSJfo3naWyM|y)5#yC`G#4R`}AzmLL9+oiaBimKxDJS=93&l!{D0n6FO0lY{ z8yHx|$fp)H-013i0ZyY%GFMs+Eor<@#W~S2#Nv2SEn6vzH3%%RCefsd06VI2$mC$?zCCvYiX6EAhCCgM%ecFKn4slwG2G?T3 z^?L$OH;|e!IZ<<)a`I}VSTpcf8MnRhYpZrQ+;Nh6p0TcOwts#4$wTmySAav82Q5T- zgB8Fb3{-{EodQ6xOdzLjcc7djb7@wpsTVTxaMc1KluK#DvU!P;=_C(2-L(KpO9-BU z7dQQ^WNSHO&Mx|$jzI88k-H6U^wHDTIlEy!2<{ugY{S1r4Zht<{!>JPa>34yN$>L~ z)5+lDF9Np*(KcRCruE~ZJzHO)4V8tr`zU!8X$tQt%CAIH zT=&Y%nMg?jU~fr#W)tu+o(*9i254Nk99anaf((1EaBpeJi#)v2|< z2D!)IYKEBj9Ox0KYh9*twh5+cX;R<0drr%TH+YNykmgUBUycfIx@b_>42o+PsNfuFw(M3N${<*Xf_ee7x1i}!4 z-M8Ful3rSRWVbR?QJU|qKqmx5)DN(c69~*k86lG{z?x`LNxXNbonpSdg1?7j*+iwc zov|LYEdwZ`V*yVXg&3zqwQt2c?`zZ!1UOS^L!o# z<4kZR9kYQMIxDFP=-9}uMHXUh2c~8yQ6lsuhFs8`L z*V&^yDbJ#u#s%bSESD3cF1`yjy)v4{Y^eViwn{PSi~8g3~EYg zl}MMfu{>nWcwhFgUES&Tn@tA_cks5r1ijNwDmQ>b_SAB-%bUdL2bzM3WtLxr0N^1k zRBg_n!*GJ1)#B$2ooLP*6EdNtDr+@%2u!L+n(r;Z?F+o~@jNU*f$H7sk@knt;KQ8@ zE`_5X3RguvOLR`bhiErBFoQTjxi5=uZNB5u_lv4JidEB1bMgMRAA6R8ffK){L-{tU z;jY+r@BP1_{b!^8^Os{UJ9m|N-gok+^<+)aZZR``{V0=ryOb#bt+$newYZF0J{mwcUzT`4NqSS#HiPdwlo4w1K_ zqmFY4?b^ARSY&h}o0S+X7qcety89W~i|nv%?iprV8JyNiL{=?qG|yMj$zmeBXf6&x zWFA-~gOMB3k36axZ4&h9&96si&RUbNxWiDgOmg)=5SKNKPy&U8H_>%#B1u#A`142F z%(fD@_(0O=SIqI!(>qH3)@8PfhWdoR0{TA~QNnw7&OQ2LjiKFPf&dXVx;2K7#elI; zA`}QE{qid5Jc<<(xwh`fO)e}DxM~`6n@HJj*W|eJ4UtAqdfNBqU8mw)Z~vW$JIZd_ zT{Uvnvi8?-r|YWUbn>TbO{d$z*E1TG&F9*B&VAdsR<88APajVotMVDcQa7fkrmR72VfX%U`~am5UJsawpE7peVZ|v-0LC!SN#7G*MIfn_jecUT7Sk}%9C%;d0zJJ zMmP=RBkMVD{TU9#s;?3JohJy@8Y|WPY6+IKDP<*UM;qB60 zXX8;1cyQ^FT%RbKfHemLYgod^F+K%iO!!=}xK_H6@x|9Z8I;`{z7rT}ZsFXxja}2; zsmrIHoqKL$WsLZK&qcj{W}DPAemnfzBFKLgnQpX^oFz+>~QW~Eg*0+4^@x^w8j_(}*pYF9^%Gx1|Vd8hqsx+m%lXEA8-Fu z$4L@1O7R0;XcnhDCKL-K{>DRrZHOnHk=kW)WHK53NjwJuBhko2-N275#1U^3A>fS7 zjQDqKpwUBH!G#%~cKX5Ec+Uy*H z>}hSE?ybpTubA&jTtR2FuEx>HG(JI;5o;M%>{ScxLUzGhTJ0Wzq$Y51d)UVhOT`?g!FPiq&)sox`J)yYjF({wRE8LL=7FY+Ay5-(Ced`=VW?3y`s zPLL4*030D~R9(`fVg$b4uX@%>d1i5q#8ypv*s{;*9&&K9?K%GvnoHjHSTemeW=m_I3lB`m*NC zF}iI<{rf>5_K~VmcK++&o4?I_BXV(8$L{RCpf_C`CnX6zYB3pCrhu(nlRb6_&Ggn0cnsvNsrJ60Teo$uWN(qR}A)Tc#5ujREUaiya#JMt`)~w3ZvC+Gpw{cho zXHK>)dS7u-Zf{-2+;CQPXB1n&#{}46?!inNWS~!7*;=)o1&dWK$g@_FLcLmTB|N#2 zMGD2MR;_-shyierwNdPFN(%;w1R%hWV3*GK$H&@ny7*yQ?n+ho@=_i38DNN!odWCW zM+X?lIPm1bgSWxo)@^KSlYYiha>=b8tI4(6U3AXp%6IQR`YHTxwR(j-AxoQxj=Zm; z&0_h+^x0haDLp^D;C`n}8VX1HPvPU_Om@p=?7kaqP+=$%m`(xBtBW**GMawm5fW`) zInX`lZ)VM@;CtRx-Z(jdDKE8Rx6=vVbWyTfqzx^rAf=WXFtblAuts3t-z1VPvXwTf zXB0AAPEz{L`#KcnGCfoj=7T;pZG~DQJS9slv=;i77-P-MF9zOk;QmEc>x$2PlJ14r zvEtoPin1xjqcjSWB7TQTNdTHaWxq)8TVmY*TMau3g^gBz&p1HaDCDzi5?j(?!&7r5 zj3+3bJe4W(A;n~#k#B-jE>-Q7l{r^{G?Cztmwq7(RJG2FVWGk3C?yaj;4a19_>7}^ z$-Pl|R=l|ZIDF)s`UFz~&J6~<_C_@_Xi+O@>RxV@)3H61%Y6udU}NbQ?VAgf1WksC zRXFA)O6)GR=nN`r2GOikc6i*J3gi7xP-8qrKZ+4KJEq-L-bwslf!3+EH!}X-=r5D~ z|A*E(nYi!je75z+TJkp7TvW-0M#kkE1eL$fc+TbSj%sx+QukGAWNtA>PkC`uK(Hws zPaJxo+O5Myg|9N`$}5#?W?c+x8?NRy$@-5ZHFE)XTx`=;{#|lrRH9;o6!9Nv{f@<} zO1aow7ca86jGYc|;T*g%VM&5`VWm3O+w}K}%ipKzT>`3?+C6l%3bL>~5`1ll5nCLD zkTPwl3&0UH*lE02^OmKfI=#qjH&P1P#R;#4#oR5?Kpu9dcDv+4}C=NH_;+)L0)};PUjk$+p6$Qo&*8 zZ?Kgx;)2GQg@vj!W#rYQ(ZK6U!>6oxL;x!`rb+d>2=iva z7s1KI2_}Z69}evAT_8CAy;Sf<#fGOZ1MGgk>sxZk__=wVkLcOQ(>_1&o)R)~M>}(k zBswg#Q2J%??8L5qRQGu>IaeysvyE$%*l9VMGFk6&9kVT3E(=ObQ#)nI(9jrY#e#=lp^s(&kjgL~Tnkn}PNX)M+%g+q^aEV9h< zBK7REDiqVra(s0|NeEXq%Lwo3=?y*VY~`6*sfLoBWl{R68^uOc>g_O2GZ`lYC7ruy%Y!f_fOxhNcA7ngjRj;F zfp1vx`rkNlo^h`8eplM64&Yp zC{G~1wzg|v&Fs-usdu92o-j%uU!FCOno;$_qpkF`Y#{D#RmQa@VMf;Gsx2=xuP}Y6 zvr(@j8EtdGK2WZljRH;4rN(7CM23`hLX49L5MoKtklHCzePIi2#u76P8P4&ed25Y9 zCZ}GbB~L$0iSyM&pt;ffCE7YQQ^~*T0mh7c&O%|8*kR<7d@Q%H-6gl3Xai_WSq)S^inpflSO+3a>o|P6CLwT5~Jbt;v7U3wEI3Aq-UQ z&WT~7LJVM}ghNk-Hp6RT$!g;Bpd{=ih@L#a&(POf36;b!#wUVL=cjRZ2^EIJ^&Ez~ zsggW-2-w^hi^kC;#bdE-(o-KJfuHPuSJyq?Y(RR4FWDDp{`vc!xb0)t56sr$t)q1u z$FP4xUSx@iyB^$n?E5x!X1DR2$1%rO_q#6spu($D&GnCW?^c=AY9zM$dcY9$b4kRU zHVeiEJ7MswpC-D4Z1SCtEv4=s43Nb%{^y7SL}`@vSQ}%86nDNgTe5asoQ^@*Pt}=- z@O6XO==DArcU!oaZDPYc+^O}i(}xEKDW}WXb+&vcY3=qqSj47W9NTg71;FgTHs1O- zHT)dttqcgzPcNZFnQZWPcnk+}A;eR@;-`cv}AfL6UAXtJMIR-u9J2&LB_>h^gf>m!$=oi^d_Ja>@BLDeTZ-8BG48AIwUtn8kR z;k`F}tJYvM87GRTugO&0!RawkflO+Y(1y)3x$JOdN?i$odxDaEtv!cQXF&-w89??W zfowe0#~MmqNO@u)P(sp_^EAp)4}hWIn)`Myg){5rl+v2EG(x7E8r7SAsloW$myWKHE>hteJ8-YN#%ENjiE^G0 ztM0*{JZPQiphDE}Lm2MuOC0gVshO$A971@a4j~Lx9nzZuFoR!NdtU46?^8DIq}a5G zkT7?0?hO(T#3j%ZHCuX_2=wDUsWPsD2aRpqbNa0dpDArM*FTwaP0hRi7`oqsf0qN{)J_}FCj#-#a!!SeOUMCRh|vZ~$p2Kh;`biY8O z(z7aTMi)5TCuQk8i?MIHM#SGu&&mxO(!K%vEw{$CH_zVpO1GP0q-`92pl5xqz9nNj zTe?Z2j(tgu!Lpr^#?FO4PL*AHmd!2^Zc%B;TJR9z;;WZhz$}X(N5a`LXIYsP<-%Um z0Y{gT?Ju89&cg`GssU2$ zBN(A>nX)XCsUxsn#=!E%91{V^&#BNnmu3DK0(#d`fiToy*RnnMFO5{T_CdHJ&Vvtr zDB1-1>d+(`#EDOwPNkmg(=D7P`;K__PZy_h_BfXV2)@qwp_j{$&PwMt8lo@k{vS}H z^Ps{k3jeA|KUS%v=ptBoVxqkG44!`MYe7wU_7%@-IA#uHj%6dqLh8Axl*4=Ux}&fo~;uBxr6imv=L ze|}3R={ROeyi_j~U;gv%3dcW>OF1!#01hDxRK?no!Jx2cCJ<>xCC@tMtls)J6)GGh z@(9(yP(`;7Iv9vpN^6Kqlt&T*IomnM%<|v3=I0z?kV(ycI^gYEW7pspSo}W8sx$^T z@()I68fHm}t?mxxt1Y>hyyN{IcKr9|Z^9=D018=G+;M2yHDPdON^Fy0>^*q-<}MlT zn+AGN+^;YxTs?)-HznzuAob`^diU1_rX^QMCo

?K|e9s#bJ+^^E6U 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퓑^xkbd4De%l8nwlM- zKby()c-WO;B2AYEzY|L}oyfW!Sgjt^PSh~8{JMfq4->$Y=A1KzQVb&|Hw`rD`Fi_& zJGtu%?0!082>V?w4#A-?pe!K>E&Ld0*G=`#>fuaOXP0*u$f*N?G4%S|Tzm4NH^OIB zs7;?L{FOn(Kk(5+Pd*`BhZV4|^~ml&^LdU3De^SRhH21Mc780=1PYi${^4Ba9bh@* z8B{I?8L#BqXZ3A@G}f7(GZkXDN4@BL{lfO#dCW+^|(=scKALgpIvC zO%@5XBN^XE&f8oDT4N{Ix~6O!;MuPJsqZdSqV3D<>~}tqiBJX}$l;st5(cZX&0ypg zYZ?Wm?oPW;1id7jb2qirDWbdOGUUuQZ2^_MWS*W8fX>aZzq_|Tc_rhHC4EK~qWOqH z|0};*3b`9RY;Js3xMBcT7j76#c%`RcXjg2XP#|nKVTK=Cg5Cn5n}p*D$S#SnW>*s6 z6Cj>#)H2Y8%;&Q`{pz>Lug`q1*ysrXS@ma1C>K1bQLG6YjSe2dFoNIP_3klo!qo69 zjlj#x6c`CRgz@R|Uu@$`Y>rlT2YZ?AP%%QemX@(aQ9D%oRp*7p8#dc*!NG%7UT{us zi+1yWpk7^2+>30co;FVf=3AieR(!uC-HW*Fa#=1(59I)kf5sqWm7D5`_^2}eO1&ktS9vE{pY%uSChDd&Lq&u&`qeJ)qid z1nSmRI{O>)Q!oP-(|Oxj7N;y{!c|t%L^NAHf^BRs+gz601gBY1ZXs_~oCE;ffKO&< z^m%+9n&*{%%rnk>P#hsFRJF>FVWf~~ED&0ajB%!AwwlN`GFg{`6h^{Gy6GpMA3E)l zK>6};ArqH^At4^9Mk%|JVwcZvj_yT3DjnN%3hcPwEbMt*7s)XjeCOzPx!!VLOt)#| z#=offzl@*rcB=Gim1kT~g|&pf!_VPp$^MZqOls16X9N`ess{x`<*pfhV^!oH zdS`RhG1Xpw(>$UJlzx)E={yn@T%~ed`R_AJ+B0U1_@_SyQcpg)_3AZN#}828sY~Q( zTKa(snp5TPdZLR#nDvri&cyB$n6NqWlS?R9+ z7c@}$KrFS|8o_{=!6(~{YBi(BSiPNkhU63{E{4(KJ?ldoNxbE9OynZjqzaCq?#s$< zrLaL&c5!Ga-A(R$PAkbRtL8$d^hH;wc=hPOalf3DtuabQu<5I%PI>SyMEoz}FTC}k zaj09fC8IA%-%Xoz!EBRVmL9S!1n_pR2WT#S6qgqk*|LR`p|A zq)}o;y#>RGe(H?N4T%)n&x_8eqZeNintyW9$5?5wxqImq4Z=WT@F1ll4Ysy=Gv9?C z9Vwz*wsDbTymg{b-#`c^DAsmWUQmEq$V3I>4Y*_CRzYSGhBa1ezYPmu00u~J@vt}{ zPOi7!uHUb5cf~g%L0>eb0=_Cq1jabtS9|_%(UmdF{rmL_o`;Y_FPS0QvP86a5*`hx zLb5T}38wMRt*saK&zYjl^Sq@Q>sPf4jop~H{!#p2{uYraQS%Ke?=c_D`iygr!TStU zeJ}1f43+C2R)6DrD2p3dJ3n`md<5>=<=(&5Z2a@LT~}4^wPB&(Z2=Ke-y`2~M1dlL zxJ|^E$zcTF=I3S@=Hd$9*zyneN6<+21(j@N%i2FkmI%e&_>jvCJHpH9AA7JjZol{a zmdh}WknI@(yNB1*IZqb@Ci>=5C@s6j#1Go~4H4=8bNW89>s)CE^`D5?0vamB`gF{N z#EJLVBrS2mRdpnh!|l`8Lc&PEBLOz12uc`xYk$+SJ{Op4aPht)JZ3+;_s5;UfBDc~ z`;yh8v~XU4lAxQ0j`miSO(5nl<2&U*R>;zxZg`zg95cGu~XggJPm3M%5Yp zmo3>W+-~FRx|_PcD$+NI&C7Ifs`UYC*Uw-qhSyMv6C}d@LHzED*-cW=thZ%9Kt69( z4wS&?D+XuSTm34(GuSmuhSQAtznv)Hzg4shf-x_Fmf|4#s7I11JT3?oKzwfCAJctq zK@)PVmq4zvqh^bdAg-~hBon$rn%A%A+xS%EmCx75+8!q4tOOI(NooK~MaGG7Iv4{v z;EZC^Fb2|B+|L+Hs1Ll;S6-^*M%k%t3$c7})1mA5UdNZI_qnDZ7Y7=utpeTU#dwF* zl~PSBecaT>Xof*Lp3f%Zj^WE5A3bS9#^q(F553ZWVY~ubSeJiyAg%yQ;2%53RNahx z$L-vVrI3--p1YQ|*fOjF!x2)z{MhWv`1D3o`Y;e|Ft2!AR_Nh)ez|T(pl)2A*({HP ziP-foZ8+Q;JdPrY3&G{<&)`Sb#F2s=iN-g~Yy>X~M* zjn-bz*>%4m*z(-Be*mUt%4mu!MM7Fz$O+vVMb7nTn-m)sL!90hFR2?ArC9BH2t$yq zTid-0SqEvkbM$^bB70WoR*%?E@P3DiY@~6KiApmKMHT}{pCoecQ-um-;DGTDIN%{{ zPrv_v;s5Sd*G02b7(kTu%)2DLZYMDrxs+v*v0$7nK`ju-Xm}Ypl!+}rmL{0GoSggk z3vCsWK>ttuSie)(ZXzd=P`SI3r{HPoI6ZgUb{pSA=3e@@bHLjeR_cD!s1ni#N6%G~ zE?wrqrZk_@dbVJbLAP|Rz6|>syx(qou>giFK=yt~ScXBkx~hRweDl7jKG))QddtH- zx;B2fo8I&1#O6zBTMnM2$(!DvqOMQSqs>@ifpozZrqnYeHVnwJyMTIJ^Jh(+yxCv# zN0{fUG>ceFqe86Kt2M{wG%sAy{XB}3SFtQrEPY9hVjUROsZ5q(Qi2eOlBR)gIj%M5 zFv0z80rN@B8Ar+H%KWDo) zi5@pWLZZ+HkK8*ZnRBEy=vhusqt3r~)41Ng*TP`aMIT(X0^b#`r=x>iU9bZ+ zpytLfo)Z&~a=mODsPky0tXJIziHA!^8C_Ch%}jQ>YSYD)Y#ib@ZTY1hcDo9$5Fn*S zHjcLOETuEP2CL~}H>M=ZW2`)Anw*giOEiRK-CR!BAUgBow|e4z$3+i?ee#@6Ms!F9 zYjH}KSGX&j4*ex^^8!5j!2FT=6-q&0OXe;p=s3x=uQ_C6qca;#MBNB?wHjPGJ`|~E z+1o*9bLTGELM9zY5lUl%n3}-bQ$aC2iFGBBS1RWLHMhkv@mX!j?@T}ycI#UqNKGvh zGD}BDv|`DK)Z`<{qG`0MmQ$SWAq-T-%B2Dk0$(#-Q8Dml3_`M!)m5z7V3|147}vVz z;<~qw?dIUBBc{*G=E2|)Xr-3Q&#H9M5!NLhr;o@ljLe|dqnw%_h&5`hy&HdCo!lIK zOzo-p&O)5cTyqb3V=|q2)l=an-@Wt)ia+W*2MZ%1FP1Qa#<`@;PTktYI>YBDmq>D)mgv(-nBA<|EUM&zH#{ z+f}NJ?#ht0H9YBxnJT-??sa9xcYqk}=6!qC7ogc%;FkMHli*-v-lECpJ6W6cdsEbO zb9-%N=8BdTydn%OrHu&soEr+OtW5KJL*p8pB@KXw+x$xHhAM<^s_+ie117o=oA{|w zc0Bc2_-nE8Im(0_#X1FjtU6@+sX6v*ytpF0t~S@G-tG`2XB9GXzGAU&eQ_qCef|;P zMi5bW(Ab766KUap1gJh<7Zw8yp^1cci~ zV^Xu@|DpZO0u{lrdJ3fqW6AU-Qu$3)xMSs$k}IoDn$2|E3|+lvs!Ah%6Fqypzn*T~ z)pT0ZX|9$`-`!QRvXBYcQF*)jSlnf_#1c2W_FQG$(vx<;!Bd5bHa4&_O*X7j0a8h+ zN;%LPOjWFe_pX#WR!N{Zm;qH+Yf_%V9dbecaKPiQN-S@Silv`xvx<-5PEXU6g&3EK zw7RFqve&$qZKrA{i6Ia3P}=U5HdU~tN#O86N)(#%w#_n3q9#`VqjprzGW&Q$bLZYeZ7rMG?n9_x;H zKEi`2`eMB2a&fm=^3_>-Y;;o=S=rrF+NwAGmaj~2FD0o{i`l2=Uxw(c{qN{({p;XB zIg8DC>+9%jD>a>4EVEmE4%ZBSki>tVE66@sAvQMpriWdF!L)-{KEd~n#@k*TV_Ojk z9keKBPL17RO&?vnR6(@1TDHm1TAY_Rf6-?dv7uKtxxC$0^(|InUKFNJOCh7k%d7R5 zibF4#|+AA36iu_U0$o8y2&Pfl+BC2qu zS0b@dih3YOvkc1%B!Z}+ESL(W&6q$K$%{=Q#Y2b)fi6i-Ed?d*D>`f3De*@J z+3^=h@FP-erpUtqz;%E^5cZ_KNv7ugD}xy*0~x>}3{RMU|Nme5Zs$vZP++DYO4BV> zI$jKnpt>qW-M|uorl1upp9e`O3bSL8OyX7Z`7tudDqwuSoz`XVJL~k8vpQ}G!lT@5 z49ncfuiMA*P+u7FEe~my2RHg{Jy*y4W7SD>9#XKnH*R&m$$k3k6(FnSp1GUn!TKlO zEF5!=Qmb6`pl_WXiw^_ZuXPH{y7vhS0X<14ttgo%u|hD{D&Lbj)m49iH^9riKJuMU zz|%14c&O_57#z0lR+ZPUIZk1FjKbP6{{ceN&D&yecE|1^YR0Av=NcX=uc!nb#ct87 zO@pr4uNCZmZ+kVeS!O9uV5V|4_Cj%NB9*N!9{(h@iYVa;a}5b+j5;0c1_-*@6Dg#8 zC=6pZL7IMp&`bc2so_=P&rZ6lw6ZOig!0}F{{NqB-1dA`{5=+?B)f_5RL!b6FU|^z zSeqS?&vYuJYGR!#(own1D{6q!y4PQlhD_0`N5A+j=R4a6Ij6gVhS@~3L0GV52r2ve zFVwy#k&a?f%Z-h#+v zdUpIRHOv{V5{b@JjScGXkLKH4>I>(3IHq!N@?Tb+6~tSzlD)!7HbZig$M3s@;Bd__oU0b81(! zhygv_eiew6(#n+CTljg!PZX%zVP2e2n%Pwb^)s0DVHDBaW3!W*ObF!OL8?WKVcY8j z;u?(T3YT6d38yZklO)qgymVDbL9)>kwsVDl0$*ycTlXLU93c!<1v`ngjPXs8@6vZX^TFw9Fh*y*tMf8cwLPCT#Krz?ugpK3eI*t3 zin#jv(-kRHZb-w{sR(Iuyb}0oYz4bo9*;+w)^!}uYRvME7Q2!r?#lM4WlY)Clv-|^ zF}P93((5W7ryq?$2W68K94JobWv?{~Z(2_!g$YPcOwQz(G%;S{;~YsQJq?Ra`Bfm} z<&zt$7&7d$K^~u3WH~8m1#UA0?b8zG;R-x3u4S@NS<~@7Y6_-*!qzgFR16q0WcUCC zag;W?HHwD@WC($8jj`;GgB4P8jiDK-90?77JnB8C91sMXN^PE4?YE7UTT9P$p&*u6 zRz~j6#C9xlj>h_>wDA;PjW@jHv~Tu(u7;AMowUW5n)+v{ZT)kZG+YLj#dvn^*!Zqt zwCh&QPCG;A7pI=9+~+XPqwSYP7%mo{pv$9DeAJCndGN6fSd!wp%l4yvvX@$3;~&JS zh1ztm)T0n`p=C@F6?k&VCnjwg;5^w{UOO_5o7$Uu^B4+eT@ZOtUbvUME|Nun^LnK2 zU0?6J%XQVaD|HD%!_|LD$cV5qVyr4VW~9&mOaOGzh6U5#tn7=|<=vP-puk1Gdc*K7Hq*D(>_haG?Vj0hr>((hAIUM=&S{uw)KPA! zfaR!SmKEBUr{ufWu%YEco>bU0Rg=ci>|wFGcM>&uKYO6|et?-!jO(0v`q{5#38U&x z>ra_TZ!vT}4+GTcIfheh;<^t&>yy90&y~H-vW>2=Z)A1RjnzM&HaSC&Q6k1QEWuv+fwJb zoy9f3Ksll&0lq##k*%=P_E6P>V;Ax-1|{Cs4;30o*crts<+=_l@z9ChEz_35iG=fB zPNi1N&BdpAu7uLo$=;Xgk>`oql@boafUwLUAqXY={#?H0KDoRr3{<5NB&*Phn{}$` zXQgk_P#bR^v5Vv?@(iSs4o9L&Go@uGH(f2!P9z~dzET2BC1$)I~$*WxV z@8Ik3@3Fw!pE+6w#^M`Jn%eH|r8l!~_)C-|bnjg1^{X!3U#73|iRcn6%;`-ccQW}E z#x@tJAuE0DD-_?!xvJWc&D0{5c?7jVjoxJ(R%AF-tF4$KW}}5WGd#`J?-M18sVl3U zX}hOINDx9r9naQR)z76KHO&|$G1X{7;#ZG?<2sAD1g5GMQtSj~r5$RDCm_kXW6)s1jJHCVG7{JH_fFUeYW!jMjK!`za>Nppr z(u^2IAkYFw@EJYLqGAuNkt44%QsqkSu`PX)&^*a6<37nnqyIV7{*mVPX&bvP>kcQ) z+d(4Fk6hLucT=KMMK7h_AEVsaYLIQ``m;1~4oB*I`b=q+MX)wE#Ar%VVn~h`-`;ZD z(H!-g_xvBKmgzoIh32l}=E$Vq+PquGY8s9FZ5;L^4~b8yS)kBY65jzn{RqavSEAKS z`nR>n(Q7=TtLVJ5i;;KXk#f1%y@VA{j_y&-R>s?=?fFe{_B$m~V^XG1BaV7H=yijc zzOcg@XH}{~+oSoy#9y#<^%uI1&mTn%5RZS^tVS);Rk(-ZCY(iqQ{Zrkdrk@!|fdoiDYE;p*?>MMQOXS8#ZAps(eo$hSyde^sT)6 zT}Gvm&1rPn>bJ{_X_Z+$=PYEgGu@a;W@N^bGO4{pmL=9fo`b$r-EegfmcilFz%wC$ z;;uHvv~_jhw6ZYE>wFiK|2DA8)?A~Og!eL5M?Yvjg)_K7!LR1Umk zwz+k3n*o`~xFHL4>@CR=bS@>VossA^7HAPlD1>26pECgs5ZfTSRrFR>6%^U$W7h$M z0A5YJ*p&A3=eg0KY#NpxpBxvGnNXB^FSZ(nRkZB{2$sEO9Xs>@a3M~1lW%{=|B*M~ zkXLD0r6kLfH)_cg1yW@+dq0kEuI35x=e+gD8{EvgB9hwOfKkfjn zKvKWx^YQZsRpg34*vEs;b;NJ+&E^@pLYTRuS6ee>hllnCV81vMm@cqG!rXX{^+f## zvm?98km^1kBc7T^$-GMhgLlgG9mW2t313|9tUr%xAkg6ZO*clunyf_7WAun$;`Da5 z&O7r7;G5~9a}acPJ<~z{on@}mgmeSPAhi)>vt^R4%dlGV*x?JOKU^O%zk)t{PM(e8 zxrUU&r;NkNYYQ?(^!lm5XY@HImt;QPFAK^GJFmz@5H`kqB6F~nOm-TiM1K=lygpQ5 zdiGmq&bLWb98aqGAmB8|)O!sf{eNb>U_YCG^#A>z$f76!cHV>E{7%ot>wM(IAy~l zc3)jbyyGM3e)pj};WjxgRb}2Xt>@ck^8G8VRjgT3s(ss`ApQXvRceVx`?$p{IAPfF z)KycFuD;&apc?S)bi6-M{&gN-$L#gU?&)Eir{v;qf=yoj@H!b5dN^iS z=<3X`-gbGrfQ}BiAy^;K)9+zbTtGhKDeEJ^r7{J?O1?I zq9NjTX1+{&PjA72&B(F#Umi!q?XI$r00>sdGnN&Q00`E#*YWt`JNtK=`u>mr4qliY zAB+Y}K{^8<8aOj0DK}w#N>2orgommtq%*3q#mL%=8KK68dIqOse!{2|3eF|wTI7Ta z8qB%o&QVB#OL=-b#zbH7=8|?jfAFh1zypp923xT35Dbt(r>AB~(vu><*ERCAlqqnz zLAy8^_o0fgeZD`(-{a9boW?2`5Bm{uz#(i@wc3)QqKH9nNu;ZJ6Bo_q0ZU45fSg|z zkn#=k5N8sa0#YFo6Du+HX#e%5~um5Z>j>6fhq)6OPRTt!+u?WZ2ghwq0gbijsu1ao*ZR4;<}S47(JcMYOo7 z=#Rxf+3fH1W(UszN+rtJD?)WOx%_*F0 zY>m}>t7DZJjZkieg7onvz?pBMW;!RUE`ctYb$X|f+Y`(`9GVE|Y*bm#S!yejFIhR< z=Bt6M#|#-h-yjl}$}}}Y1qMGn9Cz28w!5*j1slCn6d$X>3NedY8}N2$+rQ1Xbsz^J zRsIiVno-=hhRi>9`K#YvZTK2`cL}7GSfjL?{;fiat0Jl^FL<#%xV7zC*~7=ZjGWX) zz81sqobuDy(sT$Drqxo>%}K@W@MUHG%|$DjNNgZ%lyhE-{#HE!63nRl;|o{{=kz((5?G%ijG}D_Zqhwy9OoIK$snXrMJg@fnv~&K+9c5GW`rS7 z04F)ZvZX5>6^ut1!lZ;=jps?COP~iK3{8?BX!u##a{E!}Ffv;185ZR3JLcU)CoyZG?CP7gQKM7KdOR)z3uJXN4F z?z|v^YN(TK!U!P=+N zNG#8BFwyQGt@TVb?2e~D&*W#fFBx;sRAwGJ%O{4lsO<5mLuFP7`!zknV!TEkLJVh5 zSKHg%(sQ;UCSO-HB^{=S0wN{rI&mLCfYp^S20%VPPR2P^HBOM@^@_HG(cbI6jY7Yk zl=gU#aRN*o8+A$1Bv~^l!UD{i#Ef>}Ce)tBnU;(n!^YU~6QENyqd!k`a>UuaTB z*yCvVze&30f=b^-u+ZSjC<=vz0dRuBx3JcBk}COPm|S7NWc*yBi#^;ab$5V~O1d}t ziF(J-T_P;=m*R9VuejgdIT$_fZ(Kf~w`00VR;=49H3MEC`b~X5YU5fL zTjMkKTNVNE%{|h#f@6Ow>%NX@F`Dvl%7o|q+hk>9cG~~|;2{iDz0RV61~@WH=4m8sX}kXg=;&0%&i!zq*k{lg!fYC`fThT-nMRm6tE;KR5KBpB=2y$@Kk?Vjyk(x}-V&sOSnD!x;7gJ)jj`71{n z8TRJ)4_AgVA(7BTA+i@ipk`cPtHhqAm074M32ed_t$>CSj&f$ZGe6O!>BRc`4X#O* zqTHY&fdn$=dFKM0=`?-{q`8Y(k5&dcY*J`@6lk+j49?=%HbvjoO$0G#0F?$cs@SX3 zPFra#NFjyyf^C!Ig0Y#a& zG0x2ETI)Tv8lpiwX<4+SAOQ(+;ppLwNr#i$#>wGSxsI{GqC z_+of~a3Ks-&DxrR20AKJ+05X~D5^ylcq|ew|Lw$Ce=}OLNkN4`kDW-sbht^76fR?& zFTL)1ce#n;l-zp>hbHG5_9MCtD=!E3pC2P|8sw)z74Myxj6k^+=XLm0Hdvu)EEbTRJ4h*LAH7cEBHLLjC| zYxe6&08|wU?R|!9#%5P}(x7$DeOOoGF@dUAA;(f+_>f9kY-U~?$@ol{<1+cX5X*Zqh5LVFEr+yfM?C)>9F;SQ4PZ{BWoa6}HMAWbJ+i+Dgg*u>p@z4wQVLc3^0$vs zk}sPQi)-H0z&QF-QCVrBCR5s|c?e#w%}j)1T8=ztTXX*(Zr*&)Bd^G$t&M%XeqEl! zKnS`l5MtHENqn8IQ=7>v4!3J+i}?JMCWj}^>>%RL;?Q=`QN$xqIBS2M1&Q= zZ6xBG2O$hpwdRyz2C~s!Tf3^&QmR!}iY}KxPCe=-Zd6T-uIZm!4@4yRwv5{I2QS!)k3I^)09ARL$$NQ$v0~ zG+fuqUu)~g%5u=;PTq{-P|gpe`o$H`{PWkq{;HE&dB3@}!;4S0y4J6KD&jUx_hG9! zW|C8W3{!&ew)qTK_W0gs`&7xxKk78bQfc!E{a9XvJ)V9&=N+y;&~)08>`jW2izCGd z@wajo^)7+%T))|5w?$EqH}@C0=jrn^k@yW4y~%TWS=5`9d4~-Fk4ACi!cQ}Wk1Yhd zGM!-H|_7FfyRgFcSVTs&pqntY$b`}C9jV#I-({;QL zXnACO`#mjn$R?vS*eL9XZFvn+tl2KYXF4ZW17!wOX-vgLQ`Zxj!P0kG2M@3Vp)dw4k|+81=ZujLn@^MNY0h51dkMCZbI`ZZRMVS)Xb@f_62Y)T%iaI+Y6l@K zRGr$91fYmPt*=uN`-lI(n|Xcwu?#6h#JZi0$J4aW} zY>?b=+HS&E9;*=VACMwv5BAQS;fAg1CcPTa7(SAjBPk`=ozoL#Wukk4xP)4y%A~ULg5VU!A`a1DFTi#`| zB|0WOy|BxzW40{;_^UMCvQWL7r?jUlv5{WX#=?%*Ir@pywVAD9420>^clC#G{EU7F6NYV!pCMPGDi3q+M`nh>I?JM=j z`JNc<@W#K*%=$`FT&PUVgzW6Y_Dm+5(s#N^m1@G8XBj?K;pQ6{_wl+oN2>L)GulHm znxa~@f%*^0T$U)lp&W}kaT8d^VWD?hud2$PsZ|Q8Vr3c_>_oLG5y6@T)WE!Ll_NP| zU7-L#3JEfB(N6qT9TSyK@3D>w7kpLHa=$Kx)7}M3VHl!A{(ZCI;kT*~wRHLFz~f6$ zG^7;X)y0Ac2z2(=iU%97t8HQ{eKxgXms@b2U8j|1NFM77a3M~+Mc)*{ zUZn<$kaxr@K-ym-yw+5~pC6Cge0L=G>t6t#4Sujo8flzWy7nnF#`->dL%Sm1y7l;F zG5xM`@IL3>{Q-K_Z{FhLZi8}1JiUi!yrU4`JyVuV@3hum2BL7IWULx&)s*q)vZMV* zTrwnA7-%spAsWdmt(o*4JV5aY)`&+CB67_`p5`QnasosZ3R_Ml^z@fEb;J3;Um{iJ zj=lE$!AMzuhyPUWPVn4Y$0iP2C*h{~EzgMTR_o;t7trE~NA!nCC_$r|j;a1utZd%% zb*^pxx6fNVO(C8Vf0E&?RfZDPIBa19vsx9P zVd6}?m)zu!kH^o?0k*z{L{Enw8T{5DJ_pe;TK>BAoAZ7#rgA-btJLufx5hP#L6w%6 z7u+>l53jU@H+79$uuBvwV6uZJ4RB^5GGn@jA=VfFLC^dX}G`P zyo$dSDX$n`K}7FrQJO;wUG4{u>v}L*ChNU0z*(}Lk%KtK+qU&L!D2n<1?H~SkRcm_ z@Dki+JVg+Kb*Oz4*C9@3)lZ)Ox1an!Ux4pZv=0123iU}KguZ;&A8gLK*Yo|(+g7}P z*Zx1#^V%r>bN1U=-<`+%0zJE%kV%Ln{r71i&2czz39wY)#QlN6NeT%MOnFq7bn#I?W@-q1z4YF{ zuGCHL$)+b=GWsm=Z@$hX=)ctYjq2Llo`3twHlKuZXF%*qC@JlR7*~p6I~C4@JrF8z z1UyFT9I$7}`y&|ph6f4vrThO${u{?!hOy{fZZSeGnaEN-sIl_84-ej_2*lV+=@)vJ zKX+q!&UT%4&l2cu^0=5W2_`X6fnR_RLzs?$WjNh%76kR41tZ?Mmk#g367(cBoPXsP zII_fo-{U)^o8Cs!umAU)RgK(NZf%3P^oC;5(Z-K^`=$P$5JL;D0$7PUewM5_;SPo8 z@>X{Q`e%koc4+i*X90yuG^crUO)2xTKa!q#O(ZiJ^wy3OfO$vz>J(x9PKg*Z@_*IO3pgA z`?wkQ{L-!g_-UR7AN zR+gf4#WFT(2=Jt5s~?jUiH-)7!>f84ZrrCAz@#W5lZ}km z%xwQ@K?>8mBdg~Mu|RPDR$W~alkxj73Gn!2G|+NSK4gCE(3R3`V~m|6al^&_hZM?y zCUX8yx$DHEhc_1?ov7*^j~XxQ{2Ybx>FIv3K-TCktn9xty8=$2N`%5Fh)*bzE2c>D z`Njv1N#=d}HDz&6?CMthtFSBHN4VFqsk7Sz6lJEC!M1g%;e8y8jNi)bHI4yFcUow8 zkups;Q7Y4a%B_^y$onLNLR(ET)n)Q9Vfgh~WzBQE8w_x=fU?B)`fPs2Xlir7{qK38 zIa%^|X=>rh008X%NEu`R2O(@!Roa;YK>)u#2e|XAuo3g7PamFDGrB*ccNU`sYP)b>mX(gmvp>e`o=BW{U1K^9?qL$2rIKFF zdV$k==d3;b`H}O6obf8Zse1NU*jVbnKQ+-DEmHS+!z72M&gEuO3Zvm z`nt;TzJ9A>y&(Js&#d#w7_s_q)I9ZP3!LWp&1BQxOrWF`pt06${nmG&=IFlEEopqF zMUK4L|EP^t&_Ih43jS4!So}nid6#Y=>UhWiB)29o^pw?plGXIhYn@t`N63mAR@R#N zMtMbR2$^p=e>>Mix%D}PEjk^O;J*8#T0+qKHb`bU&n#3ebKGGGI$sQyQSTH)4VQ{b z&`wGC#JYA>w`?frdNZ!lu6U5T zI`91=f5;(@zz~gVD+G#?X{w&Nj*-*Uj}YsIA)^@KN7a50!%bkx6A@?Ou;f=6Fehs01apTy`a* zv%40p@+_PEz7l17aP{{kfV2pJ4RTV=uYYYk{~jN|uf}V(0wtN|XLfUdbJ4Fxkp^J> zagB4)dd9-_pR#0XKsl&4QIC2tlo?O1Da5KInBR)3QQr--L*iU_TcYL{HPnXAC{=R+ z32eQXwOA71!$p}HHXy@piWqq4GwYBm$EwP%6o3E#0000000000000000000000000 z0l*;)RE5%@q6NQY&A3Kk-m|7f;8LL$3GaQrM~rc5w2Ud=EiQuqDLJ@eOnvK`rKN4n ztz3+Xz(m2jMOzoT@-22M-XR7t7Yx&$=2Lu=2{-e<9jroNyDN~t?t(*lQZhd z5IQHqNi_R%c!A;%P9DKxq;?#W*p`s|^ZK1jW}}%sMd;OIH`{UVlsV6I!grrNy0Gmx ziiKYb^1Nr;c+Uf@&*N9+NuRNtj7KnLS;=%H>7;=xH|sI2Yl4+cB@d46IT}n|nW7}gA@4O9#X0?sJX8J*|LNsgPoE@hPlBX_q6j!6>zL6aLk>ffDk;>y>vaf3E z!;`yXp6)m;dh`ViE9mwcG(9ScV|1o$)6Y^}i;BlCQpW3^v*T$bV_9chorSCe@!8eO znRqREa*=e{s8p5E_N@t<6f$`%0YWjQdQ2s@&w58LNy*l?*B5s{|Oa#BYy@=D!DK=Voy$I(e}hu z!1%*=e;fZ-LD&%Xui{BFEKy zs;kCJQ|ChNu$E{>ObEhVE`YJsEWBnTCm&jos=W{Bw;XL@NkJb{$sQ~8a<}IUb_p#8 zj%01BmqsFt>L{l+rYOY8I3O;N>ufLv=!>hYV%?fp_SVv)bK+f8nl4BdV&JN!5dejR zooqkEyQ)W6@(0h!F!i?-PQA$fB*mvAq-UQ)|Uf90+S-XqsLsaoUL*~VnDY+D$SPT@%5oY z9xlvp?#aU`6kM!DcLqWtXcl>S!qPTRC;H~r4#~Yp9lWiPcXS4;*1y=gjgUpa2pAr6 zdUb?N4gNPtV5P~2tOn??{?q$?fvpu(9#qq8_srHK6wnrw^Ohr|KRMcZD%nNS2jkj%Z5sI^{=H$k%lD~((!}e@y>W%LCUf0GsUti;M zwR;^sWcQ0kB0Fdu<0}Ntn%1!`lcJkT2LTHCXOq1>!0A<15-@xe6%JFY4LfXrR#;K+ zN$MKfrfq0EE#7*UJIthDr^jJQt?Vma?lz%Q1Tvhhdcw%y*0Q}gsn))1r7q+)yOvn5 zT#T-6sQ}I^?sa-W5?CCZ#uSuLP-Z7C{ODK9e+r9A#ifl{b>VmZR)bQ54MlqL?9R;J zIa`ey2*ZG}41lElyqZ|?v^S-y>hQd^UZsvDLp+gGNwaS`hd%!LeZmuwHnJxI$;4~M zcuq>>6=d{!85?TI=~n~?8fi@8Se*A!L&|Ggt;>`bs?+s;IQG)dxRtO}RTROz!WNr`STb51i4Jo!X|&WtttoGA z>WU^{Ad(Vqt)Ej>Dl<%4$ZFoLEoIw)*)kjd;vStz`u%g?NYzdPk~f(@Pq8LP6KXJ~ z&pM?kBdfSzygOnGyv?4jtSnHi!Dap{h$jG#lGmmmEQbWR>^|M1(*SlumdHf~zHO-TRZVZ(0wHcJldF)2*G)bbep$%uJ}fyerDE zrYV{%;&xS37-{&+o`(Tf+c3PC!^ywdG}Rbf67dbKR9rTDcva&=VZ&&1Ske--NgD*n zwhn91isWHnqg3CSe1(p|N|^ShJpr9OaoST)Rr>@vN50WJyKDdjN-mcmMJRxWBLd5? z(ijNsrPOj8rx<+FEF*k3dLKvbDV9oV+XRCNqCC(9& zthH!3;bQVFEt!1|$WyumKrNzEWo}vcT_CZUwH{oI<_w{^dT~wN9A4@>WYg2Res&2m zL?lpl)PeSUg3++C-P!L+w#wFZjJcbFP}93T~;fhZl|Dn_@nOK7WNXj&o%Aq-U2;*SOqf<&hb zy6)WWR|5R^DH`0lFMI(yQtaCFi5HB4P)Q{F-2SIocO>P{rI9mf<0A9G$2Cp_4G>jo`h z;WcwEK>G*5Pg;`6G@+$2AE+zB4^>u;cMwyihAPw4*kuG=Xc&yj*=E#8;T~

0w%z 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

  • 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⋘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 z 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

    _Gq0twHEzZ{OjXj%iA9p0IW4cMR~#% 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νQ?C9senMOQgY|h-nB@Bs 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%0AL<<;Eb+|-4Jj?4u^mIPF( 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ð%Loq$uq56&F7Vwe$lA=AM{xHy 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

    !h%G5vcl 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%0Dl8+% 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

    _gT=dza91GE&^b)709mjPia3{z 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%0A1Aqmy_v{?W z3jF+Y+dIQf2C#?~n1u?iVvr~k3_h4SE_94Yv;C^085+R&FW~pKzv|ai zNBqCmtzck~NxYcwWKk2dJFARX@2r&@7Q@L7oe3kt{hom*!n^$6Ty|%{eonUw1{&SXR6e=s_b^- zfu-B97W&jJRa$`?*rWCOA_c?4o;z{omY`DzIUOeiu(M1P7Cj=q(E+Pfd6M4ABAZDh zy63X@nB3EM7G4#TmMouG(eovZ?z6i!9eT3ox?ZTww76j#S$Im-x5=o}<7d1=Pd_3^ zFx+mp9 z70|nyM9Fh-`)Wm&hp)Eb0mG@ugHf)BMH5biyN}YhuOQrCb>vUo_8!jpo~eC#dwzl1 zmx4Gb(D`=Te7W7jv)+GZPKEl1-yDx4K7vglBBL|5)$?+5@f>= zZK63!@+FS4NS9I%-|E@;yt8wgg-Uww0;aP8u3cxnc0@H?PN}&`lnE3 zxRd+0J~x;xAlO^cj(rEN`mGj3c|%cWr}Uy-&9KxA_6T<~VZ!m1H%wkJ-NXA0n`!Hq zEnS~k$W?jPYF&>Hl=pm{${PL0SkX{+8<#Jh3(e}a1xB!SWGXfVoc4ttU2vZ^9?^}$ z;h>vF+}yEvcrmqQa5coZsKoU|xvl*`zA+~`XQHx5Ys?l$*Vw6CM$vnl&zz`M&99me z+9^zLcJl`;EtHEPC#!O+idkJ$>y+H)31kB#tqRGAi#Bu?x{j008!eYfXM>ed9gT@z zXwy5QS*Od*A+;opkK-~RQS>hIY@sA$6iGxPM#_z4S-@`)iOig!_bVL;#@+J6#){O) z$zxm!)vKbOewqLRBHK#=2tZ;a2#gy3vnopWeO87LoAt(CK$UCfXkP&g=p2F`WA*Ml z?BBV|sU>2GB}B7ONPu$;g~57$E5Ns-UM5%hz?fBX3U6|2;H+@B&$3aE;LDuL1#YhSKm(f$+jU_Kea1#yWV`~* zOuCYA3ADm6Rpes;nEJp6AuLP0|NsBT{zC6XfzeE0r??Y!JkEGiBvk}TP_RxCN!F{6 zn^VN{j0ptCZn0#_+gz0+IC&5XUU?Yk=ewbur-OrtZhx^{);RksTiNNLmu7s7<4b=^`GVfE?6g<+*d`gRY3b%deO*P)hCWChhl)O{lQp}ae>eVM zZh;f{evVylO3RQOyr^JfVQ0^KfmNSGUHyN`Fj_e_R3h(h zKmf1^t85O#M}ipOEHfY}?(A*Q+IxCLrr<2etmu7&od-+H^e$Jrl|1b({3Ise#+QS2 zkd&GjwvLYEejC><8E+l}*Co{NlF&JeYvvy7^}PNBlxiALXvr84^$joUJkNr#c(~t6 z-(I~0g+VP|29C1Od8TZxR)ENewHhhIO3lrhzJY7iS8FuRN$Hb4GlaAVQw9f$359bT~DM^V^n=GOOk3=JpNz=PC2?v-b<2_CClx8XU+ctD-^RYfpPt<tg$2xvCCd(Vl*xx9TJ1JQ z+Bs^bA_9oalo}5av;832x|9yh2}J*ZdGGjd+!~^-`R!$aGf^xhn$7;CUk|iHYmyv) z9miADG0S?qo|GD#Z^?EiO6;(Uh=mPnvf}VE9LlUA`d`QV#GZNM{@LjoQS!g+9@X8q zyHEO)8qxp&4rmijT&!AMC_mtTXa3RspZnh{kNO}CEDc_?01drBAH~;z=XR@*cBUun%rX$C(BF-u1>0Yr`p!bdUO=Dg(2Vm5#kAl z(|p}BgL@ZM_$sp2%9@e@uInhfm0WHj0Ysd^A8nJ`dc41_RCVN=CIDgCtKtF{#igO<{Ym3qpc|0 z#q_@K$9b)O>(KEWzs2d}QUCxC3BVyv_TPDLd|k?x!QO>z8<}qRn#cQp2zPF55cLO+ zh~%^6emwDSh$G^?sSMVdrUr&I3*CU(4kl&$QV)#yA}Kes?^wv%FNyIrb^;3(#{8 z3)k#MlTupUC9k^yaEH??rK${sOwm)tH2p49Sdvsz81=C-pe)U3A0b-I9REq)f} zE;WeP*i&zxXfQhTmbtFM(fw4?z8}k%VXupgd^aR}AKUL5Mrf%waR+`x%6(IgSn)hE zLBH$FJ3Kzy4zD=$O*Iqmig#GR-LrdO3kM?RH>1Ib_-<7dE+}z)Q}O-8(C;4lfpJj9 zkmY<3mzTU4O7DInm558=6e2#B=QT5J5a4T>16it^_1WW|^~KT+A<}e%|5W6!WAX@n ztQup!_9lY*sjwJlhWToukD>RkMA03PBtxdrE6ev z@anl{0hqrXlNMxXqim=?7k+J19~@F8oszV@U7b52+aAT(au0xg-H>M<^46KO=~D#T zRqz8!jI~Y`Hy~A8t85!}o_%jj&+zm1?=Ji8TEqBj-5xAzh|mm_r*t~`Ajov$rWaz;wD=AGwQ`&uFF=51<|LI% zR3Pu(mQxNZRj$&SP_G5cj3lFBcHc!9W#n&h%cSG#+Vbh|tOJGIwUl@q4&POnNq4%M z`pA+NTvlDvG7POHHvP)e~~L=IjADq@WghJHBIC=XEd~&?Z6a z5Fa(JoPzZnUnp2MKTxYn;x(6U)HNholrse=+x#nejW6%Onz%LVbYvN|^mn6NisXdx zniH#`(Yx-E{cSbfbO3m}#jZ{rV+)A!4=<*(bZ=xw`1lIA>HataiXNa)17cu&lmWmY zY*dxjhhd{Y=vE;JDf7Mbl=5b21sO7##O)NG0Ti@{lRV5xuOxvjNq{CGpxO8}I+f7n zYMyjCWP*_2_-vl+2>q4*s=`>E_No%oo~o9Nh`A#AH(7au?3UNO4+s$=Hd zaPIO{Sm!^g^>)XGIcW)j-J|fx9meA9ntMhxayft#T$dF6O|lQY?p+UO*oKLW!gf* z_uc}Hq6bu8!D1@hmAHtsSH|5xD9_(nM(q!-`78O1jnj`kLN#*P=ahE3Uo^(lq4(H) z4m0KHqXJ6ovKsvISDq(r$8 zXt`3P*7I!55lasRnZPf9sBMb`vG9G82e*2jMQk5K?`oeQ+9jiHtHn~A%c`kkAo}UJ zyIf+im8Y$ZTOD3Tfy$)PwBZOzBGl>?8v1#q#_1*Bx%9RqT3Jk?~wgJbLpHHJEkz8)mw
  • Rn|q9|_}l*!SV~>Ax2s8vO%e&a=_yWB@@a3y>a!Ybj(7e&Ld-GQ2UnIW0OY~YxQ|ileHG`--`6u4teC& zTCRXosQ{^gKtkTO`y_-YfH9U`|KyK7LVa8(Ijz_9?GpdKL8>K!k()+u<}-@Pu9n{q zbc7FGtQ;W>RAtVj!4QI<*3?stJysyRt}wDvpuk2IdczZwEZFV;@RCvOInZ^40ue4? zctSCxeRHn)b9ne9VFLb-lHWXesv~O(FwXD9JbaM>9PP_EoMoi6m7sDkL`eXXg{GLX zFM`k8dFR&VJQpREqIDJJB^Cq{0&b@v2Z54O;Yj}&;)Iq z)=BF(nIa?dt$?;KI&7lKp`1Cr9c8W(s%^;}mHT0zR8LYZx$(DEAV8wLEL3hyvAA_* ztH3@AbNQ8uTrymNNGF6`WlFPjruEc!{cNq%AoFL(I@e>AN>~F2vgF{cwC&&o(Y}Lc ztHM?=^xDld=7)%Ux7h79LD`EPmj#Ql*VB|KWw){TKDQ3yk6MI<4+#PcgF7*lT#VbXY;-Y$Tc=m=>P{S!{{CP80tsjBr;WfN z3{-W_hhe8Efluhx__;gcVMQ97l#~j|lrFK$?a9&kL%ncN_meqxvt#JZs)Rt&4FwVoCg8w)73uY${^?wj=NMY&IduRv&Qx1@WF!RHZgDS0v?kndKEG^a z1?xM=RJEtcETc8Y>IU$Y)%9tK_T#=6pp2_Is&cI(V#va+Um*BUOFwZS-XjR+)rbW^ z@ghvIWALuW(v~|DGA-*l$pCfTe9$*mm5deC!Rz?G1aL zU(2pI%ADp?wAE~{*UjHT#bcx&qxj1qpDs_h;UlzsO?86m8m*Y4E)GLmsqWC9_TDXu zfTkn}>s2ldLSevIa25!K0ttR%{7p)A=x%5u9C%2mu85s&c=fk+PyjWnXJ`HGuX$9XapXnX>BD0`8(jceyt(VUlVf^)t`|>r zQ8`JD^XyT6@X!8D5EP^Bd9Warl;I#1n3iWpF?wK>wLzZ@r$D*8Z;W?es$}v$kZC(S z)AAR?jG1+m5AR8_`{ zVW%KWK$q}qH0ALz+F`~qSXot~kbVe^TBO|DGET?3qfCYVi3Ux=JYboi+Gq9uu4o(1 zt_4V+X7ablwdwrt|5?xP?J`^Hk22>mXnl9Fbe_80M=HIg*zZ0(>kU&Y zhv!$P;qs3k)JY2GusnaCd(d_4PX9@?do|sgJ%Je4Np;i@;&lLt3yWMy!e>x#%+^kbIF6T#1i)>J6jK3ky$g{nt_<)xNvUH;nhTK@ zrpl#`Fwus`p{_B2$G`_+TI>eU!O6qR45$niyDlh5ZqN=NNKhkiJXq8uNruu zDN-+0y^53<3(9ciJ(hE5UYJA|2dNTdHy5Fe);&!Z|7{r!DhtbcKwBwLhB|~q34ie( zUObv}UENY!u&Drx=n%we$Z)PQ{rab7^+(D21X9@Co+bf`~o0KhI8b z+*b)|S?shuTOH}ve>s+y%|*X$l|AdK**k}It1GK>&Bn(hA%sOKDF!$ywq*jnkB3-R z3#(k~mU3pf6FEXmH!&fKkr1*mC4jN%X!x_{P7W^dOlVB~5^>N$JZgA@B}a0sDGcLz z5Xj0n=uZ<8tq$W=RuH11ZuY>-sFU* zLHKszlES|kcg0j+wxTbyF=WAWkNj!sxhE;y`^}-d0 zl}kOI7!&{icx6^993c!;Mc$l&5dvS@*5GFi>|RP{P_ku`gDRkj@ivYce_1;$!R68& z%tox7!}vZTPCIHceBS`bBmetUR+4=Sf5=>W(@5+=$h(W~KN-~=VQG(nangDoFY%xD zy*n=sr?TsdOQZTpc|X4DTC)?2<<_Ms7qH!a zC%j%`Yyw_b$GX9~>11hb+0nJAU=;*liv%}O z4)NOy+;}N1$+xSZ^U>H0*?84k_i8c|ix;jw?c3Mz4C(Ie&Z^&t2Is#!W?igV>6vkv z*P#s4xO19J3$ADYE8h#GrhDfYbGw%cKbp;2=sR7fly3sm_)&hz7|3j~W(KCWwXEY2 zUlYIqCD(}|%<=I7z#%MDRmzEBq`{0pm-b2L*GU;N6^WSDBI=gYG%@ygo=0Fr0w#tM ze4-CrjokKntYDCvOole!U~tW4-Tz=~AXku;2BeXY$yye~2hdMh0N#Pr(3*AGt^DWO z-E-64$Iz1>S9-zkXQnd81m-_yv5>>*9Iu7oZH3#r8Jt%i!EG7gnfJce4VPp2C@j7I zp;>2B&MVFHRpT1xgqJsW%d1dF$s{l3r-7%{nC^quezsodYTJ%ZGm zlYp#&iMwQ%F?_UB!?TiMb6px>O6_q^8daPF)FMU+=_eUP)WYbMMlwb%p}DH=Q!YcErz$s6S5F>&eHdrAuuQ1n5*` z^6Mxp!PxYtRq$fNnxd`QF2iZ|w#70`Co+rWuKaaPI-#4f`#sAT3$=@SF?d4oW6+e{ zGp9^0S_l!r^$-NHIY`TODVpI0zlt@i;%-}b39}|nvWrLwip`+I^~+_IQ&^=C9*p|= zHzV$S_DsY3he=w<>k?ooISux`;O#@P)^pmO&p7@_-PO~aHbk)2y9F;a>a_QGk3PkD zuEp6Y{PRkWhmqvv*{pzMC3Ky4oU@XWWcyT|vQ(oVim*mON;I`mV-TdbG&Ogc*~ZPa zS8mAvK3&P*j}3NMyvIEgidP}2MHbncqT88U=6cxZ0>xK~ZhcDbacM z$?Ki{*}c=)vv<_>oObNPz59P13$)6bdBL(^r z+(IKPqs_^jEPP|OSxwHlh>|N`&^Z4|H-X`vv#d(#*P6~@rpBkKK@hl406Pah#&9a_ zp`R2_gqGo+&14D}Bg7F@GhguezDFFw9`oZwI%WWmvoj=opTtP)OhM%)=(#aoh2>d7 z?I7{(iH zHajuaj9foM!Fn`)C*5m29;?SY`rjn2`Jp<_W0qx){Y)umTxI3uTOUUQ^5uHFR=e2$ zW-2|LWMM7o=taBbo(lqJqo^f;@N&&VF}4m%n@Yb>M4cjlChMX)aeO4~%Raf1P?@R0 zG0wBfVCUR))YHjQ?!R}GKnbPAMH`L&3em$pvBXWV77n2TgC5fSo8r{ZlVuuQaGbyZ zzre*X!hwZhaiDehs_7UQMh$tQx}lEkT~h$%`y zj5uyL*VI2x-oLE1M^Ey*vD~)ffbRD`$H#shp%`z`-F;*Xp1WOo&dZsksv>yEOpjYT z!l!2w^`gOa-bD8=q*UWY0r7X{Fu|-nP;en^Pqg?u|G)l5=SHy6Y)l&?2on2u6PvTG z*%gUeGABmvsensm!^!&Ns_>SxrA?`3iOoa4&Sxl+yH_fgls&c|ZYn~(Aal2Mj#h7H5tznCj}CS+d_cb6kz7b#3CFXWrhw z^yN&p?wh`|+m(D}sVA8QSNf`^;$bIVn7}vn1h5)1cTKhXj@aKUsGm0avRytJb|vEG zkIJtPX3VzHN~}OIJ|61ljw_bvvggc@bG|1Z^?C!xweznis>k0^=sl-Z-;#4Dj9wQ( zd@YCWo1d(X)MD)R=CS2_lKJmB?cSj{cCbcY4p~w)SevSy>+bmMU812ez8|>rU#j+X zm@bOnHKH_~Xdh_e*=(=@2{~U+-78T?%Z(qXUwB3*^_ZSiYoOo^H(DApW(s=S-5^LPik!o8B$i| zTJrC&#@{gq(m6wMcqiXIj;PR_*tKi}PlR}ID@Ezv;87BtfKBZ+SlGm`F(8+RV|~m3 zgs$$Dfsu@hIO|gcG6PUuaMyx1+qb60gVSRpV<+ zzZm1VUM=T4->^O&+ISw}<3pXl*7+Z^_QX38*J-Q!UV$@*ta(??>mWCHuI!{xQqR!8 z+Mf1};LN$+jU@S9d&)q0)ZOFUQ2_UTAq-SqvWa1+AZUURQ~n`~m%3>(Tom4_t(9|Z z@CfTVfe#J*@w6v*&jTdb-ZVg^wIJnZke`VsRaxVwc*aF0BRViywle)n#3r@QIHtkb zt;(3;wWG6e!tN*ckGvE{&$ma?R!^=!CO4fsO9&chEdReCvm^= z^_S|#{TXxLjCfT)`R&z_6?179+uVL**(9|__9$+*2RW&Jr=5F>OrIRw>zY*-QPm$< zGb*NP$noWPaXvcLkA>7)v;w7SVlHEq+J<~v9^9dz>#y`6T`IkMn@H5{Rb*oxi(r05C1KFUUk+somR9H|3gu)PlpJ(T-z8fTv z%Ozxzjo!Ru@GvQ|g^GHy9zsmKMg&q-qMu>lP4-gMU(xLCf8WgdL*240@TPX?yo$kf zdo7+UkkwbGmoS?lH ztqs;1)}+Wv5XY%fO}7kIl9WanEsRqS1#yT`!*RGeqY&fNs8%-y*v7Ct7AKAUGimRBhgrp|MbeAgA_ssS*=P!C_cTMY-O=DqGS%R`o_! zp<>0Ni(8YB(=NQ$kG4iQjK?rH+VoZjqEDp$@fC`~EKRPSrSu*@%EyS5)y(zBgEK+x=tcFkPVFd^VpRMg6*H_Cb% zjGnodGh#j&i$i3pR!ht|pIGaCiy74`G3syzq=d@(50rZS-r&iMkLq&q{`ZH~_WG#H zGY)6MY5NNIsq(Cu`;7CB>OxbEZ{xt;T zUxwBTDrmKqC|+$li@kqQq1F66x#k8lBXQAX50{@+hf|Ygi4ju^-HEYZL=8jVgA&-D z(&Tms4&Lt6WL}{OCmcgcKGt@M^(#r4bMysZ1tyy`0@#AuLu89Rh>aoZ>kbl zB*t9+q7ewkhWjyPQfx*I_A2D)&Z$!11`Errjm;ZUiYbwXL_&JSnuy>td>q zpiD3pLIC-JoM@!4<_Mo$Y}=W*HHnYSDva#~Cg2>_zV7iewz77B! zAq-T7%BUd)KZO#z^5QK_t1Beh4Nc{CGIY{jV&}xgM2!Rg(%JhonqmlC>{-;GdRvN7 zNta1XHnX^`H2s35WKHWnW36NROUK4D{)KZ~n44SkUiH@)bU*jwKH;R;Jz}r%P1$0Z zulAA#wEOn*oJ@S5$!a{!oCj;_tr&OEw%gF`w$iz7BM% zWd`qxosF&5$ZlmS!7EYwdbTQ0g;_ri9TUf)j(-XY){!KI+r=%<0f2pyZ=4>DJ#a${ zg+{20JL{GXbs%rI@55&4UmGSev^v1KM7i^2o;@_7Mu8wE`@(o=Ja`>ZkKfj$Gh06W zl)y3d{IRxA1>0mECpJF+Nou($Z2Pi0vDSU6fK?t@9V9o|Z`**~o9jTM!lahP@uGF&z zwVG{9aQ_1?K_bG;fRXaM6EZ*iGt+ph9^1yKWE4Q|8u)LlRK`(*3ag^d(jk@PrvM*U$u4M8^IOM&-WocaUTF1Xfn}xo5+HSc(>+{}Wg>@Hq zk9HDC7k0?}=~mIS&l+u(W=Soh{IcW+lzaU-d0-9D0024j*yrn_OQ#_kx=8AOes;$_ zGKi><-)JXtE2(-->}b#h=cPBs`f78W=P&`lAq-TF%8g;8z^H-{Q}~>wv8w9@T^uQu zR#NY}tP-$D`jZAlc^jlPsX1j@b3#q}Z9^`xCXCtLmFfJyOkf1M=U zZ@_AeeDC=`&53b>4Rw9YGh_xbjw6zzHQX1p`>9ed>%-U{w;QT2a+yVv#XL)Wgb$$jRF_Z!|JO|?&_Z`M*{ZGpDf872isb1twtcoLf#&>W_wAi$K zqk}V)MqmOY7!ChiHy;aDcrzNqiOyQ3Y*95p>Ss!1x~dp+@L>d1vXH`|v7kyA5`-B4 zhI!v-4{SlPqnK|(Z?H!&LLJUcv!x>pM!}wmkpzV<#3ibdf&h{O1)$Ang1Buj19Z?O z*L%^){{Doe=b+ezqt~Z~9;ufOVcV~?7B z?bo;YlN$8%@b@xQfwQ+?8wd~pD?Xg$8{UZlsnS?^7o3byUK0Vx#K|dQZ+`SrWbG$8 zREh{NTg_)=P~|RDIr@!4U#q#TPjFd<2;Y@n~;G?+6(SC{Nt|!zRNgIJ-EK7i8sd)UBzGPHbPT zyL-5hC=&%~cpA$!$|060ajc1?ywfxNPR=Iwi`5;=8R;G^W!P(%=@GI77&1NrYCY^|ksD^xGpd$rs;hLK_jzQ~0VY^T9I!UlA$7VK23o7Zde2kc zU05Fb#R@|gJ7txMo2oOXANH=iEYsryPOlza*a$>KfY35l4lP(Iq;lj-JS*v?Sc9lB zuQ*+pQPKHH_kpx~x3`@ScwZj(a34$!Z%K@-)qvn33{-8-p#m|2U(yEB`sUW%h+$Av z%UBV`?MQi7-^34vz~^OR&*bY;W3EDN419T#4UP7v%o?e#%tcb}jc_ z{53fI+?G`xkAZV|W**ppA82zqtPwC^HTA?MnM~~FfjK!JlmYOl2=4~A16!#Ye32Jr|sY4(* zu<7vyw;)*2XB4P}%~Nn7s-|FO)|0Ny_H4AiVC!$xz>l?3pma7Hg^Xkbzwv*L-xcp} z6-x$~*t*;o*2W1N20`^UIBm;MU2PzXelK4BLj@&j+8iRsc4}<${tbxhW8{V1uls7X z{AMnVx#*HO$_-av3U+$Ep?~00)qVnldRHN()_gV#DeH6ggRT&lazx0aK*B8N!>YuW zY9L}X1y-1Dk5k7Pqk55$d07z1Wd=pS6NpNnkcuFtQX|bbd7mBwY}u*Lj+pk$Ay|Xs zwllu1&>H)DEuNoIt>V)VzTp5Hylk(wU-W|pV~ujJk1M*ilFy8yv#s)iZxBk5DdDp^ z;@`RPJI$2gQr;QfDhqw!vUcW7R3s1?hY zPAf?FW`y9U>(7zkvrmp&k8hX+BX^$uHLD9k>}iUTO{`}U9fOW>Jbm)LOggFjhO6R5 z6Az&|pKPuQ3hvKM(r3D_Ix}g@li}mDjEHQpH?Ea0k6Y-pTibvHpnQZjD<%}pXqYRk z$xX43w#n!f`yVnWjE&%i!MR^eoiUDTWxd;BUJ4EiE7~iHQbyXI{tDXqa2_?K`xoxNN3tMVLMEy%s3R9feX$BLy=C{}A!<%>Zc>nDiQXsWSGWFl0g zNQ@?me*BNPq({{igkfMvP_l-|X}eMNLbSnF}KVI?aEg zBx|00@X8XkE4(TgRn2;@64qmG7)kZ0d98;j=yo`mEwvRe+AVdMjL>Io1|uOh`ko zt|+RQ01hDxRHf3J15kq>Yr{pjS)0umzE=#BGz8dET+5Ra0qRD}P05MOnNmSEqV2$X zju}t)2Bjl0elxdvAeyKBYAV=9xz5X(?ft8ukyvb* z9Asy;Q}9e2^tZYobv(8=jFrpsRzPxtHMJE;VUfkTH++ zaZwDfGut8Fpq><~q1T@8axky_e&kec7o_f0-6m$My3cBNoDp)pZCspiH zF}f{QWtx22ROy@$Xtov+F zUP5zVN$2`d!JP}m8K#UO1{FyM?6m(&cjsi03bPEpo-wf?X{l^6tA{puvY!b#kk3e> zWf7Yr-sN_EP|KE)(jT?uCb*k*b_bsDJ!(@7uR3viRM7=fP^_C)mrYHN z9yaz1I7F0A1%=49*rsP=jZsuw6V8NF=s#%jU%BN)W+la|4G9vz{ z=iYSoKi7I3E;Bs-rHYG*@paA3RlCh!>Yh?#jLFyZ%I5XWn-R0y{4M_?ygQZ$3tClL zQmNjn$1)U*X4j}K&=u_?_1DxmIwv4f!>aQbTNW}q(em=sQ9w}>19sCp^A-ZVLtnz1 zvL?~bwdiJqkf#~OF$gi1R;nv;ymPy2W<#rh<-&$@dihnAhT(b+e^`d?f=$ypUrCN6(<8fhZ{8I&VSHC5W#)khnvK6Msn3ia4- zDbUcNdR~#LZiZjkwW`+MjM+HT2Dqg(7Ryrse1;~s1^4wXSnkQBNT5jui8FxGrG^$M zoY$-hQD#7-XFq{VE*eDDzQAdrCiMmw0Nd7xfwqwnCw9!@tk?*EMpQqL@$9=clThV8 zxquWAwbCF6^%A{U=p09YAq-Si%9{lcgCFrwt_$H=)n#Nu2xLjHO4m6j^t*uCAj#vb zMSu$^kQ9O=VHxSWnvSl|Gggsm83EVteY4WR=~MiwMW%EGq7=a8g1CPtTw2H zBl$gF;umly!hMpc*7gAaCqCHd=@^y|RQfO4<(y6*r1o`LbUJ@K_PH?Wqx$aIcctO5 zdo*UTQXI`Q%IYsqZJ=;FL@2zGpJ?qi+DE;2r0!dVP4`^DG1on-D7bk3Hj=0;gU(Rh zd@74jE9hu3Ecxty5_&eK+?ULKZi_gm6R74J)bhCz3;FJRp~$y7qz+_5-_e&&>csP2+L?mV1u@x<)xs`%mB3DQ-g z&vwop?6RbIJRaD;i!Nl%{n$ z?xPzeX47yqI6)7{K6N|pPv%c(?<(iv--$RO3{+Llhhn6_!LRI@HD3Don&ueFtuifD zAz+Pcp${JR8qoRlf}cK)=wS?Mi6j?v`YoB<83=?7(grT(kJav%>Yafdc|Z23?z7`9 zTcxm%-Dap)GFR{%Y+DZM=)z?!8+vo^7WjQDv8y2yLU_vg>Yh`tzY)FmWLuVOeEpb? z6gt*78#^q;;z`HA;6jvJ|SCADy34u^jufv1hIH(M>W1H!GRzihc$ zOh+`)E#!*KO!8u8>2I^C6tE>|vGw>NEq2i>t(M{!Zwor4luwv<&D$RRPYfMEV|JTGJ?l!uEpzmcRhm;UI;>UganQF>vbXu z!+?-jC@^d1^Yq9^1=E>@QV8D}AR#H_5Y~a`g}$8XGzqcf|u zrRIsp@8kO?NqMb&mY1g!V=1V%zLS^zQ}xB=Hc^?V@D~3@{JPhD!1QlF^**`7B% zE`!BFkJeJn&xswLZQG&${02@(7JL8K^u&ko7ymzZdiNgT<~Sh?RDI5!12BUhnlQV0 z9GEqgB8gIrjK0v=Q!1C z+@x4-+m`2a5$2vfb5#?SSrWa@Z^`U-F0;VZaMn#+(zZG}m~HYpXj&@o2Qi^g{r<_v zI1_R=2xCp_8&21=&Uz5_oNFwrMT=3Oc#9pg7{>#ix2#4KOl^c6Wc*Y5n$>>WI4w>c z`Cu<9B|#r4M2HODG`7&fGKCUEK^_z&z_W#_QRC&3%Oq-%y43*=!TGEhZdh#c!C*UU zb(}XMtChdy+>DkeBfUU zO=L67ser&HazW2;s|YaQ2CDC*#xhzZPOZs4t+rO#>TLcseD3f7adPFW1{x^w0~ z)c=7404KM>;t29gl0la1>*}8CHq^cQ85bC`+Iv?-q1R~=oimJHhA>V8jOB94HVTgJ z0l*;)RF%$^2M~iFl3k0v9P7H@2+FyGL=Vc6sdDiFb(=M>LXfj@iuF6kia>Q(zSFYC^vsi3 zT+>Zv;WEM!Xc)S{)@#^BiX9 z2oDorTRP!|6{f15==*N<=B}zcTSIJ=omAS(4G}FNH5p#h`fJsaq;`}d-66%MON@R* zdz`bTs%EhlV_TCD{U7P)Ls6&ZuHY z&w(@(O)(N-z=_ykDUc)3&r{~byB9Px+V&XlF+5 z^{Ny(t%V`mgS2?(W30zfS}OR-c48#zrDaL|9Z-`Qy;Y`J&MMNM7Q0)Z8j)uH+H}$1 zCwe_x+j0a`HK|CBO;HrdK@o4%Hr&_Of?|$=agGIuiL+w)jYg_^%Iev-U#VVM7zTFix~yhZ#ko`pv4+vNM%N4L=P9^L5Obj4 zFoFu(M%ssd>${OhIPlS3ixs$BM1cGu3{<7kiD9EbL8rR3-8E@RgjQSKqD#- zx09Po@PD#JI7=K>g?;t+J@3?mvl7@YbwCo@SMTo zZgiL59=VufO1Jvg51si6hUC(3KF!|0zQsB_5X0k+kgB^UZ5F6=XfPlvvR3m7wTVa@ zV!EAkA(;BziA)Nf_hr+%#oZA>$&)125*!~@b5}J;lDLlh7i-ovFM8H3dlt!^^7KgE z@Qw5?7UfXeGE|TkP&l{iJuUmQcE$@5hYbq!?Tk9E8k#})+87*(E?4sFF?H(8Yql82 zBcTS(>Y%1&wW!Zx@KeSh8`t2e>rk5`-ETPp6pt{#}A z#K&X#Zp~h=zs#)iRt-arVYyP@2W63yc*@XqtMoCqEMU8)Y^VNocgrr-(+r=`ZrOAO*$Q_CmD zWN-Nmmb`0=P8nei!q(guqwKC(hR;Qt7{+^ ztnfi;J8mi1@>c)aeI3hG(^T+}lQtV_I_g-T8t9dX|EzxT+x()I$e0KiT#YC=l2Ey05=cRBs-#&MGU0Yt-wZ>_8oC6HP zQkFKZ>Qo}zy8VO=3ge2m@_cN_ucJ<}Wh5h<9vLiqB2a@=!wB5~?Sjx(D6C5c9~1&) z(Zh?7g@tl10h1OiE{LvywYOCQ{WdgwNx*4Sp)AQ-!qp^(Y8q|y78XBl)2f;&6l#3N zR&|nNi0X5kDQjI8$wq@P)F9UO;Pdl6ij{r9qb^j04rJu$g|zC(_5mn^uJJY~{$AI1 zZ;`FpI0Szr*)-}tGnI>^GXFX8DOgg#hiH77IF;1b&zH`;5udVMz@@7Z83M#`sH>($ z(!QT$$DL8mb6&iwsLRCNNelxaF!wg)Pb9vTrnfPTt-sOF3eoEHd?@c#VXMX;h$6Lo zL)D5)TV;As9NYuMoq8lMN)3_`s1*3h8Z6mM%`QQ*sp6paY<5^VmB&bj=oF}xptX}Z zbunZ%aU|;qhCtBXhan5;Oc0hhw}jDtI0*`xC=EM;%_kO1G&5y{CoJr`U;r_VnV2vm zV|5jt`X2u`nW7(-@3WzeP#hr)RIS#N1yF-s;?>q&!HUb9%~V#IEnr5TSeF^f@U6Ft zQpcZWPy{5nBxB#q`XHHy(e_>3J3!X>Y{Y&KqVrE;e|qHGe0Ohjf`gydu3j53&8pPG zwtxKO9z>+B80TS6SWVCOJ;hs=W9vkWSHq#+tMpMtnJyscf_)*1K8^FloF2IVHL4M- z)lUApJL;whb5|aRnv%h7$?pJeN|UQJu21=y)t{f}&;rlas~lrv=w259RcU;)EOny?NSXlK#UJw zp0_1U4D#=CHdTn2@`;sir;^xS-mERZon~(9*Ejs5AdBmXYwt3fDgav*Q37~j#L@q` zv1b+A(CoYLMwUf{hc z;Rc9~+S<$aY0v&+8zE^l&%$)vZotG!_1tL4~FtIyW`9!Ae^ z&J4o9&rtE7)@Igh-U&8ePQD@#l(URgIQ3p`BSU3?4qg;NQky-bJj+iim{@$REl69q zxdB1dUFM_7u9d8drC@R*9T>WbcoL@?t#jY7yG8;_L{KBx(PZ+h4r?;iP!b$1t2(5~ zWl^0+nV}+)>Hucwsp6hj2V%jK9uB6r-4Q7z<{bHgEuZ-vx7<1kr+Tmz23Ko$vHCkP ziEBs>Aq-UI&Yc1fgGOkP)uhKI0xTQ>2s#=FoQsu<^?R|i=?PAUkRXJ4=y%{pufxEvk&&M-1W6MjW_y^wA-HkF^T3$rcvs>%Y?w69#QuGC0AkdxVyIc z5ohoBgolf0j^T~+V)7>yK0An#xz+4=7|k-Lvsg-*JSMf2K;s#tvB}k0YaB0$)Ra%w zc9qu~*2S4;JCF}tyUq7prt_wPO!J&)_xaQA86j5pm*dS=73~r z{bGnp)sn)bY7S2KP3l(@-ZAGYLh)zJ-P}Y@^!)`TiA!63qJ$xRqN`6SEc0gU4<+a) z*axF47=-JRu)t0?h>*dlT|)EjnQGv!GtP6CF|i*CB_BTv!UL>qnlv`Z&f}*SM@6l3@pQ*d%@QO$O zHsl!yG~aDDyc0Qf>~7e}N^c8Y zWZ8daHu*5E_f1i4#nm?zJ;9VT^35tyZW?P6Co3`o^5|ib#r#T(zlsz9xFHNw<;ss? zp+UqT)tekmd~7=?LKSyb1gVx-iRIOi2}Dg0d=?oA_)AibkKd#U8o++`lBcR6{JkHn zX8dE+fA^iiVN?j?{x;%XDYZYRrkzm@N90QRMtYdH*RYZ@IbvQMk@l{-%ru=@h|jZ+ zaxivn@L8|d#)p%*UiL#9hJQoZVI?`WI^p@2bJp*C{c^94@e|T@PF2&R@v-t&$WB=z z_Us->U(>yY!c*v(q>Ch6+ESZ*$+F>iDE$YMT;dAqWlrv%dpL97w7+g=Jb5=(`+10mX+jxtq@|JI6!uvUxgM>~7~AHPjvO zDXe>}X?c53Bfh?9nZ)yd(Vs;FnQYtgh;2x;X%s^M9fnr&23p?^eE>|_=$0x|AVLjw z;O}2p(7WGab1t>HDJFwMZXWFrO>q#a5i8D-PZVV@RjMU zrrMtqymo7is#S?~{wWTlW-+>bU!Hy|w(t>Cyc(DO?3ObD(6>l#ahc+|o{?XZpVJ;NXAijyW)j$UT3+ru-Bxv##8!Z+yC2LjN zZ+s5e{m-+08Ig*sNtb)!q}FaatCz|CSBoF7tM&Wj!*!A-y18>+gUWvWmSHCC(l-Bm z6dKK;!gAA#C6P|!1)@rTT|(D6PcWH{=y-&5K>woOCyRY6 zduNFA`PQB8bvj?K=^a4+W9VHUPey%h7~H&xA-W$icm=Z|#Xfvz@#WqXN-n2BF0Y%1 zV3D>n#ohikQ%~u2zW3Mt2G^!%%-{CwZqk{f6n zf#mYtR0x_?V%*j2){s^hRtYKTTTv=(rT`F9u|2g8XvM!CsqEdO<7^sU0!D(e^I&OZ z>3)?*isnCdc`UeN0gM}^3}9ltpsjHU!Do4xE-^6L_*iW0U)1QC)mvHR z>8&bx6uTA(Y@)+UA|J-aukcQ<{m`Q!si8LoQXGYn>BZEMNHC@vQAw=ZBphv?AMqwGJBVl!eXcSrJmq8{U z>T~JHiEd6r{C_a{OOhuN`2CN|StD=wJz#5_JZ+glw@78*{mne;3j}|$?0s&#_tMqqXVCVR{v>vHsT>d{}*vj1-NmEN2Ic7qzvCf6V`dia;9?4n6dFgkjbm4Av zR)nl=w%W>^PA@LLoWm*2U{L4lxt=IHWk^_EyUlBLyIxb3?}=X-zwJ*(=dU|1(CfT= zu)d9Jt9CYoys5an2$*rI_`|O8TS}ou@c5&(S+6(FUOxuWo4}jo-2!u?a+IY-pgcn zDW0l6nX2V8U1;2y zAkz*pZYY%9;@GJRD)17Ilz&i3Ac(S~V$~4s0~0{yf{~6trb=Ph9v$X{gjKyL?)Ppt z_f{DnuB2}Q6GcCC9Z}L#A5wBY-3&ihvKi>j(foIk^(hJKr& zzJ0y81v=QTobG?1s!4#$ou$(^V`mEyqcybJ zaeN|Oa@-~m%aUY3NP^<-yC9@f-rLw10zQ$WzN=*SyqXSuu@Aa<6tXIWJ)y?BI!RX7 z&!{J4+j;jrxu5ZbP6-J__4k>Yhr`;4+?V?eXstJIOz}RXH~Wnv(nzA6u_?)6Dw`RN zjz{ktHWSEam_Z~Qi_J)~>Ppur>EjrVH<6PC>7MIt>WV_SvRSl8V-+bI7SWv{F|c>Q zve{iP6{}KP%O%#CedOHVTLHjZ6=Q12i5YeP5>YFeO=md|g$QGlQ&2&c)#MN+DPRz# zem%;Ik)078!tXxH1D#pfk3awbadae`gi#S|)p2?NI3WyFt=^bn29XWTCbBY8nG9SI z8D5DQNG3Sn@FpgI=0)@D)RIJc(ElH1pCJPVK5gKHf=%rb!3ES27*?sTZKqrx@e|KC z?5;297$h6>$hJqV_!rgh3{RgaHHPeH?S?^XfKB z_Q1Yyh}EXS*qI)ZP2V)mkj+vQRu$)lH}|_o7Y?nD0ipXA&J34s^$V*`(PWpUX%tiV zt@raep4G2cE%0DJD%Ar?9iwKj!2kg2jZAHs7C_mDflUC?IsL1b7(88)+h4Mqo^9t( ztf5WawJj?~wnx!xN`QcQdMN5T{Z+g5ADY4}FOpZICz2ZJ^qqa0nPkM=_f2cjnkeX^}l(2Hp5ioe=)?pP$PRJcnOLJd2#wN|Vc z#$9gK2n_r88xS9Jqb<8mDHjga7qMsPr)Fc}+9 z>(qBrF|L(9bR4H~;bAoP1-5k?v=x1u#2R*0)0IKQGJ7k;3kV}XmymH- zk*Oh?2e>C-nDU@e80uulcX z3H3gVPicWAGJm&xuiG?95)aHL=h%>Da#RNOFX!5QA>!PQ*+(R7OL0xW?}IaBomSl6HLikIMeYsHkfbZx1yT`_|JjaAaw6tK@R~ zP75>J*40{?rMKw)5=py3DOJo~Tc=ZER&zpgeC(l+hND$Nwm0lzgBv?WcoyY@qSyN= z=i+RE$u^ZS@kb4nX?zrxo{-h9orDzb;K4v1&$tq{*eezW#DS<_CJ<|n6P~riB>7pi z!Ksq1Rls=OKQ2x#K5iwzcF|e#rhpH8rv{?iNju1`5P6Ib!8_o zbjlT5pJ52l-=Qe>uY+Ne-C}t>UbpfP`5;HpK|%zWcW~h4;DVLyC}_{1)G$S!vRbJu zq9?mSRaZHhGfl^+n!I=N%k#I-<6K|LRAP45TI|0qezeZxtF8(mf10w3bjfp9xmXjf zSS8XY&5pGhac61RZM!+|Il^dyMx7Od08}0%Uv(y4h<1~R=LK+_{auE6yQmRGnPVof z1W7$0B6`-@uf=lr+jN=n%j?Y9?tw*S1}MZ@uW)cihU(^S5nzaS84xA{9f%NzvOX7DG3Mw8AC@W^lad6cO{OYe($rf!==P^BUT7h+59tbd-*iac| z?3Dcll~M`^CS< zhz=nPRJGQeVFsgm`g9t@$h!^+&$tlPGKDWzb3=KewOj^5WIt!esi{L>=<+yu z7xUL~io1FDo)*a=Q-&~X&LC{4YYrgZhU-jp7VR-{i7O;i$+9zT_2vWEqh}o8SmiaB z#|qR)uFgbVq6$8xcdB)|;S`{&r_(F2IjI{S37NJjYtSO3Wa#jpQ^?&@hX_-veICI0 z_B-m)@Jw8f8wB0;qeDTlUcs(!cOWUr;SUiyMj;9d+}0~46#)BOf3p?3F>*o3Me*LK z35zvB1|wjQSdbG4HO>8dXUuuMxbV6%eDL+e^O~{;N>y^eoeK&Y-$al#A}pFk0_L}b z95CnP`%4_s(aqzvhvztYVT7Le2`sL~b*GxTaWZv4LkD7YR}q7Z1x@_QNT#=MSY5R} zz`?6bO`Ck2Q!dGr2yJfz0sr)PIsiPd1J;BG7zXI2^MFj(o?QO6m)=+=y=va>7?rzQ z5E8zyP23R%yYbOgy{&|tdnLLimvywtN8#14Wda7F5{2AS{g&tl?$5hO(hnAMvcyc0 zU>bq;fH)xxRL$0t1qU2)CJMf}yywp*^6dr40#~va1sQoV$Sl_p7(Y8|kc4OC!cMeF zRi`fl__Hb+@)+F|$2VwNGe$!6x6|AZ>6jJ&zrl{T+yCgExPu?6s&B!%cPz-=eZxKX z=IPFOM@*72`u9z3cD0q1l-g%*A^!a%>KPr)&hn5c8eny}OEfO4<68Bax|TtSgYG@@ zwc)jDlYcI*roe77r}^?(XN7^YCCsssc>}9f#>*h%7EexQkN#yfwKR)2+TxPMp{eNP zY&6%;Ang`z6t}zhIg328Kl*!40P0$TNLYfFVtU`B<>nmB)xYNaF)zR0U z0|ONAZ`8z#s!~G0@vNn5#FbCh_0A(Qi;U*>h5*BJ%%QET=^U(3{_Q3kaZ5!;Wq8`+ z<$QEbuEwakg9Wuo-_IOe6}Au@E(I#lw&HW?ouLz`OfN-$OpKWI4fqE+^NFuv&^k}? z0AYLGg~kW!RXJ#xZ0bm%01Wl$-N6Jx$y@b&!_~=DE9}QS()+CAaoy`myQJNUteEUE zOE!=5`q|k++WtWwt2-^63VjKsrr`{vt<=F@7w1xpOR1Z>=?wD zimPVDdoZwMn%fEto!n5g6fpBj((6z}oJ2q8@wOr?;O}@ebAlF1lBeR#; z7&;vT%c8ok zV{=ndjWg2sNorQxJ-z7o>%+F3ry-?(5_g5FKW_T6)$FOMn%J}U92M!yQx8xMv1*lni)icN);I~BSRbk_iZ-Pl=*~ofa=HUr(qvT7b-0;9lVhL&j(3zcn zVBr!Jo`tr~-G#yK3&DG4D}q`IcvDs22I(?HPC{2{CKq4?q=|v|8uZ{a0h55^)W3x> zwk;(^{Y`4j0CvrnDyi$k$^g@J{XXv7#_6zKpJ|Pt`$oRdK7Gn)w%u7uI+~oJMx!y3 z+_8*bllD>jh5}%4Aq-Td=7|OngI3PF&2@KE)paXr-HD|L!Dibh1SDzd$x9_p{2o_I zdBG<)Du(D85smVt9<_39WIl|kgDMNI{>de^(67<5M{GOEfHUDLtx;gj&A6UOs&ieg zB4;9ROUZ%QUai6S%Y*Zk6ioY;H#N=9c_T2#G;b@ucsH#dj|(-Rx_v)3nfjhOPV%Br7Ps^aZ@?t2gFD}nB3*=*9` z^s^ai-$DWfw3|kqpI%|eYS&R;RYuBL9H0cfzKscCz*r^_YuD60hqJ>6XF3iOB4h~N zNEPfHalH%d*qfd&|DV!6*%@y6A1cZut^dS><=lg3=PR^RjFWcdVGm0Axg2(HgqlFB(p)yM=8; zbiFC%w59h=c;Cg47q0YTI7S&(y+CA8nJAd##xQL<=7Y{ZSb{9P)OrfQ~}p2ng=IauuJEf!R4)b9Pp8x z_?7%U{~Pe|bM{$#JE?Uf4<0iEkFo43mk-#U@aI=c(eG}DCn77!HB(xvlCHP2PGeze ze~LxRITWg78!8~;YZ=>}W|sYS1rjDdD1k3+qrzy6BM3FsUbnh@Be+q%GL>~KQiEsI zKDB8OgoluL>Jnc>D^LB;hJIJzEt*XYw)*`icy?Lr!JM^Rq?tsd&O1DxH&7-q>-ncl zM-PY_dH=!p{(q40d_8lvZ}+N#-E$<1E=!DhrqPs8ag0Xep)?FeBCgkA+Ei#a72j3F z9(^+Mn9|kGyL#^|a7DkDv*MbH9r>Jlo29>`!4(=+aQyqdtwxT+5~|i;%=6UtmyA3g zTY3=%BGGX-#U@hVXz)(dh4X*rtny#(<6CDprGK0M@~kqAs=qtScc#6V{H?)iX6TO*C3v^@$Owuz(!g5W-6UG zP|kS&7wDBt#&UAuN#QBLNbBb69(nYQ$Lc#&;=}4R=C#8qz|3nkS78_}H7e|OdIbhe zgbGwG?39}@92@TsXhF;*)-Y3nrA>x;P7&ZE0{@3@f`h06V(CJHQ0y>K2sP)yt2o@F zCAU(Wy#y#OKF+C2{uD(LchXGuHo0YVZ8i{vb<+fI-5@_468{xON zW&+!s^Kl_sIy-s7hRY3HI+-}eos!1|i}4Z=rkdbBmqX+F7*zsod!L!t^u^Px;MFXB zse!@ln-0BQaIBom?Vm*0y>~tIZu3E5=?KLw{+|q};gaX0veG!;hJJ!qO`73MsRVlT zsX3YPr9F{GW9GMF!ann2vc&S?*Vy>Aq_o9F?(C}sTnsOiBdAR>RP``z*8_kd3{LCI zfB*mbUiC(R(3~LFw}{{Cn2!zvB;DlP(6A>nQcrb}AyaTim~b+Cv|Tm`K3Nsx2oA;z z3W{kqhdYRXfOU@Sut7BUWgoRWLiy%@;Qw}Rv4bv9qFX^aWO+DNh*ps%lOPlJgyOiG z7ET~OutCe+U35rw?9mXXGKp1A>=FqAg2Wy?ET*z92zX!T$d*Pv zcjWQ|$P7}z@5@Bhp>jz|Rlkzfawxxx?qM8>J#fS-wxAPkGWz-=lI}BI+RD z_R5x?h|9}YJ42Wia$QmquZg!*fioKeB=eW;8i!lMDtWSP5W{j%??_a#&U;yVHZyEO zWCRxGUL7%)IE|KpiqsgSFr>hN1qkFSI4hqH;szdAffO>tL>4+Q0hE=Ri7|>oJPrZ? z0(R?1fw2rA*T=ig+KpuWIyk;=6pgjMDFuJUUm8X{FV)(Fysh?R2owxii>WwL<-FV9 z6S({93&W~HdhZkd40GX?iE|8RzOMpKX3yK7Y~JzJw{8X$a?x(3G53jW>WIyG=lXxDB&T) z6#F7b0eA8SKN?F$u~s~Cb=4rqf#mxO%)+s4qhd7%5HXxnvA~74uu4N)6)22@B%d4$ zvk&>B!!3*Ea@j=>>uvwmFR_r#EV*fx#9b})PCy(X3{-{ImZ5^Wq(eQS2QC5kSb+V){BY;@;Wg z9tGD~871S+BF@_{$^QdkMd*tT@R|$@? zDlvnugz0kiVFYT=xLP&S7|0yT1covJylE2iAvl_2EgayoI^`whn<`E^y<^#Mtj9`t z0BF__H~?lU?2Q_y77FsmL3*da-PWwvCis@j+b^j&i#U2^b`~QShGE^PBg&0yyq;w2 z7|rNwsI_A%uC%8lSC^vN@t4Z?r#_)z$^>=3j|8GIOd!|xala<9isuqjs3UUgg#k9x zBMJ=Lxm}zE`CX8S5qTau}IKLsZF-G7qznu*)H^iMt5dM1#=W;*0Nc-f7~0A!3> z!cY2tR~PU8DWB*%Jfn_3_}9CgS)DcxzvpV9**3_);`qzH4aZ9C^mp4_6#XW_>vDI_ zR?wx1BX=2v+dX76rStKEo(jyB5Y4p0>R-3nT6gs2BZSyPHvtGynW#aqv02o|~}H_BSbKpSYF`4ZM&JAq-Cb|Nmfr`daNs zvbaI5?UR0Vs?K?6xYWL5SJPZ;0S!LbmJqo#B;dy*B3*KuePoyngCCf3syUU_*XXmu z_MY73&M)>3F{p#N><3?C?QS8Vpq+r^Q=b3Vsk=vOMi-oq;m)rZ*gX$7+CpvqE+w~H zRBc{!F1XLgHC_5*kO!o&zozr7hZ|Dc8&mlVJ&HqZJl1lfP~a)CI8yGol7ST2J=WFF zZyBa@o>y#hx(iB+dy~G+2SEyOp&!1|t(3*X#hYa(I`Fz2g=c`va~?xcdH*<{vDR0XOgOIR7s5-4+-8d&h3x zJEB4S=32)3pIo7JFD{R#={;{opkvrSa(0OUXaUOr0>v=Zmo)U^6jZL+<>Do6XeoM0 zZwShUATrly*&6hT(n<@g39<>)T9zLnUcUSD`gn5%&rz@>ZPb`06hgtEgPr`%>R(CV z{LU)$YS@|9M_h|B84Q}&xo}c^i&{BFwUi%d=r-?!+nk3+^Dd+3zE#$KM`8vlayjKi zm&H|3gUfO)X)a|77yJZ@`*5&6M!_HDnD^-CwfbqZ@%14MDuTo6faX5F;hqn>W;SJ6 zXG7bb=lMM0qDp%i2RqUepdi1lyD$F&oQL+znkht` zcii8??Ce7E=3d3sR$GF4jiVXH#@=tXZrhdxtesT%GXI=?Hz85Jzwf6sDq3vtSov4k zISo^*TB}ul!2=B*`I+~DuQwV!5OL<8{~vj6u5NBOy6l~rZPiwZ-!H1<;A*!G8{9Ff zrJ_q&*Z3;bQmyrs_Ds6H>vtS14?JDCS8{u1J4eno@1fUe{Q9}O)+8x927b~rXE66x zFS(x`S>1Y~*>TMj@;B;Vrt5#i1I4}fuv6Ev5D(8p?U;dpSODMae-C?u0(~W+1M`u8 z!;=##V7Yu>C?~$K-k8%o)u|v(LV(7Dh$L0O023DqdkRBAFoRh4_J^I7o+=k2h zK(~o_#*fL_q@+U`YXzo7wJTB4nWOf*jc=~J7dcd6@oc^PUDdHH8zR>ZM(!Vhmq}G= zI@n)&p^NsZSu)GL(TU+m*J*c`J$^Blw~B^o2Ur^N4ibazwdm_6!}T;gxnfQ|17b#y zX&RkvphAorF=Nt{GRNiGwjKK8l=Eo!Z53U6#jX4Ruj_N#TjUT9Xdwh5=*vJ%*v-kN zGiF#+fw!Fm()KATwfS;otiengROruSz=}u|PdNofuZpZDNqnE=w_;WmVVQnQ)!Rk8Z1^2Zj;Fgq`xLg zq6i5XJ1B$uNAWEpT7n?5l2|_yMidetEk^I+OJe;A;>(Gm=3mJ0hV2PZzd5_ODk&Cz zCz5vF(As+^?D`o;c-c*;He20arOy{GVYG$Ym14a)oPGu4-_q5PwqX&56LYqGYw|w; z?&l8E=6ewxpu<}t7XRoSnbIFhuup$4816jF>@v9Zma&Mxz+H99zJOV`PCzcS9nx5JYS zDg)9zVuJ@H;o6CNvUq+Wqo7!?avNubb*vz_VQ~)LKv?dLZ8p}&1-Ez&r8eR8ya{SIHT4c>MuGS*L zcQ-`yZ2Ot1N=kT$K5qvkX7?2k*=SV>2M!b?`ygN z2xlhg8EF7(AcKeJ-y|0NPG)Fx$z4ob0kfX-N~0{HRN66Ky_&j{b8eaYThNa zaE*_+_}Zpx4!i}SBp`_`kPNb+0>^}Ar{lARp zI##I!?Q3Q^XP#;MpS_=SB&8o&bsa;>r<^*5z_5R!Go3Qk(s9? z#1jo7R8&B{q>U|64oE^ewP3iakyr|-Bv$L44niymeS7XsXFYk=TJQ2TsAdPyM21o5ff#92v60H0O()2yWqxDvw0bdDn4dNCu*go1wV#>(3 z$59T@KA_CcyxH5A7pu>6cfFiyM^0bfghV($_u|((smD*;SeFvz+2?fb-|+Z|G$O+D zegDcHV4*zTc$EGLyREpVLPL1>uqz_Ytq<#g@h{=vzX=rHrDjDaCy zTa&K${~aF%o~^1|FSxG{74tlpT8spQJin&$RH$frEFWvdA?F~#7$9eYFic4Z&oM}T z@uRtNZOaY4ZBs?)S4W{c>F(m*G>Ozn&Vq(xt;=TvnTRqTR$({TAqt5AgPA;z(Os-U z2M6iv7^{DMAoh?wqFA~_%HO<7b}@c$W(8I>)2q1l11;Epw}a;p}Z z&{Flor<@(L>BCi|At$Q&qr*D@jTr>?RPp*es)l{H{0|i4q^(hbDz+tTVk0i_(id8> z;-Z+(w%UN1pFW49bV(YyvMrI~{7^;ayIxL9Tb{B=fwNEeF5Ahg@d?zti>akz^hNC* z>`8DjXy1`0VrmWJaFQ_Rz{lA`5z5B1LDIjr`M-hHo@L4U?}+8<{(I`EZpP#;j#gs7 z$bHp5hpVCOi(ET9?2!0Rbamxo#Xev zVPK%gto&63t

    T=2QxFxQ9kERgF0B#dH1KCQ4hdv%TJ|?fb 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 z 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

    8QWwV*vt~rM8RDCSn)=}1o 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

    ?eq^n+cZ>5#^n5WY>;7{?*`I!6ly4I)cW>l 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ℌ$l8VT>S|3^Hi;$^ofuvh}I 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

    TH}5FHF^RP8zAry0NibD= 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 iGc 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�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%0AO#bZXYD=+%k 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 z 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 z z-OV|Ahk2=qvcW$(TUzvnKL0ht>mPjPT z;HY8fXzjabgb5~YZS+_zNn;yN@!TTD5DvcK#IGeF3hk(A-^hqq9kOpxu=Zi%N9|m`z;2kT{g{8d}N{$BBGDJw5UrDu@UMCV<%y4cbqPsGY!>SHeqkCorYVoalOU?PtV->)+ zVy*xnhKO*#iN-$vTovWXpD;HP{cx+> zCIRy7d2pmXzMDR3x$QLFzhSvLleyY|?=19O{@-e<_Mll}>W_(=OB?DVn`FR1A$}A9 z*sDMY_Q8uGb0amkk(|0I9kQu1%G8(EK~33~#>LB8ZyYUNOx6XnT17wGq!{_hMm5GU zZ}NfusP7wDDH}OKq%gXDndGY+3}UerHj7k<9j91eq>1$<&v>LnrdIXyU2DCm_zXhL zRjQX=nY4AeTZidwS<}V-F-lnO>G}pS%Z)hSt@)R)(t^**g@&#YwH7Q~_qLB3f8VmV z*87(hrXsLUvuFScfL}6mmh*{@%Grgc)<3#-O+QG!8aeP7bkJ9QdzYjCAASyjICLf^ znEr**6HWT>f=<~~37*J$+3>O0diU%8+>5KdAJ$!$(AZ|Sztoe9(|vMEQCUwH$b z$)F4)fKIyLl`M4dAs=-5O8``PT)*>Ku!FlzuyFaft>)Vrj~PhB4km zKdV37kw!BtqMDS z@q_?Gq4*ek0qeA2Z#~VwjuB5kybq>Ss2Xrst~-;ds3U6#4^H7J6}2{v>FOxqEQ+N? zh1stls3BEXn+ya9)TEXaixv;>*pt@{b$YwXE zzeQ zvd?X;Ea>qX#*WRQt`gy_qG2r+pS=DO5$X>}79X`LHpnS}GuUQ?lqa^U8)?+VCkv;8 zlT-LF@#xZRk~$6aXp@T}Q}sG@Y@|P!(=xQ^q~A`~noT@r>-{^u{JA{qE%)R4g();S z`F}>@5~?FapGI;JjRXtE@!VW?V1tOoAOU!ruboo0T&*jwYkhi-um8i(82~5H0(m5$ z<7aum-OIM4Kw0i-S}!CJTLiDU9wcc@>!O{RJ8IGn{@xiCjk`I<;>PCaM(d{FD$5ba zhfz{aoqghspKC3oq~AsDuH8j=;L3)B1^qTTpEb@6dHWxD6hH`#lF5`JvPe6XDCQ5b z3Z?ISq#i~0RqYq~iGaLbDEcZw_bkKy5H3I>uPRk5QllGemUrlh8 ztA_LyctlsKl9Mv2zA~Y;^=qoca5r=y8>#+HcQo@jPLb?uaRJ(#cQw?_Z82Jk2ZitV3N4&n_PM6g@7kjdJ@I7LovaoK_*fD7G)!#qaIJD~+Ljh8M z;-#Vf46YeQVsLFbk=<+eG9BT#B9F*VMqaD>E#n<3_+rj~=nJ0NY_1uKCZ-J*0KZVq zzdJ5z%}u^4Eu4?iW;VUpWJ1(v7(HZa%6aYGj6L~v5`Byubjn^1=%Q6NjXY^54S zCqC0#+gi7rotdJh3xkQl2_C6zK2Ir{^NHv+h}3M*&szS>rROvLA^O;SiHYPQocM6xedukmZ~SNN*q6X4GgYX9Nq9LT0-G(U&3 zQF1$U`yk^KLy4u2tdkY$f6Kw$nx62>tvD9BvE3~(nqwz2p`{v$6DpYVwz`!NXMAfH zmXlaPG|lSw3V~uFUl_y^Ks-`bXPuw(F85LD3n8Wg01ZO`06HQ?7F+{*N7b{Zy81-#f}1;g(6;r-x`^4NCgLydMQB~)`n%aT$Lb&;3b zaqov2BWbBu)Sb$iyf+-LAG~wMN)=orFnJ0I+LHx4{pILnz}^9N_G6p(pS`qRPySNn z810c**>|_r7f=IUog{AitOg2C(Y`vyl7?u4Rz&(-Mzk`nkmacrMLrwBD ziE!o98S%qj+07H}mIu9oxP~Hznncy@VLDRK`)B8Ag%%NiB`f2PQkJUzhaZ5rwAGxw zzJre==V30JlaJwVKGQnEnK2a@Px44CLXmKWk!Vq(e8ma~8H4t`Z03y<5Oe24GPw7eiTbU26Rds6WUX&?$pk99}T0 zi=@irKN^NOvJXql?d51$RdQ!1MCCV(z7OKo%({4QN7MwjC0QZ^2hNYm!>rJbm{8YX>>dhbQ z4CN7=arc%IH7Y`(FDFoZI|-WjWgp|W#h?)s11KME3XXdq(!>vj#&Mr3Ahnk#Rhfy9 zXJz}&pktq$lKg5FZ1j0)bi`>`b0aqxWVKFY2`9tjZKPc*8C@#O^+}?ViulJIsmWk2 z#IQj@qxO@kbn^;+kLVvL&7GW4J<|4pEq6HYzz3i$ta; znY;w90Fp)OswB{BCac?olg|+ViL0T7&9FFJ7#wIewTImzX)1uXDYR|9O57f2`%lB>F6~n~i>$5&BTfDbsNKm!-K%~0r zEO11eZzYI=>iiAq08%GcQ5yc1JN_hY{51Py>c;oUzVhTW4e#LOj3wLX;94e0YnFm7 zIAW1rxt-6qgm+gai<2xM4asOxdR}o@FyatTSEQrLBh6084|M?amAw8NhIPzE5G`iM zH&&Xw zc+vT$;8Hd%9U&bzN)TxXR7Bx%_~^0JAb(@VEdaDGcRI9zvtxGhvFxGGb?b$(TFG@8 z@)k2nM5R6lX{c((ow1QeuS#){v_WaW87M8kR^tqUYW1V^H9w87-0%G25+_U}%2=q= z-qJ^aHgi%=b9jm`PU~EU948uBDjyk_7*?}ZXXQr zodDUhMPbM4Y_~FIXlL*kPv>h12r%o8IRN9FoueYJ56n6Qxj!12dqdPjr$GQou#?&2 z85l|uheVT^n=^|qnYD3C-IBvNRhQ%BE@Lh3c9X$=tkEO>?_u+WGNj*d;}D~!$nEvG z`sOtapT`#y6YGtzA9B_&S+Wur`Q{@xi2l$o4GHmod`?CBL{@eX0x4vS1!3@`5+6?G zhWt7xVLQ;qJ$_`HRA_{6U>)zsHg3gT=NZLLp6bhchkX|0)croCgl@P@lOn^Q@Oa2W zIS(g70)MQM3R>pui7Y$4U@LQNUvjO^Hdgt5t$clcVnA?|o8NEiYs4BAU8@R(#I*gjlsiErO5y5tXh9UYbfi0$2TTS~?+DfhWzh#J3VIcTA@+ z{P1x96K>|<04$^5gGy48YT>A;S|ITy4~>nyo~p7To5(!k@es;1O0R|4B}#puWWYZ8 zh;wa)z6v16dj;WsV63n<(M@MKq$FmxHHn&rj@BbM!t z9gMzjS8WDLaxb-qR%s7dx>IX_n$S9C&8lx=*xcNWkb`Hx(?^vi$##~=~+ zz|<)2MX;g276XyZV7vv+b3NUi6Rh@1zQ5@NfxH^U&&d~D2YAQ*XGk5@tC2OOZGl@t zS=un-eG}s`QPF<}tT_4Yab6|#2v&Q;gR5YY$GABb+Bugop@1UH4|}HYx!^u-Duda; zRzNvX(`#u0hnhwZ{i)^;DDAZ#*^4Zl>w#feip1uVb>>I4zI=!b&@oy(-*QP_WJ10w?x7EBsp=GXUH~hLV;4H zR;Wd!fvN#S{O)}(*IR*aTvmG`TdKk+TlAPy-iLPce_EF9`20<}#3WVizaIpRQE4R2 zT*mWM&<}jopppRQCX zD?KAKYx{S?%#uV0@j=?BHMxLl-q)^&-HDDMEW*4wSM1JyZy6bLo?McR6MK{TpLMcV-&$9d2K9yb5#w(qJe^={6H$Ko<}M|R2!kG*`=s68>f z2VNGX_Dn`tB3xvOxlmp<1IQBD(Y@$(nDE^CUthR&(R<{MR*_jYO_N-rCHZ%^>C8nQ zgv~3Lqi&BM1bnu*T^d;`s!m6QE9utP5m{(4L4?<- z>arPzZ}xPNt^S#A_Ud%%;5Uxy6pdI7kXs&Ol$yF^Qx7i_{b&iW5`$0l@sdI-8^D6Zfs<6Rit$hPJOJiuQo!r&$|BoLw zF(c%hzAEC$SS_)PT?d7gx|yyl6;=tH$2E;$c{Fb6>O;%%PI5Uo0&*Bn+4QBQ?gawF67jmjKvZc5R(hF-@p+lDmY*KT+6GG(YW>o%26E6dI=s9QVb!M`o*n`*hF zRH?2nje(j{Ij1(=QO-PX_vNl%m9qT1v-?HkhXN8xo@j;BDREpfNfsdLKcM$wuB$o(LNj}f~+qpKy_?s{(MYt97at3!W+#kHbPl`19M!(S9ya|#iSs5l2i z7jG-CT{xb8w%xn1U&7s;bV(l3RzdF`QclY6=oFJL>|*46i~TKs-eAr*pY;V0oK}#+*d{K&G^6iGZP7$ zs-|(Cw;00jKx)O|QwMb*ho0xgLBARNSo8v&vlJN%-X(1I)0*stJcdMUhP_p1#^06{ zHs#+G%svqDS%6e2g~}lCF1|mRy6h|F_0}K7Ft+}<)EFym5uJE?aZ^{F90_AjuFucNelTfPtiv=yePs2m0YWL-2d?-Kx!?wzY6-ztBP4yOG% zUa*Ubddy#IkBowPY3(#nq3HH26GWFt)b-PrrCp*Waye=YQS)CKMXu)ouZjXUA_}R6 zCW%PA#e>)C|K^haC{%iJ_f+%kDxEybwco>iDlj984UYiWw=ZFAx7U938bk4}(g2YX zgz?hC4Wx0xz7(&|o+uHF543ICx884JN`&>m3udIFrG@>O#&!JN@s$Wffxe?mw zXgvr`CCgJB0IP~Rlzjb2S%mzhq+#n6E^qm+7{4uV#h&TI38rP5dt*o#0qL^Tr$V*? zLMk?k6oJk@M*rbn_Na6v3;!dzgC)l(CfnWJIP&(V^Z_t?k{0}WI z&Rbn0!oZ-X7Mjw0GM~zjp~^2%*~4r%6_k?ch`vR5WmU(JJH4@6Jm~!JFb_oghvoD@#4lkO2U%xl-!M%zmTY_`Bd)Uz7c{m;zax^ zY=YV>AR0jX-750qyO*vxnb;+;1eL!4$1~Dm^YCJsgUkUx8|=_liqi9aI5!7-9T&UE z3l*&(CpEce;D!TN!M^j4n99@E>}ufG?ls%GCt9sbgB{8Yt3O3`E!V85H0Sx>bQXq! zRKSVnFaLA|lMxds(~^b$_kA&9Yh-eKdik-gK_M3#Ec&_V8+ZDsV#)8U6jml~Pr`Za zWDRQB6xD#{1UK?R=N-Y8oI0cV5kG3>itEw@HZFK(&=<&0Nglsoq;-j2YBZ2JKe$1OcV=G+H zgUX>ecn%Y^g1QcSr&(@?;6sY8AnCLS`-MoAD1pog)iqg1JOqg$BR>Ht>6GoU>tHm5 z<-P zet&%>i=2<45xA(T1tYcb&;Hbdr8E-D3D;F}tQQhQuc{Vg7Od(mIuD)3B!9j=8|OPx}^q7uB1^CeHonZN9*>Yms65ws#MvoBMyI%(fa>uoP}Z_ zgq`>PoZ-*#AmQ%2kRosxB7_nT&BJ{nif^Nnr!FMpXR2nZV5r&^Ya@mO7lBzu)GXj) zi~Q$*7^6Y61}4(pTI+TrJnw7<-WaJWnhRdSi`y^~N0krbn2Uy#zPIIERTw zW_G3Ji@hPVecWK!ER9&a2A{v74jmd6uUg_Lf2UNovTK#9X&#HuCY)CfphU?W`FR_7 zYn-zaE2m&{lH;ZMPf+CMgL?2<*2cmoMXAd{j5R!h3ZMMu4LLcvU9OJPHfS`55c*E# z%;6=isHrVCByuYgBJmw&!)t1;8Ptcvo=On+1xs=M&qU_?r{znD)Ulr_SffnJP@rWG zO`Hi_F(66A|y zP`R@THZW$xDyeH#`})q~)MJL}>FctTEdn}Ju?1^@VFq}IYI~Y&aC68lB)r)*V!TlD z#8#9j!>9PNgzm8BKVSd={;TnnHwqNIP^}NRK*7zBqQyBJlW+(UW;Lo(z5TMxgr&{< z^9YpV7mygAaMiC{FK>5jo(7rZFhWU~jFA=mWW>59L+2B#oR2RUk`o!bogE-gQ6aB|vqG!qr=QR)?4@@jwe@D_0I$|JVQ_}1R{G>PEug&*Bh?>Z zxOs`x^-5um^Ci@$90lPE<`5xQBheAX>g=(s9xzrIK^+ev`yLHthc4k4xqEhJs^@U1 z>J3Sq0t;C`ppOVHv`#tCiM&22z7JsIPf2xQ_aj6IDu-?m*{ecze1IbAA%ndw zJb!b>C@{Z0r5(Do=@%znw)_OmZhohiQ8wt+SCFpYCUI(@NK~+k9@Z$QZjb%a#G&bE zv@@2fW+EBGC01HKl8oW-Ok`IgMLx~V?XNq!+Obkb5vF~Z?yE*?^Ir1E?KG^Qi#@x~ zf7E;;pfBr9r_2zHDz5X-J$0E7Mg6s%_oxb?RiIdRr=r&Ja4v(5}B?mpzP z@ivVZ@|#g!z!}?*9BF|MNB}e$C^Z!lI;~)S!LBnJ*px&o`sq1{3Y3B!2E{@4B=zua z_P8Ov@*bbEbSZ`rjlzKZ+b6tg3%s~)6A+ozr~4UphC-X$DjJD|V0u=ep{+k^R0`!h zn&^@iG%L4{{wF7s(f}5k8kZW*dSaz9&|Ev0>Wa-9Qz}w+Elv0td#c%#c@FcO>;qQm8LYYMQ{vbU{blp~MDnSCPe5~3}+ zLHY4@Q#pDQ6=Vo+f2}4pIP`d4hD%&y2p3QD>qjf|s5f8s?B35(Ob`?)VI8^9B5|Gyc_2Jf`AKkMb6)%cCe=h#`3Fk}z@Gw#V@z^kVSTx6S#<1z+x{Lk~lm4|X_O zDw3tEXD_-Oy)3$jk2Jqfh;cn7xW9V1?J%oICBvu9r%3Z1lk0NYr)_2kfot%G>t;*0 zr)>x**b!8RX)2%7yG8~0<<>Ub^(7BIer(wK4zVd)@s7qVeuqeN{JE9Sj!E z@CjXhXA-J4dg7|_PM7jNIpZfnZ+W&<`r)T-m@o0ZAPZtdV!2-3pd;O#$LMloD5n z_eYxRtLGyR*t6AhZ-cZqlii4HgpBiMTu!+M+Xvnh8;PCv>>cYQURlmNntrpI*9v{{ z_cK9G-oJrTUjhx8vb=1AEVc>5%P}io>?bmh4N{&t5yfSecU8Ws>S&?QEIC9vpOEcjv88-{ z_?~)qWXkPqi0uX5J}dk0OYy!R^Y6P;POv~AmDx2h5AC^QgK*&ks-+>l!F|X zyW$W#vQaJ8h}@R>Qy|FgErbJ}uqZ4nEAg@0AeS;E3_Czo#hfb(Tbh}h8QD30Y4VO0Yr*ewdy_gj-(S&s=-C}V zGWRBR;`kLSppB@A6ASwo_=nQgyA4PrOSt$8Fz=bxJzhQaJq(gu8?eb6(7n)R0$=6pd zpn<~zkYJJh&;Psvg0eLX2lee0Y^tQ4C3kSQXw^CC(oOJ&Uv!F`Wq9e4Q1B7=KYK zTXeNQC#;JO*Us?Rq-((4@K4anks~R zCo6#(7-*n0(q@{FV5A|`mocIE3s02T{zp4PrzI>rtGW;@m;pUI`JzW;Nf%^BK%6OW zG~Bb3*q~*q@?`$op+q-5_8kdVOZJ!iwaGgwFLRwDxDuyohT7C?*wTl!wZpRZe-kiU=rn?%@*?c;+Ce)1h`Zt6P2M#cO2E8t@b;xmM8?qQp}{5J_g&%PN_%4UF( zNk1o41OG%+s((vwanxlgq-=19`?L^4>(#fZb_zT%j%Yf`r5{rMT68=E5jgl+@=&cF9d zXBSL%PVm$_clLX$TDnr_4}33^1?F9z1sB}}uR}f4`mCVhM-prRomMgcVJ-`JPx&eW zZmH2)k0*`~;k3(7bs;rkEB2ce&KH;)dwfN)`C?QY&3Yre*>`Wmf-<8a*LI_P>#pW` z3HhEYKgaJG|G)Zk0T48%J~ODV<6{C|S#uchqR4=0w_)zTyTEJZ8U+EiGbEl4dj0YK z9ZU(aj_w3CDX{7Skxwt`-CwU)It6zc3$Vz#IH1Q0%w;5|^msc%j{>_bSJv9StxV6J zJp8piBC7Xn5|Yl&%);wGfBE2)=zmY}3G zNWoX6(>5c*ipH(>1yK0PPTVb}cE-S!iS*RkbOg3ffK0Ds+&`%uttLvVzuGr-WO>Xn&$H z%x@yg)3BqlvcG%A*u`{*KHd0UOSl@|Ko2XmAaY+#U!5N;#rJt@@xuN!vPS!HIh6x> z^DY~Jc8`?>Ea?=+0m@{4UW$~*kiB=U-n{o3!7L_He}O>B8OSTl`r(gD5N6MGnP4ax zK=IL6szMRki_ki5d!i_24>=Wl;r*Axx*1qsXH|KlU4 z)y{tF6%JK!k9gn{Yoo8)ovwugW|gR$3cgc!nRnD#Su1+h1gjP}dYj-pe*GPd3Mw?f z52PHscAm}oFMf3Z@MbKgzq$he`$y(Hlj{K5NO#v?e*oB2e4cMaLIA;%HMa(wG8R^! zjSTggph$1j`7CC*4&j54rXhc0lPh&eS{CozD<%r9B;?`s~Iu|eecX( z-6tJg!76{*SrH51HTFi<)tC=ARc;zs{I~C&+4$3+q?m=S`mdJQYG$c3%=(|`Jedg& zB8Dfkk|%W)Wk?Q;PyxKSp&@%g1i%hQ_=l~4AyGcw6)AuqywG5)YRVHFz{^>umdb(1 zp4Tj1^o@eIAKE1v&Wu#&N`%jzOTDXevd@p}K2H6_R&$mKITEtk_&uwmOsQM3w=s^2 z*Ya|UVk|C|+&L+u0M zucH26oeJn`-((t2Fg6*Qxj(BY5tql9{?PlF{lCXwrNhBris)jUVQwWh#gpC?>Oqz= z`&yFE?KsAQz+i?t0l*NQa4;|HKvn-A+}E8*wB9i|rZR^LE-Pu*^*(DuVXtn0F_=!? zg^Mnre9=zKFbf(|KALq-$o zw)$WEA`QWLZf`ktU}+MaJ}(Rbw8wB-&a##N=O}z%`rg4QGTQsubL3oHVo)Z9biv9= z{cl^9P#68$UUhkjAWT2q{^acF;o>ZC?H~QUQ*rNmVV}s^1OXWSnpk8ZH(EE#+Wn(BtWyBDph)Bzgv11Q^qJ) z#glRcjG0b z?c(U1i zPErE=HgrkUxL6f_hFfIILj(+k2#zC_!$?_)uR|0Ff z@3`T{fB2yy#Iey?>?V3G{DiAk0zS|{ha+uF?7Gu0TW}^D5etKAx$$>smn#OPMHmt>Vy2B z7dv$+??kY_ebH)plhB9JLcY{B6hl(d1y)CyaVM`lu0c{N!)wvHrQI?WW}U5#e|VW|c0Re+cKoJF*M-DMdxxRP=n+NNN6Sf>lK|Bly4maN z)N))NbUy7m0sv9{2vM?E2oJ*s(;0frvWge`)Jqydiii!R_}miHsO73wY8;42!C)2= z$Ke8dV94a=F-;u^VUN$!^B3!Bbn+$H?q6_?A>hoI0_#w~k@hY4$R9S4gvh8sBLft* zSazS_Eo-@R#fX}`r*e76rMs;onwownSy&m7!IGo$)-A2$QpPlKkjZe`p>ixJRIB|h z-KPb7LDin~^a4pym*IW|QHbaMf>s4So33Dv&X+=nU(UCILXnP}ic)xHv23`x@eEf6 zxkkm7Ui|&L>ZlU6r!AQ?#dsIC8kdyLLz}Hc(jW4UqbjPNvps3g(yrnfACI&!5^znq zRqtMqujhBJClGIXmMu-JdHGV-Z>_{@1=E42hR(`i8uFOI10of05@xPACvya3L!sFeP7_UDO2?V8 zQFJOZeZ$2C$d<<9o1xrYH)hFH-_*~_s2VlF`vTb4SrzG<`KYdbJBp7Jj8*Thz6 zHUpCpJ>lfUgiT0+ePit99if2Jq7z;+p}w60959;QV*KuHGGJPE%#4tNojkt^&cn;0 zSU!eGdB}Pf0nJY2F3Y1LTv41%4wSxpZT8RXm7T;yR_9L5Tj`x@{Vx^%Qr3+nuZ`el zzT`nntI_xlxY!{87xl(NKg@Iz1%)w%rqHzfUwM@DMBJg-LM)hE-U6VGuTo(b9vjx= zpn;8NIicMXyY*XnJR$L`YmCIWXu}?>bh|)=0bjaG38!Uq(tR0dBf= zo=)d!!$4uj z5PHv<-!0-Mpuxx_U16oisgjS}8m+WcWX=9Hc5OmVtlgq4Ddpzi-;W2s&tDvT)kNa5 zs_bplvtLu}dAY_qdhVLfc#d)Xy#2>>zsC?y^1Rk#=n41gyVJ~gXCA+}o%cO2h5W++ zID^@ES&@G>+w6An^O>Z0~BvUS=Gw33+(%qYUZ8L@AtU zXITeeJBROAXBAnwe-u`H#`u+!R(!R+Br0^EuH4rIukw*z#(pKBsK$11Aqv)y>hx`c z2h8x*CKB(pvyW4@uzx)GisF-Bx1aQ`+}~K{j5Nv>*u(JwApk6nzQH*x zER)@*%L{@vMY8i7^N!V`+hV_d$JBK(q=_AZaicl>0tig!T$w?lp-1n#aa3p}e`FGJTJWWJ#PH@LaS^spu)VUgmM))wp{`LS--7=yJy6i?(=f5~5Omr^p^R7V}#p!-tnIv_@uuAT!3lrzT6) z?W6kmLd?bC6!6kxSI&tWl>A8H0#oo&&=$rUf1&5#7Qa>$r_yfU+-xCF(ihCydRu7QyYHf zv{MLF%o9UAy*p}2QB?MhbI!6@@6}(d&U53IT&6^o z1xjH5Z&GCOGwMxkuMEIWRTXwhWiXbEY;fQkaoA9xO)Q z1d0XC|894waVna$&_NwJ6HmBiYvSocilA&mSEa;83!p3tGMf|%~B=VdF zyDtJlNMO4Ajf0yYg6;_e{JWiTGmF!Aak>mYR;Ai}C8eH_2;x%n1I@b%oo>+?AWvuV zh_{K}AofNAGWJegOTEAZ;gPDs!!u#+_X}~LZZ|WY2>hxYHlc? z*JMhd8Yi5KQIVzb6FJO@6vV?#Qxi_0ee28!0)tMe`j;G%G^Egy^N$o1$N*44serL> zkU%nexb&c-)CU_omOn^>WXvHQx`7IFr>3#C^nv2-9kNJiL>2GB_!&imCT=TOSGN4E zbM4pMHpT)@m+_T)p6GrwZ%SJJ!twR@_ezrWZc@^z5_dV4}L zbmpH0UP=JKO?0MRHSWrmBk6eoXIjj7@o4u)rEh%c`tOK1WGi@0{g;7U1S|+DHER~K zCOf?Ma)wmfXq2B&l_HA8S7t<{q5LX`NObY{Z#^yk!9K9 z=__f#tmBm!|21R9K?hTHZY%aV`&1lCFc+nm>^qQAL9LvM^a0jb9pvcz#(qL#2WuC@ zK(d-G3EW(#DCgXU!TKcRS0!}eb!7D@+ zD~m^E*_yI*r;yZ+%IE*##}m_f)iW97qCy0?O?YE;SM{(|ohxG>YYx@&U0<*_-fQ3g zvuQc&J-hrABTOc!?ST0NumF$?X-_jn+KX1(h$J5Gq}2&uP{loS(X2Yhd?|b>V)1m` zP)D@f;#v8Ib2`^3BMgKVS=+<4)u}KE%;g*9-S`~uOyT_S<5Wp-pFjvnhJ-9+q`%P-Y)=$GfpT}2~gd1hGRSRI4kV6)Mf`g9(`Nl9&0ztlaaL_ z^>I7|QCjV$LdW@GzNe5%zt<4fVy$VtCpbxXUW?m=^dCWXm3 z&j9P5exwyuJ!P|C=T-ocsFp9gBUo6OEG7m^0W%E!_Q!5@c77a=j^o&nD`zQ}c1;f` zSqlsI(f-y5%^NQ!nyE;K%tN>cLiX}%H$9s=ppm^|=aZ7=z3U&6-FBPO?>u`I1>DU; z1U4)nD3Bxfb?ic6u99t1PBxZ-F(?My7Z%k@fug0}0!F9oBeJp9E@G0$oz<0^r7&-fN?BtDfrCh%n zukpE_i1CtP=(=22HU?H9VObzXUpNv_hK>8Fodndbeff6?PbUXf%~p|mB>lCbPIO6l z+$@$L%trn9es;!mwW+}RaNPt!DBa(McQTd*Sr_PxN8_9t@uS9T5G*YG;FJ396xmfp z`KIC3NiVvZzN)rwCGql}Yv|{H-~LW|BQy~FZ=Fj28zvj)5V}VT{z+@i*nKRfroI|! zf6^I-uVM(~#+MHB+Z2y+D<9eHcs$fu(O7N!IK4EkO9Aqy`0 zwp*}8p<;YR$&17Hi|O#vBR;s|ixUXi*35b1)`)*5Ixt)QwjgZ#kMU=|>aVYB9Ss|+ z*Tl1$q+rdTLz1qXE4M_1nqd=F%TnRsxdCE_AI41Zz_#uu;|)5;H(n3_7MIkrA07wf zO;m^1b9g#vgp!vrJdOUjxbFgh{)eBQ5Ky0y$()Y3pq{e!JKHT{@&!KBiL5}s3FXoD zb$Buj}HoP4b)@QGzHbDyd zZW@&Xokzy9AqEjsBHUg7$I)3hH2rm9eDp?-ZU>AQy%Ca1j2$M zH;76%NSA_iqktfS!OQRc{snjUes=FY_nh-QXV`R(->$k!`(hZ(bu2E2d;fGa=P@hg zQgrdWY#1l`yg%{m^d#LSZfF6kg%<9{F{;q(0_BFXvfCxF7vpe%YnLs8vnh7TMY-83 zmTu1$r#_z#CDwQ>Ol{}aEuKldZ~ql&~1>=%icZZ$39UV zmTe=Z;FPkOH0064R9ZP^FuA=Vj~hbF4D)iRd}_`+jkIoJ9{z9+cj*BRP;-(`GcSy^ zv^_t1a~CMFrmrVlg$sEIVV%T5ZsZK-e8J(C#3%ryYQde)(FvPEp%4UxkUXcu?i*tz z0n{NIVdQAKccIy&f3mA`A~5ZB$YA!CWqz|4czEgW1BA8N%>9_8uhq?$ZucTOrl+9Y zhHS1i=6_UM-H+ZXGT5DkT)PuQ_%JL`%~%OB{u3~Pkd;UCKp(4sJGmZV^I$lNhGzRG zXr+DjI7ZUgbZ9sTQb!A}GC5ohIXsXsj)#~wd1=l)16cHHA-94VOU zugFqEclzqj)%~ZaPsi&0V*v?jx(`Ky+c}U2ogr}%#k<&01xu`B0Jb(q_!GFSg`=#V z2%UVM${;lwF@#v-JK z>zw2`OLvt!Wvy1a#{noY-7b^BCj<9?61Utwq@?QOR8zAPvZeugeaVtNYBHyA8{pvc zcRS4#j0Ci=fN6pfbVnuR7kBZT*w}V^F4yY$LlHs!VVM`*Y=ggsUdZgqpRUxJ^4La^ zN`(ohF0~D}uZ>UFX|H=y`+UN4#no?iDvedL7ca1iDhGg){xO4Ym<{CFuVA zbK+r=tH|$P&bH16pKlH7QBvNxwnz(?AkISoKGSH=AmLkq0d{O@i3xeE(lseu3au&+ zDQxEMxIS;8LrH^c(Wt*F;@IS_xi3lDuFog}AHDiFgu@=SwbGCHkDqgVyvOSE122^j z4o5X4mh5p9SaAJ^`gzq`X2-E|GCJ#o^?$a?`5T6u*TeBF2v;Sw9%ot+-(zzhbsl)< zwYqbm+n)7g|LE@M)!;aZdU3!-T#UBRt~QCDhL#8=F0l7ux53?X9*rI-6OW^#lRtm} zs5+g$(p#w6^ePZm@6S*XUudDJ!-ZH^aD3ABd>p~P=+~PVLHX*(-nnX5ANeKy{zg~b zRwTRIWQp*8!{W3lQ%1v@p_ZGnw|-f)x8P;?0v1krJVo=-$T9URx^RVp~)Q(TM=`mX->)RX20G}9a=ktfga&Haad0HkOmEfPQ)neG3_{q={2 zEq%&GM>Uaw=v*m$u@j%qzgALj=c2am{GcUjd{Ym3+^m$kNSpuo`HpYXuC8~2QbKrP z)I49XRqM&{qo#T~)+MX`dM_p-b7SMKR$7H1VHy!&~Uo z6Lz~u=QX|9_m00d?kXd|nz0}6uUONJ+WH^BDI5hVDx14C8iDZqz|_(AWGd23#I_ct zRpl-!Bp@g2rV61TOKjE2u;QY&vR~a3C6DBTD`dZ8^&vLHjJrJ=L1>1kIg1`)@GEp$ zbq;3Bp;0w_;T=7%CQP~9qYOP`BN1T?9ShgO53$t(Lxc4c!n#%- z#ti`YkWZ{+$o8h1zlBzSSPzU_)VwbHoLEeKY0@!mH%k8gCs7L9Pt-J{Ra;Dd`p}1r z+WuTqRs1Tx@v=ZUJ2_ie+!awVEj=xAKz%KInh1ctAxcQfi18I9s#y3Ah}j{5F1PADdg+o8Un6)W@OI8-IR8Bj~(aH%>&9( zgca|sbUKpKpy**-Ggh=lpY%A6iVgFRl0SbT6Saa2YF4VqO-pSsuDy5_-Ua~U`lH%jBaTH)>c9>+vXX~yZ7zrVV_Kfd~InlJSyUU66ZWeJmb_ro$U&Cp6VpfCeAX`&No4VdaFRS$FdP%SYgabUC_I5xU(0>pMisNX?omhGIW`0$D|2NeabUeH$+m-0! z&;@Z9NyE;j^2Y}GRsXw2*@yHt;Bo)Mt}y|%^-qLs1C4#;^nabo%GZWX zizh*O0jX^f(hF<_-9O1g?|=TBWOV!ajp(tb2G2snu)hD=KaX!eXnw!>-g$rUK9Iop zEp%5?Amn)b-SYQ~-$}tknmnwrK+%ERXi%U8osHo>Z!{w*Z4#Iq37{GVKjg=-l%<00 z5cK;ic#(JM7jm-RREu*IhHOhlJ^^_)z0R61^%g@*x0jg#jzx!}{b3vpxY29+p1cq$ zPFX4|UGqf^7wFBk^M&eyR+zgQH=Swz=(wbi20lErz1b%Li7gJH?pITI0cHnDs+C}R zfvV&cmH}e2{LZLKU!Y5o93;*M=`@_;R;VzswNxmvo#ff||MM#pUl={lsAbz9P!n?| zJy36${@n6g*>zuKwcz^@&OkPA**GTbB+ojUfspvB(p`6-Cm?Hfle#BoyT~io7p8>| z537qPJOxwAxx5Km7}{fBWyF zVZBCmw7Y}fpJ*lTG0a@-0xD5Ybq-p}j4#0_8;|{+3jMsDJyW(M2#;0d#mS63kPgcn z$n;Q;2GCV5TxG+80`RbCX+){u_ygoBRYpRV`lEYg)waDJ(e$4KzB(d({8_x|CTq)k z(@H0MO^t-OdYXWX%oBV4C91IpV`~a6pOCXV_O$%u#55IBPm8cA#ng5w2aHBusWp(t zQ!8nh2fV5w)1es=uaqN;K}UlOn>fO@#~z#f9>O*e;CT`r%#PGG)zf^!&pOGg5(F`* zGp0pU?Z#cBYSp;#Z_}!S{xRlJ$#vE`A!f=%w?DSE<^Ll0`SbpOIt2jew)DHpEozwK z-iZ&CHLOoly~Y_4!{bwcghE80;`$jy_onteqO4BOo8wumR_y10us3dqNc&M|EOo64*~>Y@eIMO z2id+9?|s#BgM^d_k7k(0vl);AoFzOtLO#F;TW3k0pt;FFIX|qI+tI2YTXdvyW*cUhkd>U@M>o2Nf%mu-At@N9lT@I5Z8aDf5*6>fNd6$42d9naP6AK@g_M|6drO;fb7r3I0CMJEl7wnT(Ye-t z_V9mAinL8!=V>c5-9{D_-4!~ zm#4zI4-ZrkI{GE;u39gBTqYWvwwqtTY6Bc#Eb@`zcbAUEUd!k~p6@>nM9QB`eBy%( znV1SoD{)WyQN@Hi#hSEeLU?H7pBI&f(e6^G>y|{oI)#~sI6&m&k7teploRz!{3v!R=#J`S26!Wp&Ep981Mde}sy$#`Q4`lz zuIx8M04O#9enpIfg~lQoMaHraTawzvQeRX3O^kCY3nB;tHjV&>Mg|TPAxJN@yBm)nQT(2Ny;_{dIQ~Jjn zTA-%_++Xf^@#lzLV$oB>T2YfUZ`z0sJRi3ekT_nu9HspL%bG128<}nl#Pt^pf1x5J zHw#!|Bw29sS-L!Lj7sBah0MTX3&-WzX`_dKkS8Ryq_uOZ?hwf|@CRdK>0x8NzD@0P zQgHm7OtoHAh9B$nUDR2|00$w2akJR=vmv8D011lKpLsHOH6}U%@w0zCs(F80XQ#ny zm~Fh9Buu{Qm%Yf_{Z=(aM?b!3!cU2A;a$?%WA3z=(vYHL4o3@pJ^EW;P9B_{Bpeb^ zi?DZG^BG4qUci&-{^v?T!w_RRn;h}MI?42J)X65oh&5l$RH|eO(5Ui0Qc@qC3OL9Tm*|+VVFBb&5$XsOPQHOf=Jv_mA|r+Wkp+(r`28Sa$2&29^=s^Y&Xh8scp{n}YyX0=no3 zSuE^HIxhigLaV}fyBY!f2>B!fKD)~10-w#3n$@muW8%+dmhq&G8EK0;-C>-p!PyGd z9cxx2f_X5JA68{l0)n(ec$qV1%xbX&6umi8-QnBecIo_5PQPhUcl`ci^%%K}_%(fl zLqp!GWy$&*Yx7t;glD>hO6#AY*JQlf6Zt25Je@u;>ga(g+og%TEls`5|M(e+#r>sk zSR-!fqhCh!Nob&yYD(XX#1f+_7hm6Vm0f7+(oD_NCaKS?YGngxruCF3^VHyIkol!D zHhKJ0)dh-kyFL#TX(6prm(d>z9;+gp(0fW6b10`9KEqWpmc#>@$(jQQ283ZskF%M6 zzL_(4|5ZG_)*yq-L~ZbxnhqNPO{~G{!KK=#f9>HRm%{S7akEl=zaveE)XOUQy*Nqb z*fpOs5kkbECL&b6pJEVt!V>bMBK4#{+NJNAIV#7#60F<#18IvH0vc1pJ`>aHbM5j| zb7I~bKUCG=&2Z4Zby@LKk<9<#t(Q;wqQoH`N+?ncR8@ke85l5p7Ns5CekC$*JLkHY zS}Jg7YoQ;C%iC358H63?R$&sY_Q40=WN|P>q6mw4;HHs5tW?3~xuXU4Ph581K)JTh zh&1)oi=LEBzeLKn&wX5I?qHYw^2<=t^dtcYSVf9{>PJ;Vt~{k1n)tu zp>LScv?1v`p6V<5iw1h7oSmGo^UuLTI&D6B--HdD4K?JX7Eb+jrf%>^aLH#QqRFEv zUVK+@VyCEf7sZ*R!VvcCF<7{uG=nt{v;%m6qCyZ!8LCWb&a!5^T%bf*$d^Kwq2J+SKDVCc zrlvBJ~*SQ$SPSBImWfI+A%Q14RR-OrxzbrMyw>Lcw4U% zsZhkV+&9H;i9bW)A7|E9plW6v#(aQ_2sba^&;dXd&tydG2jv`HtAc;il}33jZedU9 z_v`pLB13~kWC7>KJc&}GE4snj1Tox!v%=5RQFlNg2EHmJvP=kle~!t?>*(?DV^D;1{+sbU8+{}bcK0%l&Cbub*X#M98|DDAw9&6Vv+tlH|wZN^4ZxTy@dYthwMdX>-J z;LnF(v8_i-2C)!AbnMbKYESC3j~-{YtK&-UB6pE&el)wEikqoEJ90a6bnpg5zMv7- zd`)C()^YSsOCI&WIe^0TLC<>p;B7`fdU^F#(GRh4zOo}Zro7M+ij%~40lfV;uK)4# zEf`PHa9LMNz28BVh+hUfNAJa}=e6$z`l?|kM`47~Xksh?H(i<)cLH^STkH>3`tkUp zhnm_xTozoq&G3A=1p>K#+=lz&hTpvZ3ZDO{QJE#|d*=BO%zN>fJ2HhI(qsM4G)*Jypefho?ZCvpf&K1c{Q*2 z`9(i6lilYyG0hw$JSA}%M-Lyvx)H$HCsiTnz%=fEao+GpcMrmR*Uai!T-!A7o zJ4%JLLzB?V-qAy8^a{z1K<2>OsVwYz-ZUW_Zf+H-+CsfN;*;6bvS9qeNG=jjepH!C z@tAr{px#x^Pdso#PL1gzSIL!50=tQOJUU)UU|w4ZhNqV1qOwY2h?95dShXOBUswH< zsybSQ@>#!C(^ea~tc^SNwe7Y?i=I*5m#e?N=Vp@CUvIRc{>D8*Kg}JU%ESP_l9Nuq zx1tY0rSyDh-&^(Vh4GTIAH9H?b$koxML)m<0EDdjUql{aV7$1bBF_^PGd>KKm;T4k z83CT0;j%EFhLUaR_+QIN9~x0*BNCa!)$9~r(MXQXJ-Lc-lH(s9fSZmq9 z8}H*k18BEC0DvblVYKvn*wPj}>?OjLqoJPT(Eep*-x>VQloF3*0fj4AgCC2qI}BU- zZ@P>A4az2hExj@+qHN5(QLObb39}u^o5fi?KkH9Dn`K(Ryf#yy zEuARRpG+-FQZP~5huFw{ zwKPz7b$wn;VXK(PWeP*GlSt)?z?UU^d4=0>0Bg!84+d(AGvdm z&AcIORuEs-N+|C8& zCHD@1P-7nKw@JuKApk5w;$+F#Bqi#%(|BcRbQw}ZH)uoAU0fV}Co63M0MF*1ARWU0 z_&LOf?&>a63R;)iAallTk9?@H6dv?{M6t??oXW~UcT827rabKetbsPi@EaP=>R18aCc`|M6((?+2s=5skZ8YrIr*=P9C|`e)j}29OMe!3>tO)9=d)6pPt>mX z>hpajVNxAfp{$c$i)5B&k2OCrdjz|92ux{ZPtAEUb+YTe7*%DeceYiq=p`?u_Uf-= zqIh2k$m7j&L6eb;tEff~I*n1RL~5NP0)nMK68Kb$eY%1Im zL!ocE+~sViFVKIg2@dhkK~ge*;~wQKqHl!)0=0-w0Agt-m)1~emH7?=!eC4(7yc} zN>JklV|Nmf%VsvUI0+5Im#3s1MzYb+IHYM(@N&91{tgg3rj}hKWt##gwX>>i3&`mL zcHAI!xrv0wWzIVJzlm{%n87A1qoW#XWzO{DlIe$$i#OJ1UTc*${(*cY%u29aS#7%{ z1>hw9XmS;+o3rYeLluAx?{H>(c5cLiJuAZTNW`6$;d2^{4ayefMbDsu*<0h-!4zdj z;v3Wrc4GfGQmnc@S_}KFD+*(8)#3GRMk3`=y(k8l^tDogSyKh;u&pdYEjFmZDkf9b z$?C@$XU@v)m%YG~{)3nUl_#^#6M}?Y>ie*XDzD6!*7Kz5gO2$eX4Z@z;@ZzGW{>y= z*EX{dgv6|DE)G}p+Sodu6bVcFV8J#iyHoJl#+>j4rqN=(z@YNf0wZY4Jsp13;JHO# zRiKDQ2J<*GR9-N7U5lPQojHGeTj*Skx3G>f1jhSFR>|lI&9+2oDm1_qXfjlz2Zhrq zc<1g)G2HHtQ~T>EmXj$OnK;a+`nzN0-cUKU23hGAKSm6D-+g=e@PqfF9l@^eysYpa z^d;qRQU2@W*y0-_~1jMXr^Dde5vwgAeGpmLDl~Xp(N&3ftn%{#Sqa zkpB|ZMJ+l%@Z+G!ux@#T0++#!iJL@0XB@{xkU3<;+bUQ53C8NzD{uR}}iFGxpze zP|&(B3rzk;eI{N)YnyA9?_vSJf!?N^kgj*YO41T($~;XyV%Qnaf)Twe&&bo zW`{gNla61if6P>0O~21fu$wq=PGu?wCB;;I*TW|RhU#?8w`Xm7HHTWxiIn4&h$gpN zDH<@nw-&j~7hISEl@8=yqkmMDDm}D)JbY|m4f)NiR)+R>!FqV%Hk8Nml%(Q{+R(XM zFHs+VtDG`vz=@_tRj->#Js2pp@pj>Ga;MnC;P=-?jhWIH-mVK%v){t`Rp&Af9GfmQ z7T&Pm-)`;2yxFC(rHv{qwg5N@V5>kLkwJ*>>t!qmv@#d^Q_M9cCxQ{kFi;m>E0l!m zkB6&aiZ;W;9a28KOtX}8XUs@Q{b)Qvfj;L^9do7j+5`pGm+V?SF~R|P#)(>osyQ82 z2Y*$82$yuwWtGlKvN34Wf{;=OMkzC=OemmIph-H1AtLMfz;ly?7}HiDQd{t9p~lzY zhbj>DKt#xLFTZZ`kx#>T$qz>K^KUD%qWiG6;oSi)xVOpjh&Lw{8*EL!A>ZQOhV| zBg5so%=`_Bnq-%%s_pVI?gf7_h|%nk>S390Sj-LYH>#TYhMadw(b*$>dbl0CQ{vRkw$2U^O8P^}7M1LF6!r{!WU*jR$eXp*_y;wn`~e|K{*`SIpufi9fDjkE(c zrtyeg%}6&DfF9ZGrR>b?d7^e#Z7SOr|HnD@QoF}yIWnu9FD=?6?*@?H5D%`{F2v*M zlj2>j6YW$F<@tmANa2teD*Bu|<81#{8Tz%&tsU#mh336+Oi@bGLsQGcN46vy#oq^n z4P)^*>P&xl6Fy{OY|A;RUuaq_;FYghF0f~yH6r@f1ZfKUXYWaYV}afxuLKb^c!Iy6 z+(_?|&>^?Pd{`&Jy!U9ucyexwzEX1TPCW)pd8ZI}qbIQP2rNSg0ffsfY#1&~(51Zc z^K4IKpThq1li9dop2{ml>5<>_u5yrU+=`ytdy8Y-fz~+SDTj`_j5HTnFw(CmB*4O# z6w7KQLn1pX)Cw{7a%y$JT0ZHn>>m9gX8b~C?z>rM2jg-!qU7ZosiGRCiQo1%#-wHI zDBu40)7I6~i8f5f512vohaoIZx(B5*-V=f){(^_z^dha_!>Msy!zTinx>9p~|G)o4 z;)7AT3ORn4#)JNUANqGFrr>(~wh#J0%r2r~G!WM-euhxZWT^_7(lBLb3u6V^ZbdzFPuR$DFn7UG%n?2aWZyp};xVbOR%sRYt%BVW~p z3C(&ApZlF?j={o9#KR{J$5jzp#Kf_#E)n5`hHDFmZM73zuwes`a?ZXJ^T=>uI2&D) z0zh(bUzatxFn-bu^i%RNUPRjn4C|C!4+7)o0@C5ZUZM-GSx+R@%lPE|zbNh=II5Os zmSv)pQl=@G!^%?kf3ptM^=fEkVteIUI7r4;Nn1w-OMhlYz-HahLss0~{a)7W)Po2d z%pX??Hj76?>XxH_m68%>`GSV3^xk=va(y1z*j%r7u($MYmVF?n#Use-ikSglMdbCj z)B2mAqCoiojh~#%;Pnu1kny>`f{QpoI+>$zrZoA;{8-cdMC+6`6iLi@18YL)rLtM ze>otW>bSqZ4ZL49QxRv2`;GqSFhk$=@ONh6i)z4fdh79%&KdtISc1{pA$}vjH=(lB zHEUPK)u(28v0I9=f3P^~tKK5gLPon5E+X~P!^5TAlzQ?-75Ay2bvCUZgDpJBxahE4 zl_k!JfGb0Dg9v|1r91d*J2&{eYdJn{EZ_dQ$@`7VhbH~| zo0}e)ceMXfcMl#$Ll8;+lTeUiM9?zD*TIbuZBwX6g_MCV97&B=&<6k{K!idcMx67d z1)|X(e0)f~+1gkTRD=tA^Jy7GaKQSxo+t0xqMFLc zskqZfYxJs$%aZR1mJ~{9*e0W^tR>p0m1i(v^_^l$M?{@T%j(a^e}jI+y}7?XxX;p# z4Fckm+MhrGM8v^Z2mmWKC?PG|Lp4^AUZ?Lg1fY`OU?fZGDDQ-HP>C+3QsHAUvEY`g zV_QQ-H)p=hX^xE`sZ0gP{o?1?M9SII!y<%-duOrOzUtFP8CuQSA93z=i1OH24}>k^ z84B=K$E+>T4+sRT53f7%BZus@qz6@3gIF_$lV9eP=tNqTmqj32x0{zU+>BU5vDhB? zL2dwWJ=7PO9XA14Apg`lX#gwhYjk!G0QX4)&%4J-09P7Zibll>j?3ls%#Ng~We@k* z4w|%XV-5E0sbsvmDihtcq*pgJU|;GJROtE$zrCvF0+?PPuQfVo>j;%|Oc6SZ7F!ph zVLxx8wMK>9-v5ij?n#4l=;#BN-f`!5D46_sEKDM@XwjQGo1Tu&ym~PJ7~62WokT^oPCyL9^JUJ&(UU0jeXPUAFJt zjF;S=9hTJ|2`1ERk&7em`~7Fl2=>6QdZ#ic$vV$QDii3c(4tf-A*BZFzh+@&bAtax zZ3<{mxD^nBPxZ^o;-;{Ai%1)Yt&${lc>i?lU%2|BPOb1zmW!wsF&HG`WKWjKs#K}( zmt^UvGZUs-?7ASoLs;tQb~P>1dUVDV!$ES(CP=f)sU$YWM&Y5OhuP(k3oF<0y0A9` z*GA|stEoL+L)0M1({k`vrfz`OGWYi}UaO_n6hiE5fX&XdSvNNXgo|Br6^jGP`$FVD zeo!G)e~k^lIzq5>P8g+6g#Z-V5B~3#tf6MSd`+o{BgC7Z57OnU-1HiXn*iLGT*iz< zk-MenIGifYg7OsLH@E>^U)jQdO1$$CAuz@?;P+_CqK5o}8 zW`0~Ue`5O2Uh!SV>*KD-C9_dBE9gQ)v3a)jHOfiWw0+_`Qly?k8tz>xEho;>HkWLU zPdX=yG2gg96Y|&TT&AfNm$CI!Gm(Vz_5USH-QCS%N^OT_g!}c%I$>i0g|h7|`a_~= z2(!!lgpE?n5C&=Q*N*GF>>)GgG%7ZmYUd=;C*rdn^+0s_8qE?u+4Q z%{qw;IUNOY8)|xEJQ-0BzWj^P$`MI=(PCS8woG>Y%yue`xUzEfLIfB>BozB;!|?L! z&mV!v61ks*g*mK*@&(ZuA)n;zp=!Q5f7#Ft-$<|z!}-FqgURS{KL*RH|9cI+_rc=TT52SC4yq7hz`9I$La^Ms)SKdM4?L2p~n>qq}Mc4*h-3yQhK~ z$dbJqNf!4VTdq%na>C+DWl{}I^lq=Do`D7k_-T~AQkcpRk)T^6C>P-hnv{FYK*_-= z&`A=5&a1&Df3jY*lb$25B14c;S;9EU?JMj|^?^(AS4XwRdA?ToORt!xHhpKUJn0mS z^a0Y&;!k=RaaDs!Fe*GYolH*bfBUpPa?j5rvjDj>>#sByIj7GQT{)v}MX$T`SuAPR z67qLGmOgXzf2Jhr*kp7TI4j^&aq>n=55u;mxxP$X_ND3VWJS=}#=KX%rI**}W9^rn zJ>_Eauja5Kft2j~cH2sRd^QS9mW+}i@;VWJ(n$Wz{b?D!$$NyOK*8HcJ=$un#h8?W z@vdiKDSa|D$-?i^=?(U)+$z!+zcdCD61YXju`tzQ?Itu$n3P_7=WEIH0fowE~)DYvjdfC+>JA(#sP-KT4fYR zTf@}~V|Ow}tul+DJ*vwXB5XFsFfT4%K)0EGbNj6L%<6Z)&1GzXu$aD2&d`IPRW%5V zCY~&Wg+Miz0MwGiYDdITRX4l%{9xQ{T=c@8asA@fz?n#rIc@)xRMi~z_qyZ#_kT~n z{xv%N3d z+ac(q89r499Q@r%ui(SW(DL1D6Fmeeqr4JMC_d-G*Ts(Z!|9i#1~%LU6~tom=V>sI z>JvdUh8`}Jsj0n^L}=jCDJe@wEY&ahEXRRm;G>QF; zDQquHL~P8RNo005g?Z36l7t?UkP@42@sx|&ioBXbx)n>WhzGyeY}|SP1v7f3?@~Z6z6Ww_jG3}tCNDjPF)C@_Gf=&f>Kut zY>Hx1Z&h@wVpq^)B2K}}B9zr7QJLY%hw8>mrTMcoD{Dr1+7Lw!hzjSok7T^<0OL9> zieX>7{XJ)YL9+p!2>lTWvN{`Jw<{2nDwq{xa(jQR7#m$HKm*ZBKFs#5^5n+Fw2!!? zpnVRm1RCUX<#_e379UbLW{u8(9ny0Q4pF07i#j<4sz`h`l&D8dF6d<7hB@O*3Qul< zwJ)~sKYpk~@Gu4jHGBbAO7b=Q(qmrKRfZ4zT#qSYYP~WWvq1cR*%OS^(}os~@|r;x zF14#;V>VZnrjE&y6c#3%YNGk+WMAAS6hCP{`DdEn#n}>1kAADxWd)A&?hNP&ycNm^`rp5-*tiM&lr;g?f?hJL@J%9H2ZLV8 z_D&--xtX4P{1ER>A0%5TY+oq07_SO>wCm1Q&)%y-U_#SS&>1o$PQ zP?0poToQ?514Z>mr{+)8nRH&5DB4t{$6ngVa&E ztvcc=&v{!PrE02LX_HoBW}nPf=Oz$v4s|A;kTfGgrn9ONjZtsR5RWoTl&3v5*32=+ zFImvC!8wHx%AQ3k7it#Qjt>V*@0X}FNe)vVuHB|3+JYSFJ6M6%wNyVAMBA8xx}#(P zVhazkGr*LN9Fz;`MeEx#s#=J|A;g}A$ZLCS9NlD}ihKWpmn53dk$@H`pKLaYJ!-6= zB`2oqlp9P;WRdx)H4&}el#3@{dd_&JoPC^z8;t`2(jpoO=#ZJXlF()us`1$er@T+E z$`neyvwnoKjQ!2WNy>e{kL}MG*2t6nI=q_JQlEgw+?#TQe2xHOWFT+e6@7TB8gms_ z`hLZ!?*Hdk819C?A-lMRmBC((rX`L8rLmzIi408DKJM(#dG@IB+nygn4S^EqsTHlQ zkE>o+?`nf#MFyMdrUxq`xC zWG0j^_&UCZJCDsgB5ep==tq3n^piby2*%U=f+sS3kd2VYc-qb;$H9hEG<(Yy!pJD5 z*nEFm@Mit^i2*cA7hr(n2oD7U4%G5|d1VipMiS#1p%dUWm>n;zOwYeJM)>0Z>=9h| zAX&M*6n0W0$)kd}t_RHQIIOnd|90vRb9Ij}7?irMWj#WuyBr&B0xiW>i*RJct+IVeQ4Gs9_47w7C6g z@|h}8km(hgM^k+L?zL!XGX_rFUsR}XOskfr!~-Fw%Hc0F;bT#v-h>dkUU0{psv-hV z+mb(WAzX^GL)4q6Pk<2Y-U1}y0yW-C%QnIDaV}gEXTDyE;_mY&k9>`~7-wwc4~7_g z(N!&BX^g%kyxe49%_$tdQVWB1S7hT4H^<>c62V*>Sy=!!TVbS7wPkdj_A!VR9x4(6 z|AC+snh0Tnx;tpu$jxOMg}TbydLL9W4Av95#D>0$;(4MBdq;1a)#nM%agdStfjPa@ zW^JyALk0B9#ddXi)Lty9v7~9TIrWjlMpIMlifp^-oZp)-zz-YP@4Qw|UKCM%LyPk- zz$I~J|KmqK7&lyZ#Th2rY#j4iLz;aY+^1n#3+I=!gVhCwr*DSPB|x2E3$r$sg1x4< zyJk=T*4b2bP7P6~RPZ#BMJDa$Y>71@LV75t|DJw;PxQ6il;5|}y4d(<68Cng<2sx! zrF&1`2%4#uxUs}?^CX_g2w&%4BiPcK?MnI?Scnrl(T=&mSVmlgEC5KId=br3)KG=g z6KTK|;=4RGb}9R!v*X4mnLb2{csVhX%!xfzR7-}HVsVU}JMe?4NiUJMBW|-la=tON zID+^nE|5tvD~8N&XRGdd3#7qFEOhYlTaA-~Mjx(z41R9WiDU}S9J*$6p;=1YW%cV3 zpD}ra(yX$g%9wUn^p#h>rgp)b6|i1aw6)}n3j8DA-Hwt)F`U)WPOd>M$HyY4&M%|` z;%X&XUHY{cyjq#t*DH*!a)ncPu)VCX`~CE{<6@>)-Q)W=`4`G1vvVQUC8vMh{j0kF zC%#1!;|z%)f2a@v0NkqkB2^*>zo-Ebbia7Z2c^r>tJWba1PrnwN~4$a)Y+^QrAnZb z90#?$(JiGswUsJ`Q^d-V1j}$}DQ@Ejy>L_6AlRctx|gd^i!y>uV^&C21X}TeFTugY z3ZpL)Wv=damx{HCfXFNCd28k7D}=Dw>wiTo>HnFXFX}HG-%@8 zzaZf`dvR-1nA}!}+%$o6p^Ga7=^$giLq|Ro%D~DoVRGN%RdATHTc5i&;jVai7Mam1 zPj@;~-lRPTE!3e^1;@LI$EEM&McKyjVR{f~0O%y(fs2=ju@Rg>Y#XbZxGeF`t6KS# zb0MqyrAqL_A~P`Niiu$kI}djctqhJre?_zp;me0&Y4CJWG%I||0l;;}=`hk#u!$Qu1AEOaR-^hp3IYW3@iF+n+43=-LA z=|X2uzbk_N<0mczH%Z-ifXvEG{~$I1&hAQ4CTJ5U6E&t@^1|&0sB3n%7o|)N1ln7n z7gi<0!N9Aonn`SvK{ej+30jD6pcx3mOAz%<54FK2>X&s(^SCX5y zB^rR*g{q)#UOS#aQ)jXnLuA0R z?fxB@u-eb1wnS==FG#+f2|or(hzhZ-K@bbVi~*3*P>m4QZ5OP9UdNvx0h&hyI3YIS z;o*%AZlldCctgqwm?8N|N`zkP7Mq#mm?hY%xNz=q`JSOh2?kPG95Yzou&7r)-RFv8 zU;+_?$q7?=boGRIQ-LVCSB1$$oD;xuk)LW^kDD#JVLT-Yz!@e5UPvw;V>~Q!E+Ev0 zoP+}$O6l+-(xI?f_go};(jifGj81R=PJ@tjL@!2Hu+(XszG(A&!}1NAwbv_*0NxwO z;{2kXh9Z)$*~IwO{c%iM_4HeEI(FPVP#B$`ofri&saX?A;N_&#TsZ~-;p$_Oh%bz^ zVie@~nDTbNS9fe8KTCTWntL8WO;DUl_r0RC;S-_+y5wW@+|?E`4)m+yQc9c+elx-PkLd+>Ri)4ju)YBJ0a1 zrXhCYssHakZ4QIJR5xOO@bA{I%!R_)9dsP|&4?fTmr=B5B0q^6x%m(QdClH6ZCsz! zg}6291=;M~OLR7G7}Pb_M?B`^Eu-gQ!^nDz(eM&psWE{g`{TRb@YY zR9F~S=2-sMls%e<)=huK`T8kEGA*?T+NkX#4d+(y<_l~HxDFxn~+_5X7fWEQ}S>vm zBAA;=k;SqN@3;vKC&rbS!_%|91b;2+54}QoEKTM@!uYq*Rpyyye!6??p-vuHn z$$hDXxBxsWl!FbEtmT7*{05H2QQ48fAYq<(OlZttw6-=9Za6#%egDD&aIQ>tE@=gx}Wm} z1qB3-;1<_{=!=QMQ`XKUJF%-AcK>FONAI<`LwfT&`Cyge2qFBk-_8|kgrk_S!!z(I ztTc^5Guz1S95c!ud?Yzbk?;HnpGd%Pathj!zp&m!$FEEBK7KWwofjNN=$D7WQqA3s;d7x) zNZ@O^s?M$cVKSuZ_nLEDWq)V6Opx=bt})SMEPg*FRZja+X1wa-umsp>e^t^C2%3Ilgd z`Ym2ME$x~0a5d5|>r0eaf9l=@2C&x10f?m^i_~x)BZ!~P zN|+fixV*HS)66TZqwJ=T{vAfhEyn~-=M7Yd%p}DT!qJS9lj~%_PNZ?pz~}$IzR9J9 zEOD&WoS?TrgLt(tz;g)3isBU|3>trRHx!VpYvmj8l!+YTN(oAajwsLyhZndO%Gq1Z+4co$s?h1 z^;qa!2Wu0b=l~P_xNtOwQ@!F>OcThM-_ZaoCs|W{(lV5 zFC!LwGtiX`ApQuT0{NuGL}vz$r5ETDQydB8#0y3WB4KF=1(MwxvY>_tKWw$@t3&JD zK*IHkT{YFL$YAJ%-`zt4FKPO%y()*XI2UOHjtmds!~%=HeJ%C^TawA@wVQ^a6=^#b zTSMzN?XJIwRjz@!j=hmM<7@+grSW;EHWCIQr_6i?n1-Zf1h{|8bn&f@%{zVmlh2la zLIeSLECAGY$*OO+sAQ#zO9A%%CSvW!_7ivKI#)t<18%f|z{QP=5hCM>d9$eImP??3D( zxQB6pw1zE8-c?WYE6^*bt|O^d(OBgtt4=UjBj<(KDYC_t;45xgeu^n_YZS|1 zzS9t5`uk#^g~5F4*2^h{G{f8Xuwf0*dZ_!aekU~y{isB!O=&N)GNXgehjb>#-j zRdRGnJW87)1Tgl`IRJn1ziYiN8cjr-m{rPAwkqHbuqhxp_0I_rYuBGrBWXY<=vkFN zk+(Z{3EU_-Zl{|Ok}{Ekcjf&*Kag&OK5MYG?SHdH={E6>WNLhx_(MXoZ8hA)v4#Ck z*9-SCSN&ngRY%%*x^W@>N9MoV1`mYTYi|!6y#6?S)@=OnG%%8vz0LEb{(i5ZD~cL( zm&@cqN8j9(h#CNZHZIj@Phx=}3(uqU=Q*);claQ?EJXmB9jio~+{iA0Sdb5Le6LjC zTwU(aAcd%%@q*Rglo;Mhr&FvbFB6D-DCVXrhUwV(&?sf={UN|#dta$nxl5nGe5p`p?1bo^RkC>a=qoxxwMXCk${JicY^3RR zRVw>b{7u2kYMIVgG?*NVa7qDxmKf?<^_0cE*j7HYUvXXaKV#KP<%t9iR2ZYg+me+f zlF_eh8XqE6i7%tB_^(@)uPjKjq@?C)_4d~WzFTWWQ#@~gOF`5pS5nxzJsot^+8&ov z%#)Rvj(u1oel^yf5LFR?0ztM)?LV{j2VTREx%5yvO)+_nkayI{IRMa4w%I6b?A6%0 z9Uy^4$Boj)Sovhx8%M0%(HPqU`;5SMrfmyNnTsU)7l?pZ=GEZOm17_t)kZK;p^7?5 zcE`Bx8n;}Kpp?jfaN_nRURTIR|8}BO-?9aX%RJRGq;{jnZeh)LqymIf<8gMLmA%*{ zU(VTmRigA#t&iEgnw$6VrVAdlKpZ?mi8t{CLcKf^vP=eQ7${3PZ-~VPS*(xqC&6~j zVEtRH^%~Eto@e5o%V3Lg{-6KqEjq>z&D9B$ASU}c*H$Up0pb&3?bLRGSzX#I*gg1T z$HDV2B}=_lj!E`h)CMH8PuJ%=ES(ur_pB6)VpO@f^}iK?eED^AAac}Q7fNXeiWP?_ zxN(Z=;4tx%G1s^y@9R{Kd0!ntlN<*Eez9(2<@-74wP%VOxfgc4dc>7!_Q`N?mKzqR05Sc3=Q$Cs@HxM$ZZ1$MR<4H@s70>D`vFcqKwl0`aIFN)t( z!}?>qP-FdTJ+;MWg>sfRi`bUIpaBqJ^HQN!Ops8hw4gZ{>a+apftuF|(;4`&;&vpS z9L-TA4ilPI2gGv31}exML`Mpmv*MyhMKwmw4&ynKUAopX9aT3jIeB8>1Y#56%_`tU#?l@Sgw-3B7d>hmU~H`AdryDS(ZppIY!c0G_CTORr=k zVBsUb++K9#=;|0F^S+*T@6tvi@>%C2ZB+#i4x~NL`N!~;g}|msp1_;0veZk)^DM7^ zi}M@B&BzgjFsWql z_ZruNntFaBKOhk0HuL=HZ`Uq>$E|_JWOkOKU`H(h)Q3}n#ILduyx`WaYerV^Un?tn zyAPxLQSx-W{jc%_`jWp&dDqIs0*ChfHT~e1(>lhem-~f9KYp~L$bRc@ad<=m+qehb-bev-qm0ZJ517XbxUc$q z+pPaoTH`LU)G>MJl^xX~z_Gw{3Lpf^3DMJvqBX?DUo=m%KVbKLX_NY4U@ZBsY8wwG z(3X}}GQ8+6-l)C%#{Fv4bn2$($LnPI+!%LHyakv+NB6K}KyujA$T!3X#_8rxY1@Xp zdNQPAs({AD!oo*)ZnF)Ck6U_hA46s*oA{J;V;ZuPi@?Y1a57b$^D=+43S@RGu0ca3 zJAvY(r~+dvbF;e|xt-8gk&0Qry0ja^1|X?oN5M=yeV(1dVWnH`Z+2T*W&OXdTfK;%eO)&Hx9E&7EqWOVvlyLps zz#4u_O@c)3Bo?g2zcEW5Q3aI1n`q=P!4ftKT%Oxz;6{rmAX!wXF}C(AaUy3U%xUkg zw9|>Bg+VJc&!lgBv=mD}xt^~(=S|TC@13|{JgSQngLxO8(?L+oD5mX4F!%I7i0S zq*GJ)J&TAkHnF%{CE4ksM+5G?BhuIkggI%m7Napw_qgJ8*h<%MpN1aTnp#OINv7t#W0B^@zVO@*l+9ZH8y@P2~Ai?I}a%8kAT&?UMsQ zk=C3Se3{6FxM+4HE>PY^4O`zI9XAdUQ)H-Xl}MhRqu!kb!)5~bT;XAhg#@${+iDjQ z;u2!Q!~*fM`j*jRh;h{+HLWBVE6lv7Mkd8Y-&fN1{uI)sHMf@CyJvk8Rlq+YM&mN~ zhuvjeVZQwG`>J~qOQ7n%_3~{A?`Ioiw(i}{vqk2m+6it$=`T8*V~C1s;^fpE(G>Tg zs~&SZRGSuUH9g^5Uq-tvQ_<6>v?0xe-a3(-;-#4AuGgg{Gjw&Yd@YZ06BG5uSf=s| zeGm2cuHv3K)K=x{(BqdziQoXQYZ%CwUU1A8tER#mi;KtZTxKQ&ytPn9s-zgH}SW;d{e()RNA3$zh zT*RoU7obWKjwqG{5^;gTIY){R&Xq=E=!RQc@A!ORVg*hkF9)h&BJs`^Vn(JT_*#+I zT303ejx$vb2Z2t}C#~&+tgT9fw&~E51muU0-0`k*T7(FFB}z;gbn?>Sp4sld3}9Em z32`>;ee6uj+c12eElBs~ndj5Rsb>E0H=f+s+h}<-4wRoW0E;I3w5YZKK*SBQpkjlM z$;e@;zRG`qm6IsZl8PPKi!mt|D^aL%u(usgU}eWPRH;R+5J%3FJpj}1>nJ+Bk3Dqk z@i}xjM%d%_-(UUx@z?h&$5*|A!mEQ?NC!F}D&ON{WMnwGm ze&u<8@NNBFwHvX=D8Oavg_QxxJBp}eob(N2Q&+t~{AR*BT0lCwoVDgl6Kf)I5Hw`1 zaLBiLXQKc{x*_i z8P8Zk?+|S{lM=0(-XwD^ek?oRI0Q0bYY-Ga_9QVFi{=}82nJi7@wfOw7uu9;B3i8{ z7h~FKyys2@Laf>JweY}xi3*L)SPmgBZEyW5E0?YQJrd^L03f`pK@ga|nNXjN{BFpm zF|>OAJ-Xi>hq6_y?eaOn)Jdf0-7LId)bM^bBdu73cX;UG%}lGtUZ-%Wi0j~HKEF)T z`VE7AhneZX(cYsLGxNnea!Bhdv2U%8>oX>?Yuo z`0R+R^OMMgTssBKOQ$oRc=v5vzWCm~HOR8!$ltX}z^7PU;{v(ST_E{H>_R)!d;Hnd zR4IJeGROF2EFBo81uL?!W9|4M1^ft%wqNe!=scO=qu*hs#IA;VP4F5a3LY!bmt|yg23g{j}Evyj`6Tn7No&c z80PjF`}KW=CAh-!(-jRryHjw@1BU64uOo*>!=5;f$PyKzH2T0Hqw#mNVVuZ-f z?HDUH(>Q;BD=71pE7!Tw31q}MpY4J7+eKxHlLtPvG`N@*eF}8@; zPGpTLxSWMXMcw*9r;iF7048yw-91et>STweReG!MT1hF`}9)$$);m^B+I_@t|(?&3Tmnp*cG${~{)cs8PuZ z!A340M(^(bkhU8rrhuCnHMPQs3TwZgVKlsV+2Zx_;GIx=rm`hUvKPDh!h(R%1ML^A zfqG<%>G@-$CJ$ydR^$W!c_yXXVk_-EC*&Md)nWnz6TqOEz{fb)dRKK)E`a(>f^f-%C8{DxV zL^1Vg7$xr0NKKZ6_2NQUw+gWuvIdW#Di)7@jJeJiPuxJ&J8rygb$mOUW`m})T&(^3 zo}*aEzGa{HmIx^Nj@aOP^Y5TW{8a-H>kC~A7k_2B3oJ4!Y$5=+P3u9s`HzAU8Wq|J zhz(}acR=n`$WluKCkL>XFMwJmfM!Rm1z#J?4YVw$DLU&wmSUdRG_Jo1FqGD&lbAvb zHT}qsV0pr=eL1((RT@6>R8aAOfDw&h6M~vQbb#ChF13W-%jXE38dXs`R_(X+Wo_)n zl$&q4W24h^D(Az^1D9&OnsMpz;f5zOfsA4M?f7_YxL7sV(|L0nm(jt5oh7;5k;jT*bsN=UH}P~_?v zwG8DXsc`aj-O=D5~%5zwgjg_etUlF2@!YqC8w6gmKXu8S#}ND> ze%!%PuScdkc&`I|lW;f_;y-H+=ggTzn~a1ZyZchtvTAVi=HqdW7=c}mT}*jP&(6(x zVaaEA%I(IHwGT~`aom?fK1^-;yoGeDRdMAu4FfGB;`fef$pGUax%kxKzJ2-eXgNzs zuEM2i(XdUAcXFtk7eGVkOt~IaBEl{eDOQD_YSEfY8~Pi*^Ab|^q=LMu1R$X z;ri_-Gg{3+Bh8Vg`$PI0wMh04HSS-p%BY2nL)~C znAms`+m5d(t_#8Cb%F@H}g>|p#s}EP$P0RCJuBT{r&SB zpYdP0(_5Tc5q-Y>B=vUM@BB@@{SSYU5VzxWaa&luzhbrk&t(X9#nmXWk|9tBFFrI5 zYG?84JR*zreU(J#fD$|Bk8CcPw)92)%B9c%c!f1PDr<*lX|%^2ZeOfg%bXpgvi`GX zU61Huz;QncHhu^BRQ(qf%e9_#hF3_Q$`!20m6xn+ z30iUel^&&|14 zyYw}u`Bw&NX|%+-6FJ_xtH02n&8Oy2iRb8nHep=uiDXXZd0=GZS?>(mr)y36_Opy- z;mDdf(bI&z`2*930$C!NfXo2&w{9c@@5XIu!tDzy#{Ac)$P4x8r%OLqBs&+&r>IeK zrm5KR-!)lfj&&C@s1>l=7NuU{+MQ-E^{BZ%{g(R1UE8!V78f_+3!)5MpVE-h*m$~> zGMG{&Qa1d2n421lRNd%Ha^nF(gsxa#Ykz)=!am*|2(AL`sak$<~9C zfl?1*1ylt3YUjoyRtq@^2N5o8EAM)iNtF&SNI83YGL4J1aZKH+s1+ld<`UrzN|2ZJ zvpkoC&eAga!7zc)ktf+ZPXepx<`eZX9ROU84$STRHM2#bl42Z4jcF5UyrXeASe>Hp zv3J%FG7Xi=vPd&|CzujYXeh>1!6umBWa;wSzdIf?{DgJpGd=MKp4D#qoaDgg4u!2& zewZA8)CmBQsJ~wRgWghU(t?2)O`{_&eon}G%5XIB?O|CX(xonK>0CQ2lU!e6yv_up zOLG%y;`OU(oh8Lcm%}&rLzXbb%RiHoLR24?SE-E*lo1>mY%a2)t+Wo6AbZ2u0r%K} z8Dn*BnX!%;N(TSnY_Ipz!F4f~mRhW@mkoW#sY@o)M;&x(W!Q#BP~F}vYU0_E8qvfV zM2Ac~l4xd0$SCw3g;BTBY(Q5!q|)V-RU~dnpGa=TqHqk;w~-G-7MxL701`X!|Exzsb#{PAi{3C7qpRtC;% zP0_De`tu|#5}b5aiwE~yUGFb&e3j>5Djxb+Th_17{_)co4XQ^N9`TAo_2P@eZCG4L zFgVOw*?y=QS9)~a6EJJXYZ-O7@!LuofcJF1WI^xaX9)x~i@X0c|NZZ7Z{GY;?MsDN zmU9OQz*j|#(EoQiV@SwS2n(5-4L&rVFZKz6W5nuUr&W_WFjpY;hpUkkJ6285{({mL z=TGG0EOTXr?>9L2u4V3xz!R##{foWi&-pPu&OoA;7hn2cat)epwBV*$eNPs`-ABU*9^!HU@Y`ne;xN!KmB z#Osg$T!`1!EeSv`RMnXiMIO#4^Q5C-hX42+u>4_c^s|BksWo00V-Xto$IYC|ny?9E zYMqpZZIpVopRs#njWVgY6jRX%BASu;6UDddYmXy*$3N@ulAWPDF8|c_N_e{t7N?(S|ULB3sUJ?aXM)dK$3`b@YI!ZYCmJVe;f?A?tl7 zl29>r&#Nhu1xar9C^wcYuI~gz&vfBM+nnSq7XHN~Jtk|?*b0SCTcHUG1NKQB9o<8c zo5ltZ(K`*j@i2`auP5@2gg*$)f56inZ1~wc{)MbeLSYQR3jnAN1O^qlvPw}Xn+Q{} z2|gsN`N*gxw~mG+G1rO3&2bqHa%daqT&dR7_kX8&CHs$`6-AhBf}2iT5H77BZZl>LcNN!~Z=eq+ySv0IwMK>e-*fQG zi0<&|idFm1*dJsu$(aCXACgUj?*;LR$q=&?M9)OVa=e*1^(6*|pd-sXyC{@)_6d{>EH@fPdYf}K@ zjEU6<`+ubfVJZydoT5>1Yj8v(;h2~;pPmJ7G8e;q*|{P`@1V+=;J7`G9xT5PhFX_D z_F(TOi0<@Uu^T=UF(bAMtf0l6B4w{Sa4NOaZ_MA%RDNY@2AQ{a=vfO^0?;rJRMonG zBC3KmG3P`C4>tyeVTEcTHabFM%h4F%Hb-Z%&JBfSVG=2G;V`K$P3gB0tHE2+CG6x? z7~*-l&jYksuK4^4icl#m3Dpv!HI@dZGn`OS4iZ;uCc1jAvfSM^WJqdyZO3VcWNyx= z%sl~^hgNyk^b_pfE!{UY%*f(pXD@6sb>TB&VJXZw-PPb^K&;MuB#vJN@25G?Xb*tK z(lV~|WUFb4hwE$#t}`U5uutQfwt0!Zsj&RP$QE&~DE^P1$7qZ^H9Z~^`!&yorePbl zIx-zr9gmaDvHF_pfEbFx5uI7s%w5MUVw6U`v*<%1F}Kj!LEy|$%jf@Ui>DAJsYPU$ zKa?iZc?-Oyf(@o}+{_GDU)GfI@~^=$+l_J1)6*?*aAp9g&0~dvw&Dp4gM;+QO;BEj zdgOi_S;}SG@ih5O9pZ9JIOjIY22oVf98-vy{5H&qQ^iiyd z*jxPPB)lnla`A;XW?&CRY%;;>J_p*hYX5g@D|hLBujc)p$%b{|#cFoT3pwLr;4lSA z&@V{kSdK-a_yD4EnI5G<3iVa%LIJ|J8e+tx9*u)iQ%p)NJw};1GksQ%&I0$wHYbr2 zX+@^vI`U5Ts6U)#=(!r$orlU1Ct;)kx%f7Fx zVP5*GWUd1F41!x8wQHY?BYqtU^%%StAFrt3!bv|vV?IUA0+kQza|LT+-cd#GSGghm zh?;M~bor01%KM_pAEeHImn_acmANxZIT4b|`B<6Q*M1FS+C?bEjbtTE3;Jtw(`B(y zSrjzI`pFe=&tA~I2sz{>Axv+uFDNuz*-sPaGr4HYOxs2NVrvu_@+o>M9nR`4{ZA@W zs?I*={in95McbrjcS=GB2V|Kj`{PKuYynKbW0M>nYbi}F&rUOrtw#5a#j^i=Cwe{i zjG%)4V$@66?Id~o3w=)=ipz=WmIGv;AmWdUR31$Tj=~a(ANX}7gbrco23Bf|o|zkP zNNmy>64FV9?95R?TwQXCsla?T8fmJ>`EIIUea>)6>&ImLLQw=KgTkZUR3gVrF`Fl$ zuZWo`7U#3N@z1iZUOHDk?~0TM!$-d4L}R#Uzj$Z@N`Cgk{CIp5E67NQJY7I$Ng@HDj%XCa=0onE+G`nunc5In6$en|Es-**taVZ6BW}ANE>8ctx+R$hu~- zkU-i2l|)9H&;J0T22!*N@^8nK|ByO9)(boPi9_{Uh+AW$p*CFrQL2dUOfkb2(?_}0MdNK=m@R-67`JvJqcF`lN))MT?KWzSd3O3X z&NePC1bK^zcH=^?>MOX!w=T(de(T&~$YMeH$d6c?O!ZJq2rvHHRW)xAsj(?ZQKoy@ z*eEXZx{)3d&Okk+?>oZ|rYG-zO{V{B$91By;9M1Kn{;YOwIVIRlOrOFUbM@88HG_F(QW9VO3s!Fv zIe9gLM7%$09ltb_d3!VltU>lgvvNu-0Sk2{VEhr3;NVwWpU`rGQ-ABXr@tPE?Cw6# zub0+xJ*~Wq%8`+9IU)ju^(I^W_#H6d4on6g13v+~4VgoWLsACb2=B=Oxgn zT2G_}b*RJQ?7Lj$W225nfMvc$E#K-*0$ZQvTp6d?kjl(e1c3r`e}MFhXLMqizQOaY z^m*&TlylV=LuV13Y2N~;VA8<BJ>z8iE*Wr0yy(;0?iPmY;5xn@e*$lt5J>^hips(Sy&dP@rvaAO*v?)cUi)>A( zjyc)G&L+Clu#d*IFLb=W|8PDw7Er?e>8-0SjqcCVfB4lVtUYJQg(G;yt=+y-F3(&3klToD~x?> zUQJNus+;k>8qWaO|8F{c@bK-IcmXssX!_d1W-egNS%XXVi44|%^$#IBMzo2E9A>C~CpO z93M7{bofCD(vYeoqY7u0sY=1HA-nkv@$ux~xP^{luVQsb3!`q*ayAxneX@yg3w@zX zcQtgrw%eOqQc94139Q2rjz)t}NqGAw4hdF1Q+6m}&&fzF@qv$#qyp+(4vcT_U|xR{ z<4&uKj_NL~O*H?L6NhRL1JD{Y*`zwHOG(HnObG%5od{%As6#LuA$_>leZL8}4Zobq zgQjGSn5R~D-kIPk@PE~+Xd(c!z61wIV<+d8vI%A@=tUdxM??d|X*2a~5Xny!WRVyg zTBFWmI@!iuEd*kBEe0MfPusTb?i~pRad~nw*ZYIhwg?&kPn=*;x^o;TliyuSf$>cg z_OKB}PK^q2!ur8Sd4?6mnn0RW?KIj(uyruh(2yuaOQa@iLtR-7z52q0eE@>gvM}Xq z`0R*(o>({9MT?i3HKFrMqrQ=Qog$#V|BPU0R z+0$nF<5JHW$x`C+8XGwt2tY#ZpL&DEB0TpdOrTRorGH5V#8Ckl zWH7)uz&YG_%PtI-?B{a01O}pQFgghn@4;C2OiN!ru)=0c`^OyefBaBHWB6-sR`b4) zv*3KoZxbU!MlWvEY7?dATJ0f~iq|0ZRwz0)OBJ!nbF|W`+_dzqk<3>0M@YJUla}t9 zf}{Nyr=h)a`RA=zm;cBPeeJ#CSCxsY#r=rYdjsvP4lVS!}iWGN;^AA|J# z;80Xm;2O!feLe?;nC}bXQaE>S2Pvrkaz%VFOZp{X&lSDHQI$JUYJb~EZ=NBLZc+Pj zT0*|yS4aG}G6*N~8QvT{Oi?^5|I!g9Lx9b^d8s9v%sffRXH3+Cs_n&(MJYh=DnN3n zKXVM9?lJHcJ5v$=f|wAU;;}00s&_ejp;1?Am_?@Hz*liiy*tOlWnyObrhzf(xRwow z#@i=@qZgp^;wSL|_rQu1f+sZC-b-#)e{mN3D zh!7q{vq-Y0+@(NoEl4tZMRRxFNJosf>`=|dQ`L&A%!PRk+qHwMRp`_Q=LvDgQSmt5f?swhuc%Q&{G93|*^tk# zIDIC0@g3Z_$4d)(wLrK%I?>laLx$(wBd9pPP-*u>Z@AVFk0K96QO+XN;7dckny~vJXkcx>eM{ zr}>*v8qcksBHFCeI*0(?bffKC;XoWF8an6h7IRKMX)_7SE+cS^OdCm*#6w%?h_2}m zxMQ=fTslVAc6l({Ix^RGQon^A-k3d=vuQ;LqiQsH`MQ|xtMid`4cQN zeU$vB%6;d?c}kx}eT2CvVVMUS=ej!UBBl2k2lu<~5dmZ7nW+#ICL~LTgv`41y9TE9 z_bM5Q368}3QKw%1u5Bb@l~W`UTGR$$&%rRd0=432o{B*u&TI5;&atk_efpR^d?n!6{uBhC`t90VS_7H zV~Wg!}_TA-ptht!(zxk20QYU_Vk^Y5@=F{TlC26H4c_xYZ$fu9Y%|OvJZ&VK z3%+b#`8qF#o|Ss&1{ADsgc>|gb?JF?HYXCHt(BcKHLyIQMv`pgraIMbpA0cp>m{KG z`r^H|zP_7W3vBI6g z4R6)0ztY1j+Y2514Q0uwoD&RyZ~(diAC^l@ixRw&mz>9%K^laUKIupLj~_h%2(Dvz zg=z0=qgM1+Iz~+Uho(gfwQy7^gg5k_z<4rA`+fAY=Vol({z*!(Ix8!MBhLT_QW5B~ zlcA)|G2_fzf>u2z;RLBYyS%Cm4a~S&awT$HB1>LQ8Zv!)Ww~J>r-(}6W}OPrUhU36S#W) zg%(7rQzta@YC2P*=>6G5_Ij4XkCv)vp`SNR{;GQhxcxFIvg;KcPT4Xo*sgFs2xq2@ zg*fJ%&29irDF@6YJ1u!8&Mhw$NeEn;t#tYTouByem&|1FuwSKA} z`t@4;A3dpFCG<=1f4d}$I)0ylu5KdoAD&^tba`IwuINbR1NY&%=sEYm!i&w^*QMfU zG9fFO=&ZX_3}Xt|V`FRz_Yk}3@+ygU2b`#?lK_Jlia8UXsO>}*v*1bC8CzP4|E2{C zkt248$-pa6BX7YG-Ec3re~~pp+#i_x`VH4m!K$6Hsf22te@*>WMm^_~2iJT@el@uC zqGGBPD&F$$5yF-_tqKNb;+S%IzkAx#T*O5m&$7qXXxY47iHDJ&{A^fJqo3I8wc3zU z6eqC;6X#D+75Xn25V8~KO$hN~Kr`-F%qZj8czR&pga7L&|)DcLd#E2oqc7)GbLi73idtTK?QL>n>p|8?D8+Nl&KnFW*0Rhvm9qo%DL(2(0()oC+qfOtg8E|0~$0zf6^ zfQa4Fpu=>}b%E_Tssb}||M25zUEsv!b0%rSSX`!CR_P5v7!C`CmFyhXcJ#ho=1>I( z8tCOaMlRQP+}FWsC9Y(|L1GB*q~o5`WXy4UcJCJVNp&WGpam%c=H{5B-4u&a3g8Fo z8hmE^bl`S~eVgogHCW3Nyk&kpE@X-pa5{c%?&)gofjscH|5Wxc_&(@aI65}{KYsE7 zAX0r3KRg(d9q5;=O^hSqfr-;~jek-Fv&T?uvhgS5r8+*6SU3xS?gzr+87tVfaCtX# zm+bSL>({22zY8ON(D#oSN{ndgxYdm`Wi>qib_MhI(G@gKcfVk>5q0&dezFsCWG?8y z<@dcWWD2S1is%H0bnko==fS6Ig)w*tiM1FKO(9Gc6v95h34;R^Ow{mnw1K(Y?8{KdAb?xICjmW5Yp&3~$+!or5Z@dP zQ z^o31*oRFFp^^$82bf_-+57~3aBv;?g1F#b^fsGcR8gDy-5>lmb10J>F&z;ekKBYn~|Xhx=mm$?QG?B9)8E-#@m=xRi<2W_aV1o!v< z_!*7_q25kj5DHt{u@=h;V~UYH>R7c>(~QB=t_Phe+FnNdm9&w_?j4Rq!xl!Z%1mg+ zg`!d>ZaLaq39B~PF?oWc_U1K7n)mhTulb6ZeF-*vTCq$kx6&g-V^s8LUQ-g&XyTt8 z>2>~*cDo~)Gb>hn`}XRUI(8JQiU9y#Qf7I;jzATCI8_ekm<&1A@CS|U7CaidvWH|M zPE+RWf&+e5d~8>nMm((;>p`BZxwl^f)=G6B)dM()nzN1Wr`*b@&RjnQOG#C!ycA<( z>P&(uP_k$rF6HKt7e+O!ced{KQu0p71YcIZ@C|rTjbB3I zuQB&~%by#~5zhPPwLP3SbY_}8{T+BK#p3KSMl5&fc@{w|ue}DKTwdA^vaUFR+X%PQ zo_@#ZCoW3O-vRa;}PmX0uo8?-soaGe&(Etpt zjQq&hWmv6SO-HQc$ugmywk~^)h|`FOqYzmK;Bmg=UPY10fG) zKkJHaXp?|&BfI(=9230lczg=mDQ~t${ZZQ(}BX*>oE9Y znbJh8DwWMk*S&c)zEs5kmfvmGCu!5{pQRn1tf(U|hu)ZdnOL5BWv=2C@@MF@8__dV zK5z5NdtnqcY&mEG_pX1cV76E*Orhtv;F2cs8LL1my>Py2(<6g80#~O`@pb?uh>?n% zX|Wspg1)3(u=hUAC%IRwpB))my&cLUcX&|sVXHag>GN6A_s?fROie_C_e1@~!mrET z9mSNlbj!PN5Sq*qCt|e$@qoZ`U!r>pVwdr1_KH6H+T;gqHtsn5u{g}XP;IU(A8;cc zCJ0V5Y43e8w5h41_Fxc+(!%k>0ACZlq+q| z4(-3`JnOA@a)E~u9zuOP7s2FT@VKg1McaPHGQrMHv-CC=lc2$r( z`uLBZ#|(^GjrHQ-kdL0=kQ*D!7P3|$E&P*=s6vPvTRZ_ZKTe7&yqYK$jJ^>3OFfxT z^B_)RE?q*H-!mbVnzlMB!U}ePWSzTWIfwRes^q_%uK;dZgN%5Ew}goNBDk zcX+q5buQxb`1A44i9wUSP10`m=giL~PfPivbjWV#8UZ~~v%D`{u_P6Xf6e!+AjbxA zCKo!v@vJHqpnoVrG#CVdvGx5&L{PbP26Th*ZwoaqoyF@n6oUDRt=eaEwL* z&T=-(2Sl1CX2j)_R`i!2-eusScp8C9vz-P)f_$n(Qsh0}S@jFfr~HJ`N#wV+(!L%e zc@yVCeAQoF$$#4ilnE2%33=SG8`vQv3$KR3j<&6L+>_kGCffyZ>Ve4N3kMrC+fZv>m-_g2l-1rG|V^wz2~J zjG$9mkSDHNl%{{j$NSp;KTJoi@NUyGW8DF{tj7ZFQgYZL$pNr;YsU;_Kj$^4{)+WuSN6 z(zEC~3dY!xli(MWoH=Y8qncAwQ-99Ck`G@j%UR{qTW^eJy*@bb*Swj0ttF}cpY6+) zm0sZV15WA(Gj_fkuR)MsxV&wlqFKRgcf zeft)<-J0&A2m%56=uuB!v~8wrcm)ea|6$53$_f2R1{@<9#71=rz#L@7HC4r2ji58A( zHJ0+EYCH`;MC`p@XjFuC+o;OClJ>^~R|TEI|JH%K1NMMe2HeeS{k?Q2tTFg^+~-Fl zY+pL0_xwA~OoTqUiZ6Uoem$;fXX8mCe^>93F74T*FEdGT{4E0CK5DK4bYTSA#{(0` z(H?VV{Ogv&(V~gpGGgYlc{qT=Ke60ER#e3}SSTD##^Bh$3FykYxTMV0^2*iC)Nv*$ z6co;NYk~DlxKYC;&7xP=*Si#`nN^7<<(?Xc80k$bm-sKd6xiReE#x^fDGXL9MdIq0 zD{EVd-{IdI8%QoBM4*Ssm(+unq+|F0HWe_};8RbVv`!7QHSi3NCXd#HhXEK8vV~G0 zZ<89eFq|hr1OpW@Xm&5x+OjC{0FA~%BH>`?Q*{q>GLxA^2cfSM)z*h~ISb5c0D7~U z3Cj~cbN8Q=1JP$WAL*Fe?>V!#Job+`v4rNdI?LFqzKJfOX8(qqfBpWlQYbNcLhNNt zek$83!as^e?d+i_z%^L1`zdCK9+X;|rS$0dfxW$Nb8OZMd8C$vL zuI^fwh7*Nib21~XRLwNkpHDW~S%$Uu7&|+%(nQ57nFvA5skps@q_tQ57WBQ}_#22? z4DhUIyKp$|1F!uJU%#}i8J_@a(Ri)-wyH45hV`)_N7DFZRR{PxG1#5LI?dnS#$Xd^ z(Jf;lpLTQrl3PZX!eIj5a#fI>dt5mX6bGk$AUY}r@(LvA8k^Dhfui4?AFD%+a4;k8 zIig<5p>?9Ijip)@sOZ7XZtgc5q5$==-}=SDS{5K=D#KL(uEz&e;> zvxd2OT9tE8ot_zQ03%SQ8f|by&`4q!01K@V1(B9#?(n`+il&kmT6DC}F(o5x=B)AO z|J6Qjx1`OgLY2nW^LKDNWx@_~r>~z(gE8MEBeW$*SGnM(EdsL~2ri$z^1H}Q-Pxn_ zEXc*Rbq-OZ(6|=wChXX*U-r_N$eHth%Jm*R{^lJjT`KS_Z%H`jecQQe#^4n;Iy(5~ z3^t4qZ0~?p5c(}Jg5PUlPm**lsz9=xNjprIRF@h=Y-M!zX-K#P(qC?!qK7a%IYfB~ zGyGt%bE*-oeAv^6%PZz?{^c(#u7zPnAy#bFLbuw~H?i&cYKRLBt=$Cp5QPo751?3n}c%h4--F#iZ3b|D@BrLKM+bs@iR4+jq&;5I&qf^Bkz| zDpJ?SnZ<#^3(6w2m}jixl<1RU%$DN>V_``GQIKr9U0i?P(ItTQo8u-2+pZi6018owU}HuuDQ9=)=r7`j|KEK?B1Y9`9T*7q!E zNrem-L)Pv}@HO#s!U32P>IRYJPU;qWOiRvm-(SFW!WZdC^`%|ty}kxho1|^dCd|H` z)^mzvk*4r68--Ur6lq1CY#AdPSXzF8I7;3dSIr2hRC(E;*QuYbJ|^wEz+R89ru z(S6f&72xamz5C*TPRM!H+CG6*IJERyvsfP;pVp}NN)K*zX^j1T7@unYU9mks0IhHf zwcsEd75-i@QkDM&+AJx>2PLqo|G*9i3Vg=$j6{B0N}O6dto|hMOnSg z)h#a*WD|Pz)l>FUMiT$&Lj?#3|Li1Dgc2UsOdD;gX8%ZD3l*ai%l_bWtfU z026584zafLbKZ1`t#74!%A7nYMm2ed%>?eVoR4OIWvOfg(Xpp)?n_ftjQV9{s^Fd; z;p|so*C9Gfy81|POHoWCm3F{r)tt9^PjM0e{yABMHokr^xycfb)lX|AHbS&<9lF4n zBREF&HFkfw3u^9wi}n&9gx*SA%K3rCql7+LUO%|xyM>zJWNCn$IvtIfD5iKJVfG?#M+P_<`1=No@^RlYY0?aTiY`1S zy7FVzmbft1hDEwn%mQekn`X&yRo?<_a0m0VLg8kAgn04bRhO~douL%I_~1Of#hCH+ zVupVUr(OPFZU9H*h0So#G7{te`oXYh;0Ank5Zm6{=4eth*S-Q2h~TdG0C{4A>|;33d13oma?LpwB!x<%IZ#~phspo4-n zHH9fO6~lR)8K9WXET^TdW}d{R!sUiG?HE%kA}4fK#1wCL`+xtciPk+#V^mA3viVq5 z=l8m!wh$5gjtAP>mQcf!n>Snjn`_o7KV^Zs7AR2L@k8*ciD;Gqx^772O&Aw_%=sju z1;rC&7y))zTLf%!)?-!_8w*NvBZz6Vk&<8o%woiHeAxEBGNc?OMhpJW<^>9xmEk;$un2j(e_-<~S z-mrRR(ELVRvfa&OQRcqu^kll$yk%2U^0UXp$@;tLtXvYmoxJEeayF=f5}>H$!okQ) zX5%H!lf#@E02G#LHD43slj4D%1#UD&6zqPek^cbOcPh*%tyrx{Yx;O}oqN-s@`G2@ z8bt)=4RFoMz$4tI?4$so8oxh)17R6P`)gC3L_}u%kXE@kA_fK`{sAf~0-IgZ=PI|t zHn=1iykg?Th7<3Bv(K=3c?T6iD-|JWpUaT}a*4 zdmOTDlNP`1o+qaeoeEz6%qz0(08>e(4NmdipM-{u zrL+Ieolj2g#G(da8kCR%(i&|Z+tcj-lk_qt;K-THkj&>qn=`1N+z^hQc63~I*7T~9 z{|&oqN!)u}RrlljF!A+wkp3%Y*J=lUafzwQ+mPEuU%k@U<*VhmSXsyu19&zi^3i2& zqiIoP{Ua5*97xN>6GsL+Nv{ow?%7Qv2j|CVDR{%o5+_W;PA8jyP`9bg(tcC?rq_>W zKJUYJD2;OLtfEx%)6wwQ=6mx7#2iu}4P(;FV;zn;g@2`yXD%Bb+9mLQBVsPJobfaMD6X2bvt*h(5iYe_k%3(p} zrpAd57&pOiPn+C2uW>w2HT_4YxKjs$K7WEbigeqwz1B8%eLeR0a6XB_PIjkbr>|p_ z30d10m$B)2k$Lv#>*C|D|Kuzm0t$aKg~>6Z1Hyn9lMaksNLEz-U$Wr7Vh{oMHJ*<0 zR_+i8{{SfT*%sL)EBJAKuwo*P5F#>Pb_(X(W+Bn2TCnp8<<8fRkKUSxu=(+;UdQ9; z>z$QS6;(Gqv>EQpz~RjnXiyZqy)2>`4yFgn3glD9(Fa2Ldb=-YeQo=S1Y8C5if z{J^fUVBA>0sfxL8{K&NQr_sU1a-Y%~wBuUhE^G?dT_QI}n@}AzWFPqG^7qcJG3OhM zyVf+EOovXT8s2L9@C`s3o!doF9NU~CaZ8`kBgi3e6PI@byv8JW_6 ze)^l0p7;rv79RSxsDgqhOp=|+J2q&mB5vdsk9YW$)|fw5R(f33*iMj`(IB-Hn=r9k z#D6`@(UprnYuIs1YkTy{2vIQ|p0ejKQktgRO8Fm&YJYv>;^^!rLRe9Zt876ryFOMh za&d(^jJ*ZBuvVzSy4Im~X?q^?nOG1B9<40y8}$7z^Q}IPH|ohooJ`;#*#r=P4Dn4{ zFJB&<l;Y@FtG@c>~5#`;N0N@qx#6(H*j}q-b*X!Hn7>SFBp}*S{%~*$O z!=s71S_5!)FONgMV%$09Dxnx>^qy7C0wWF!Oc1GMo=#c}Stx~XDH=B%zub!K%e^~O z7@FB>pBFUf#w;n>Rq2tE@-_hb`&~GVQjjrbEZcZ1qAR3C$y#fwQ_kAEmM(l%?Qcb; z=bq=#7riHiTXf(YsbShyMxi-}8>|2N$In=jFs>e=ja#c7UdsiRLjMn5sAS^Sn~1HR z)u0!ZSYpxHFQIWX^U*n&P)Ky_9oNizmjbs-a?57foI)~@cWcHF6pWd3LY=QLjTQ?Z zY*kD|yFdA|=)bGKp8HsMWmqN2KiI#)dS$D$qIH8ikItz>^(8Vwo=hXHP|yxE*(Zm9 zb{jw>meMUlHN8<^ZLI=zB znU+{P)F`;WiHUQKEHq{P06O}clZfPsU$SIqnf&@jIoAY#lWHElj63O$AqfCo4f(|^ zsS1W2j4>*G=I*mdj)5H)t~fs<*>QrmCf0El(Ma^``g6R#Radqzi_7xGPv}ZWe|-FY4gG!llWRGqCR{HA;u*>K3riUdhX^-Fm&~>#JdUql7f?rFvIm2X zapHH@L8q_ao7h+XiAUv;H7f4SbsMelyz>csppE9ts0^DHTQScXAs0WdF%=69z8qf9 z#u2}w^*`$%ed;66jx_L{Lj~2C>7%@{g|aRRO06ZI@zLsNCz*@8v5;)HLHH9pn~@kj3*Q#bOZv4Vz~TsoWjWHFyU zT3PgA?u|vO6wq3>VqIj-WaNA15UyqSv;WthuL-~pdWI5wHUmc3-FK2oZz+gX;P_I> z)3f^Fx&X)2Qt zh60%DcQ!X0ndNfp4qoj;U;4_fMUsimUH0h~qDZ1Dc^eMP4B#h|?~$(Lgao+q$J9*E zb65g@h>=YEF<>p9XJxqmPfpoVg4hDfz)Ichr1zbfuFU?}EQlA5kS6essc1@`f@SqL zXLY_Njw^3xZCk*#M+`+`jDX)!lWREP5o;?(qf-&xrs{E|ZM!qw{K1fQwgRL8DE>mb zRstAA$g#d9XGDqLc1LO0$c$QBm{i7Ej`X#vzIP|Y1jNJT}XXrW!yF?l@`@O1QivQIf} zYDk7$6Hs%rp6dbAM8mxzCLk!+F17yc79+&J`g4|q`5FeV*Ri>=j;}j=%D*7%Rf7Gi zKMmEc98rm$MmTgrPSfX$&+Wj&pnM_*=gt-(0jc|uebxA0QR|*d2-z>;d6`d-Z*yHA zBQEq^l=u%VK&3Rt68oyN1bv6OM90Y(I+&sA*u=6C0D%8n<|7(Se?&i6HLDV8^MFKz z=^JfIW@zqpen&YkcgTNG5e5#rXPielA@F4B~aS9D%z zd%73R_F&n^U}oMSv$GR13(2|ip?IrRw&APS0wP6bS$vC6cVqc9w&)>9)dn0>+}mBO zGOFchAZqOj=JtY=y=?7~hHz+QeH9~SNO`J(0AJ@Hcb#!tr}*gSQ+)(Gvhr8( zEg9fuc5QNPr{H*8Ap@iCVN7*B=UdA}+SiY>a{w%rjIut=35k$lEN$7Suo6~TD=W1q zA|X@ZLOn2VcqAh$`3nwNsvfilIy#*eWO_urhf)naRvUgdEsM=g>Y z=??O^Xok~*+zqCx8LdG+WnO{n44s@o(D>X;oVfWy8vLu+*+QOhx0mvbgv7-;zg41l zg+v9)(^d!c>xQejr|VBlDx0=V!Mr?X-9RA=GfTUh+FA8oh|hlx<^WM>haR90O>md; zsALKpS1otmf+q`F3S$=4N&_Q9WU(!-ZZ z><@a1myN-$y*-~4cF6Ny>v|XL9V|{>U;cP{viSJm|N6HDj0?3_+=ZUI&w++T#hE8m@&-Eg-q1J*8V>#vS0{&hM*K_Q3yF7}C|`8R3L8@J zE)UbIsf+vBcEo~Kip%YdT*Rq`J2oSZ59DEhRnwM|e6JiWiS00p{b*oMGcJfhhGgWv z@;IFMDTsv%V(S{5*>c#=%vCA)cWuJE5VUTfI!tSicNRP3%Z45fuM;b-p<+k_b3r<= zn>;gO?%Q|3ksR|&A983%O$g94&eucdJF5}(Yq%%58KYQ0lQA>PU?H>*vLFE3Vk?uu zT}VOhFlthsoXKH>pPhd@og}g-m0YdE{grH-KZzRx$ja#@=o0F=b42$ybwU3zH?>;l zhVSFU@|lnJ$Kq;hF?p)Drj(ps(F|mic#YLjQ0}CxTR=L%qi10# z0se_qyv2pIEe3x~;i3SmzwWcT4&DgMUuAvu;L7QNadhOusJ>$z0~x0q0A0ED%PV$A znp5h)0{vJy)kxT|b=VvI_o;@@kH=Hz7~B>9@pBo8Iidx_FbW(ng;3W?F*}iC@@V|y zC!58^^D@u4iW^C?np!`z@|T?9aXf9>Sn}<_hqd;P+;0+QKjG)Rx^P`tF2kN%2zCwS z6Yb%;mMX+OsQmrzDM1SyMS!0P00RI4C{~QRA*w^#R0COEtRU=r?C2pSMkAbdyxq=E zd>mIXlEn0adT1XSB;tG`nKBKqW$o}I88Z^ZtV(f46gr_hC%HZw-OY)Bs#qnlW~Xpm(3g0{=WkG>Gxz zeP@%FuPZF>_p9)MaQ}(Ac-7es#i^JsObx~cq`F>hW;9!+n}wls+|7%L=naZIupv{VID7V_@QDiL{SjlBQ#%Xa4pm|L29PyXS})?>#7l7lD%DM9r{ zsl@TuY@8RDrN4~4oKtp@vO5dQ_yD9;oiqTz0nqe6eUsa6X!mpOEa_DjWvK9rMfPRo zk$~@B=w+&oIi->6yWvVLO1{HN6>k7)9+iZ{Xtn1*s0vDpj^-47CO>j3Scs1vmv_k%^kk`!aQrBPy8cZ>AA<#*qfzOW*Ncaq5HPV zyj#C1)ya9xsYrLpsj98>18ExIt$B{47Uf1wx*tL=xNr%jsi6WB*7i=Sx>Hw%P(>

    h`-=&^a3VrJp#US_Ow=a`B&m)K!{)zne)ZHHr+A^-_|u~EfT6t>sRHxGGE!4?$PrK4!Z(t2pDYH(a??-00rll27@84-z@1L-Y{O65hj z14_bEW>jYsSMhKGL{Uub*AVy^z+@@0za)%zHWGKpBH( z?4(Shie)dbB&I1zG&B8~(6$UJq2z>QV=piH)2^mSTGy>4Z%xkO$%Sg}L52G_s7j-$ zlNRL|9foDLvvSy4_?sr8QzW#^<+T6DPeg>uD8ObBO$(o+cqF4Wky)*x)D zU5ek-(A>NQK(K4Wm;nB|3c(#cWv&kIs;vwE@pBkSUZAm{U=-MD=N#N4=}-jE70|-# zO;9tfa1F}B+s2xRia&naUX#9(pY@+kUTHwgUwC~g70A1)ZckfDpRU!T_j};S`6Nmm zxG6646oA}rB!E0(eorBaK^H+n#+DhF7tS32ugAbKpRk(->ZP*9+tjqqNud-yJw0nd zMdF}RAp=EJnm-Goq2xL5vNKE$Q|A!bG=HYU>-!4Z?;QfZ?L%gA`4lNRqHKT1;IiSd z-aSaUh>)_k`BJxZ8+t$Ru*zv{jA;2)cEEfxl1bp9O^Xh-7P}mK&HgE#u$nguXvpxh z8{3%!Wz-vdUKj}PE|dj;{=E_)(7KqI0T?cyYa0I`JJe@p^Ck)xe}v`2r+$V`u`y^9 zuZXUe3#6erar&k$@eBJ`ix$95M&?3oc-+McMBu`0BRW7pl*CWMVe(Dj?ChkS{Ek9h zSy^rQc!Z$tfV?!ssBTETgdG|R&(VYR{~GeANs!wVj)dG1sS7Fk{dL;SPNZYqATGxR z=OHVXI2v9*Qa%o15^0VZLjYLTD)~JQiB$R27appbu(RQG}0<|#~(XM}p zKufLhrdK!N$89KM)vdY?KRsncgLRDN*7A$^Gp;)l#oSlV)ZOkO7V*`-Uz`uVK3Uvr zaFGYOl;N-F{zdUu)t$YlKY@(@+2k_L{e9zWO{VEwo_BM);2#>DU9`TO#O>wq#^UeW z9-2r`Hi;I4_~v8dk!6;&MD%FkHch8RihusAPyPwOLM^x}p>;|@or}AD+dc*?fs? z7k%486vhPX962UI#KzCxuY(Evb@xHYs>*%*UUxK|XHbKFQ#PiHUQ@(t>=0(Kav9K;(z>%hXMByt55UytLDl0V`si3-CBLi zL@K@khPuVk;ePRIEC`5pIn3;$&3Qv9os1k+RV1eLT zyfp7*Fcv0v^J>LLB5_(@Yw&8P*`BZe-UNrI7-~*B1eBplMy|#v){cJuzB=3dQ}~}( z8D7Dsu36J+E@zDe_}lL*i*;loXT%k4f)?(?Wy)~fcoh&^Rg`IZCF{C-Bx{bvCwH1J zy&UaKK*}_h5-dZ0S1WC*6>J+anK{pezw4bii?Em_WTD5dio$@! z%p%tLobOeh)LG@*76e{gJF~w9t1!;h_{36tHi6gmrr&2I>%HY4Cj2P$ZX6GuF?8}bl%ml-yS%P4$_s}b zmXB6wsTLGvl;j3xwk2nnURER=aA@IclMrz4N^Ay>Bv}3q{+X?(AxS&U0c~IX+sO5_ zXt~VNTrgK^)6OZ0RP+Qu768Qj8MY>A zocvYN#KgiH_vf#J)9r2rU;cSUQYs|hh#7d<0=OF+@N++_x}ΜjZ;qMgCc#LPWL{XDOV!$|irw{alVC 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㔵*LO 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Ⓢ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

    >o5IYko7 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�eYPy$x34 zX#9AuW^}gs_Wtgyw6AzH)(%_F;(!8xH3rQGpv48)8^(RZ)t(40U8={x`P&@)s>OZl{qUS8$Lavh3_J^$9CH*vvS^VGnSd zepVHeJrB(scj3hI`lg@fn7{Z^FrmH83`b5gi*2vE#e&k=&XHuu&KFM0xhThKgXaCh!!CG} zXwvv=6xX5vWk$VWSxf|(_jUVThq|0`HedR8(t7b1gNtS=A>5mGY+PLzJ8=+634j=c zI7yi!OqcCv`wbeP7XuW=K{FG}O*C4k36Ad%vC0h@Z(EK3NO;tf^$Or+zy!m)YY9sV z4K?nI)aF?K z>4#J>`(?7qas4tR&OJjv3139df$fFUx{bB1U#VWbWm%^YB6JOB;g0Ycm8-|}r9~aG zJs-pH7NK^DSv4T8+%Hz&toO#$8@_jS)Om2ZUj^4>e^t2?20@Y1=ff^N#$^1pzwej zYA8)#nG{w>i_tmi^hFsxH7CY>ZMvA$}Np>G+Z&UAhJ1{ z(5-81ib>eeOd-F@%yLlm`zb=mqGz)nD?H$;`PvUGj|Gbq+jjvkYi|Z1Cwdr1%@6kI{fvwR6 zd}oNb6U6ptr0J=Yo0C>f$XSoA1zj5=-u`P$Kc4bU>Oct3qcI9Sz54Bj4~y( zbEY6)%}%zUSczFg%2Z>USIMqDqjB0LQMtPBj2hf~og8+IOE@f_j9-lL1R8gDALpNi z!!G5{2~z|rqp5+$4CH&{qQ;wAu&EZB^66}r8p+DpS~bj>E7-4 zY*x$L`)9v>$nNirRqo#I)S9;PyQ>XELWQsiw~8M&mov~l!?J`SaR8?J-#JMMlhO1n zXX@+)%|QqfWiH74>Nfl!)Q}-&|7WR?*kk52C+_xcqkIrxM<+> zuZUY*TqKUVMiPs1z%HpN@ikP#c{CX-40)_+`q(D9UqR!BBZ?&2mmqt+aRFZfHr410 z$7eJIJ}0QbN5_G(9IE0PG`1lTAOHLN<96Y-YuEC5FzpBw51L8C_jB0C^ZuDek~PD_ zJoz@Yz<0GFy5!|@o%wgJ0HS_2p$l!KcXzO`7yz+#^XGV4V>8f24=14OvrWvLS_N;B z1u{!djz51!-$Sa7`MZHzEo2d<)`nomA#GQEl$NXL7iP#&`WU8-Hz{mk_7&;;`i5nR zvUXPJ<)2kkf-&RwyQY)J#R(eiA4pHDR1FVV(^t5)LYfEIx|KyRBNe5eox99qiQ*ha zCRJxzpKCEOa*jh&o1x04{t|ul3PQ|W`Hp3b4$+!PW!^fq1v~PMm98h`P`E1#gEud5 zigf05>Hbg5xo1uI)?NERec75&{{lUQ@Y^q{x^ZEAd z5VrA7SaW)GMMKgy&Y+jYU#3nTNATcGI%ZS`X|6~>WK6VjeRjUkUaFMIGbuz;q)jff zKJorAuHqr*{LZ|j7)yg?^SAvfuz`eFDeY$%ma}H&RU!)(H(BsCm!G(b&896V#p+lY0mwQN(vY{h zysMO5k{oWKC7Y{b8~6!wn&uN~Hx)z0-0-C&wYS~~)P z0GmVA?hX?3!ylA=@NpEh@Fa>qI zzdw3wYB4pVni0q}!lDMIG*Mx9Nc_lmq72{!P0B*SFjFBy&kKWk4a|ID05hfgqU0QE z^o0*uh=av=Q)K!y{z}b{lMUB`Wm=&rl+xO*zQ5oet3*dpFIdC1V(TRTlW<~X|MI6m zGs*FmpR5ULJJ*IR!Vis}sT}JuOlkUiutI+vYg}H+Ai)yC`CS`Rslsxua2I~Pdd#Wl zRJ6`jx#Y`7>|y=eJm#l0nfNCCSy9!9z64E^UjJwr{UN^+if#@DNk)Y^mf$%|2Wrf* z*&x9zICSSwc{zuNDB#EaeeG60moO%z!~|`OUYdzcJra83H(`UcK_e%2*x11U_}uny z$@TOh={ntpuU_Z#lPG8Nm6S-Vk{pn}jhL{n#FOt0|M)Qhuvi(at8okS>wTg{NDcew z#QHik^3Nxz5uIP>CfBJ+3SP#jeEh55sIcg%ll;wE!ZL8E;?nmn;o#=&+r*d^$Zq1- zmIAA@?u6rr>rNaEs4NI5@sop5IH^Pofe2GZAuAD33GNTJ{6h+LYMRbBJ3*8s#f{`F z&mY#4DCo92DG=%+QWzwZ)M9&8vHqj|o5MaLhp8M#&KH;0UnGB7{_;B)BmGIHSw<`B zx7qJckJUc7k-Pk8{`mXnvUyf^|8<*unJT{Amh!Fh{Q@je%j9?1j$dN=_&nCwgL^um zj=Pfl2m(g1HU!6CtrQ@Oc637Q%wP@1H2Cpx1lZZH`OTS@z1IE2srd3r`pMmbL zQqs)FtEUpjxlcBazrIm@bDSXivgi4*&k7j*FgAt+5KhXzvcj2=KXUD7sNeM@cc&h5 zoh(I8KY^)o_YYm<6{ zCsM-!q&RvG>QYk>m&_*VXrkRZ&XzO-0A;XKU+8UY&b7vkBx*@TCsv-7k!`A1mV6|i z4J$)QnOIfg^8&!E-M3lW`-Mb6saB|j#Q1lqfc?Bu8QrYU-EWoblXD219E&FdFJ}UD zukO#_Yf&ygv?yA=7(uaeK;<;RW6sNDwkN$JhJ)4_Xnzs`ybpwrH=y3^z(>a7<`7Nf zg?M*xe7Yg3&Rvj2l*BS!tGhc;Nl1@e-HKG;oAKDi`i~59_(lf4aEBqZZq{51w)ikJ z3&8FzBL~x*+dv%G38_5Rg~Np$(j9d%i*eOf&LMI^3}G>b+!S>9nQSx6DrdC#Dx3!R zRAL#XkuV`wVe^7<2tj+PgHM*Z^&lwbDiS=cZutmLIpH`~1*O5hDDNzvNDj^^e7?(o zWGqJ=-t=8elSErNd;-Y{aK$9@V!r4JYB1>Q{@tTGwwY&ds)Qi{T6j=`x)b;Ys6RnF zRYhKOv~Fad8A}0YRZ{*ut^PZ;MxEQepEIzXzLe#QfrCP9$;1 ztf!trSyB-WGrnzm%_KTTPl1CU2@u(JOZ#jS^8k71*Mv_U)Zskb`~w%`(=0=#1)d|K#0TF2^(@6?<0)!+td&+We%CSWL?3mO2q2xj{_B-0 zUgLnZx4CK1pIC~7j4EIx=2AK@)^9ZxNKVokqg|dNCAU$PgPd>}6IMl9Bl{~?`?^hh z4%qb4VLmi0@~r5Ng9+Gssgu>RX=$7asX}gZ@KLhl+jfkFL-x1wj?w<9_BtOq;Z@v^ z$v+Z5Wb<*XZW0ojw`C}k`e?^+kGU31scH-8KTRSWDHcIvN8*Liw(4Tci-?HFR;@vy zXykBZIPFThXyMJOdc=gKO~IY;8 zl@Rc+l4=*?W@v{j8J=ZYY;!|fZ zIGlR<6q~@nLqNCjBw-_q^~+r*QMjFj(6lf(olDs-3xg3CucAuOJ)t*;Ke=IhPNAz6 zI(Ip%a#S34IrV2NignNqMcHaC+Hes>q$40}K+K$H4g2O@3jk>^VjTi%ViNpKRsi6qVW*A z06-AX_k1|fJZUDqA=)y={qCEImi!4%N(ZIiz3e4Pg`smtu9YKYh2Z@RcjS+oG8u_q z7sGhoQG0l_{3b2($g8S6exLVmr^Twj#V>?%)hnvqe_H-JP? z>YwG~$JRe$ruV(TGRcX2?y>dSk;^wKf6o?>>>#U^E|sfAbO z2?;p~o1dy}Y2r9^69hw~ola5SwP{q#P^usI1PBrvuJaUND-F;YBxQ+@rs+`d_Qd3$7j>f?ak(SqG-oQ^EB4l-RYpbtaZ~tKA zd4)IF6d_xplitl`jRt`g6$C9L8ot)w8C?rHvTMWA$d2XB>oP2rE*F>9j;aA8iMS9_ zI(Rmt0sA7D5S%JJdYN5)sbB5IuAPizv_2m;_IO0loKvxCz5fhcu*^wa*>$`#pi=7a z>>%wWyVPXeRzD%qI8KI=ssxK1Jr6HIUli!rMem;KJzArP*X>o6=M<u-UgH4`1Mdx3sjeQCzBGUVK#dSMyB&A>N>pB~dSGJ1V?a)} zGwbH_*G!dfV++J!l5#x1+Pnz!0K-tqaYAkFQs_J7Q5vZ#>v;=ETb0*Z`U1NleF!s% zqvg%T6OJ**G&S0->CO38jxoc@HQ#V|Vhqa-;9zt;87uEIDgEQr%ItFzJP44vNs6m@ z6pxH>uL6-{A%lCo&!e0d2c(UGicyjsmZ)^d$o4sc)~&aAXJa~%5R-806xlOZ3!At#6Ee3Xyc(V53$t?(VRgUS@7Go|X`;{lx&r&Bf>qRxQJHJW z6rAQ_+zFvm976QMw>y-S0|h@%Ory&H)9R?)B(L6VcaID4v@nXHF66ltzYg1!Y@dVa-g+cC0rQySwK0{b8SO}ujdz8T z`4z6SqeLEgOy}R$KMA^qv^M|AJ+cs#M;wZFzTu~M{9DjRr)@bjF|*)|5x}KFy<3Lg zq{^?I(U!sJj)xet@$HCL@aWf?eqF=s_^SLFx2_U6Nf5~&c4+#8MIJ*g3vW{?^I5@) z(!-Ea{Z*L=+-bkxlh!VE5}WazpOeGjJUC8qH84{wUyD7lUZO$bEI!1xula%~K$Qyg z;immXY?tvq1#8R`YQrClgcY3RCSzv$$!5HG)#{P!mM>tAHI6ag7szxkn{9dODz5uv z$JY{dUG&=8pENu(AAd71$VluZ z=H*E%6CILvqv)5Ia#svgt=jU%<-M!3Tz;43W%9J9y@yZ0PmhJwF|e`WXhoiAaAyA< zyL#VWHUP6RfQhN^y~B1jb?m4<6MBu1DJY19EXQ{@k4J!q1YFHZ5(OyvU;c_hKvebQ z2{jfS*hB1Xm})8d_|&@M(OBbUC(R|TfU+g+*)%44S5@%_u4>OU@vr@2?aB&E9Rb9f zj0LWeML%BEoxt$FB$=OXE%mh@xYUJ8e|vlXms%MHNeX=O>VvrMgqP1_sJMFckClhH zUjU#h{e3F@S1%&P6PpGfkD$`7tQ6_1M#7KIsLgu^zo1USg2UGV!tderjDB0xj;WaB zeo!J#$RyLjGZ;RYPR^8>nDQg2gu3VmCAuA-o*Ov=r=ecb>4cKeneInTjl@k< zc5Nv`-lDCZu+U+W1#Im#34YN>nUT3mEmBEo3cEs#1Mgxv0A~O;?sdO}|7Viakym;WEl3R&&Kiy!M#tt(eHE0W z!hy!-Gq!#<9gMUu*l+R4zGxkE;I>(cu5PHwg_kWvx_}>zl&&;R*BQ~W$im?m-QsCK z4k0xI6Owu3S>S_5s5(V6I`(luQr5scC^8zsy{AM)Stb_xA?({I^~{;ZKi8ZLtQtS6I4b7=q~#Ny2*@@E7*9R$gZc~rkD1N# zK4ZWp;c{7?*#(%oxLIv90tmEu&m#oTfWLd(kmsAOY}LV@L_mGWHvG`X)43a?yc!P@ zHde9a#L0P=m&GCOz^)P(6IHoz%Dd6mC=5$-xTWM9X5jk_Ze?ikQ4ItQ4||G^(&x zio%f`$;BKG?l*PqRJ7%Hy`2}Mlr9&pC>Cw*s`|^pJSWp; zd5~7$w@t!F3AbOG-@k7+rYQ)NvH7z-JW3=M_U-BEu&I5zp;z?&UFA zV_PKtjX=C*Vf*DJM=V6XLtuGKax0zv;h>@SmZ_nXMa5S{S?Le!z~#{j4gA& zWXWp?l9ZZV{>Y0IVxRB-sNZ6xdx!Dyn8uXqyP{qqk;5d+A% z_1C|-FaY9J3#HF10nkVzr*i}}^0xkq@GUhz^Q~iZw$a%a{}|6#x|NCvd3K=&mq)qn zFH5>TBb?GZkEAqpG-_2>64i1?re$$>)}m&V79s43A|&@W&mBq3t#t%hp$rye8s~2J z-|p|^ZcB@4IhJ*(qg;43*RxO-z+&K6cWO39&v}rbU`_2qH(5Sz85C2La)D}YOubTo=(8@jj2GvGBKdA&)y;IH4tX1Wzt1X zO59vtrL30V6u`e&bQzmKFPKc1XVd6B=EUik{7K2GoU3VjMI~Lxo{|CXKU3a$Ud5kR z>qJo!PmEc*JyRQZpban)G8mo#|Ar~qCnc(=63~ea0YzFWS$9^&e}fXSk@{HU&Y45P zj`-O@BkDvb9M)+3qEsFSf#3`+3(Lcpv0cB!#n~sBDoZCOD3hy`Z~IQxY3(m~XlDjm zcEZ~*Nn?8XH)3HwzkD>yvg!1OgP8EkD?M>-h$Lp@bYb zA=WTdu>m-^=0Ud6r%tY84Pe1QRz?*j zZ^TcoE&A~A#okn6j(7B(9X33D;^1=dzn_6~UN5mG-JW!&5HViO_L02cQa^$(mT!$@ zoW(6X%EDJmAsEw<+iTV}lsf3pSV$tJUCitgpKR3S+Vn>>koHq!&+JxYJ_rhUCe zurV~p_wvqkXGOs#1|cYPY#1hB=uAH#3TqYV-gHK9kDp`ya&QW6|HKE@nEb3Sp~vPV zNiPNX0f6ik!O>7GQASn}F%a34NP|A#+O)xPWPJ1=e6&2w7LQz z@RLf83QABE#GIuZOGx%$UMNZf#KgY?oXBo4v!{4RQlGHf$f^n|=ko3c=5y7&NG}kp zEp`NlGQnaLVL{~9C>?x_-9FtpD0E~tkFbaV>08nJ?A2cpo{C?^gEBQTv=ns+H}Mj! z7yF6{UJO-ta~pRV8+C_N#JI~gY=8k6){Hg@c~OhJj?C;LLRbBXIh0Bk(HEg zmX$T-bYv5C!}24C)Gql=>-G8OOcQ4P_(R>EuKt^YYn!FaC9=v<*4bP>^R{77)dz77UT>Ex<&`dU>hF)T@8$ zA^*sdGM30zu&R8u9AGTz8r{74=h8I7_AC9nCIoW;KbrhKbtIUQ4r_NhS7{xP__lgv zfa_ai8;)3vvwuc5OQYO}=E4@Gx-C@ULx}#ku)QiiCP2SFY@r}O$!}hLuxjqLjzkY@ ziv%hGUSL>6xvlXna$pcezyDZpNAy1FPn%A=#33&}QT`s?%ah0$4OY>vcP`!iDn_98 z13~1@x&COfvNjFxF@&lRd1gWur4t^QI+C%QE~h0YJ!}IFW-U%-MJcdy85POJPj!A0 zVkDo`rEc#GT)NabDXhkSlgs)l0ymYVBVY$OOEY2+AL3;7=b$-n6Ebagt~43e1F2*= z2`jdNw&=2xpHemG+dpRqkXovzS35uz&|_0h+odXHr%13;ZAkPh?=u0OKY@)aLEZKe zPIU&9n%J1R&Kc6AAHO-olO1G9lj*3-Z93&*aM2^Y9zB%{1DY5Dad-pooxP(njW&9N zOa&kY08mT^kpe2w8(1mTyrr?RjxB68T16{d6N&tZTwFDJ-uB~9+jMkR@34Xy`6mK3Y& zG-+{vRZmd6PkDtN<*Lud*iF3zW%e2BaSCVP!sedw%aE*)#Eit&eb2*4?J zF}fkCdQ}oOQLp#}5!WrON@=MTAUsJ^Y*EbBGyQA!K7Mb`_;g8qk5ypC`%)}pOjm4% zH{no@d)uH@xP)`aT79=`1Ov>@L}LkBFpHdEiA^L4t#{jwIc*eyzamlNJmZ`N{36K{ zYU3?h?KFmmit%%Yd;@16q?E^8v4P&T zBlsw4JBFa>=$6slV%N$x742q5Cg=07W`d6jQk6gD1k7Hf^KQPGT#xVM7OJN!&!$Wg z?5k2V%OInwC09e3!|toc%0;KP*GMoIH0w{|5$ zx2`OPQ)x;@ZUwKWq^NS!Qd&DMk!j@WT#&LNftW_@yZZ#uICsmIb_P0;l^c^RBvuf6vmY;5jkb#u&7Sh=f;SsQV3_#Uq)8RdyJ8GOgw)si21)YcXMWQsjupir!-qGU9`{8 zUDnI@8ocHykrZh3T57aO-XASgAoi^%Hg@586u&dn$w_P!(f7pTemg(EP-C;4mIKGh zh-YC)PHB1v-N5z5Z)WF{Lv7-4+3>t67aD82HH|!K$ojJTE?|v03x7yVT_e6@jk(G* zJ}EeMBt|)zY3_G=-H&?G^m%WPDhpirlizcQK#jo8Hs(?U_zUtt{Lv3ccPgC^jbhLXgp` zyf~4O91!*y@0JY(4V*xOVrd!LaBe^ z6Dk)7A}=?qFzmdOy4%ogZI%_T`ZU=f1!0Ew$>zvK_cXw}mBU4U&4sjt6$5Anx874R z{Fwhh9gIpQ8V;I<9-c?*M~r3PrWgA2rOUS|q{* zX@R`UX|$folgv99s!+2(hTS@9WDQ`FAfbp z5ggqm0aat?^!7>bKxuIyBC(V&s} zNA+peX?4BT{S%TMp05#vCYmd>3^47>zbwN{Q`2&GV`P&$4kf~$mjn~57WnO4;#kP{ zb=?MA(5waA>8S*~+>LUw2e@)N0gVz1n54|2JHg*dq)?OIlroIV?5iIUcQ07;+SkhP z*EslJy1%_Y(A;euOmv#)AyN&#zn=*-wwV&2Kl}G9{Qn-lJBPSHnFn*S|Ns20^Q}DE z;Rgwa%*Z#Wa`+$_K$Ac;5hc-EV((+&VPR!GrSbVnd@;hzSHExO!^uaJXnYo+a~4i0jnFH%z`)_F*f7P2-!k zw>mx2#tKb?t9xBl+3Ybp1=*DR)67~%13m*?qHSkiS*cfS%-o}tf)v5W9z7xFlHuEIeXH!ahyrC zB0}phgr?Q5y|EdnxO0LEdF(}&fUr{JH81W!8D5+9db%e#Dv9>sN%Sr~+gmY%D8J89 zNK`-2f}H)-Yg5WtUKS0?TG`uV{%n>W{rq?8-}+CY{+pC@I8SMBq=K{?NGGf`KWsj@ zeQAj#@cQr$1FgQ7HFwR-Tzgg}l z+bOk0Sp$ZLn;QU~Js&`)E=X$zBL&FhkUf>sLuuDHdP}4V3KmB*HDZJTa%oqM;nv-)kGm{M>de?AYje+uQMr zMh2R{lqImBqM1FaUf+;X&`H@<=Z8qd{ zkU(N-0~--_-}fLlTL}?^J!Cnv*lO8I=hc}w<;S}T84b_-lO^Y6gRUAQo|>-`!^dnA za}gvSGNxav>s>uh&4lOb>wIZxQagV8nto7{DOp8?q>`mscKm-=3r4~W`<_g(nVg21aPE+sy`9AWxHBo21h{)f#Kuc9ERtM74yUz&C%Y{DS zvZAoSr|`KqJ*Lz?#w*oJZUsYu9B+v8xXmA;Q0*hqO!KlSK1 zKb9CS_<1v)SPz1sig}s>9*Lz@B3e$R>4MP33{H@=M0uh7PP3UdO$Q`R7(TJbeRFs#w%=1beMxQ>Y z->MegQH5DEeB{rA-ArQeqzAF&|L0_nwm|)IvHtJh$HTgdai0?OjQ!TK|5yJ+feh6Q zebv=2O{?69rI|goCz$n<+xS!xE4g~Fh<=rggXU+Gk)l{ImoGTT?5Kpq|6r{z0q4(L zc(jHZY`WYg<5kta^ohS;3a%VqFqXBMFN%~2sjURQ4Md>eUM(Z=T z`R>meP!@YN@#k?e60g!b1UA;9qx#xh+2d4Fk%AItST&3( zfO2~?!sXPZHGFb@uvpnpO6;5en#$Z{ygEwFU9x^!(r1>L1im4R9^l_%eyY(|kr864 zpHV%v9L_>3Q9EK_T=cgtfL1?r{=eF)67t{Vh*?HCxo73_B9x)e0pH2lU zc1Cdg$CCr`dLzW1u^`cQC&G_C@)LtFdY?TFFKIOSE6*~IDYiWPO2!NUKn@sAip>_Gl)mhrq0 zPqmmJO)Fh17u6cbMJ2jFB*dJR^wso8t)Jy1?Vy+VpW-k~Jk8Fnca%skE zUS?eyhMf>zx9fMnFBbk#ROGnWdqBl+>oVSONj5gU+W(Ya_#VPyG!R z-Q+91UBF%K+>sbo0|K8YNjGj0(ac);B30yTim$E>2*dB?a*t(Xw#n=K)vj~0_$XK= zIB(c-)(_ZdRGT0x$Esq9ZXQU+R~ni={a@6V8ahx;Jmnfjp5a&?dFq?NLf?=-dM#HI zzfqgK(#o_@U3wYX`8-gb9EdF&3jiV+@Uh66TCxtEo)&z@1~&0;UpW#Et;}qISYvLI znWGUgxx^^dcGD=uNR+D=$E~6GbQl-uUx&X{!!I|)efVbP+KetuCSEHrEK76pqoeC8 z0YK<=PZ}LgPzsp0egMg2%5&@9Vn~l#$8 ztsGs=l3E=il%~N_qz!zVqQVa#z>3T6KiM9LdAHsES=MDqYU;l=Cc9si_~ z45MVY|MK!?y?+NEw_{z1Uy%a_5JB2DMIFc-&1*Rsyv~i|ODXbdv?RCiF||)2{Gc;!c#iQiRNXY)Ez2L`14NbX`#e zv!w#0jQOv+fAJq3H*J5;%kE9V1O>D_kjS0G@b0`}GZE z(ruMo@_oYS-905B=3mj~6^T+St}a*vbixTco^84`>c`ukWBsWtNJE~19bHx>P^iAVViPX78QF}>7XHp9sT#6TULOfyt%?&7#@s9%#CLiZKZ)OqMi3}0p zK*@mU!{Ct{kbeehLg~5iM&*hi%B3D6B;IS`YXR$rktnL{U5^kv*e`KjYwql4$z53&<(6LG7l=&Th%L=W#2MP( z`RJgMD4CW7v$ZE@s|1T`Y#rW|J!bFfbq?9%dc+Aoj4#8Fx%Q6VXKaGj`gL-;&XQ%LTq zKZx}d2l-I#Tg$|y@w+mh(Y5WuWebko_GOM!3LDllV0y+X)l)_lGC3vBF{p^{guYp= zXa@O~a)v;0VZOiuCa^32;P z9;DG%C{ltYB_VNa_5S`m>b9TY_x-cNSZe1Z{!X4dvE%9Azg3jTiI2t)MA+16)upqH z{sg%gsS!V;&V}{2_hKG}L<=w`l&kf`- z%Q6HNdm9!z&@C65dAi5imIon=0WrS*Il4ovN#Bc#m<`n{m57CtUN@sl>v5jo!B7wU zpiTfFS-n-a5M}MKMAz58ti+@?8YWGZ^Fv&9r(NCDrStWQ5ZMZAF~&0ILUofT0t{Re z?m5xZuA-%{^V3190V=r3&nzxFCpmT3@DpREaw7P*KDG_2SGm=m^X+YAyj|>;zjOfD zGsXhE9_)U~yrY*`6@>WZ(6W2lP*tZSpwx?k3!5|CIiELuNq+ox);5DNT-f!yLQbC3 z*W%ngrWL~0?h?;M3>_xo2Ny13$|Yz{IasljARTXzGY+V8n2}5qKf%tj^e7`h+x80g zSq7!gl2DuhTpqIjW5MVn%SpNG4{mr(}wY(u$5 zRg7Se{ob`#ve}@{gr0pS#$VyLOv%r{)4Nbw#lqepQ-4n;Fyrn`s0+~V+q2W zP~vT@pICTbqGTf@BcU(y!WotX$BJI;3#d}-83J*l6RTz^sUPe1P54fgR>F0oNwdv+ zs8``H7R(J&GG|81u577Ll?he0G>PIw*C#nH_3*JghFPq?rdi2%u;ynP!o}fz@S2Fu zB|ZGr^yHMp+i_JzN|z0N?~2~uos`+uJ_C_nrJ&{gUr(7{yJYL{V$3KXWBQ z!0<2roJ4_6)s}{XY<(Q-Tt7$+=TJa|42WzF23x8WZ{u@%JPznz0hSc*S2tAlGX0^w0ufBO_`sUOPJcY7!#*5F_nXmehl%i z$}ypdQ7g(A5{h5R@Z1?TiKd3a-xk;h^t`6X;hZ^^m$qlFYoo43{BJq;F10?4+b;h1nFr#C4*@VEyY?rK!6!3T z4-pP29VW_M-P?I1n9$hrfBc+Af(|s6&G{XKd~3tL*v4cUit-|oc9O;u${QrB$ZOO| zphFxRf_!*+LHy^X2jp?;o9;pofx6{0P*n$lv9uU-VZEwg&h@`5M;rr3k>Z7+ zS&aN~V#Zp(sqFjJzEz5M(BGXAG!SiAAoc_s-r8S^1yi_#s?Uk@|= zEFsZyKD)41x8eyaIVcZ(B*zFZ#zc0L0PxXjI&mAX>Iv{}+` zzFjT6Z+M2lG}LC>`1Q^!>`eom2M^^g(soRJ#%_o;e02ontrw$=wZ;RO&dBL?!jA?L zn>W*ZvO5p;V&Osq0Z8Mh>DcD!<%znQR6~m6NrF-m1iPgw@ni1x>J-v6Gu4zWI4c}z zQ}XcA^Tzwa<|o?n)~|naqu;p#vXFIAGmI_)A@BrqbywGD!K@iO*$n1)I7#Wk94C(K zuUKE5WTbn2j84q9WCwoB5A&kJ2B*Tnz)^NwjG5DEm1)XhM>xByEMv`H<~E!k0jG;A zSyI2sB=^q{3p8wFACO>?_{Yx~AqFFSF;Yisz%6$Dk87ld{x!FemaHgF6DxO1HbINk ztw^R+)!6a+*}x(P>4WbOrf(!r^;s&-0l3zg?9W^C-p{9%a9vvteDQv>2ithcmB(T- z3BlEX6KOV*T5}B`dXIRGmh1eMhW*-oaHe5b@TQ6kBZ=oRJq-q4$kTRIaTl zo3-y&iMgacE%}<6gK-XI&K|WJ{~5gdeaCj6C?bA(QnJYI?I;WM>%a^IV5ZK01Tha->zGT8=!m_+}Os@aI;nd73Ar4L}s>Or zXkx#QVsPw-Qyd~)!GTA~Wh#&?PutVSHew@J(nhn0o5%b&U^iV^~} z)X)qe(^_qp6-<0IG;E|(i6MhpCAX2i0VLKTE{-MrqfMPu$&`vAIGpvy$zj8EPhTw- zs0OJ)07)CzbE2*u)WSJUzu)}h=Nc2*qh^S%qs@$TF{^Qn&DX0HHrH&S8vg<1s;t7T zjdV_`=(NIk+dGoCI7}`n8CE_{wiNf_=AAhIWQJzjIkkUJWmckSKQ*I4J50UVlWcha z&lMXH?4dF6QJG_HeFCMd1VG3CN!u7;6G1E*o$cD)=$i_Zk4>z#Nf*!qtAohA2t31P zIhb{YMr5w=Xce>!V@(Qmpnncoh9DBjj_&3p@;+U<$NNU2%q{JC>hFyt>UEg5{wuD5 zO=KhDUfOwx&QB-CS1&FY@zR|bw(QbTwGZ)v+D(<~e{(*Un;FuKA;Alb5+{lte%iSn z&<*y#t%)?+YtuUJm*%Vfs4+BodG=;hVW7X5B@VfuV*l3B@2tgUzSUEJt2?`HXA z;?`~M-tm>Di@YSzS*^q#2*v~Ns{;fiM50KMV~DBde%lBVWF#gWX#(hTw8sG>D$!yv z0F>SKt#$F3m+@)p8IH~DJwnbJco;mivDU1P7TVJ_w{m|bx3k7hElj9}JhMMF;95NP zy0UG4UB+xci?Mr)_|D|6IsH8%ldzbZG+K`5Kd%0D3s*m3x3?Alc>#Mg$g&rpL#Har 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஻}Cr$t>#vi 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

    36>@3FtUTv$-V|?Q;*FJ}(|% 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 $9^DXJ}8D-#M_q4{>qIp)gZY9Mz#=q)I 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

    f)(A3QELl6Y^ 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

    Y^GMrEt; zZ>+iwe!Fkb9jtyDu~{D_3p88RdSCAj@-X2JFL37wTU<_<9(Uc#K#rj`HSeSKEh7t9 zj6#zA%DRl-J{o6_Lyv|AB6j%?KZy6Q6II=KKUtt7M)Eg=f1RD0vs&LS0GX_*aZs=f z0Ltk3nIH)2$C-5U4bPr)@4|k_NlI#xq8!31+t5FiW1|&*eP#pONlEH=iM#M*?C$RW&_oPuhJ3(cmU5O~oiuNXc%d0BY{#@t=u zsgM9F$%bjjdmozu1;KX#Wn^g7G0gY8zXP0kN2jlY>nsZ!McXuNvoeKw_aNXi&-aSz)?Rqi+)v;mVCkgS@te1LCP{tQpndtcNACObz zZGC3Sq3QHjJfq)YcOTeu^rx36*qV>Fdx-dsJ;TSG9cK0>eudLf6C}c*0Ngz?S)_}Q z)C93n^BLva*(=KqB1Lw?ffPcZS2yAKJ$}w#l%-{W#kH$n}yLOFGmKJX%I}7B_-sI`}MV! zqzdUp1W5?rUSz0n@M7)%$)61M*QPI!(oLP+e|xY;fHampJ;9ptK7oF^KG6|He>p`N zW@!RjtIi`S!bc+b5wGc$R77b+{YI~|vzw6y96ha7Ga2B>zm3F7#nBKITTvCG14ctZ zS&B>XCI%WO$C=49N!ERO)igVLL9B&!7fqK<&?F}?{iIQ3z_r-w8|rs|PxPE_{G(Zx zy5kKuDObJP!^cqxmVu}7IS8H#yp(Fy{^Orym1R{2g7&Xdj_C}zUx>wc#5JVBg zh3EP*l%7_@2~Mfs72`57RpnGND1k~`YgGWAdwS=c|lhUtJg3!h{jI#>OVmNkT; zebmLYde1|qv%GQn0R&0e=(?aKA|fbz{qs4}MR`;$zeR#Rb9REV(ms4l&WJ{O+$in{ zMzBTEZmWAVnu9}ouO*#ZzeNJ@;Yw0I;U4v!TIDY<)hEv;%p=dC*Yx!VCS?JjOv=~@ zIj0?hNTBHEapRz#?L7e9-3K9tjBcU(I=}kT+nPFlO)OFT<*asTGw54hJS6v*@}3HK~38>S}u~otvoKZS2;~1 zb<(%!To_`gCwuO9LBxjuiV44#kMb?2FO|Yss)YpQI3{)@hGUGH zDtx_|jwGdAkKCVy(1?bn*>Kt+$3#*g&Kt`+#B7}@N76?~0-RnIr!>-j8@c&DFQAu0 ztwOr)&gG+#ADHRDUvZ`Dy4W>~jx-4!tn5uwAe_qjhGlhskFqmT_Ik{z;QBWGViV`YllG>WG^uQF$o|XBImOgA?~g6SsmgR$j`;W z)L?>?eHHRFc>m|IM%Ce@Z?p1xYbRUt0UmErofmVj6`kg4*oyS=FCOYO2aH znjlp?pe6*2{Jq@{4Um+P>G_>&bJ%-W(r5$yx48Nwi!Db*BmOTo@!`m}T6Rght>knW zYZ2;(K!KwGmUlSSlq{VSyc}*VRMYn`d6>2QI^Gk>LzBO0pr_=|QZXm_t&G)sBL1v$ z_Q0{4p4!G-dg_^4jp<4V%EP^0Z4f2#RfswpTj$gXIo5jRqi&jm<(m2!h1Y=2Q#=OC zO*PGuzb6P3?||f*J~9!di`9&Akb9Q2yh3OKq+_K+Ma^!(?lCNDd(Ki9NKd`vwDd&> z3xb_Uu^BgaP~^~@shBwA|HDsEEUL2FqC!Eiyd^sp+?L54;z%b$vH`_ZO}!9lwE;v7 zPyCep=2U+hb>0boT8^Uo_qQrjz8y6IX$i?R9?%8_ET*F9IBC9N#Y6(o^Ope<9B;mo zivgw~mrbK9@r11-Vtf3#z`Y{rMI@0B%?hCgYwA6Q3&!&}Y2B>g8u|GyfdfrS46~`^ zY)$Ia#4MKGgvzyt3S3(4s?cR;u6BkRiSsN$$(`xY+7%qPyPbn7wY=D|ZsJ+Xg5oZV zO3@qtUM>o!Lw_d2M)%MN1smhRluy4QV~=K_q$x7;hQ|t`v{s%fdRYK1hJFm$5<}kK zSAFrgSB@LSVs9(iF;K8Yzh56(VTl{(sVRPc{z=C6Iocac&XaW+Px>g9de-WRn-QFy z#;l$%M6wCjHMA^+>(4eIrvV%k5v!G17&M3qOf=0d2g3f@+!D;AQE76~;UHlG6cCD1 zFh(RJ>ns^C)d)A03~5#zL!%ce6wEJ2{(>0|Fzn}9Y&OD}O&ZEe`e;MXNbhbth03TPk6c|;n3c%6 zq(D}!W-v9d%I)fMOU(NFiFXGHObl?qqcB5z=3Dc%{cM+jV%rf|M=9|&!chE+eTgkl zf~C<N@?if1!PbuWt%a}-4Y9JdvNgWLPln$|1Rb#}kcKW5~n>_n)(k`YhDDMrw& zl(#(*nRs+3OPFIMH3olV_CNf@LNTK)wC96l0sSfJ3$r!=NSBsQe=QXA4f|zKJ`}0E zU`3e^k>wvY1TfKZ^IM8TJ84a5~%$rK7wc0R zd1%<>Y4F-WDul&r$IDcIN53#3dB9rIsrene_YVcl1RIZ1;$3rccbyFU`T6f)s${0b z)_=pDk*nmyLS`5KhG;C8@5@++r|yaZM2L5`e$6FY-^2t6ob(f#DKctY)twSDQbL)U zZSM<5PPzkwO(QHnyccdb^sh285H~Pv>|^-TI)mF{_y%_+EN_Q&Tjeb;tTXv18Y))j z5brJO1+hI%iYBI?6*d+?PgA`}Pef5rl<0xsAWbqaGx@Qo7U51K{jivOI*|6gLo{hqMck{#PA!CScdG+33|?kP z*(7~Kt+M4bqPFLXj9EbbByKR=14+MFx=zH^e*bbEqW)uEEEeSFfywuBCF5_hJ(aR1hCo5 zLy=KFRFCtu!kJdCVHUtm(>rck@$B>7dZHco_tSOW$hDNSF&pTplkW?S z{HCv7aFqC_NdhnBau|TmmkmlAM|b=p)Q6vDGrul0QF{OWJ#R|BL0t~tBi`H*@DaB8r)@Z zceiBm#ocYu;10pv-5r9vyM*BGE(yWiLVzR?8&f_GghWQBJ8l&x6_x6zc{V!*qPX`$#vHA+%>S4cbocC zr@TK}x^_R|BW|sf7gew>^u3R{Vk9Ijd5oP9nsTl)ltj@aK=qhYmK^|Kxxatrv+7f7 zElc1Ne~CotO7xs=HR;Mb_Yp?yxV7@MA`|+z7g69#4z@hP|{92Y3aJlIdLcn8wr z_-)Cvw||2d!Cb4O1p*+!olD>GOqA9mh!Qj9nt%DN$)e5fd6?31t8V&dn0dOxL^IvY z%C?X9u~nQaQ1y5BkEkf4Bh{LRTJCZKtq5O;StXkEK}4Z~tr^awr(gJKPEQ3c?ye{o z4^@V;ZR3xtt6P&S*~iuJg=wMa3QZ22h0zGb# z8E<_2_4oT4vOlUh4Fdq6THai$F5@9qjY}Tt>*JB@cHIiaqqy!S(@FK2RZ=uPIet9! ztM^y!*~+qU!IjavFC4bk@?Ga);X>lm&E&xjV*l+wbiw%68mkv5mcR5SV{gQUnbaP2 zjVp`OCi7V8#0E*Z;G0$OjCy#i&l{T$Tl43#Gaz{qM{BxKJs;)>P%7tGRp?|l|5fj4 zeTsOn4;f_o-ep2+XmhVh7|l^YvBb(ff?wOHMFW!8O85)~06HBlX@8jfX&azBvk^2) z=EKfnbw=s+F@62@cJxjB%zwdDD*0BAH;yFcU8F8=q<$a%KeB9Ew6hrNNDy5d99Mg$ z^($shq>MVuCq?d3u=!2PVm8}=D~@FW{+3< znFmy*RY_%*rjKaW4VzC=?_x=XWv6Slmumi~;Qso33Z+A~%js#izY$evd>o?QTwTPv zN0#>w#E2KW9{sJl&%wry_s+~OhG(1WlmbUC+8T^-n>Be+`KMrU>TWOH^|A0Q@}modj~Vcz>FYQgp4*G@|@-abZ&wY#a}oBB}k0eZ|k z^C+2dOm0Xh_UST!h4x)(r+xolW&Zf3NOh}bf&@GU%Z#@-?dtuB9s0T{B&Ph{xI!v@ zpRz}pE_UOL?UmslVx70?V5krd^$f2$#mDA}pYC~XZ2%a4q#?oZ-P#+EN6HJKEYr^7 zsDUb*G9NFSQRSzZulkB}efA^xGbb{Uqa`*%url0!L;rOj@mhaOKZWF_i&g(7vVD7X zZId|L?%4Eh8?g*C(jHeo%(CFg(ta%sdb{|mlzC)*hF_w8)iS0z@o6^xhR!GvofmDh zRQBkhoow1~Aqh~Px_NQ2!$?SDRj|GDGy$f~Ev+uiwg4e)IA5^Hx(p2qrY6iJ4##2* zZXlT38HOL2Qik}zt$`Q2f-mVx1rv>y()XgUG^*=DcHa1Y$7Nb2^5=SPJ%y~W*tETj z?Tl0XV-V_Qt6r^&u)qmCNbE2(#hJZ0Z$K&@TT3VS7G)pl8y#=}yKB>i`7h{|e0OKe zFAq)@BAD0WEPe@nO*u5wHhJI=1UE7^yYuaZE zkGWR06F%cX9Q~lLYY>nX6Uu65A#~Z-&^d5OL}|$znSxlku3!V{K$0iQY1?Pyj7*VR zb9k88XO*s_nRc9ibA^abKXX!z#O}IM3>*wqU^S1s1>(A0duV*YKl!1=_@>phQ=68yg)z#f;pvfT!m11VF55 zsf*loO}%Bw;|4#XVQ4i$mW8YLO@_9XI%7txv`(YeHOvZT+()b8$zr zcXo_0QfU^qx-4@?{mxRy9bW7*6JbuUt)Sx;BaBf`T){Nx`4QL4@>fmYtemtJ2Di&D zeWsGGzH<;Gg>r7Z4yipMVfTA`4jKH3wo68-Kn|KGfNFP=Z+HvFGSwO<+ zSjmxgBvpdAmP_2?59gtkz_0hqu9D)MsY#OQ^{2?#92e9BE* zoID5`IM=?|5A@^&A(AdQmkoloz2m9EKU`H?4YAAO*M?MZ=y7JmfX^}59Uf)!?!;xk zgc5XdCcWZBaSClMKONl!G&cL!w`r*G+A=pp-n_kaSB9a2LT^gd%?OnlGHe;2rQ23( zrDSthE;d>jN<9kq2$sr~-ury5mrF#Lw=qL2BK5t==#34;ufbP)bkHU(7nMm(`PPqG zaWZW6DW%LKV9mtIF~F!JohSUg5&rwUU3F|<;hW5$qi`46X-wf*j!m`=aNa9dO%A)x(iFh3Z8_E8aYSlp(vbZ+z6Kq(YkE#zw;{^fY7C_>!+%? zq+)4^AvSD>duFI#FU~0;#saH-ArO9=#P1@%l)~r}`izE;M()Df+%aY>jpKrwF%<@A z=AFj;*hJ-#8#A^n6T3+6QRt8^!B_g~+c#PkB{Dr;x=wA^`1Y37ywD6LK(|*fPs&r| z$8RCXa(UIh!g5ad7gbwZ-=865ZCs%kH(j^D5gv>Uz)Q|%a%f=SjU5zl`!a-jjY5em zXIQsF#s83VjU}{_{285*7n1b;^r{z6^sKW)KYFAmg`~ft<(Jdv_4|iE3#+GFeOfCY zW9--gD6q{QMrJu!*ZV-D0mTbon9D1K+L%BB5^CO{riK90E{_061@CNT!efm7Kt3jo zW<9?~4J>P2r+&0Uwfvq*gtfaO9Wk{16>q+@YgxqX0xy7G2?URzSdXjzoq&#D1Gmg`Zdxb?RI%&=}=V~f@9LHsJeVFFbgOX z)n&8gw@9c!QHZq_=T;V1mX%2s>#Wfol9V4jR3rPv@h9!eo2^ zz1Tev!IW&e+D}Og80fCc5nYRpxOrnLAU`*&1@iMy+@eA5>0ybGeYmFL<|{p3xE%7> zj<%bBuC8bfz28c=pQI!OgWM2dqz`PF-&>D68(Lbw>&e3dctQ4rE-O~3KsZ5=wbr~tA$R14DqSLNuP9{D{)#m!u zN~7~Uss5VIKby03W5NH8Dv`@PSg!_(3+1@L=y_YUQ|G#rPT6g#5-Kp@8b)Q1UP2@h z`Q8G@ymO^0GL>cQJ#XdYyejN+#*#~0@Q(TZj|PIzNewxSsfmIE*g4??peSl~W?;2b z6kH1KPK+_?)pQ|BE&yU{H~?JCkQg~sVIEwIuF^Cph3lw0ETU5KTaeC5<_?p|dS#V= zleHU}|9A+-l6U3hk!Ff*EHBAhXsW=(@@wIn*356S6&D&0u}R?ZC*4wWHKxeo2Cbf) zR@Q0oS1p^gy$vJaJ#Qm<19lHW)L2XC9Oy6Dr6((Li&i6*1N-0BU-1m#Ezte+Z?7qu z72ZZcTm(RVGgVIJLugCwch%iJ_Zfyt?y}VI>-Xtwb;OdUb|X#y*N^%hY1yj1V(%>G zqI$&A1H%tNH?{0F>{el1V8?WaRuoH*zEC{LkPE5uSKZF14-)<~TS@LuO7N9y5(mR# z&Qn3xoWK6*LWhlHhJaYRJ^2L44}#4*HU)|`xfwU}0+%EWHgUX?3qW{&*akxE0aXeE zmgIDllpdqxowA>|mG%@-#v{I31k zDEi#D*8|(at(hr+zS%270;|X4r;&Ggs{JQbPZT1;O{7D_^ z&jm{Z0Wc85WZP;%(Fm>tG^KK)Hobg%l?nR_^|l|vYU4Mw@4pTkM2}h|D@R+;RNwbw^(2gC8f8tZ^|F$$P{j5hgy{Q` zwxb8|l8IPZOV-l}co&hBh97|k1kge%>fMC?jVxbsDoX;U>Ee-Rx0{9c@e|uA(m$DP zOv`l_NMlI7cG;q00~CW7h2$@c03|_uYsw$Y4RQTH9;L=EyE*))zhQYFNq;Rd-spqX9r>WFjDoW900q);ec3RQ+DIA$14&BJ@;Zb#EjL$+d6w}}aT^quz? zVMETF`>Wo%mxr}+(caSui%%!7f6UY%;~B_@^TB{%Y#ul5Tqsal7TWs}Cv>jZr_9jB zI?oYDSX(>z}69nL^LVZdlP2bh2-u%ou({5+fU$;8^@=rca%Dk?r z7;KsIRcEyG{DhJD`>)}EC3=u5<<2!BZx9DBP~chF+F9v_*D2ufB+2*79L@wu4{Q z62bK9QU8!ta3UCEdDjdxad zw&`_zmsND8GJOdukgF^ta<|xO;mF}v81ZfhQJN)8s+ekR=OTef!N)uwDGUJqW7q*; zB+Q<&aYg0Fwvo}WIEJ1TcwTK%N_rnPzH<*8Qu5xil)u*z$x)7zYN&e|} zJW#SsHXK8Ky_aS8QWa>dx;Y-8wAt;p^3|N!I~tx#n*hZ95T(|kiS;4NdTY4tm6cBU zPu7lEEHpnH^aI@F>V(kEIrDQI3B=cJO?(?0G;H)X-~YM9JS|Bp)52La;N~ybmbeZb z%UB8<6in-~I!=H1eKi@=2&a{8ItsoOa005)j+pw%g0Gahjh%30h5Cz>jV4=EQVXey zg52!L#FG{m4drI7Jn@&6Z@?VzGM@@`LVcx3SeW$3xyFE|=%kJFlklygfO5d`y=DK5 zpShp!uzSi7%Um|QTz7k80ry#m$=oVh`uDAN`k*sYU)2ucpBaBtlI3{DY%rrsL+)bw zv<*YD)mh^lDBg`h;>ubOA?0>ugcWYuP1q=0aPncOyi~RMrN#lW!vFaXTABnS>TB!Y znC${g6cmLIKmaWgU8_2A))<4DhPI}pA~&^+Vq6oJl4YNZKlrfc=IOQcY!Cm|?|cl0 zU-L|H#CUXMX2*p581bI4UJiv@*#wf(}QL$mWY+V1{`$}M5K6w+PETY zzz_gDN+^puF`jsO7ABs~!XNVVG2HqSlJl~GSGcA&S>}B8T-~z5;(CSQvjhIUhV^%f zXixD!B$ZBs3A30;qp6gr;w&RqX@TtgQopomcoDn@nZX`>9xGV5?_GG}Ea^CkEtYcA z&ZUB!=(HunG4c3V1b(QlvQ#5F>jNDu6yIw(4Af)8;?D~0&Q&=oeU3=R4GE&M=bKsm zhGybBk92Lq&$az_k!=HHoD_^x=otvu{@(P8ou7V>>*RABQrWL--jU0E*=t#A_Njf0 za?Qj0cf)yVNgWI^ZzfH#44QI#x0WBNqVQsmp(GWOJ+Azxc#sS5-+5{XOQxEyAv^Ghe6j^l2`S*zx1wF)6I+V`*- zf%|D2E(9MB*$<0S1K`}!Aj;lVkQ2AW$f79>eQ2JsO2@;};(?PFG3TZO4o^iLepo`s zPNOk|aFry%843{q=&F)!o)J2#x9WhS{q&-xc&V^NToU=uP$U|Ih$t z9TO~rmsx(uFx2;jXzSuu4s)03Mu!t?^F+;0R5Q2JJhHvFYiO(}(Cj?VhbejNMzOmy zz|>6vaJye(6>gFeE|4hLQPd2Wfy#_*G8z@EmmB%T3#BRr?5OLC@&q{l;U_5=kyLwS zna$W-#jfUw%e)XbKvlavDj3eA^x|ui8i0{EfBDq8j`-$Em#{Nl-)-GIqeTqjpjH{j zwqTfFvL(hUo1kPXPr2e2L6R3l5_g7%zg6GN>eg)>FX=T*Pi5k*aIuxy!C$Yb8$Bvo z&gVNV&|3c%Yx{Nmq3HGo+`)AV3ATbdsV4+3CIgkZ|di{fQTa8)tab;Wj99hf{M ztN}tsk)n`u_J$i`dMGkq@VnKtI%Rv(FE8_INan3s>N;#GHd|SUXLQ9Wh-b1^jXE@V z)RfWWZm4O@hm;GP6#!$QYzUHcBq3bVXrqWE<%8>3k6Obd48R#I?`_kfYO_#Xq`XSC z6l}dc6gjpkL=@CG_|O@p< zYDG!Q99oXz-;Y?1y`X>W{bzSnJa05~dN8=cmkdzJ*YmAOcX^0L$P*BzB|$$^5V6U5 zQ80-YP!QRz-w)a)*Eebc!ej8B3S6P%y))vyeP#pA}*- z>L)B!DWz(<%`ki*0#|78Fml8IHMC@U6cZ6lT)a<*1Wry#cD+;CZf^DRxIE~8`_aGR z*~TFe2=aa08Gn1$-%P_-1XLlxJKg|D=&)gbzs(VRECzu;90WgR!67ad<)(hp3{e0>EFaD_mptu^& zGuVRxZ;C#Lvz7qd1Wl`#NB|mp4eMJ|G8`+l;?@`^J-T;~sk$0zs=SbraWUtk;wN*v z$`4F*aB8*sZup^{RisY6F%B3^;Y_}C)odeMieg4B6-GJeC3F?B52(S2VT@q;LbGu6 zO4OXm>CeyvTsvi^rnlBE?;d+}tSM?mV7VDGvAI%BT~k23{N;+dgh}hx5^#ZCSq}@Z$D_2G~u8u~Z^Ei`D7_^DWYf zHJdva`0igXC+oJ-vwkf*(K%lp@rLl9`LLFQ6ha#st(L<*q@$C4R zLl87x6b;nRwdEQ;j^XF5)qiRt#0!kHIM&ffmvJB zA8Ky-T$26_ROsatr>#&K)ijRE!I3zsvG=&g;vPrBNI=E1hhU4fgR-@lyXd5trW^yT z%x8aHt;7vRYwpRv@H%f?euf?tr_jc*i0mi(^)yRBbiA@YS-ZACi~(?Z;4r1o$e*`_ z#q>7VKsO9(q+Kb_^l!vXT-?L7s5TnaNc1Pc6-+Sh35h@_`MQ zoW=7iya#q6#7g^7(sB%D0%{Nk>yMO~wU2J4pM^g>qalML@xNt$4ZR%7cpKu!d0kh2 zcUscfzlID2=rMq-_$8ObrK=*4N$8ZbA+9P0`LjRMTfe4322f&GQtGxrX)_FT@mZZI z-o}hf+c;TSxUo}XscpvzHG4f5dFmQk+TCfb+0eZ;4>9@xJWaIvR@3^5!rNze*)O%4 zhHT2Mw2SuYYJ)hm^s)c6zxD5+!Ojw~Wy~f}61HV>i4pnGoEVl{^ti-nLBC-7d6pKW zx*V;JT;Vpsw-QU4%D03kPM#XoOMp_Zd0N~uHkH+m>y#v2tw|!Y5mH?pDdd2TtS4JT zH1c7)T`M_G^98b!^$uDZ@55%H4_0`CN5dBcH6nV^WR%Lfdq}cKGm@A|;L+uLz`+Gt z#-`WUV}}0>9~9Xlz*w-ytbQoUEb-IO8l?$Iz>uF~TQ;%BE31cL^NyWMySnvF^rYjv zd`5*GMZ>p`1@g#^Ee5;w-~9>R5`~)f(Gh<;B77#yR@LXyQtd3E_xU$3@65vUU;a>9 zG#I`?PRI3_?boMjyGEG)Ayx{vW@Y?0xbGFr&EYwl`UL4S^01ynh9006$wAL*vbN-p z>H0&@`Z-05W<6`-YF0i-Fc}cH%u-z`{oq;(Pi3?Ebg6uWSEOh~am&=6B+V7}QVn?>>f{B&k~u;%>ddi4AU zl28Je;tFUjnjUFbi{mggi?}N8js#H=fRGl9k~UW}2fRJJ^p={TI&!iVzelMb&>VnU z#PTAATK1;U=IX(P146L3Sa@1bJuMr{mMza`3V9w$(_7Xue|(HWJWQ}Tof1+zZJfxl zwpIFSP>Ya(5W}>ziI0wAUVgTXuTIUhb3#J@C36IY%3#jv+sjMAqXM14$kGNqo8XE4 z+n*p&cE=j#HWb$>1}U@;T=4}Nr$4G;bO8XcR^_U}t-Rrz)81~>Vlh`=HS*5O8pRQh z$$Q>oYoNk304Y_@b^5H*-VZS81OLqdWAh4kRKx76*C?+@G2H&)O%x)Got@4SctE$u zyWbjFOmEW5_!c17`( z`@5wv0O7NO+AQq;<$~_(SXl(Hknodu+y(&c=xsYGe*)rpm?PLVcH5QOx?QXHTQ%93 zaz%}qs(vALAAE&;G&rz-QK(5*Ha-(?SSfsaE3SzHhArj??&JHb&I-PuaOuXlF@Qs%%_tHD@Tg6wLSB_*W&?CgZrDH!kP^UvdBUHBI}1CCwB#p`tVsKe z+Q_IQ?t_GBNb+sOkH;P~JvO6h6gr^QXe8KD!-HXHtv5iap@PkGovUJIgS)uM{1|}C zeqjATL1&h4l-`-~dof)Sj%_2FBmrqUmzXQ8rAVXWhg&W;xVzx8h_F1)xD1hvk4~*> z1c*VH=(49q$f2lZ>&h4rBHbPjTs~pfi#+?8b^4V$blto|AX=TJ9zp6eESmv)=KueG z)H6e@_}0+kI@3xz zR{m-oodwA|Z_?IMT9c8(nst}X0r=v*&KVKQdX~umgfz!A;w2uUCBaG&4xVnm=l}47 z6$}dyzdOP5Kc-dov%??&o;ZbbA1r=0O>^o@9RP%|r6h1@(cKjB|mz>(b#{t z57Xv-dnD(Fy??Iq6#k0w>F%iCbIDkz@YF zFX`Y8yTx`nh-(>!kC&xz zbNx@77jO|*sWbq%S?drWyx&4c*rTi&X*BuJw`>YOns8!QqErNdPY$gVb?OoEeABY+ZF?f{0~1= zVF->|TNkJVyLxD3pT(*gaD0Eb$}W0YXTz))N5=u%Fi~QOEUph072UB7{T)7>V?tdiwp{v*W{9;zJ=E(_NWuDcg&QN>O zF*IJpIt^Ejk@ivay&lu}HWKeOlD_(=@~{7!5>ob(Oy#=27S2Vo)`Zgc1;9j|j~U&< zDC*=FF$-lbc#mv8z}KRx+NU=Ww^JgIrd40P6@Eo`I%%#&?3_-@TtaE-VWIF8Qa(=O z3lJMpg2q%&NqR=Fo_4GN7}Hbd1HHmYEJJK2gVE0oTy=74LNXt==B~(CvM_eE2!&Yv zF0{P#T)U21_2fAn6#sshDy7fmeS&)tO)IQ_OPD{Maa)NXkv;;0I(MbK8V#yq64F^(Dk?m4=;vKnKgf!q9!%|m*Zv5HKNnT zPg9Yh&239a_OV{e^4GO+^9Uw^p;{P5YVqLd#Ltbp(+hMJMN7Cr+L((JmV_?EwT?OG zyL3m<_%5MlE1`ClW1R1WzH}QWEJ0X1Y^(2Rt-8OT6{oRmH;2fXOuoG>4F97962O5J zq$L0VK*pSE)=MVg0OZ-c_EqKUSmg&;#9&NGrp-_u3MR2}?D5_MMGI|8j!x^_lDS;XMW7o^yEJZgdRM5S(noW4#XqQWk7(4dQqCVUHJ!tVvRu4PX zR+KS|tIdaw34XmIX1on9evKstVA!8O(602n4~1~cw!%$Vh*^dgfBmSteW@d&c5IgV zEse5L>0pia0(04Dzi@=4vD<%qvtRn>Xw4Tdug^V8)inXJCtau!)#j0Mq%cn_0O?*A zc{H(1%`koM`@>X+ui=u!-*U6ru?F7r3%JpO@@m;K21|IRB-lcK(N9`@$|V0g5|K$orLdC(&BcU0UrVneCa3%3Gmw6r6G(c1* zuP|9|q?CLc4dW&Tu-h8=4k4g`He7>JzR(A}3cz45+b^kJQH=f;sAtrY^^WNcQJnYr z*glu*XkJq!J(s!ism$HMTNG8vQpkqM9~)c*YY-r9fu|=1=qCZ?M}Wt{#D@{!LGa{f zCLIScdWxE#WFU0Zk+DONM61&jW1_3i zNS2<4+0g<|M*4wUQF+2uGc%2X(|JyBYXT*e+!dF)Wmy^mj*Mp&E_HlDK@o;EikC~G zo8uoiPJ9c-gCmaqC2xMtHicN>0Y5^i5p@)~9OzTUUCYs1YdaO_*A~;l%|}0T@##x_ zeN_S3<(anOo6~jiC^tk-mQctg$O;ZU-39`pPPwNT(h<+xrAaAi9{DGU1Q7FBZiR!7 z98XRd4_!2`fHkB{n)T#27?gB)O{WZA7U*lTss*(8PFS=Xa2eb;#(?i_nvUvxoyCO_ zcU}D{U5YDn9O*n9LvVZ{iCDxnawTVpsFz&qZG9G2rRN9f0f9uTsWd{2A$R*YILlm@ zO#|sjNWoxX5r~|Thyas9eb#s|NHZTTH@E~2;9kCEnI}i>(mj zgf19X*D~{b%f^(izdDm+X^{Vi+mBNl!O^Df>pS*IxU!TkI|}m79FIW4$=tU5QeaYAy-o(Nrr;H|H`?1Xad&wTRR%<^LfHjSw&%%&r!nVPDl>I*cZt@C?H z+`qRU{k*1nwA8;>Mp#tWI?#h^Xv)XEqdySP*p$<*C%KuFs=VYINc27zOpXditNP`$@QaJ_ zAVptrVK&$RYR;>S2qc`aS^AK);jo=gY4&^EOfYYnTB#O8xd#)t;g%yod~p(+`KKaHHXxFP^nz@|nZ!0();j*|5N8W^HKt%@6u)D=Fe;)2qq$Jargn@X3uxPC*q*uBaClg`(t5N_tB1Ti!H)FL$GJcS`#hyr7r z8SK=@V9~6l{w0Gg$t3kMRTLn}QTr*XxeILa!TifrKKB=dvociBe9qKgTh1c_{1d?s zJ+?V#+kd$1b(r;D#}ISv>Zk0r~Rb z^eE<`AuZMKYlR_p)w7gZv`b-J8V7ymYwbHSO#t|5DUvz>(9?B5)n=Gp}J>6&?+8b%+lDp<#=+sJCpmzwTXJG_|?HN2Y z5+Da7QKYqL_oyO4_Sv(g_b&)CBP14lwe`yO;oVaN%LYm;ou+cLV<0r}N6jPfWRy4x z)1Of|%Y@&5z=|_69FOog1Qx5~pQmCIq2V#%glJ|juUz1c*ZG?~c#=2F>7Tyw9EL)O zlWy6!g!%D3Jo?#P9G5;?tP6_^Cz{eiW~zvFQ4Uy+D~SS`kQrXiueBYZd5_3ZMV z>V!!z2U=%fi@Jo4QzA&uzyKJKKv58&!_&ym@L`DnO7^5_(o(8W7w>cHS404*TxQN9<BkuOI z!tgIJ%he)J0So_4oIBAajeLq)_(07;uh9=895Uqt8WJUhbhg{Y3OW_bCbx>8??f{&tv=i zD>sY1@HRz(d&<|I8<%c@ls=sE?eFO;T83;G{U?lbvmJH{t@S#kKsx8IWN>1>rf+pg z&Nth5TF?pAmrEm(>(``zbI`@T>3vC>Nx&jE^P>Gdh;M*jg%$~syb+H;k5I(8Ov0_h z?pd@&1f{g$R8DaY3ExF_!h=0^ke4q~d$HVZam2Hc#C&MsxIjEJwXXghJMETiq_Ane zbkmv%s1oG~e|bH z{%>NSeHN~AhX3zB$n*(nE6b|ZTt>2J+v2n;TH6w8n0@@H^2N375z&9woc-QfeR9yE zqexD!FjkHOHt+ugHNJ*sCv9S(jU z!h*(D5D{BUfT7EXfearEkYdYhq^wZ@7DoudGtYX6HBz`|vhv@s#3z7$gK#vX%p(g6 zCKO;{E>}80znPLt04 zi$e#CHv>VVuOC&!FYn>jsZ$BrtMp-`2LO0;rud2)nKJB9&1!Aj14L~qNyCpV7#gIN#s|6O>SXp1uBic~Vdfly~i zr!?k{BAl0B_PLo%1;gDI(xL%y07UTsJ}6fd02whp4_PiEEPipOsN#JDd-;>j?N8qd zv&>d9qw)uNAskKH)v(nku}ENb-8)>znt{d0A>5RF@^QJ?;t)q}27#utJ8F_ax^RW^ z#NbEJUvKv4QoJ^q^}XNry*eMRIFLIaK^MqY6KwUoG5YCvA{X?h2d!tcb?wtT-%c*P ze$0p^pS9|FX9w+^>Jq)IgshPt0|1AB_X3p0vk~FzBIz?;f_9stEcIq;YDnl32$)2v z5$e+XY21Oq4gcZi0g3)fZ7I*$8f2=FJ0(`?rIjG3bk*b|Z%2G?bBFr3ar~qA@KM6# z8m!dQS~}s|>W+#d6}ud`k%=}ABi8LBF-CcTTs7UoE{kQoDx2csw+7&UD*(Ln6d<$Y zmRPj1KsD!bqD2(cxI@rG`KnNa0&(G8N|gk2Nn`Xb|J66}o8D>Y(EodWvUEe}atCyH{vMQG1wbb%Cb$n}*c0r=62h`vRuK z7Ca#z_6jSWB5Yn!CHspu620qe?509Ym8E{CM4O-OF=YDG2lbthJ^WsdUC?|k5GG*! z8`_<$rf!1I2SA5Of3aYcG)JgReU-pYdmKernnev^yWdxr4$(z+TVq+)vO*ilGo9)P znBY#FZK~-wLJgK^{)H3^%*7cT2!DHP!-`xxRrv>R^B5A}P11m4BE}Kscv0ND5ca~`wc)^Syd0wh5_poIh|}su zBzMa)t&b#nO9xO#QbhEkC;<_sBEOhL|4*KS$6w_N6&pg&8 zgnnH%BTu(QHS1jd;EJ|YCW+nVyioqc;IL%n#;WOpZ?hqNKDBdVag!V`m7KcO<`*1KYk}j6WFZvdPFgCp zkQQ)_(gOet)8pYWj<}P>sR8mW7D>(S3Ej9}k+3oBX=mgBl;9AI0jN6aX*L$3qUBI> zapUeQQM&-3)Uub9{{= z3fk#~m2dnUTxu&Qg zk)xUbNkv+2>S?6$A2&U*j}9eTBU&p?xeKp`n4egJa=wq#JX*@W7>x$@d{BukN>7{! zJx?~A{?1LllI8h3aLTnZG*E#~P0tpMx?4_`50G!8WjQsNJcS(Klnp|1h-PFWL}6+e zfHMul2Bt_9L@HcL?^@@dlq>u+jVU~5;z|ue7|SHqqBWx96VZjX^Cp^^IWnkXnVFl* z>FpcGr|g$N<%ezuYG8-_ElCxg z%GV;T^01n+i@!BHU%atdjZB-ZuQPnB**STUSE?oEd&R(gKY$I;F^84h8ixLjV8#7d zLMIXP6C)U9od%d8_5b)M5%H_sTv|8VPlMAfM_BwrFi0(+Vsp)WAu`goRGMPnkV?@wuBbO@ZZ__}7{ zH;Z;EvJfEEDgbVnYECCipB*!V*W&=9&TCl2CGQpvQgR99|7hJ+o#jVpq3#`b`5B9? zJWc^hf5t%@e$bRC`<}VlNMY3+ZsOiqV&T&vsC?d8hE&ygl3lSQqS5zpv} z_(a~-N&EOOA1d3SdN_2wY97pN;jVRrrsEwNFUOu1{nro-001crr-@ynEH0riXR^7P zFn5+a6c_=HfJe{F!dU$py8jL{(~1{(;y@%p$2rT8!kgE?n>tz-u{-D z#VcjPm#;O_1CWU-tbNE=yP$^B-Ue@`PjrxF9w+2`=mNGcfuO!!DB_~dTj9_(&rGkI8v zDM=_FUdm4|E-Q77{dr}$k_ZV5Qo`_Up0eFvHDmfsB{pdPh~8kGBOie28RFM(18+u> z04?GP{Zxt^!&~g)8j?Io>KBx7;^Obwg8&gc?Hc$C&IY>ayk~B$ZutdM0Fb{ld)*`Y&tD)c}7L+LB5GD1-mJa4nZI9ujr$Algn>>Dx1@;?f+w2TF9C1(a0 zNGKo>(@4<-LwIumlj5KU(*#+3*o`mJmgHDrXO07q7;>i>xk=2_^SiwsKI{zbA70;2 zCLsE1_pp@H02sp8ZR1_i^ZY>@KXn`SYhvOEa>r6{6PYYO0bYt z<0dpP`BsEG;2SD?jCQBAWJGNa`*sv=L7 zs|$r!x@}ekn!+vhcTZk!SGFqK{{GyT?_2L=k})H!4V?%axzv!cCTZ6x^gGn$S7s?4 zPV0~QR98ixV6^|9lC%`on+*g(nCM(F!r=j2|0C%v{F?s0KR(8Q4F-(S-QC?ddi3b- zPDx2&bR*3ur5iy)kWjk21QZ1%1OWvB1r>gLzQ6zAKHm5FzUOuCIp=kpNBpK-IYZB3`keGa8Mg1AQwS zgh=j^qftz%xF+)$rF#SXQEq#9JhD|V)$-cqh^La*Q;>&i&t#A^5bphQVIW^YcqGrGDLXue2fk@+$|HToYv-vFR1)w$Auhxy&(?n5t~02La+ zvTtSqAf$i`t85t-F+@z30;dm`fQ3dg?720E)1td~-MvkiX8SdJ=1#X1m~Mfzoa3ya zd*V0N=bHP&`+wi)UR_@Qsk198vpE~_ajaaN2b7Bn-mrG&S!Fb*n zcCuPUMa+ywW~^}TFm>#1c`RZwXCONEVJc0WS=kpgHX&XB)eP7^rO;p9H!Qu7m8o?U z!{1soW)cs=Vt405yO9?{i4|*lu6W^hf!h+>mjg}YiogMa--~#$tz!fGa{AtHq^6zy zHn-6O6@bR01)KJ#aE4B3zgxppzPMLGziDY=x66%R6_*ng(4*APeVfd@lr^2AMF8F8 zOxx)&6Nacxq{f0t9d730j3(u-y^()NzW*U-Iqwas&P{@57cDR`C0rK9+4-bWDUaD9 zxZHlmQ2y`R+}}syRgDD@58uBy9CgnCIhYo~PNRBTT*MLRFG#M3n0lB?_nNoRw_qZ* z*RyiiP~6mXraI(psH&;XGsiIlg>=G^i_HVsE7~A)=hV(5vG9VG4(aywyssY2)^Tzt zQkah>k5gPj;#%~$ZCafTj)+F*4U`gklHOKZH&A--!A?#3pA@Fm$8AP#7~O`C{kgeH zrhoE0BCx$p#jq|dn3u=Nlynuh#IPB;($oK6{!2v@jWcCx^k4maFVC_0NgqJJ+0?d4 zXmNrzwA)Xst-*8+I}CxF>j99& zBvo=PbgLkM3AE1Ntjj5@Eq*%ah`aSIY8yfh60XGp}mCyT@DPfF3_v$}W+N{+5Y*I=*lG6P>j0WX3G-(>d3a@I&V&s>aX2lIimTTKkRp z5nZNQOb?)hakgz1i|WoK5Bo~)hH>27?2PUHCvPJ=;Gso<2j&N_-xTUw z+&9BK*G_~3nwJ$UI)1N~nA}r%0-q5vr4gaH{1fcrAyF~!9AKE^_kmN1Ll+H@Ta))A zyM9HV=^(Ln`wR%trc(Pj=05l2PdQ#Rp)UXKZLM}g%c^E_D2nYgRpH_Ws8nl)I~l{m z;+EiG&&Vv(MA2;hprU3nX?Ta{=x&s|lSNsc@+XakXBpNrsc#FMWoH@?DQGqTmhv<0 z1qGy#1QrDQ!5ThIN(#IQH&J3r#uIIrr4eTJ_}}~{QZ$Z-&FZqA)`A6(r=Zi22erJR zws$|ZhG1T!)lb4YPohC@v3%m?rscR6hW0JJ*FT&8CPrs!0g<>sPXll+r+W>BhMA0=slHfDIezKAri5w97^3t~54 z4fc8ct~39Y;XYQbEGVFeysA`llqKKzS*(^k0qDJ-bXC$s2beve z57aTWFYf~GKc6h<1q+xfeamI**zL%wU~si*{blLJrmBM{`{`_YD=KgDiOEDz$5wtu z`eVJ@$CvEY_n(qYqe|xHE=B7tZKQb4QAXc~%N{)co<~n&K(V-lNpyTNUe&l3zkRA) zd_Q`{00Au5R2U>EWDz`LjscEFiz)wg!E$x;mKaLz~o zg-kq=swLt!^6Dggc`oQx4(gAEh8g}M&$V(ed5!AaPjD1#sKx<5^+9CFmAEzLk@RKd zRDy?kQrT6lh#=9Q^V|pjUeXy)jX24CQV>sX9eb3e)fP&g-}aj9bt326a<(tF$7_d4 z0mp9H&RJn7Vtk9>cBSumA*u0$=l7A!L{+)uIkAULd! z)kl)k=$P6nqtS!y8e%xqu*%|Td|Vvg*( z(AIvhn{4kr-kt;(F%g82)&d&FlD-=DH6It5!GH~Vk+hT^Xh^Z*uRz*ePlpJb`1faT zN+Z3IA3`2z#;u<1{kK8ZCVV+6$V*>a`~72=tz!BQ=Hn|VI)_pB$G>EMb$UMi<2flG zT%wWgLUtM6Wyu>J;`E@3{TXRQ`uoc*dlGKnX_e;?e;Op4Dwi9Ge=rT>;yZGn|v98}!XUkHERqX-ySJ9VYNx#+MWJV#9Lk2bD&}q;lIFUQ4 zi$g0y!3mcM6&a_L@I=D@NnNr;*8*8mP=GFxz|pZ-t*D9|(K3yIqgT+*Y-l0D$SH zRc5^2JjKAu%9vAQsilNpkwR!_sPUU@R1aZIV%cQ4|M5ecvEQhTV{)lo5`P3%rcD2fSmMsj{5?Hq0Yxht&n`Yti!)=@tU51}AJV|yH4*pA04&NNnzK;Xbv1Cv4WTCn3$-up9F?TCb zS4xfbCnRBXfbG8?_+?HAdwpy&ZlOyi$Z;xiIRvP_JIkH^EQV! z9TqDdr0|!TyC!_Jg~s0FlgkDj+C?QqU$e2gGNjtgHS05-?G{Ai4F~Ux)cv-@JZ1v zV>1g?8KpY&dOUr>gMwz18CfhyYV5!H^tWYZBj5&QL^H|1n2duIFwL{LW+_s;v;Up^Ap^Pn^O;c!MHXEOqtH)FFc-0J8p=2+4WH&iRtYXVCe}f&8~fp!{uGAG z)ON6=HxSp3#R|rPJ7;pfJC@qjhrhJ07 z5!I=t_x{#Ro)MB5s!=(a3|J`gCkBJ7-Nnw8 z%yJt-4@@YnQF9}{7HOxsR+}Du235;^mNW7mX&jtV_*@*qkM1cyG4USXtTe(*WRS{7eM7^I4a{ctmvsv}Y1=4f`r(J{B=GjzKEc z#vz@1WMaix)meOgWL%WuaO+aGziSRlH8cVu&IY5@R!vD0UFvJj!;Xh1!Ugz~wo9UH z5zQjT#e5aQPIOB(dS&QXT!8t4U0g6`6(XfH`Ssk>g7K?aKskq(!FH6eFrAx&i1^&l zDVgDWyl!*(`PWqCw0cJU6>VdEb;^*-MUO%a?=lAbl$nXtBqPvRRKhJcNYGsaX+F(%>^Vc?z&e^ zd||~+W2eM;7&hC z)+2thP&z$m2dwQ4={o@`GMGn-2Q~_{c_Exih@>0J8<>!&f3dR_<2z!6^6dc_5;~9o zonK;@lJa!eJnf$uaJF@fFq$6*%@4MqReVXwCuLDZt*v{xS|YOWXZSe77<*2B-zNXb z8@iX)S=^QJ$<_uzZj1pd1Ft#VjaC9oElv(z|2%6NX%)PkGql`aZv5<13Nl$dA;8Ki zo{~tDuHOUvFFSz2W(MKLsz>?rDy(mKPYN~hZ$V5Z@&)YkZo*sJT4vmmT%7ld3269n za=^$DT{RM%W`H&|S7>D%hjiR5wuD%FjL0=i zbnN3dlsQkt&Qqj_09-*$v^$yu4hspy%te+mF^1$RJhjW$>1Sl_kDn>n3u2P4C_YFE z%6$9qJM)Y@SyAyDYjns^!Wd6JHu-tWrEFkZ%;q;W%SZ2F(p%}h@1XoN4K~emG(YuP z4yOb3dcXg>nQAh-dmGhAVe`v7UT`Ta8A_p_BK+iii>>#)SzGnC8-vlA)v~DUok7r_ z(qz{I*YmC@27qhg?=X>x;Q;{VA$o%;eG2D9!{2M3IK>02`v((sdRRPT&9IT!#nYW> zs_#R;+NInm-~EeIamubQxGvF~`*_xHe0gu$m6dn@H;!|y#eB|pcaHeoedfatBgcjC zsQI_Y#cP#)?S4Vf2Y*E@5})34vz7jStJsl&U9~K(myRN8 zuWGNzGej!1NV8N8(rzl6xN#3Uc2^Sg-tP*CuQMI~qDeO%cHq%>Bsjk+Jr zn=2iHlWG?zy__4KF4yb+Xeh>p2+>Tw@MsPt1S>7qX|bQN11^A7z5f5?`f`)1k|e7D z6c0-T;ruc;Cw^pwfF|s%pVz5A_PsPBx+J=HQMV-3sy3VEd9iH1_}Te1Q#|{)X3F~h z({;yblyx6ruS`v;RoWr5*s$u+d7E>b_uv7b9RLu{G@JBT^(laT) zHAogT*L7wel%#0t%gjKis2keJB^P-Zi|#Lst+S}Sowi6L_2CuyuoaFpN+G+HOMX(s z>}lbaS@bU1rGZ0L#J;5~>T@aSoCbB#2n)-eY8J;#B}1i5iDh|yuF8~IgeD7o9wE>^ zm4F5S%E4#~FqZE?bN_Tk)K@q)dsujBHZyT|Lf&gp`V)Z||Md?Ci8s28YW&sOH6=?= z2d~(2_`5D-d6(RTv=vybs#MpyIOrh^lvr>;tRn#HGCdjAR5F5vlbCA+r9rXH4ntk0 zvtq?o8q*$msg@cdoRN?OA0K#H%h=nt1x~gaSL4XvENa=6hCfrt(hn6hE7-miG>u(R0AYhzPfouYr2JhKedwoC8;A7JQp~W#b ziwvKZST(P`otXrlN<;kQnS$FbR#Tt-Up+?~cbO8NM{tdw+1Zfw@Z?ava%QsHEBuz%QV zvLg#NPA+EFxPShH=hLTvBDD~5B3O18#T>n{+t^l8H2Ob&dayv=nk$u|8W;N9sf0`{ zy9QapS_1Z*lPZ->effks6Xfg@fMybQKm)99WQ$Oi{#z>E$qEI0_Lx1CNVJ|bG?XOY zqd>&?xSn4jrzpQ&BRpqT*OFFV2bw`qx_X?Iqg=gJT)6(`rCP%-5%s^e6o3SPDw-Ml zrxjR1o4M*@oB2%{9xm<-7FG(@t}=imocSmlCT0@uv>ET^B!a=Otr6&O-}ETcfW^9W z2m3ew{1-$!jbkuUY1EE3eIaQ!^mBET&S9~YNQ3I?{?3suC57GM>chip+)SHV+#AM8 zco_*d8K=h-z#|q3WtakhyP2etsX#Eas1ltz<{S;-lQS1%{_|-)TU%L}6kkkYIjEZ4 zK9!{USq0GDXMx+3!UDbXi)s#{9bz8Q2gk7x<>G43j%6;g-E!T_$2%N z#rBlY6aU{%+Z14G?L;CdyHpw#8B|Dgh6J2O4V)onR0iy9BR!Q^8beWb29zTUV`eL< zbrU-d?5W4K)~WNmzPbLD&dBJn zsKu|pj{O41MQ>^F6B1XIl+qqKOXPr}Q@1DXNy*V^H0Cr=Oo_jpB6p_-E-?-|1{cO6 z5=V^>UhS`?03cEIrb97}9mlROdlq7=MW_!n9$Dx+V0X;rafqGQ#Zg0W6CbNWiOgMt zE{a2|_P+}lznhVRBKM%=&gsrZ&C_>W95LdDyIS?s|1)}ps&b~sQ|4N@c_ZSzWi%CQ=JVDme_mTWusrBc_VlXLgS1n zs9NR?HEu7)6l!ya6RwD;FvF<(KkrC-^ltSa60cwU%%k%O>=fF1Gq1;LWal+9v=oobyam(FsEgu}p5uZQ+`9u2eHRM<(k zKbNj}$g95Imx?l+j{*po{F;>oXR)2 zanrrGy!$>$^Cg+-mEHojj|>rU2n8tyOlNOL9S=DGP!@y#JAYIzKqGF*IodP zY%rG%`8m77*&~vn9yV8g3WfGz(b#xcMqHfN$+@)&-txQ)r4U*71$jg z2XxLsE2W~rG3dY6G%%#TxXKH!BrD@?&f<#Jer_@+VRUK!?y(Kksv|lT!MP4AtCKoF zfp_2|D0Qv+4__5lO^tsqJi3z|KLUybgOzI~!a5Y+-BybuPiOHQj4#Er#=EHJg3Nx~ zddjExgM&+EVNE^uMrl9*$TF89^iErw?35+YQ4>j>xM#%E;(Qr@S+I`^6e5v25_md1eQUpR80F=8l?pw zDmj8yS2BEEmAb7ldP#gQtu0DJdEf#_MM<^wC)vfnYWpzw(;S{UF7XQY*T80DdPuXR zG<7(ekkUK#4t9ZpnKzyaMqdV&UxypKt!j;c)#6+V>dn6U;UqP;7x==_>f53;uih)P z!x^8b*yl$-wy=B|R&%SlIJDKtdVLYE(kfiIfpWx8?63d;{?`lqDU9Du*<;5HGPHB6XSi5eZb~E3GS)SGjXwj|w`;p)O8VnDTa> zXZ7&@+BjtT4?WC97V#jRV01|MClYizE)}>{DD%re8Wb@&kZ}w)8yFabwrYfRAM|{3 zj6MK^0zfQSIMLYkzIF$p4FWwwR~X%vG9Ww7;OLqQ@ia9o=D+wg1i&NJ(335iE;Fn> z-V|nuG`eC$p6)-M)WAQk8&CTEk(6&Gh|xBI=2PEFRwG&a<$U{3;?7C36$^O^ZyPlo zVub~KH_^m%JOM-OnpASH^iMti-1pi?m(P{Q&%C=&3OnbobJ}`w`QB(T zn7C><&|(p58vr2i#haRY(K#PafO@4oQ8w4_^o73>b_=!SF#Ckc(B8 zzOsrC*l3!kjhTxI>~s<0*UvmdsU+G83uIuIDu^B^l;YY+fs{;;iF{65XD~?NxRBN& zK@^g&e@=#_Br!qlqxe^zGF20BpEW4w&?;@{$L{yXS-xLZkDeiSrCtPU;J>n>Lr6;S zkD7&JSyyjLohhxNK1_jcitqd8ldF5S%IoWo7%d)>wEoAJpQF;l#;c?rJAH!ht(>%i zAB?mfgzFC{xQ3bQ(?3fMOW&^8g+rb`7vBVmvbv2rx=dF^(|m7uls4gjX=!Y9zdALw zey97>`H$cQ&r3&V#r z+-^VHvpg|YrB>tL&r0U5Y^eM3j9V6{oWc}mJ@v)|L&4WbKq+PQO_{SJntpXH%%xb; z>DM);$lpRS`d(X}Im~6q9wP#P?BvS@(<$n|<=p;+OYKOABPCAmu#~FGh<}*VuhQCJ z$NtyEMCVtgpw4l}G%xL~@7|QV>|2yIU6+kb{k>15RqC-VxuS>#AkBivfxQ+VjgE5! zC#Q`mdmLLiWgpoA?O@EY>Z%<=3nk+^0XdYAxZz=)K~`Mw6i8?nJxFFWt17%3hc&dI zT*9$k$9_GVTh`thK#xxnM0R?pgCzNo-I<^LNydn%Z>Hbw=!fk~F>|x20rk4i>wVa; zfTI^rH9iPbn>uh+vbK{p=$FfRx1ScWnz>0AowDY94hHJsS@AX9eEdw`nCmt2LS@fu zjJJm^BKZM_xSYlQx618>Ut2Y2vYH-``uIxG3+%{E`G&`xWzNO@yOL?Q{nxjhA!N^# z9LS$BVx!hTR^xqfvh~;pgNnCevMyg~h~?+OinmfhMk&V+#vFVqDXSh3c0|F=xwwJM z@i7J3Ok!VNjwPqD%Kw1Hq|UNtDd!BV*paSN7dhXW;%~TQNn=O5H|K#~@*#X0d1Xb) z?exZJMWSu8m}>tB{SzS8DqcSSd9c5KcoN^bEVk+@Ei2&ENA94D3&2K~h&bj9EB1#d z&q)mZuG6oFP4%OcN4>R%-q*e#<(d1Zo7k{7IoD|2IQ=IV_xE&%0`xzA7Kw1|)D{Vf zv@W%|iV5Y0Voc=)k%T+nAr@7V#hFv@AJB{RiOG;sg`kmAw+E0<0v zi7$SAIsZ@eUCCJ-tK0J17%0bY5;;`>01!bo<}{xu&*ht(kg0;}D~07K0%yY(G7^>L z6kdP@m{%8K72trOaLmRCaK{<^?Xn>j5pPkXs+gzX2y9HVn?(m;jlf_l*p)=$v;L+x z`N=iK28rfFxtt$3ZR}ucVUA!${Ftl(w=E8{nNle8VAL!QpIL> z8V~}u7Yv`$jmPt2vr|L}ci8G?A@cNX%9WTNIkIuF*rSb2x~NsZT1n6WVE}kU2PYF1 z&`KdAiOk5;j?n)ix{>xrL7Ga(@r}^Xc11|$b~TMA6+SFq(1W)u0}q)A+f`0V1Od=L z9!^mJS4#pBG0adIYvrYC;3ucXSFwvT%Zppze}#6w?jk;nXYbeP^*Swm<0YTmq%vZb zvDco*3QvlZd~|=`bD5h!jQ-C|5x{pB!BiLLm zl6HEN&sdqvEu`BT(iZfqh0if9@LjIWTL~Enj6WNXmxccgTSxz9b>Hi^hW1ObnI~QF zq^T-LrSj?7H9V=4nY&4%$zQpL-j`6J)HfXZ=~w7PKm^tR0SgJ>KYlh7xa*t@ibG~t zit#@X3O{?v)){T8bEpiYulBmUe7o&SHFTz+<#%19(lxrqgt&S4a2PW@>Q;yl&Se7R zej{=`OvJwRML3KVg<|iq){P>Qe;U0mTj~-0nnl$K@3*FKMKAdQsgG>vk3u&PkHiH zq+;L)d~n{%Ddqw03l#O6EI?RIsrI{iwVVVwmsc{8#cquK28V z=kOquax>fIOG>lU%*7A4TvTuI%FV7YNij6CH!#tkKb9ReOI8lIc=oS!HtMLUPw#5J zRZWt}{3tIc-(uopP=s(@U^U0d^2EU(@;u`{DQRJeA>X)Vr~765aHZ__=KNHQAx~2X zO}gx59uEzm^ z&_H?J1p6y_TYMUkbF;6fsP!NVJsv_XR(-#c3WK$jBrIp&4aQvcVU@J}(fLur=P&-2 zxy20caJ%tQq_Og%9#kR|vAh>lg{H>}-;wqUWyt-^avM{g!SwZ&=Ao>Xf!yn=j~}i? zWhw8gxSvkOBn_!VYfnzQ8c4fPV8fa-=F`n>?@u5}fZzKfdIl3^X>?);XFjn$uHej; zu2=l_Yb9|za#E?FAF?QsRp%3kf^FyeMt^ij$3q2lJ}{n+*pvH*`=P^S`8Pf)G5{kx7}~eq zan!j`4B)R!yC`q(aJDK)ev?;`B}KwO$-)ADBm?tOl&U&HbN~C45u=Yiy*rIhfg=h1 zlN2GqYyTsR6Yqyz{{@B8X*B@(9~J?T_`aIHC1_ zXEqflGQV`95ev1*}4?7`>rQ;n=js_fgIW z{3Af*HgBTMZk$G8_EIM1G+E{8xYRb?NV!1X(i2|&RV4Qq`+xi>Jj2OBt}RQ2_!?mM z+PHsVFg|59B6L0+G^lD0%*A)p+#7Nz)V}>vXqAEFSzmunJmCc;3SMz*)~X56pH}z& zP@uQeZAi4&=`gDGkmA~apCwfo_UyuH&}aZ4F#_wg)FO&9!sV-dqwp&Ji6Hs>Uho|A zjp{<-vW$0T$dpKrxu`#X*&GDlA^!8$i)TA6Ah>Y)&FX6RtXi_CznezEzuu07-#q9P z&~Rpgwh~jn@=hG+#R9qr{JGpd6POS)-Q8d&y{_th14bHIYP=_c=mfivVF)^xqHM>! zI+A?kR`9sTf*FtCzAwEWJEoNAzRp!2ESI4PD6N_HFRZ>f=lw+^$qRFSg>Nd#p_?l& zP0mpn=Fm=aT(#oHer~a6CK`**6<8g2+fyx>YTwHjm9?rT$eOt#dl8B=S$xW(Cd;8SD(XSwWRZix z#JeEUY#9==W(U^geF~o5{l#Ac4d;hir7BXkG1|a`1-Cq*zlttpRm#+oP`~X-yGNZ(zt?X zMY~Ub}Nj?s#NGss(b)8^h313OaQEb038E?Ttj_h06R@=Msi3dpYOoeU>-u-OaeCbCHL8h zHNuO`Z$?=Oven7$c}9&CW{jWet{5MG`v_$|e6N%RxvZu#1SXIP8ZxDN?Xf7S5Q;YQ zzB1taltR6^Csxucq-japc{RiH5jp!zf`?yXQ5l~5CGtE}Y}4W!({)J{>@wpM5M z1PFu}q)7Qf21J-;%Ko0vCyDNf-(raT(F{X%t^Q&Iuo-9F`p6fRu>)UEN^HHS2gTsh z-r^8&`bND{gp0i^Ggfp)AgGv7IWg@b+?eBZsp9snnX{Q+l*nUvbVrD0zNEj))^}U! zE#{uB2k{~lq8y{x*ry@^A{1K4@#F*RA%W4TvhrD~*d$Vg#c+3+nUbCOSc*sHaH8RC z$>dOs&lk=?1jS$TU#5f~JP%9>m#e+rks4OeF#q;+U_SYKubx6~#O4;vtWL7Xvxq5E zrTXK9tsH~;_q|=SgqrjtQ}eiH?Q}lLA6>urU+b_TgJlRg55D#^(tW2*0HUGCzxU!G z()Zd;jL)qtT7x^blV9c{q>ykH>tcRU)6I}hY<)0)l2qwWW}bi0Ls4ailU)Mn6Vg!B zOF{|d%1bZIYG!0lkL2&qpHwd6kGM>iJI#-HGjnA4T5Pr{7>G_B9yWS(;;dn47{5Pp z7vDBGlIVncj7NEwz$7~kJ~A7Q&J%_$qR_t3qX%QwODKcg4qIjHkqey5I^Gqk>p6lZ zlCG>I#L-N~8JzaP_R7EllCM$m$O@)5smP8Nuul>==Y>2uM;R4?XhBuM$6~!2U;bs&F>rWabZ4_z z86=NxH@u&v(I{4JdKV_&j?=Q97=o;-8-RoBvM4a*-7jHJMOF7@WZm7i%9zaV<_OJS z8PHNb|NbINNxIWA0r(R8$2xd4tzc^PCNLrY! zL0Gv$AA?I*aHcyenyhfat6x)Kn`@N)yRW>0*#Xrc(p0C-R~9}{mFr|G)s9oICZ4*k zC{g+E@%`^Mjqch)oU%+c?=t^g{*f$Lr*44lnDEuTcG2MXBy7+^*+7Xx>(IlR#J|4R za{xjbXkT-t`g2p9QdLS(0bDk@9vXYbRrq7dSGh&lXz7)RY{ztJe1)$=C;8BL| zvf$v$?z+aAkh%Xz>VXzLzQ5lG5ELhN+Mf@{aZaBFkJGNOsahEm0TTb?Co-n0Uv0%x zM$1mO@_0<1BQ7uATKm8JI}6u|SZ2mK3;yv-1gaR?4Ff|vaW@qc4Fqmji+RF@kCOdf z(Ang+L;|BtMaq8Lql5{<;&tQ5JZr|BrN67N16!VA5iZtPlDHOIOlw1E<~sJ0Zfr#m z0$7*N=y<*}YiG8w&;CP{KSPB9m&Ycu+A#SbuI+4Yv2`^? z+7z3xW!+iw#m`7Ocys9Ur!9Z)d_Ztwo{D|$vD9x*K&`Aq98Np%t-m}xIyiXSS zeHA^-G6{5Qy$2kuLj<;t4p8%lk9oZwN7u#t{@Sh$1g_7vZpLg5;u9B1&%8O%Kd~wrJ+m? zLY)uWi*s>f`%E}!=qkF75s!f((K5%IFRaSni*k$vlOs*D{7vram~R@d(PhR!u%yD_ z(_7X8Cyw1$qGClM6ZJ^N{Z9(Vbq(*&$~auPi?tcmt$F&EgZMWuMZ)g`b}gii38dA@ z%9PeeCf5uAV(la%v{fU$i~tY9bD$Ke^6QO%LWK!^lcAIf*3l)|kPQ;FKJsByG`HEC zt?w-Tb?LXhaAqO)XIsc4od?j37&@}7M{ksbaS4Y>sH?YjzB7@tm8gR7s`@lMC8fpf zlob_S76l|4vmci9(Ub2x34J2@>UU49(iStw_AwAAbvKOFE74*+YHQrqb|s7ppu+S3 z0e+H}lb=iE!gD45UiDJ_wCS3gor$L7+TH|a=bcWtGhgR($D8=KVy8meZ+D!G=BDI> z+7`}qcb=HPtdfkNb`&ef5>OjLQX01{HoFatDlaXadVPpY8J0$T^Ax>3l}IP$S3FNI~ZeG^(XwYy9qt6c7OXtYQ>|VvW}5l zoLjdb@ZEZZRlN{Sh3xmZ1Zv8cvT}%VFite%*7yu2iN_BzQ12b~X(H`IA ziwd%~RMsfD(Y7+_)P6$TR_R!^OK*3-unrZjzTlPXIO_5VGY(Jbd}a1$a!jJXyn*D? zjT3JP`^$Dzg@^?^DgPuxAfaYbOa&_Njix*+Lc&1520omOnw(T5!Ne+@wA8U8Nx0!$|6lxi z;OC?9`=8ocN*Yt)^l~iE_1`F(r?t*UYn1bPWo8tPTS${Yl1m={{Uz6_Z6@q=w5s~? zT|IS|+^w3;fVuNlq(|D=9Q7rQ9F|!h{?1$^S8=2`02>Pd08kH3mzyCxwuKg!!8q8? zLg9+h-frD?T1qh7G-OUvKS6n@$$EGY@My3O~6Db?#6 zX(j;?08|*7<03&?tGj<0AHycE+9g*88G=$v6d(Ba&iTHzjRgOFNc8kE15&BG* zuFtNhpwhGZW%{GHe$PTQO2!0k&vj%u5082jUM##ar4i%*o(p?8q@+ltw=CihacR)1 zGr!B7n-IH5aU3N^Y{Lc<*Y?CT52OmbmaZC>V zT-?++NK@O>k#^-?t+3(rp?OmeaitNe@2u~}HsA9&4cT3*GX%7~W}!27m5npJ{sv*Y zovMam?38J>?x>iNVYHlblh+~7$jCiC9XR|dr0Dp$RJa=Q98>b5r-G^S`@R*V@sgB} z-rU^Z&(YLJy&7(ctWZ=$un^_~?EtiS1ty&Ebn98d#FSU62;M1BD0iFm&!4^D$HQ#? zGQ1FJgRwiX8({VWxUs%>t;juA_fpN~NFP>RO0NB%FzD`(73>g?Qfe!0T_*LzMX;Kq-;-oh zj`S5HRh_&EVCP2Jm@&_XLRg*zOauFd?s;5eMUbw$1P>I)eLiQqUy8}t^-Jt>{nFP$ zQWO8NtAWBCF`)%!&3vVpq`N2quuXE?Mml*C6wDpLF; zgsNPYFbf8Apai|~@-%tm`v<1;U`iQfBH~F!a4+s4TJw};@XZHIi474KHEEI*CfH=8 zW0gY*Q||TLtvrC{AyEee;6*x>dU`XY#A!CU?3{$2K%rVy$?Au%ZFo%-5~`yDM z>iKjVu~b5dw{K38{=x4?Uumsun0_0x-sh&Np`iLt1BN}ZQrvjIsL+Ds*-dTAYhBiv zEQg9znn3hrzNzM0oa zm^?|gru};ZT3`q^u_`TjNX26efC;ekCOsdK#zH>ZKF9JgK!uk;IoH{JS6&xsK%C{E z=8@S*RVQxAON!M(UasKAkiyCK^^!)VK`MYn!yOaZSfyQu!;PaVlMS!yu2nC)*UfTU z)uew7KklabPDYT=&a>3U6Y|%T?xYbC^s%Xuyp5$Wu$m{A#>q!j+0#z>OQpdn=-7oE zvefM5@T9`gN2{%c(TjHm&w?kUL8^&QJc#^)+-nM3;qH?ryZ zllzlLRlDxL*y z{PPOZr4)7L@*Cfdx2-lrosJldJ^Pb?ejied7+>;Bg{oF)#om zO*+2Kz7raor+R;LtQoT+ZgEt|D-pN;i*G!p;rYO@f5U{47=5un`Y6ZI!5hu~;N4X> z&P@Vgh6bBjQPGh>;;~?|7|393GBuz+iJMaMtM5mJ^wdEz(>6FV#^MMd+bm4$&R4I% zQvJzNVC7=+_rciPAhB(yxF$;88pjQ;nWt6O<$La>CZ%*dOMBi@r2<3U9|eIUQC-_ei6 zu6{qqFl@pFWYWAnhzW5)pt@NJdcu#ZWys7iBx9>k0F_&hO9x?D-C&HtDTu4b3-6anRD zDDl4^By~5NnJnG~p|mx{p_NqurZC@&33i-6lzfXX;`(#jdrn37@9yJKUT7bguNsvA z>`VZV5D5w8&Rk5|1c6-AU%vKgw{~lTzI~X*kZ+LdIBA+t)#;oz3?~%0y{_0hv-_C3 zNU7g2%OKNc+|}H?xXvW%!qc_!LhwU=ai1kOW$uqJqHmR%SFN_2lDp>{ZW8C_YdKpv zvqMfps%_VPh{Hv%8^-R1nAdJzit9yj{A_8Qu7iCi2x_kJ!b$>ww_*zLvq*hefB>im zQH{)JE~=t$H`MNRo0mR3l+V5u3y2(94}C@F*7Hv5NNF*^IyHt!vX=K7OZh@^!e~)P z=Atzm!maEL^yBf~jNeo_K)pehyvg>u_!A>vxpuJKzbdbWVNQ zUubT*ce2(hFOjIb6Z+Sawbi`swQ(F_%n=RS`46^IU0Yv(mf9bW8210!p^}A)!8vqsK8**K6fKFMVF;VAVAhB z1Q*0@HmO8C1wm6j^lIp{!d9vD3n8Z$GKv|Ubkn>z1PJK_8jO9+YEoC(4*!ObwvY+Y zDpZ3Ntj(pU@IJ6CgeMRuy7?;MiAr3H8aq%{W!PRDfyAzrs6JVgR))03a|z0{|qM1nPkZ+E+>5WyzK6xKn{8bPf3AB~AD)ndPmT3HH2L z57Wkl6tOx)qSFS;D+Mr8lSqJX%YnZn55oe(Uvh=&aZ+85@ zFL8hOeD&G;`(H2as?StutUll0YXV@JOu4ZMA^;VU|6}T`!rJJ*wm(4dU_pu(C&AsF z;O_43PJtGl;7)OOcZWiO;x5ID7WYCaR4MY(|MeYwImqG6p4q?Ivi4f{O-h>Po-D8* z8pNdx`^_B-iUQMsJlXI;)?o`)q^9=8E;rWn{j=a|r-GxdZn%$DH`fQRWB zMWf_YL3v=wxnHhy0E?oLR=wHyp~!(XDnp$gy>i~3zy#xHnCiQqU*E;qXEf=cxnhF4 zDhXmLTI|+s8hsBeM=vaa=Ydfd9(n5)`ubpX&G_GWs*wl1^*vy60~05ABqeUvoGofh z^ffWwtOpXpxM++1bN5#N__08swHmLwyX_(`xVYfVS^`>=lJ-;)2rQ<`%ai77q`DW| z=Pn<6x6=fLEESsO#M^F{amn6R0H7>N?@+7easmttbYM$S03}?H1iMI%iF zW_TE1ABz{QQtUjIkhC55KV=&pjBW=K=nR@-VBp3~qghC!* zLZ)SaBWuzOl7d+Q)TmkNHYDFAW?HEcBqTBrg*^y}CL(u|Wr&f_rsD~8@$!QZ=b71BsMlOk(EzC`LuHD@_EHiJ6fN3ld-Y0xHB7H#LxW_GPu& z`)ttvB1kEGR ztJhh=O6Sgf?Q2ubMegWQUUd22czRU-S>&XA?&Fa+C&JIXH!1onya!sJgC@_?gY0C} z&!u71h*7OO!@SW)O$xXF)i2|O6L(n}J=ec`Y9C${(AdWiu9(>-w6KQ;R$Y4D;s|B_ z_GF1~$sN)ttXAZyk(qB0HdQ}R9hJ~lY`;sxa^N$<(XUgvjnXXr98rQk4LSX#y>+TO z(PP%If2_Uo!pl}61*BDI>Ig-~4BuEkgq0=|f(3NtVreLJL=KsY1Qzh4GATLaU&_#; zMWak05;0On==OnTwq+7|RKglYm*@3o6VPmjw@)6y`+J+Chn>YdU8wE$g81d0m6v`Z!Zp$qi$( zSr7?|Ihc-+I723C{4fR{)Wpm@xN5}W8-+qXxnv7{`$(2}{Y*I@nU5X#quN9)qo#Qj zPT~31vh0@VsoKX>k&gCdWhMavBBCQ$P!i9nqGImQ)YH5;Ql7pY7L?Bo3 z;yyOlnC*8(cB%@3UMXk-#+b564-rO}#bQi|rlfUIR4Mxt>^k?~UzMV}NRdqn%TZR} z?yV->u0!4Fk3VcuRHDFX9=Nfuw4l$RpcKBVW=oMFuuMiBAs3;9Nl;o@pZRx~8+dN3 zQ%!lFQqC%Rv2)C-9xMi>{#*Z$A~QbduZU{cc$zs)Q#}h;6Z-|~G;jrmiW9QY*k*gR z+_g7|MY82tHRiy_@$UFD(5ia$B@bg@dBc-1TeV8Hk0a39I} zIUgL};5@>U@@BbrQ`LD8szK#$3qcyDcT7^n(clo!42tQBvZUIn+hU{A8phvvC{OZoNv0_IGKBSlL~_@AcKSjoTdAxIfXMxf}n z6fs#~y4YGKD8n;N=Z!`iVzcCj>)K)&wKmTUj{oAwoc0QSD#X3$Du8!h+xGJ0d*%?W z4&TuwbInPEdtS-knIo4k9gbE=`Q(t+cmL%*=VMs{I6Rctci)Q#-H&A0l@2YV$yO9B z)4O#Vh-jkd@Oj@)@6@&7q>SmR}I^9vblOY!5$o-aYu#!Jsn6mGJZE&AJG zvDN#d>1No?mpA_%ces_FS6?VRG@Oz!zNY+R`ra_Q;U?`yrsz}D@>UpWu|8TJH7ONa z%$BVlGW`q(#zeKq%?~XQv%L_p;Qgwf0RP|dxZ`GOjliiwQ}N*=57yhqIb(yvZ#!Ds zRuBB!*bZM{7cm!4kDIH8wzpl+@09Wr=E~vO^E7riSWNh0Ai=y{2lFM0w`$EAWpVdn!~Vp3WN=)&OH9_Hy6@jI znw!4uo;UMU@)a%U&nu9i5#9KG(SeDrdBY_&>v$FHvc@Ab8J)CM*7!EDcn^~IwOfck zZnu)sz@aJRUOZjpEFU^cnKy{o3h=VYvp47>^`LH3e42Ly%|xDrXl~k5mq-0`)GUKI zsu|!CRy~Hij5<<}t|N=YahPj*|Ib>gw_W=a?J__N0zg9lL?f4n{euUm<`B)7p_jkZ zeof$yIQUnOdPk|YhSeCqfJneCBPpdceHda%)`jq;=PD5nU+Onl+L%EDfj_6Q_IT|H z3}n>pFl&m3{0SC562{#UhGZ`jN?z`2>50)oIu45vlW%TL2BmAEfpI8%8(ldvHdIHo zT_UvxDRXUF^{gP`Tl#wori6;!MROd+-rB5ISbr8o>d-DI_-u!Teb_{0DT|P-3f^GG z$j9t*iZVD^@hLGQ?5xcykD~26-wB@)Om|EN$+pT+;&hF?se_Ms1?(RW$0TT*U^&F; zxtvt!jHwQ{Wt{&#;C4R0ZMWDt%yyT~RFFd?qrQiHQj{_u;nl!p)1|n0C#zj1J)nul zSiUC01SL0nH(7dWAkJ#C(cWLiT3Ps%f8|?q)yK?hQjmQr)e?ktLAvmtsIoKCGbZ>{ zP!%vJOcpqlMghtOiUpV1z-Y+YNadVz%Kb;4o4dE~41Smxa)(Om zrg%1^W~#O@%adms_h}$cLTlLm@xzRTs-&hZnxH_Zj`9B4zcPmCnICm4&Oy-^&ZmR9 zhEs=YV(F=|cLq00bzes==mU&$>%wTsQ_uZun)lT?G32qvZ2ie2e-^Qky$`w)P!-pV znvxMdnoCdz&q3cD^5T)-QhB0d$Gd0`jPm!syLKIU?cBm97FqH=90I?lK!pu#G;}_0 zqw1ZtK-9d{^2laaQ&3*#*VUoXjRKYp`F5 z#DmBdcwb-?9&~9Ih`$PrmgX#9_edZm2fZB_kY$Ng3qqsDCS@bB9wsZ3Jw`=FMc7-R z3NTL4f@o^lcPupyWmwo0F89z(W70EM>)u?zm-ZzSDh2*bS$FJ=U5(Ob9C#cPwFcDH zhNZ|mR&u22!AVux)MIqN&s2O*Z=r}s9-%5b){!HDIB~16^3+>>GDD55;9=LZiIXM} zZ5v`cLyk}^pXQ1OYrpGGD{`L5PO*ox90F4K01`3MOXu^$@ro+Ye7d>1oQ=&9`Xsrq zNa%p!3iuX`wS=KFAG^TGaQNY?U#J<~^~%XhqL(*gq7LrA*B4P}8!Y+UU%wbE^?G0x z1)g(Xjwn(xF3Hhxskpd;bS#xoz{s+pgC{}EBm}WJ$im!&iSwTOMgGV8*RK&_#Ovr> zy6}LhQi}6~hzR0$I=!t8`}m(fBpNjFUQTii(;Uj8YpS5{AE?Qb*Qifr%I?v+v@%;-m83J& z@Pc?Fi%5f`^$1;3aKlJ1a@r!}V&u7KqADG-lP$Ffuy~`n88p9GjpuVU1ox!IDPfu- zp~`-}$3k{2)Cx3WmrAzHuS~yUrOr@~AF{IYs1P#ySeIVMZMe+BLtd7CF1tQQ53?#@ zr;8&_h}hy2Xwb;lNnqw93~`uuAz>FZcpov^=X9*Q*6#f2VS{CPrr~l(D~$Spwa5VL zbjgKywT+&ZK-v;n3s;k1Wd9e-#tsT|^_Mq6^-3^Kx8{Q}nL4`#c8-v$?v0YLN+SHg zOf?1GM~&Yzej`XOF_~@>3de=tRp<43gC6pVQLn)T00L=XraDVmr5X#IfFd==PqzZ1 zMnM&gJ*r)0Nf;61i2qIdJdw63L{Vv<*(jsqLD=!#-M8k$TaJ@8j2vw1;A!^6pEs~| zbX;XCsKc1+2M2`%k~0|>9YnSLz!Cc^Z8wwO1M<% zwLK-S2A)#`dkT@dj0v-^f9!lI;na0V)%bK17GPyN7z-e40^>8Z)-51Z+)OSJBPyqq zXI0Va2wA>vXSo8B2;llf2)~CTs5Pd|R+|Y9 z_&F`*>3dn_(#snpGgL6b>)Ufs!1r4_>NKg;nC1LGssYpr(IYegyBHPKUE3ICrd(3( zjGh%gL4W{3U&BeUH}jyQ)Ca?&eSIXrzI?k!gs(2wlP`2AI^Vza@8Tz}SM_K@(pYQ( z54F$PcY}+DG8WC5?p6hbT58YQ=Q>Ob*L}Q=ipT?(3TF21KWC-fH}l(ZR`Iw?kA<`i z_+pK2c11oCYu&}E2ow+{&#mZJ-PClciCubL**=CQ8XNU{p!C5ao&DBZ#8?k ztg-HtL>a}w11?X(D2?meNYYX}82Z2oG$Hkr`4YxZJcj_)KfelO_J=L5G*sD^bbKa^ zfo-#l{a4SA_-jO7+o)Y$wfyEZ0U7di+xEQY@_AZLn)X7jW1$^lii=W%ueka}4i+B6 zcoTsY0D*H%D^Aj!L=`!JKL3gGA3yP7jO%(Ugoc6pO3LwO7_df&nU7sn&aYUuM%Po# zyoI>(I7p0k{_7Nmh~aRucS9rIZ(4!|6WY*xHej&o0B>KLt^Slu}6L#`)#m1y>XVmLQ z6l?pxEe3UhiW(NgHwAMMhpt6P>88aZ^TS;Fd!4Zh_P2sBXb%EPyz?ocL6M~AxrP~$ zIFL+Qy-32f*@?{M^K}KH%beQEQsdy#X`MVL%^4q>D9txERNlT4FE6-Tn!zyGTdR!9!>{%!UWDC8G=l3b4 zT}549Q0n5Rj&Z?+_9*%Z4S7ZaScKhSo(MY2P}zzP;tLJ|O>LEL$}bGIDKy@-l71kF zrETGiomB0nDIYZH#uw!m-g%lgd3xF(Fo1sbg#ujrsa#!?(2`SExT(>=kL&}-NjiOp zFRgjaI_EMmG#nh$(2g>`Iom{~Qd%8j_z)4pOj;XP&EWpX#-dgxtyH9%QioBLKweFS zvDi;VXKYMOdG?a>p?)c92?ZO@pokwX=P!B99Ndwx;#)BSr(B+chu2f%%~bYL!`FPxg6cdBCQ zl}kKPapmJai5O^#W>dDC`X(E=BC?&`lwuK~NVFBW;!)Gua3D=V$twq+)+&s^RT1vS zW9te}k8EF3Y~{Nje65+yCjd1HH)a`V-77AVquu*%ugt}#+EY21EEd6GAEHRFn5#ge zL|O_?Jx}vZA@i-@7t~RmooRV1x#vgJiH4>*WgQ9vytD8G4QIIg`L?8%QSfCLqa0Hy zvgK>+=y6QN44Z2gPr$Afl0qTgRP_;s$g5#V=B>px!^vZPaZ(pg#&jcQQT0!?W6%m! z5)T^OYyjh>Cqfo#XxT*q-L0EfDaBA6*2`sSt1rxH%5oz?aZ0QOVHhzp&}_J3EpVwW zVBUsm?u*BfR&F3Wl1Q{1!Xt+g>O+TQq||9Bd~7e@qR8o464Oa7Y&}aH zkS~WaFn=qTi9|P~lb@P#d1}v=eXJwmc4}u~tAWAbCV338+T}NAMnolmwSz1XCJov6 zb$#k*Gz#6sH>miDNkAA+9R|&D%0GT)!a!}RODUTu_MSWWJQkZbEo_rdeW!$ zjZ5L_AIjZw*M1!NokdZQ8)598&x`F|bw+=wWXSLQCiQm82rb^ z!}{==n!M80O5>?hS@Q7E^v`?MQtmhsQXOaxM*Zr;Jn}98gnbS}$ib7?I=G~12NygR zMRJX!he3ugIo5CrD>z(wph8wZ|BE4d%M1OmxYkvLxJkPa!=cEl}Xy6J@#7C|LR z7uF|{YE?cH?dt89!{87}j;dV6IlXL@ls-e6@QHc?&p`D3>Wnf~hU&(=^F9tE@)Nfl z{|m(k>jRFJ7^lY=`8wJG)2h!sS=>ttmkHBBgDdY3)V$nscGhqCzHO41+6$lR4{`uy z*h6Gt2rE z$pHVIbj0wcGp3$tk_w= zC1FCxrBFmkrPjG^EA!&XO?S>ceM|)pscemmE9A%uS&nve?ZXs=U-MCutB)_*I9SHy z*vHbeSEQPDywoszkKUdSCTq z^msDgQQFempX*K1KsZgI`?sc4rI{G$)~LTgKpI+2Tl(IhN{6gIFRL04v236MaU`_H zT}dk^Cl7m}=;b&|v#G4&H;5L~MjuUM9ezv2C+ov5@!<*?zm!ynC2gsZm}3>0k%EbE z>W@+L*W$VS2Ua+IcQp9c(u@pt$PiJ_8~V z@(83xSsC79zDejdKav*t05YS@Qq=zZKYq@`P<@oN4gv$OEtFWAEGr9%x@qNb`m!)h zUpn>vB<3>g-Sw_UZq&b>I7W?6j@THhsd#m#7=^=Yy{&RV06ii<{N74`ymBBpDR6Tt z%)&x`pK)UrhXADh-5NK1c%%%Q5qH;vn=6tqp;j_;5*--E0IcwZ2DP;;)~r;J<(x< zqLhZs?_i25p>0W`#L)Z?-X*r}Z&)!)!wA|ic4(ku2j!a#3g67T4e>|XxC0Ru8vId# z)Ion}9lq+%S?Q4URYVk8uQ=s$!kWM-5m#U)6SHA_n}q}Z$WeHYRs9_H3rQwSGNHJGV|{|&j_j&=!+)9)%6S*4qxv` zOps(r-kI$ze|YNe(Dta5iR0F6bdZV7EcRpq*HJJc15Bg|#8HlrJZRSiOXbw9f~Q_< zoa11$dE3#>TDJ4?M#<^JqYt{GiAlKY?N#y?_EZJGL6jFDlnAlj4IB zEU}?@)Q0zs*z@e;4WP;yW(e&Yocx@B{M@3Wb}DIHDdcLT(je0M@vGJ0}JX#|uZ@O*g1-*iIkD!HwRDxl4bG9iw!q=#SDIxNBd!t|- z!{__!GtTn<$48jTN)x-aGdvs%3@*qgJj*!*S!p|!ha$@W2q9AY*#vVqE4ZG#wi27( zSk=oIk_-47D|3g2J+%6lG5A~Ie%~C1s+{S9I<4L*$u7(IyBkOsa1j0?4VMmh`E%ei zhre&Qv@LV7U4#_8Ri+DvA2z+rcBI3N)HJ}l-@|EE_lMfFQh8YSgJP;2NY$PK!=YjS zgL^n#OsBvsd6Z4kaG4y(>Qn#k`;k>Iir+qh$D@3rbhdLlH*F=jLNmm7?l(1X@Bgqp zpHogS0C)9y?BkC8{r1D%nV}l%8BEc6UAeEc?=y1TlY~Kac7~A&<+t zZUU>aQ*pCJu9^&p#%JAkBnD*&sS{9Nzp=QfTZ( z%5;qq;x}ysvvkn`ZEU4<6=*F&g9lNC9}yJ*rU7OKxe^BP@ds!CEZk?wnHK>nH>-RH zgVC6W_*hCM|M8j-wx(4}dL03BcD%}( z3lD?_Y&nUF!e;}c@ipWJ-GoG{ZDygIT0D!r?GHX>iK#v;8F1!t(2sYYR z@gjiZVJQPK%tU+hbf+~{Hzqp&3P?Gl^z`Lm_|1u-#KtuZO|_L}>_|P{r*1V^VPiJz zXYgmU8>&}sHoPzHoLmK;KkKJ|Mgfoi-9F*{^)>R2>l14{7GA3cXlh+{pI;tG`gGCS z6KNilEEYrI3kI*f$D}D%16P}PNkeQo83EOK!W_)gGofNwj15Ltq5JoyEuJBK99YS6>(X(3=lB1~ zAa)YmuRqe2Hl@%tG2ao(*WH^lvJ~@queXQgEpN4lu&w$1;ZbkfimA2t#!`F7MZa(1 z^{B&Rv`J~(@0mIGy#87djsHE;|NDECy*qj3Zc#wXp!bT=X2Q7UF9aWqfhxt)At?>0 z+_M-WPhes6%g~?zNzLg%EHVUtAa$F5<@fh|tC?4kLu||_+J;Cpn*0gA#;vqltTBOZ zZ1zfQWK*G!hc}oBBR2>AuwN!ZwBvuGs^Z?y#_!6rMenHC%`6!g2<=az8kS1aMkw}+ zEJff~ilQ#>QJ1lInP4Mt3HY$F;)Fi#MsD3RYvHyp^cvp=LW^VumUvMSYJ+p(95Jgr zUwrIhI&0#5V#u86HWF=R6Ldi0h$wRva>^Is#W=ib6M2(Oze|~i7&L|*h2_3={j&IZ zJt`S9&w^Ur+xlgIGWFa3Ge7Vk1bT?+N{G`gaC?#acGecaE75W4t3Y7U*Rcz>CIc@j zVF%mJmfob#h3Lt}+Fuf)05pPXKHEf66e2P=DyTi`Z|DX}SbbQTI<%9H4iw`Jkl*OH za0>&ngPn`Cy=w4CUA!JVwaM3IoME~pT`(JF&n>@b!|!ub??hV-_5~gUK0ZkBdE$DM z87Hp|1%A&oxIA69pM!K$^5ceF*MQlNOv@R>jVBvY~6ZE$Ix6|e1&GYB)%Wo0) zoy)ClNqh-6+z}5`iXktvrm3QSRMjgRP}AKmgK?UY*(w~3$5)^+0Mg(%xh2crDU4}0 zqeq{jr!(9pDiRayHj4hjmyZ!;AioEssfKBZ70WfVrbh&TLZ82R${#j_(;rWcnbN-? zZ2FpMW5-TlHbGS_h00+=zbZAi_yuTxQHOvYsf6Y$6-q9Z{YeQ^zOeqC-}H{f<9d~Q zrf5`d<;jv&Zu8I0!kxRPV-Z*13A^5Vj>!CVi*J`zYO-H#SWR!DHRF2^&XWI1Z4+9y zcY3Jc1Na{*L(nyMkGCV2_a}BPboq!$J3lk3u)x7Z5e790r9~gwd7q4)`rFK?msg++ zFXC!4pxrF%MMFP)v*fAaN|>@+Cq3tPrx{@kS|6X9o=JbyC=YW~%3&#+sg@cOM5!C7 zA=l$qq9df$JQk>4tM0_o>>%nWXUvd^K`(uS8;A;UIV!{iKZm`PEF%bv%1VoVL@LBb zFjRsW*ou$__hy*U31Flc|Eu32L=Y+K8UEGazK&GhWVZts;+vTmsg`h00ks!D!g&J8 zqLt6QX^U5E{U?5SSAR$r_c~ia2Su|(mP0>M*WWl~Sv)R%_7}@zKk$2PzA&CYs}DP7 z=%+eYY@yTp#D0P<3;ch=DL)i%0#1->QP#BuIz)W-X-a?;hZF7Zj|=xXohR7K`+Gc+sib^AmT z9Xt0d{TkI+aaz%_H?f@gJVUOPbAnYvp1i-_F9ut;&p2F~$=`*24i`*1&A@2wHc@9a z?RZ6W=oPFs6Q9|pK-q~=^Wj`}{AsyZBjh6u0Pu)Yup8pgs@xpX@u|IPUj4a!%p86` zSE@&c8#wnO20iR8`9O0=zHAv^6G=QB!S%f1Yb>{C5vVq277?p6r=y3S zx?1%LFQsypoD33$6}xh1-GOSUS>p6e&ktBfDO0YH7&czRGO=6^t)A{oiR$q zt6F68$U*T&nQ5sm?@U^#B&>t<*sfQesX+o5Q!Ig5L75+J##<3{`%yJ{~KT=X^M z?}lM|ci^tG0?-XMc05wH=j6h_@rM)v($rmgt)Z+PH?^VcI$5tpprzDED;UShT1_>~ z)2vt73m>d`_&IF8GO9Wzc!234Q^Qu`O`Bp!&$RPR?Ay-6e}T5mt~@7gdObh;{v+jG zV&XOECyEK5dTRK=ayGs5=UsF2w^vRPDe2584ANRGZINSc11|J-7za*cQUD=a67E+y z6eDI-%xXuXBWb-skDNM@Q6$|)6uWfYx07~%(`R&~As6?iEeg3rM4z6#s`EdG#X^uM z(w==`bvNGgZhgw~(YpMQ)FhO3>A|wyw0^y>5jCWI~3 z*4JGu&F0rn!rmMyuEu#`rlO(Xf*-4kg#w_6dm#uAWn)wrkZ@@b@?^FvhBeK=JXuz& zZg9|=6b2#pNKN?ZzMI5I&1w^MIDes_UB+qx%Y+1uT6zYFwZh3j*Q>=xW!~%yFF)P8 zw}ESuE+zl|?JiUzCN}Y_vB=A*i!D?_`-Byx-6%_|Zq18J$WlqC;I-M~ z7m>#aU}sb+BI6>($;ySoB2yGaZ~!vJ1T-9y2}O(|fy}{pK&UBocbIE7yFD|s?m%&? zsJ_9i&6t%!G`8ii`cOIYx$xz;O2)KRh<^=Jn)^oq?zUBbZ=UrTZQ;K%D`=4m{gJhzKk)I0_$B+%7MNZq}>P0P5d>HD-wnTFK-{=$m ziQELFc^!IdTY~Kk?}Q)nC9N2#}G^l8dSwR}2>UTc-mL%`;A;XaAIa z2oqGVlkxXE@I>oj73;Km$E8TWYMFA7D?frX^V=)sk#@!~sp3{bwu7Va5yfeo^vTO2 zdzw;viHtw@-I%Y3_>HKB|69~HAWo=}03TC(I3>D&Xre&Ytmu{g`4IwnIno5FGyBfA zFhH1RS`Kj0g_a9^o>GotA`pyjo<`!9iU5G}!i@w}BJDeYbbp(;K^M(_vX4qa$*hnl zwUS@$v5;>~)ee8MsHqGKB-K_#ftuh*d*ggMC3yTVWPA|5RPShf)4X2oFb+xBEYv!~ubgM7F#KBz^JEN$^b{S5Y>S zBx0lwD?$6~Uprx8tH_22)#CG%(iMX-S1N;M^NpKBw5B&(=QuKAN^&MglL&=hud+Tp zb#rPyo%F-L7)~C-Aqw6pbV>13RADlTr1CEyQA5!!GyAXbUO$=jdOc390WnfEG)Mrh z<*NfJw%+dyN6|=D@J`QcY&k-$=5Eg=WXpg25CAAQ@=GoOikcyc#!7B6AsTuw4eFae z4q=qB_+^p{!%3Qn@o%h^hy+h1FahCH zCm`D=6@yV`HrI9^1d?29mg?(}b8YEO$E@xs)(z`08<_jjGNbOOYp z5W~bL=xA+AP%!831bicgVwOmAcHIShWK^l6`PeFk0Wf3g@`w^LR+0D9ddFY*-j%5+ zzjOJ)NTn+cS0}2e!`jW;- z)8l}vPrtInO+xN|l26^{cu}0e<{0vq4H63W3=o>;`iy?)E%qwqoZNoDzqIED%DAiVg9|dQOLDlpv=2HMj=8B2kE)}#| zLE-q*%QA0tn5}E)GlV(xsPXdl#5d`6sv3E>pZT$+13(ROOR|9h1G-F`lHyEigj)1k zYAv_13iK{NBGUha&MurcKgRr9c@IcBHuca8B~9M654{i^uxi*RG^ap8gA<9*cj(|;#cueWh- z_yw1Uh@??k%o4BF&=vU9C%h4v8A3eI8##ayd3k7LD9T}=)OrsUOP(edi&wjShZKu# zcwP)lijLA+rA-zo3;*FCGjc4jGW=?hXLKtuOOLcG=JcBn zrZS@x30W*|7PkF3riu(YoA$*{VBv7q9LfW zzbqbL-qIypIgG~UWiA%MG{|uP9TZarB9wJ}iEfqPN;cun7mpN6oxpj%H05XVw-FJO zSP<>A{R&qB?M|DD23}8^K)6bN5#(UxDv9yzIzS_3g9z-+5o_ZYR6Ae(ROR90W>DBf zp~nE@3MN+&Nh#CnkG+VqkleX=%DdPJNrBb6R5SnMM-Bk3Jo|SC1T<^GHXg*7dI{we ztm-TNNb5q`-+UwQmL+DsOY#u-Y7*cf{xzYce*-C#4vqk@5k55baLFLX&0nwW`4;$Q zq6g0T?h?a{{4OACxrV7>_JZiWp@VMU=9j1|z&{wMF zi0%}fwqFCy+{k$V<`8Qd%_Crgjx~;uV~(kIRI-|Uf5g+JBj=I&In-z1hoyd#K6g-R zDn)_{bmK-S~DYg>#+@RX#BgWC|dR@xU~LSEAv-$~w2Mde31cPZ|j z7@t$Hyh3}kB0?N~ECofpkEC$LII2pPOskJ1J-}mDKpIIGq$K8EKXD~lN1T zSjIBC0V`lJMA;?-ZH!4b%Oipd!> zw21mKz1|XxGF(j$QI4`fG{6kWp+a^oSM{vR@)}Kv{BKFh^+Q_QO@~hC-AQ&tdArwh z;+x?G(k)iEBR2}HE$A=XHPqjJwmYTp9qh12C-zV?v)~e(adX%$x-)OMd;NlhQL=|j zE&k%Nv6d_+j~Np$$9$+A<7JI*K8|!A^S73^r^t^3pyy@*03HM5r%9a1Lh7_Kq7L`5 z8<82cK=kT}!BHo*cwO(Lh8!gAT08HLX0@aO2B|qV|M;;(fNC^9GSd@<_Q%W`n?T_1o|-BK_M%d z#dDT~L$Z++OFlMy%({F-|2r~|8CoZ|=RNS?r1wwf=scY(KHaI0LQXqv@q!DoSaL4V zy&b*i7o873)*KllqO0neWlSe;>vB~0C*nSFaDQzHDaa{$_`KX{OPiaM0VsRKy-X9) zb=mj>u~io$N!1^~;gZ1(6oj)k6dN&Ut%;RsXI7uYjA(}q14|6lA36-@wrEwt@J%q4 zY9$=M68z@ zxC~A#>D^vwQ&@|tv$h?XFGYSQjQ|8Zr^Bw^{9ci5L^YC|_O#$7r=Fj{ay+%~9ks`* zzSH66Jsc|P2_w>c&ry@*o*`=AzC6`Tn?S=*Lb=!Ql}dU z+y9=Pbh!Dp`%fUR*&bu08&jTp9;MTFM7UU!7G1-ft1>hX zVH9^#W%x1ZMt}LeJ;}0A=udK){AA0nVW1b*p#9_!YMePyuoY}^LcOT{P&Ktv+??odIK5y;1WAD979cWS>F+^K9C{nF9T0-3IyuPGH2>B8sI#OW!{h3!!; zcsvOb^FMin+5A|8_H;$%HPIN8mx{}Siu`CBgDc=tuf68 zN_p?G`E=85V>`?JXC~g4SZR|**|NO}>!>dNPtGyQ+gRowKMmnTMjD30Y|7fk(XZ9G zh6C{T#4Qu-XhU_Y>XU~tufH3^BRcl8)YLybJ?Ng-N8uV;Aw%iAB!4&8&RqDN=6LEJ zcnD?7b-GKu;ivX$PH?k7oPLzciR}}k#tGuenfPFr-XJ`fd^I|UaU?HGx;{^qu`zs1 zRv70+x8Z-#mcKatbPppe0no}A!fdiCC=={uqAvl!=p0Lj01xkoRKMJ4r_ixl9jl$F zWx@WnE_I4EEijo)hfgfjBhM7}q1aQ-gbDn@(-gYK;2fU=PXA5UKGk(>!5*Q2UH!va zb)Hg1@oSHDs$6QEz_40K2Q(IP$2!_%S$6mhm^9t*s66edyb9N}P#MqV$TAks5fL!GiyT8)zti*`C@9|DXGpM6s>oKL zlQ#Vo&y6|eU!RutwuP^DT*QLfB82~wY0q}<_PW!Tj_-%9?=y?mel{O zofh%eP%i#(e%*NPw~jhLw4>PSA~)Ir%2IH>ZR+!Anu)XgkDrZjkfPdZnTC?5QFRZc zIK8QEqO2NDU*cqIC9CHxR$yN6EswWSX({Lk~y zqZ8>}L^DhzwAOJ=(@O+rM1S}6|XOG#QtCB-MsTeoT z%RzltFYbyn$=O~1GtxZ!oAQ>Wb8+ePAPo6O<3a>HUBEGWmiwk7;ltwb{PZ}BntoPX zk{O$WLv2obNzkf@kOX>-T=Ul0Tx+ZuUZx=AwSema?dEGwCLf~3grmwfp|fEJQIKyF zn`+p{4zFYshrc~XfSD!|3V0Xkn+$$&i9N=-XBYwJvZl4_d0=o&xGER2HPSx4FR5(B z39~{hUcmMj^ME&cTT>+b_jNT{*_=@nt#kE++PE!rX|WJJJEeJf@wg^b4#S1m5#CSY zv?|O4#?(Z$Q&UD_F(fM9tv46^v44NwF?G$V%t63TX7bfq&^$C6Jtbfm{Jp9AOH1t$hWvCsPxaLnf8L?cM&O-kR+nUF_tN z-XYKJruexR)Spwh^VG8Ll_^{^QkJ*?Ae?lKJWh~Z0t|9DLm4S;CEJ6t-9TE?IzMQb z;(*5ts74lky;V}>fFHW?m`kL3gmf(lbdbq@(&OY4lu7;b7x$ST_*Gbhq2khkp`~^> z3@gwn)}6qKLNW0ubcm|#biKD(xX`qchLBoV$V8iVTGzO9rQvhWw5t9gx)!EJrF%#9 ze&e&lS%2YeW2=JYWPP1}y>oB|EIfng*)egp?u?!XWAhJ_>1=5W?9Z7K_VVFpef{o8zss zx3c14M>5ixx+$(@=UDPM0dughzwCM33ItK+xxW+(>A*C&(Bqm&y{1iax_TA zNC?+qKQ0vULC$XzDFeIBb6A#W7+0kenDce2bo-6kX;tg?*Expjp`PW}8>;;r8J>Hae|f=d0cWCav^>Pw_`XLjN1Km3eHPr zU6b&R(Z}WB%OG@_uR4+uJYY7dL;&;I`xD9m;TuIoD$~C8Y~JJnA~I-pp~Emdq|eHv zY0)OHF$cTOSFl+-+~N_W)Qx+-wk^m*5sNzdu@v(8e(l^WFXGDo@$&_l!BAdnILOj7 z$|+9R?Mwt8iBpBGk5z`e;`FSl!toMfM8JX;wJUm%7;rcoZg7-T9m&rU zGabq}Laae%Nk~qFLd%Fw9E%>`JduhdQf2VFdW|FfS7^Q#g+eOl`(tk#40aU?{b;NA z-E(;rjCuhiI$YaJ@6lfGyZ%Y$`I*J0WyhQKewOj8f6AgH>S#V+cgm2B$Ay1lR|eTF zx{LdRDL-wf6{(I{rfHNFH<&6)adGdY78U}_pNR@CRYoSQN`P_+V^gu(sb!$5|65&ls`L5q+O(3lGuq{If*mLS)SMk`d+p0* zhnscdYLM18blDCU2utu42aVe60sw;;K+p;Ro60ECEQz+`!l-X{+z2Co;ev#D{L6z)&WVt-A;P6X$)q9_-!PzJ0|hDC|EBVcx;knqAEmW#tMbO zGnp4@%4;dymiUmw$QuKD3}wFAT6?rmx#H3W+9(})J$ouo#%lK$|HdEND*(-2?IWrW z4Pc5H)LWGfSm`;52F?OlcMZ<{+{r*ijX+rZ(T?eNcjtRXq8GsRs?%BeZm(N?M@rkI z8g`oEhoz$)m}hm>m7aI?1S$iFq$K8-@}>)_LzU!=uZzVO{S918;GYT z?8sd`t5Yc^h+KMH6YmTABTt63TTIOlamF?{j!W$qOuiYPC!2EC?U9b(KCf+IvK${t zy^^_p4vke@?mwv<2qgn7#iel~GUVT7%a}&5%R|;xEbQ2wwvD}hT{MHge*nk#YJQzD zsOr%$J~Cg)T>s);U)qN=P0}=V1nF(9=yu3(61AZ|=>NOEbIBNN{B`H6tHno5``MM zP@?~N?8CAAy9)my==9At2!4d2<-IAXxh!!htEGPf`cUsfASWU#XU|4XZuvovj*5Uv zQinrKK_%rg=hx-Q$yy^gc!Q5E=_(k)H`{_ztIU=evP+P{(l z8tPcKXT$)#3?se1aRg>s{+Is3d7wafoy=?cn3%dCAyz@>zr|%u=O9n@I(h5|c1- z7~y}bDfqmoMasS*r4&g;GhbC5yFBV!C!Ot4n0&u&d-oBC_E}48=C9O|Mm4>yI(_qc z+@=hNQ$CWVWYdKCQK7lm9c$wSRSyr3N6=H-@rq?mVbRlpd3^~2xw$pM78yX5o@2A& znh+WpJV3<^f3~+np4R-)o)}v_lQsQ&S1DgRA*Uo^NS*#`>@Ds6)JN=B;VUt^g!vaX z25l4H49r@_+9|#Y&Dn1LChSlW6SMviHZibg|Ff1)aqW0Cndv#gosiRu1kJTlX}5rTYpnJ=+LS-#CH19-xGq4USe`onJUcl&APS%27UV(~()|m-g*7Jwj-uhqsTqj(q{1w$^3kEv8-E_^$R5Z+# zam~1Nzm_vs4;wX*=&q&#C@2WCL)Pdo6){SYgL_`%u`o0mV5E#45ahkDSS|lgKX?cp zfS#^Rwza1z+Y2+E!7LJWFTJ{6VilE=v$FoU8j0^*HarEscPhS*0pvwPXm|^?;t5G< zEK=SXzu$k&Tn&i*4v_P_xrIlK+S~W>&RfMX@1cFCRCC6}iD>Z|%Vi?|`sZ9iS#2Tx zOKsvZU(_Zi>A9+6(O)w8%90Z@Ld-Aixai##{9uNXqSKgY|EFVOFV8#moX~Qb`9{Xe$VjQhkZ}=IYyg! z`kHhe{TM<-JAr|0@^^**kUiw7J*&(ES2{yI#C{--P%e(2P4g#wEm76{`Bzv@y5o>#<$Ro(TUk@Y`j!bJI84Sx!Aa87Y~p!^2pjRGbTr?!yf$G~Ih_=T4PMxN{=K$n=m>rS=(O;4_NX$}AN3I0Rb zcKB~&cD;gy^M9rq0H1QV=zayo;u+W7FwJl@MKD*_{Ax@P65lVS7Z{l4v%uW!(0}?N z#zCFY)6sb&ait5weC8PrAf2X1_%92FawmM0xJ^t}@wYw4KrPAS_|t>F6Smyx$Tx0x z*$7LQ4Z-O}T!m{b?AqzFhpRxTZx$r=vK}ljh>W{W+uXBAN zZBEHWQd2gKN+x30`OyW(RH_k9SFf$|>0gx*QU~qE`bkT};rCruEtRM;J2^3tIjAfJ$*=Mkr!$BrTi7eaW&=!6-;@31SJ4X&rn@5%6ud=XJs6I z7EMd`qB?9ZPF>o}c%GGAO)n)USIId)0&DUFN%f^p9BVDr0t{2MoH?b-$B|p5 z-d5F}M3eJn`uxbRMr1$lR+(rkh=^u?PBC`KJ(y4WI89{45A<1|!nHefa?b~LIeliu z)f+8gLaZaIJbfHaIVFaGO2WrJjwcPESjfkV*b5N;Tap8<1Ut|mC5g=@_uGajg zA5vu05yg4>H-WP{RqF`-WExD9E7sek#WK)*d=gIIgPvH*1doByRuO)IcxKV8aiwvu z8RoOYAovp;grxqP71^s5hSon~ddOSXjQ!AY7R-r{Q_nh|G!Dq;Y;$y_<~NQ_;aP7+ zgD2_n-42%e`PO+>X%gg`8o$(_?f%e?w_&lxA^JsG6IqLCr!$ya6Jv1+|LX~#40y2g z3`=s_WE&_T39}y9GgD+}XVwKE14R2!-v+Ny(-glSaPM{|I%7B24m6TB=13c@&lr5W zb0U?Ru(8(eHhZ2YRa1#48g=Nv`t5X~DuySnOzT+s*`mRUgvQ&3a&VqUS+sZ$viIHY z2L~Si;-C3STKeiJOf*y^EHwRbo@X?JTy$tE*ZIU5k0DFjK8zn6p}tPVghR#@t|8oD zg{(*xiu3{6u7=_T=4QK=9kRm0BDJdL(1y-$t{fdjYN@rY_`eJ)z~jMvYSSC8*NsWC z7@E@Z&z8k7W%R}-^3}aJo$0#JN7B?S>OK?fm|#puoVMg*C$LUj^Hm)?81RjlPcb~| zSjf0sY<-$~r;8f*t0rF8CF)3~XtCzYk}5Y%HV**F>Ii@l!5)Ar@MBfEa_iomubk#9 z=_&7UdJS~R*NLTd*FL7nFmt)nqNJ^+EYNFCU6${&mJJxwdA8;<2zADR~iU z|Mc?$0~JGYQ71snQ|n|ME@4-tE2xg(Z#<3jWw;0of~sWY(-QjMZ*cp)SoGHVm0IMU z_FUky)LpCZ$jVUPD$7saHKR*`72nagC8(c*E$5|AuPv-`HDF2RWmn<57Bzo^!0{y?<0J{@5_Tf-@7}xu~^y{X~$%Y@Uwr>5*~mIU`n+y(9^8A zVfa~26`WwvHW<#|@k7#d1M@yS&|g`jl*RswF}m{UyVJK~)Ht*`A?jR9bG$A(ckqrJ zWrrzWih=O(n1T9Rc2p}%015!fW=35L1CYx%Qq-56+?0M{Q4X`ST@7etRNUeiOcV+R zyjwTMEQ1PHd&aO4)H5zHxN!O84ms^Fx^bDVm@y}rKlLvZ-srJbmS}ZiGo%KS4BsT$ zii4m=BJvh=9P)y3Nh*s2Ymh3(jeO_0M%=nc=8;qFY8%H*NdqaVhv(B@E~@K3SNE+@ zmg((7_9tXCY#`FSBcd(veI>6Y3i|B7XFN{JU%&QDkr!J$r%c5Nf3kH%hrwuQ&JsN& zQC*P=x%h-IkBF+)C8Ef*k;&L|_=MiSe@iK&A!`~Qzu(K3@_FYkZY;(UfUE$~{|{hu z#e*c>$4t=CL`JbhFHgbyY9iXI`$gsBiN-n{#) z%U5y?lBmc-J(FtO;yajMI0mY8t{WsqJOHaocqKJ+oELxFURcL$^S`}jHo<50vK#&H z{3QZFDN|ZClxD+d$>3o|Kmu+o6xiWnl@5IK<)5~MtlGZ?L z=DjW(ofK46`lbvYx77XQ<^KYpwKki zR$cG|P$t+eOcXlHxy1Zbs>`MuLn}UV5y#S&49`^k9Fw`-t2GJYu5y4+m5E#~13-ua zEdXHHA9?G-1Q=l(QbvNPD{cWCt7$%{NdVMw|AyrAExcU5}4?SD#lBbYE?mF zp?qgEWs&43RG;Q$r{zYl1omf7`JqS~mgfpq=wv&7jSS#6wG?CQb7*cyrr z3PplX=Tj(EsZOa<%dYiR%AGCDrVC8Ti{qVw+=aU8<+sPmjV0Ow_&gd-fImk3)g_sf zQbyK7SYXTi-95140gq5>skJq1w~T2KA`&5F#p2By!3l(&5*$tlTgfZyWKG{x1$7R< z;hfudc?io*7=%LD8{pOm2)?3?_sx4#tXLV2q2SBwn1Rf_`dXh%b-xcLUz!ApOZd0{ zSiw-H^mP}Q)FE0ir*O$IMM6d$gSJcn$ePZ@K2;MCaL0X5^i6Y=Q~Gsx*9CLn?~v0* z8KBUE1=~-OtnP7>_<;|>-<;<1%=!bs}tfNyxp$YYpPtTsmE({u zGp$DL{5CRJA=drasbbm|S2J8=jXv%h^1Ckj$y#*NT|?y>`tSBPg36$`mq0D2kKa_u+ zNqbapKCfGE=ev2!H}{G4jRxw>QEKO=D94}d7$;JixlQqe)t7?E3mRrkh*l){c2v*m z`mse%(`y$tnqXDWWSYLj1F+iws2x7jMh zV-D7Ca8y==%G^Hv5F0h0CU@qgv&I$(K-K#ai7NOsU!BX&H?Y12z?l^f6Z6Gt9;cVJ z=FZW|z!ZnPVGU985+TE|#OSR|UXgv~{Je3^7yOw#*x;|r@2SZj>a`Z*GiTq_-&%b; zeRy}~SnBu49Q<`LqL>+nb<380JosT>vLd%C2Yze3L-(co?-Ix)(6Iyt0F&SsBh6|3 ztRiR~_OdHI_360q64OyQq01QUKc{!P?kfb|nedA&=`s&U59%_)Z{3+pncmo+y-2-k z?SzkDr+5C_e;8mWwt9vxV18>;$4P7nxg_m6Ig>hurC5%NbKkzCj<*IYW{72AMriGq zC{d`E9jHpQkkN6ojeV6StCZuAqGa}h>ozQ=)VPH}d^o?w-mxx~%hlQ$`eo*An{fDY zZ{uZ0BWOVv39(mCC}*cwJ=yQ$*<}f7tL2N1jK5SlfGCRMk5!r>qoQ|H=6yQN+^#(P zV12ZfJz%Jc)h%QXjw83Z50nGDu+YNy^Qf29o5JeDTSbd)k84(i?{}UE08m931c2c= zdP>D)9a$V^N8=O|c+k#NOQMN(+__5EU>UbfPZv2=@*=qUm@dO|5qC_$v#A%D#m394 z9IFKggbpP(i&!&sQ<~+Qa||F=pBtMIPQ=B?+Zva^YKCN+Zc{R32TqQ7_pwv_x%v4^ zEp+Lv-k5#%7=eFE9?+k8;H3{IA#Sfgd0l@WtO%;TgdDeeES(4*} zqi^O;KCFyLREUHZ#l3KtrsT zOU`q!iQ73Nj8*_NF@P!iq8WbPgBUyjki~hC=v*E}gm2q-sk&TF*l5DG%(;_WqWJlt zDQdGwt*z87RqjPXK4V3)eEQy+t*;bZJ4n0bp146jOKg6kp+U5T@U1$x#JFF!UIF(@ z(2-rqK)>uXx3A3XF=>sifbOtd7CGI#__t%f7Q;#*s2~&x&+#QT+SHO^L&zw+eGdjn zf*?*Z|MnkSbr?#XlKz>R!hi;JVoPGcUT6A+7IrUjtSH&{*szMC@ynEsd8YUn@sONU z&Y^TNBIpcr(NQVXHgGKBHU!RnEXP!L+oD;@@R7w<{y_)+7rv7x@X-U+*Z;BZC7i`d zMj4F7*s+RK1iFR4eo6$aA!j%5>@2LxL?-H2Rtd zx!=QKz#M{jTK7pGRgu0+g(&+fIx>V?Ud7u{g~bl|6Hv-H7>_smgBtcjEaq}1~8 zhwa!0KO*ur(_3-DgB))lGY4OuXo=W zD0nV_GQZvzd~BZ4c`3^Y8g*G1s;$la1p`>pawww0$mYZA+PsgI=4vt(xQ^uX)pt|q zFiMEdd6F2vT^!4c(w4?4Iw_jJ`t_VwLbk21)P|Ep2ZR;xSy?(ZvU{k9oE()y zFcH|-_5b1@Um&6yzjXG-%JUWKx~$ca8X+pF7H6-Zidfcnmg~$uFkZSVC5EgBK$t%? zvMM3AYgi9?`~7=FHX?{Es!tXwurLKy4{yiED>cu`2&-$W*=0-l^ol8agM7P^Y(1yc zIk}EJR@`ugb>O_jDy)nv-H?(4OJRatmncmv$IZOL`#p%nGVlGu;C!+FFaNn1*g%u4 zw))8mkF4dvc>W;eW}6!v?(LM3h8mkfXiO>X1;9hyCHU^YmyD{zffbqw?043e4UA%~ z43HXM-Fz{aUqVWl=;=*Itn_9M$UykU&IQJGf`XfW0ncbJ3Hj?4P~;h-eMqEr<>_<< z{{sJxgalCbi-Hx+>ojVz=#C9C%Eq6UOGVHKU{wz&7|NY-I5ir_w>OHMjHjcMoDV7u zMVd5uk)=RpTMbQ5HUn4B6*}=E9&aN82fQMsVPEN&)1H3Imf$wl=~5tzf>}wGWJ)5+ z77I=@_I2;YCf^pTrzvnn(pIS&-=f0k)PE(X({a|<&+`_r*$@1tgu~CA3F8DZa^q|@ zRW!k(|3uh_Rqn?9fPvDvUlL-MnsHBIrV8w@M7uk#W$=e(>9+nus>7<$#o-n~e~=A(alAMU#x=JHi!KGy~QnBr9nV#6D-JEmPc zlNchy4nyIBsQxYg!_VXMoy-(S-6c|?TYc0a`WZ%&)Pv@4YGT^WRp_UpyfxmqT8wC` zb^lQR`_8K|9oH6z;a&J1852j?k<47z6Lm)9?5hki=m9QE{vwHsYkhk&NsqId!sD`%MAxnCgh40r}N_ zjE%Qf+;+O87KX{25&Z&oh1)|p)is#;j1t{l;VZE^Ob0>lIQrZ-(lHa}v0d!~She>0 z#g|`M50jQZXh`N5DS0#@KvTx`PNqU#?~L!8G-GIZPyns7WC^iJX347PP+4LUtLbwr zjo~*eEiXEDM_3m1UW=(aqcu@EvwE|crd$<`8@bKloyI5i#jAUNswdc0o`DRXMNIE@gtr4BNM!v*Z0Qs-Q; zsAge20{`Wohk+9j*DkGfRb}(v54r*4Ws0~5qoo` ztIR<$4V_SLe{8<9<3118Velc<9OG!Vd#?LBa={3+4#A6nkK=Zv-+aq|watMCnS2-c zDNcb%7P3gpZt#p)0LZ&LZ1liJ_4O(KKlu|^fc?FZJhazXWOx8s6=Xs+Fg6VynZPRr zb)<4@TJ||hU9=+-J3Pt6&%YH2Ct|%#UDjoFhRcEaJJTt{^d*B z+4e=9UUZF5-w0m8Ef=pMokxTT9q8#c3zSwp@xWNNB>9x<^RGtGhy$zWNgddmdR* z*a~IH;V{o*fNdI{CM^^>xiy)fV}}+-R#-8WC>v1ms! #!Q`XA6$)=YNV5x$!?6K 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 {CrmNj8Z?u)W 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

    b+VtBm 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͛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 z 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

    G!l?v`|zQ(Rr?^X%?Q5J^Tk^FEh%*I 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

    s`kd$g4cE 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%0D; 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 z%0D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

  • -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ʕEB-vA^tdi9;tR$T6#vK8 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

    T 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\N^^TMt0U#&Mp09A-#t&x2_8;{ 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≪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Ȃ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